https://github.com/victorzhang2014/solidity-log3
The Usage of log1,log2,log3 and log4 in Solidity based-on Yul Assembly Language
https://github.com/victorzhang2014/solidity-log3
assembly assembly-language log1 log2 log3 log4 solidity yul
Last synced: about 1 month ago
JSON representation
The Usage of log1,log2,log3 and log4 in Solidity based-on Yul Assembly Language
- Host: GitHub
- URL: https://github.com/victorzhang2014/solidity-log3
- Owner: VictorZhang2014
- Created: 2023-05-12T11:02:50.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2023-05-18T06:43:25.000Z (about 3 years ago)
- Last Synced: 2025-04-06T17:36:23.564Z (about 1 year ago)
- Topics: assembly, assembly-language, log1, log2, log3, log4, solidity, yul
- Language: Solidity
- Homepage:
- Size: 24.4 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# The Usage of log1,log2,log3 and log4 in Solidity
#### Deployed Contract for testing: [0x2b1437da111b553cb1384d8d290b08820fd188eb](https://mumbai.polygonscan.com/address/0x2b1437da111b553cb1384d8d290b08820fd188eb)
#### Test Case for `log1` for emitting an event without any parameters
```
event Fire();
function test1(string memory n) external {
emit Fire();
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
log1(0x0, 0x0, e)
}
}
```
Transaction on Polygon mumbai network: https://mumbai.polygonscan.com/tx/0x0a7da0136ddd431aad5a90a4babcec709f62963b61df3f3341b5f54037b18bb0#eventlog
#### Test Case for for `log2` for emitting an event with one indexed parameter
```
event Fire(int256 indexed t1);
function test2(string memory n, int256 t1) external {
emit Fire(t1);
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
log2(0x0, 0x0, e, t1)
}
}
```
Transaction on Polygon mumbai network: https://mumbai.polygonscan.com/tx/0xc1480bd039b41f6b59fccd4031a7f5951061472201af78aeaafee7b74c2cda74#eventlog
#### Test Case for `log3` for emitting an event with two indexed parameters
```
event Fire(address indexed t1, uint256 indexed t2);
function test8(string memory n, address t1, uint256 t2) external {
emit Fire(t1, t2);
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
log3(0x0, 0x0, e, t1, t2)
}
}
```
Transaction on Polygon mumbai network: https://mumbai.polygonscan.com/tx/0x10bf33dcd46cc6cda1e8315a5e2e735e73567cdc05841b51758847db9421e3b0#eventlog
#### Test Case for `log4` for emitting an event with three indexed parameters
```
event Fire(address indexed t1, uint256 indexed t2, bool indexed t3, int128 abc);
function test10(string memory n, address t1, uint256 t2, bool t3, int128 abc) external {
emit Fire(t1, t2, t3, abc);
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
let p := add(0x0, 0x20)
mstore(p, abc)
log4(p, 0x20, e, t1, t2, t3)
}
}
```
Transaction on Polygon mumbai network: https://mumbai.polygonscan.com/tx/0x98813736f2e60e3559837ee33278ea86990e557a0216fe91ca6c559354a86071#eventlog
#### Test Case for `log4` with dynamic and non-indexed parameters, plus three indexed parameters
```
event Fire(address indexed t1, uint256 indexed t2, bool indexed t3, uint256 abc);
function test11(string memory n, address t1, uint256 t2, bool t3, bytes memory data) external {
emit Fire(t1, t2, t3, abi.decode(data, (uint256)));
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
let p := add(data, 0x20)
let s := mload(data)
log4(p, s, e, t1, t2, t3)
}
}
```
Transaction on Polygon mumbai network: https://mumbai.polygonscan.com/tx/0x68cd6ab903e450c8d566eb80800aeec759f31b853823c4ee2fa359e13435c5f9#eventlog
#### General Encapsulation for the four log functions
More details and invokation example, please check the source code here: [SolidityLogTest.sol](https://github.com/VictorZhang2014/solidity-log3/blob/main/SolidityLogTest.sol)
```
function exudeLog(uint i, bytes32 eventSig, bytes32 topic1, bytes32 topic2, bytes32 topic3, bytes memory data) public {
assembly {
let p := add(data, 0x20)
let s := mload(data)
if eq(i, 0x1) {
log1(p, s, eventSig)
}
if eq(i, 0x2) {
log2(p, s, eventSig, topic1)
}
if eq(i, 0x3) {
log3(p, s, eventSig, topic1, topic2)
}
if eq(i, 0x4) {
log4(p, s, eventSig, topic1, topic2, topic3)
}
}
}
function getEventSig(string memory eventSigStr) public pure returns (bytes32) {
return keccak256(abi.encodePacked(eventSigStr));
}
```
# Solidity的日志内置函数log1、log2、log3 和 log4的使用
#### 对`log1`函数的测试,无参数
```
event Fire();
function test1(string memory n) external {
emit Fire();
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
log1(0x0, 0x0, e)
}
}
```
查看交易Polygon mumbai: https://mumbai.polygonscan.com/tx/0x0a7da0136ddd431aad5a90a4babcec709f62963b61df3f3341b5f54037b18bb0#eventlog
#### 对`log2`的测试,有一个indexed的参数
```
event Fire(int256 indexed t1);
function test2(string memory n, int256 t1) external {
emit Fire(t1);
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
log2(0x0, 0x0, e, t1)
}
}
```
查看交易Polygon mumbai: https://mumbai.polygonscan.com/tx/0xc1480bd039b41f6b59fccd4031a7f5951061472201af78aeaafee7b74c2cda74#eventlog
#### 对`log3`的测试,有两个indexed的参数
```
event Fire(address indexed t1, uint256 indexed t2);
function test8(string memory n, address t1, uint256 t2) external {
emit Fire(t1, t2);
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
log3(0x0, 0x0, e, t1, t2)
}
}
```
查看交易Polygon mumbai: https://mumbai.polygonscan.com/tx/0x10bf33dcd46cc6cda1e8315a5e2e735e73567cdc05841b51758847db9421e3b0#eventlog
#### 对`log4`的测试,有三个indexed的参数
```
event Fire(address indexed t1, uint256 indexed t2, bool indexed t3, int128 abc);
function test10(string memory n, address t1, uint256 t2, bool t3, int128 abc) external {
emit Fire(t1, t2, t3, abc);
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
let p := add(0x0, 0x20)
mstore(p, abc)
log4(p, 0x20, e, t1, t2, t3)
}
}
```
查看交易Polygon mumbai: https://mumbai.polygonscan.com/tx/0x98813736f2e60e3559837ee33278ea86990e557a0216fe91ca6c559354a86071#eventlog
#### 对`log4`的测试,动态data的参数,传入动态长度字节数据
```
event Fire(address indexed t1, uint256 indexed t2, bool indexed t3, uint256 abc);
function test11(string memory n, address t1, uint256 t2, bool t3, bytes memory data) external {
emit Fire(t1, t2, t3, abi.decode(data, (uint256)));
bytes32 e = keccak256(abi.encodePacked(n));
assembly {
let p := add(data, 0x20)
let s := mload(data)
log4(p, s, e, t1, t2, t3)
}
}
```
查看交易示例Polygon mumbai: https://mumbai.polygonscan.com/tx/0x68cd6ab903e450c8d566eb80800aeec759f31b853823c4ee2fa359e13435c5f9#eventlog