mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
[isoltest] Extract event specific end-to-end tests.
This commit is contained in:
parent
ec86e3e9ae
commit
85e3fcb1bf
@ -1416,686 +1416,6 @@ BOOST_AUTO_TEST_CASE(default_fallback_throws)
|
||||
}
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
function deposit(bytes32 _id, bool _manually) public payable {
|
||||
if (_manually) {
|
||||
bytes32 s = 0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f;
|
||||
uint value = msg.value;
|
||||
address sender = msg.sender;
|
||||
assembly {
|
||||
mstore(0, value)
|
||||
log3(0, 0x20, s, sender, _id)
|
||||
}
|
||||
} else {
|
||||
emit Deposit(msg.sender, _id, msg.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
u256 value(18);
|
||||
u256 id(0x1234);
|
||||
for (bool manually: {true, false})
|
||||
{
|
||||
callContractFunctionWithValue("deposit(bytes32,bool)", value, id, manually);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(value)));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 3);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,bytes32,uint256)")));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 1), h256(m_sender, h256::AlignRight));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 2), h256(id));
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_emit)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value);
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
u256 value(18);
|
||||
u256 id(0x1234);
|
||||
callContractFunctionWithValue("deposit(bytes32)", value, id);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(value)));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 3);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,bytes32,uint256)")));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 1), h256(m_sender, h256::AlignRight));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 2), h256(id));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_constructor)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
constructor() {
|
||||
emit Deposit(msg.sender, bytes32("abc"), 7);
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK_EQUAL(h256(logData(0)), h256(u256(7)));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 3);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,bytes32,uint256)")));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 1), h256(m_sender, h256::AlignRight));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 2), h256(string{"abc"}, h256::FromBinary, h256::AlignLeft));
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_no_arguments)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit();
|
||||
function deposit() public {
|
||||
emit Deposit();
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("deposit()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0).empty());
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit()")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_access_through_base_name_emit)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract A {
|
||||
event x();
|
||||
}
|
||||
contract B is A {
|
||||
function f() public returns (uint) {
|
||||
emit A.x();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("f()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0).empty());
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("x()")));
|
||||
);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(events_with_same_name)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit();
|
||||
event Deposit(address _addr);
|
||||
event Deposit(address _addr, uint _amount);
|
||||
event Deposit(address _addr, bool _flag);
|
||||
function deposit() public returns (uint) {
|
||||
emit Deposit();
|
||||
return 1;
|
||||
}
|
||||
function deposit(address _addr) public returns (uint) {
|
||||
emit Deposit(_addr);
|
||||
return 2;
|
||||
}
|
||||
function deposit(address _addr, uint _amount) public returns (uint) {
|
||||
emit Deposit(_addr, _amount);
|
||||
return 3;
|
||||
}
|
||||
function deposit(address _addr, bool _flag) public returns (uint) {
|
||||
emit Deposit(_addr, _flag);
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
)";
|
||||
h160 const c_loggedAddress = m_contractAddress;
|
||||
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
ABI_CHECK(callContractFunction("deposit()"), encodeArgs(u256(1)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0).empty());
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit()")));
|
||||
|
||||
ABI_CHECK(callContractFunction("deposit(address)", c_loggedAddress), encodeArgs(u256(2)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
ABI_CHECK(logData(0), encodeArgs(c_loggedAddress));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address)")));
|
||||
|
||||
ABI_CHECK(callContractFunction("deposit(address,uint256)", c_loggedAddress, u256(100)), encodeArgs(u256(3)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
ABI_CHECK(logData(0), encodeArgs(c_loggedAddress, 100));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,uint256)")));
|
||||
|
||||
ABI_CHECK(callContractFunction("deposit(address,bool)", c_loggedAddress, false), encodeArgs(u256(4)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
ABI_CHECK(logData(0), encodeArgs(c_loggedAddress, false));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,bool)")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(events_with_same_name_inherited_emit)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract A {
|
||||
event Deposit();
|
||||
}
|
||||
|
||||
contract B {
|
||||
event Deposit(address _addr);
|
||||
}
|
||||
|
||||
contract ClientReceipt is A, B {
|
||||
event Deposit(address _addr, uint _amount);
|
||||
function deposit() public returns (uint) {
|
||||
emit Deposit();
|
||||
return 1;
|
||||
}
|
||||
function deposit(address _addr) public returns (uint) {
|
||||
emit Deposit(_addr);
|
||||
return 1;
|
||||
}
|
||||
function deposit(address _addr, uint _amount) public returns (uint) {
|
||||
emit Deposit(_addr, _amount);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
)";
|
||||
h160 const c_loggedAddress = m_contractAddress;
|
||||
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
ABI_CHECK(callContractFunction("deposit()"), encodeArgs(u256(1)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0).empty());
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit()")));
|
||||
|
||||
ABI_CHECK(callContractFunction("deposit(address)", c_loggedAddress), encodeArgs(u256(1)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(c_loggedAddress));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address)")));
|
||||
|
||||
ABI_CHECK(callContractFunction("deposit(address,uint256)", c_loggedAddress, u256(100)), encodeArgs(u256(1)));
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
ABI_CHECK(logData(0), encodeArgs(c_loggedAddress, 100));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,uint256)")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_anonymous)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit() anonymous;
|
||||
function deposit() public {
|
||||
emit Deposit();
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("deposit()");
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 0);
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_anonymous_with_topics)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint indexed _value, uint indexed _value2, bytes32 data) anonymous;
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value, 2, "abc");
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
u256 value(18);
|
||||
u256 id(0x1234);
|
||||
callContractFunctionWithValue("deposit(bytes32)", value, id);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs("abc"));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 4);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), h256(m_sender, h256::AlignRight));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 1), h256(id));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 2), h256(value));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 3), h256(2));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_lots_of_data)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit(address _from, bytes32 _id, uint _value, bool _flag);
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value, true);
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
u256 value(18);
|
||||
u256 id(0x1234);
|
||||
callContractFunctionWithValue("deposit(bytes32)", value, id);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(m_sender, id, value, true));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(address,bytes32,uint256,bool)")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_really_lots_of_data)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
event Deposit(uint fixeda, bytes dynx, uint fixedb);
|
||||
function deposit() public {
|
||||
emit Deposit(10, msg.data, 15);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("deposit()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK_EQUAL(toHex(logData(0)), toHex(encodeArgs(10, 0x60, 15, 4, asString(FixedHash<4>(util::keccak256("deposit()")).asBytes()))));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(uint256,bytes,uint256)")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_really_lots_of_data_from_storage)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
bytes x;
|
||||
event Deposit(uint fixeda, bytes dynx, uint fixedb);
|
||||
function deposit() public {
|
||||
x.push("A");
|
||||
x.push("B");
|
||||
x.push("C");
|
||||
emit Deposit(10, x, 15);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("deposit()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK_EQUAL(toHex(logData(0)), toHex(encodeArgs(10, 0x60, 15, 3, string("ABC"))));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(uint256,bytes,uint256)")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_really_really_lots_of_data_from_storage)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract ClientReceipt {
|
||||
bytes x;
|
||||
event Deposit(uint fixeda, bytes dynx, uint fixedb);
|
||||
function deposit() public {
|
||||
x = new bytes(31);
|
||||
x[0] = "A";
|
||||
x[1] = "B";
|
||||
x[2] = "C";
|
||||
x[30] = "Z";
|
||||
emit Deposit(10, x, 15);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("deposit()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(10, 0x60, 15, 31, string("ABC") + string(27, 0) + "Z"));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Deposit(uint256,bytes,uint256)")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_struct_memory_v2)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
struct S { uint a; }
|
||||
event E(S);
|
||||
function createEvent(uint x) public {
|
||||
emit E(S(x));
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(x));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E((uint256))")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_struct_storage_v2)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
struct S { uint a; }
|
||||
event E(S);
|
||||
S s;
|
||||
function createEvent(uint x) public {
|
||||
s.a = x;
|
||||
emit E(s);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(x));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E((uint256))")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_dynamic_array_memory)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
function createEvent(uint x) public {
|
||||
uint[] memory arr = new uint[](3);
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(0x20, 3, x, x + 1, x + 2));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(uint256[])")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_dynamic_array_memory_v2)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
function createEvent(uint x) public {
|
||||
uint[] memory arr = new uint[](3);
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(0x20, 3, x, x + 1, x + 2));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(uint256[])")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_dynamic_nested_array_memory_v2)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[][]);
|
||||
function createEvent(uint x) public {
|
||||
uint[][] memory arr = new uint[][](2);
|
||||
arr[0] = new uint[](2);
|
||||
arr[1] = new uint[](2);
|
||||
arr[0][0] = x;
|
||||
arr[0][1] = x + 1;
|
||||
arr[1][0] = x + 2;
|
||||
arr[1][1] = x + 3;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(0x20, 2, 0x40, 0xa0, 2, x, x + 1, 2, x + 2, x + 3));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(uint256[][])")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_dynamic_array_storage)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
uint[] arr;
|
||||
function createEvent(uint x) public {
|
||||
while (arr.length < 3)
|
||||
arr.push();
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(0x20, 3, x, x + 1, x + 2));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(uint256[])")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_dynamic_array_storage_v2)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
uint[] arr;
|
||||
function createEvent(uint x) public {
|
||||
while (arr.length < 3)
|
||||
arr.push();
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(0x20, 3, x, x + 1, x + 2));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(uint256[])")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_dynamic_nested_array_storage_v2)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[][]);
|
||||
uint[][] arr;
|
||||
function createEvent(uint x) public {
|
||||
arr.push(new uint[](2));
|
||||
arr.push(new uint[](2));
|
||||
arr[0][0] = x;
|
||||
arr[0][1] = x + 1;
|
||||
arr[1][0] = x + 2;
|
||||
arr[1][1] = x + 3;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
)";
|
||||
/// TODO enable again after push(..) via yul is implemented for nested arrays.
|
||||
/// ALSO_VIA_YUL()
|
||||
compileAndRun(sourceCode);
|
||||
u256 x(42);
|
||||
callContractFunction("createEvent(uint256)", x);
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == encodeArgs(0x20, 2, 0x40, 0xa0, 2, x, x + 1, 2, x + 2, x + 3));
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 1);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(uint256[][])")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_indexed_string)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
string x;
|
||||
uint[4] y;
|
||||
event E(string indexed r, uint[4] indexed t);
|
||||
function deposit() public {
|
||||
for (uint i = 0; i < 90; i++)
|
||||
bytes(x).push(0);
|
||||
for (uint8 i = 0; i < 90; i++)
|
||||
bytes(x)[i] = bytes1(i);
|
||||
y[0] = 4;
|
||||
y[1] = 5;
|
||||
y[2] = 6;
|
||||
y[3] = 7;
|
||||
emit E(x, y);
|
||||
}
|
||||
}
|
||||
)";
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("deposit()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
string dynx(90, 0);
|
||||
std::iota(dynx.begin(), dynx.end(), 0);
|
||||
BOOST_CHECK(logData(0) == bytes());
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 3);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 1), util::keccak256(dynx));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 2), util::keccak256(
|
||||
encodeArgs(u256(4), u256(5), u256(6), u256(7))
|
||||
));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E(string,uint256[4])")));
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_indexed_function)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
contract C {
|
||||
event Test(function() external indexed);
|
||||
function f() public {
|
||||
emit Test(this.f);
|
||||
}
|
||||
}
|
||||
)";
|
||||
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
|
||||
compileAndRun(sourceCode);
|
||||
callContractFunction("f()");
|
||||
BOOST_REQUIRE_EQUAL(numLogs(), 1);
|
||||
BOOST_CHECK_EQUAL(logAddress(0), m_contractAddress);
|
||||
BOOST_CHECK(logData(0) == bytes());
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 2);
|
||||
|
||||
bytes functionHash = util::keccak256("f()").asBytes();
|
||||
bytes address = m_contractAddress.asBytes();
|
||||
bytes selector = bytes(functionHash.cbegin(), functionHash.cbegin() + 4);
|
||||
bytes padding = bytes(8, 0);
|
||||
bytes functionABI = address + selector + padding;
|
||||
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 1).hex(), util::toHex(functionABI));
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("Test(function)")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(empty_name_input_parameter_with_named_one)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
@ -5292,37 +4612,6 @@ BOOST_AUTO_TEST_CASE(abi_encodePackedV2_arrayOfStrings)
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(event_signature_in_library)
|
||||
{
|
||||
// This tests a bug that was present where the "internal signature"
|
||||
// for structs was also used for events.
|
||||
char const* sourceCode = R"(
|
||||
pragma abicoder v2;
|
||||
library L {
|
||||
struct S {
|
||||
uint8 a;
|
||||
int16 b;
|
||||
}
|
||||
event E(S indexed, S);
|
||||
function f() internal {
|
||||
S memory s;
|
||||
emit E(s, s);
|
||||
}
|
||||
}
|
||||
contract C {
|
||||
constructor() {
|
||||
L.f();
|
||||
}
|
||||
}
|
||||
)";
|
||||
ALSO_VIA_YUL(
|
||||
DISABLE_EWASM_TESTRUN()
|
||||
compileAndRun(sourceCode, 0, "C");
|
||||
BOOST_REQUIRE_EQUAL(numLogTopics(0), 2);
|
||||
BOOST_CHECK_EQUAL(logTopic(0, 0), util::keccak256(string("E((uint8,int16),(uint8,int16))")));
|
||||
)
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(code_access)
|
||||
{
|
||||
char const* sourceCode = R"(
|
||||
|
23
test/libsolidity/semanticTests/events/event.sol
Normal file
23
test/libsolidity/semanticTests/events/event.sol
Normal file
@ -0,0 +1,23 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
function deposit(bytes32 _id, bool _manually) public payable {
|
||||
if (_manually) {
|
||||
bytes32 s = 0x19dacbf83c5de6658e14cbf7bcae5c15eca2eedecf1c66fbca928e4d351bea0f;
|
||||
uint value = msg.value;
|
||||
address sender = msg.sender;
|
||||
assembly {
|
||||
mstore(0, value)
|
||||
log3(0, 0x20, s, sender, _id)
|
||||
}
|
||||
} else {
|
||||
emit Deposit(msg.sender, _id, msg.value);
|
||||
}
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit(bytes32,bool), 18 wei: 0x1234, true ->
|
||||
// ~ emit Deposit(address,bytes32,uint256): #0x1212121212121212121212121212120000000012, #0x1234, 0x12
|
||||
// deposit(bytes32,bool), 18 wei: 0x1234, false ->
|
||||
// ~ emit Deposit(address,bytes32,uint256): #0x1212121212121212121212121212120000000012, #0x1234, 0x12
|
@ -0,0 +1,14 @@
|
||||
contract A {
|
||||
event x();
|
||||
}
|
||||
contract B is A {
|
||||
function f() public returns (uint) {
|
||||
emit A.x();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f() -> 1
|
||||
// ~ emit x()
|
11
test/libsolidity/semanticTests/events/event_anonymous.sol
Normal file
11
test/libsolidity/semanticTests/events/event_anonymous.sol
Normal file
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit() anonymous;
|
||||
function deposit() public {
|
||||
emit Deposit();
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit <anonymous>
|
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(uint256 indexed _from, bytes32 indexed _id, uint _value) anonymous;
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(0x2012159ca6b6372f102c535a4814d13a00bfc5568ddfd72151364061b00355d1, _id, msg.value); // 0x2012159c -> 'Deposit(uint256,bytes32,uint256)'
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit(bytes32), 18 wei: 0x1234 ->
|
||||
// ~ emit <anonymous>: #0x2012159ca6b6372f102c535a4814d13a00bfc5568ddfd72151364061b00355d1, #0x1234, 0x12
|
@ -1,11 +1,12 @@
|
||||
contract ClientReceipt {
|
||||
event Withdraw(uint _value, string owner);
|
||||
event Deposit(uint256 indexed _from, bytes32 indexed _id, uint _value) anonymous;
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(0x2012159ca6b6372f102c535a4814d13a00bfc5568ddfd72151364061b00355d1, _id, msg.value); // 0x2012159c -> 'Deposit(uint256,bytes32,uint256)'
|
||||
emit Deposit(0x5ddaa77ac5bda319ba947e31bee594711f39ed1b20d079d438dbad5ed729fb30, _id, msg.value); // 0x5ddaa77a -> 'Withdraw(uint256,string)'
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit(bytes32), 18 wei: 0x1234 ->
|
||||
// ~ emit <anonymous>: #0x2012159ca6b6372f102c535a4814d13a00bfc5568ddfd72151364061b00355d1, #0x1234, 0x12
|
||||
// ~ emit Withdraw(uint256,string): #0x1234, 0x12
|
||||
|
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint indexed _value, uint indexed _value2, bytes32 data) anonymous;
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value, 2, "abc");
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit(bytes32), 18 wei: 0x1234 ->
|
||||
// ~ emit <anonymous>: #0x1212121212121212121212121212120000000012, #0x1234, #0x12, #0x02, "abc"
|
11
test/libsolidity/semanticTests/events/event_constructor.sol
Normal file
11
test/libsolidity/semanticTests/events/event_constructor.sol
Normal file
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
constructor() {
|
||||
emit Deposit(msg.sender, bytes32("abc"), 7);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// constructor()
|
||||
// ~ emit Deposit(address,bytes32,uint256): #0x1212121212121212121212121212120000000012, #"abc", 0x07
|
@ -0,0 +1,15 @@
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
function createEvent(uint x) public {
|
||||
uint[] memory arr = new uint[](3);
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E(uint256[]): 0x20, 0x03, 0x2a, 0x2b, 0x2c
|
@ -0,0 +1,16 @@
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
function createEvent(uint x) public {
|
||||
uint[] memory arr = new uint[](3);
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E(uint256[]): 0x20, 0x03, 0x2a, 0x2b, 0x2c
|
@ -0,0 +1,20 @@
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
uint[] arr;
|
||||
function createEvent(uint x) public {
|
||||
while (arr.length < 3)
|
||||
arr.push();
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E(uint256[]): 0x20, 0x03, 0x2a, 0x2b, 0x2c
|
||||
// gas irOptimized: 115211
|
||||
// gas legacy: 116393
|
||||
// gas legacyOptimized: 114415
|
@ -0,0 +1,21 @@
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[]);
|
||||
uint[] arr;
|
||||
function createEvent(uint x) public {
|
||||
while (arr.length < 3)
|
||||
arr.push();
|
||||
arr[0] = x;
|
||||
arr[1] = x + 1;
|
||||
arr[2] = x + 2;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E(uint256[]): 0x20, 0x03, 0x2a, 0x2b, 0x2c
|
||||
// gas irOptimized: 115211
|
||||
// gas legacy: 116393
|
||||
// gas legacyOptimized: 114415
|
@ -0,0 +1,19 @@
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[][]);
|
||||
function createEvent(uint x) public {
|
||||
uint[][] memory arr = new uint[][](2);
|
||||
arr[0] = new uint[](2);
|
||||
arr[1] = new uint[](2);
|
||||
arr[0][0] = x;
|
||||
arr[0][1] = x + 1;
|
||||
arr[1][0] = x + 2;
|
||||
arr[1][1] = x + 3;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E(uint256[][]): 0x20, 0x02, 0x40, 0xa0, 0x02, 0x2a, 0x2b, 0x02, 0x2c, 0x2d
|
@ -0,0 +1,22 @@
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
event E(uint[][]);
|
||||
uint[][] arr;
|
||||
function createEvent(uint x) public {
|
||||
arr.push(new uint[](2));
|
||||
arr.push(new uint[](2));
|
||||
arr[0][0] = x;
|
||||
arr[0][1] = x + 1;
|
||||
arr[1][0] = x + 2;
|
||||
arr[1][1] = x + 3;
|
||||
emit E(arr);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E(uint256[][]): 0x20, 0x02, 0x40, 0xa0, 0x02, 0x2a, 0x2b, 0x02, 0x2c, 0x2d
|
||||
// gas irOptimized: 185905
|
||||
// gas legacy: 187621
|
||||
// gas legacyOptimized: 184551
|
11
test/libsolidity/semanticTests/events/event_emit.sol
Normal file
11
test/libsolidity/semanticTests/events/event_emit.sol
Normal file
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit(bytes32), 18 wei: 0x1234 ->
|
||||
// ~ emit Deposit(address,bytes32,uint256): #0x1212121212121212121212121212120000000012, #0x1234, 0x12
|
@ -0,0 +1,22 @@
|
||||
contract D {
|
||||
event Deposit(address indexed _from, bytes32 indexed _id, uint _value);
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value);
|
||||
}
|
||||
}
|
||||
contract C {
|
||||
D d;
|
||||
constructor() {
|
||||
d = new D();
|
||||
}
|
||||
function deposit(bytes32 _id) public payable {
|
||||
d.deposit(_id);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// constructor() ->
|
||||
// gas legacy: 249112
|
||||
// deposit(bytes32), 18 wei: 0x1234 ->
|
||||
// ~ emit Deposit(address,bytes32,uint256) from 0xf01f7809444bd9a93a854361c6fae3f23d9e23db: #0x0fdd67305928fcac8d213d1e47bfa6165cd0b87b, #0x1234, 0x00
|
@ -0,0 +1,11 @@
|
||||
contract C {
|
||||
event Test(function() external indexed);
|
||||
function f() public {
|
||||
emit Test(this.f);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f() ->
|
||||
// ~ emit Test(function): #0x0fdd67305928fcac8d213d1e47bfa6165cd0b87b26121ff00000000000000000
|
@ -0,0 +1,17 @@
|
||||
contract C {
|
||||
event TestA(function() external indexed);
|
||||
event TestB(function(uint256) external indexed);
|
||||
function f1() public {
|
||||
emit TestA(this.f1);
|
||||
}
|
||||
function f2(uint256 a) public {
|
||||
emit TestB(this.f2);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// f1() ->
|
||||
// ~ emit TestA(function): #0x0fdd67305928fcac8d213d1e47bfa6165cd0b87bc27fc3050000000000000000
|
||||
// f2(uint256): 1 ->
|
||||
// ~ emit TestB(function): #0x0fdd67305928fcac8d213d1e47bfa6165cd0b87bbf3724af0000000000000000
|
@ -0,0 +1,24 @@
|
||||
contract C {
|
||||
string x;
|
||||
uint[4] y;
|
||||
event E(string indexed r, uint[4] indexed t);
|
||||
function deposit() public {
|
||||
for (uint i = 0; i < 90; i++)
|
||||
bytes(x).push(0);
|
||||
for (uint8 i = 0; i < 90; i++)
|
||||
bytes(x)[i] = bytes1(i);
|
||||
y[0] = 4;
|
||||
y[1] = 5;
|
||||
y[2] = 6;
|
||||
y[3] = 7;
|
||||
emit E(x, y);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit E(string,uint256[4]): #0xa7fb06bb999a5eb9aff9e0779953f4e1e4ce58044936c2f51c7fb879b85c08bd, #0xe755d8cc1a8cde16a2a31160dcd8017ac32d7e2f13215b29a23cdae40a78aa81
|
||||
// gas irOptimized: 368478
|
||||
// gas legacy: 390742
|
||||
// gas legacyOptimized: 376774
|
11
test/libsolidity/semanticTests/events/event_lots_of_data.sol
Normal file
11
test/libsolidity/semanticTests/events/event_lots_of_data.sol
Normal file
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(address _from, bytes32 _id, uint _value, bool _flag);
|
||||
function deposit(bytes32 _id) public payable {
|
||||
emit Deposit(msg.sender, _id, msg.value, true);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit(bytes32), 18 wei: 0x1234 ->
|
||||
// ~ emit Deposit(address,bytes32,uint256,bool): 0x1212121212121212121212121212120000000012, 0x1234, 0x12, true
|
11
test/libsolidity/semanticTests/events/event_no_arguments.sol
Normal file
11
test/libsolidity/semanticTests/events/event_no_arguments.sol
Normal file
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit();
|
||||
function deposit() public {
|
||||
emit Deposit();
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit Deposit()
|
@ -0,0 +1,11 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit(uint fixeda, bytes dynx, uint fixedb);
|
||||
function deposit() public {
|
||||
emit Deposit(10, msg.data, 15);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit Deposit(uint256,bytes,uint256): 0x0a, 0x60, 0x0f, 0x04, 0xd0e30db000000000000000000000000000000000000000000000000000000000
|
@ -0,0 +1,15 @@
|
||||
contract ClientReceipt {
|
||||
bytes x;
|
||||
event Deposit(uint fixeda, bytes dynx, uint fixedb);
|
||||
function deposit() public {
|
||||
x.push("A");
|
||||
x.push("B");
|
||||
x.push("C");
|
||||
emit Deposit(10, x, 15);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit Deposit(uint256,bytes,uint256): 0x0a, 0x60, 0x0f, 0x03, "ABC"
|
@ -0,0 +1,17 @@
|
||||
contract ClientReceipt {
|
||||
bytes x;
|
||||
event Deposit(uint fixeda, bytes dynx, uint fixedb);
|
||||
function deposit() public {
|
||||
x = new bytes(31);
|
||||
x[0] = "A";
|
||||
x[1] = "B";
|
||||
x[2] = "C";
|
||||
x[30] = "Z";
|
||||
emit Deposit(10, x, 15);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit Deposit(uint256,bytes,uint256): 0x0a, 0x60, 0x0f, 0x1f, "ABC\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Z"
|
@ -0,0 +1,23 @@
|
||||
pragma abicoder v2;
|
||||
library L {
|
||||
struct S {
|
||||
uint8 a;
|
||||
int16 b;
|
||||
}
|
||||
event E(S indexed, S);
|
||||
function f() internal {
|
||||
S memory s;
|
||||
emit E(s, s);
|
||||
}
|
||||
}
|
||||
contract C {
|
||||
constructor() {
|
||||
L.f();
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// constructor()
|
||||
// ~ emit E((uint8,int16),(uint8,int16)): #0xad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5, 0x00, 0x00
|
||||
// gas legacy: 150662
|
@ -1,24 +1,11 @@
|
||||
contract C {
|
||||
string x;
|
||||
uint[4] y;
|
||||
event E(string indexed r, uint[4] indexed t);
|
||||
event E(string r);
|
||||
function deposit() public {
|
||||
for (uint i = 0; i < 90; i++)
|
||||
bytes(x).push(0);
|
||||
for (uint8 i = 0; i < 90; i++)
|
||||
bytes(x)[i] = bytes1(i);
|
||||
y[0] = 4;
|
||||
y[1] = 5;
|
||||
y[2] = 6;
|
||||
y[3] = 7;
|
||||
emit E(x, y);
|
||||
emit E("HELLO WORLD");
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() ->
|
||||
// ~ emit E(string,uint256[4]): #0xa7fb06bb999a5eb9aff9e0779953f4e1e4ce58044936c2f51c7fb879b85c08bd, #0xe755d8cc1a8cde16a2a31160dcd8017ac32d7e2f13215b29a23cdae40a78aa81
|
||||
// gas irOptimized: 792278
|
||||
// gas legacy: 390742
|
||||
// gas legacyOptimized: 930774
|
||||
// ~ emit E(string): 0x20, 0x0b, "HELLO WORLD"
|
||||
|
@ -0,0 +1,13 @@
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
struct S { uint a; }
|
||||
event E(S);
|
||||
function createEvent(uint x) public {
|
||||
emit E(S(x));
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E((uint256)): 0x2a
|
@ -0,0 +1,15 @@
|
||||
pragma abicoder v2;
|
||||
contract C {
|
||||
struct S { uint a; }
|
||||
event E(S);
|
||||
S s;
|
||||
function createEvent(uint x) public {
|
||||
s.a = x;
|
||||
emit E(s);
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// createEvent(uint256): 42 ->
|
||||
// ~ emit E((uint256)): 0x2a
|
@ -0,0 +1,33 @@
|
||||
contract ClientReceipt {
|
||||
event Deposit();
|
||||
event Deposit(address _addr);
|
||||
event Deposit(address _addr, uint _amount);
|
||||
event Deposit(address _addr, bool _flag);
|
||||
function deposit() public returns (uint) {
|
||||
emit Deposit();
|
||||
return 1;
|
||||
}
|
||||
function deposit(address _addr) public returns (uint) {
|
||||
emit Deposit(_addr);
|
||||
return 2;
|
||||
}
|
||||
function deposit(address _addr, uint _amount) public returns (uint) {
|
||||
emit Deposit(_addr, _amount);
|
||||
return 3;
|
||||
}
|
||||
function deposit(address _addr, bool _flag) public returns (uint) {
|
||||
emit Deposit(_addr, _flag);
|
||||
return 4;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() -> 1
|
||||
// ~ emit Deposit()
|
||||
// deposit(address): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988 -> 2
|
||||
// ~ emit Deposit(address): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988
|
||||
// deposit(address,uint256): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988, 100 -> 3
|
||||
// ~ emit Deposit(address,uint256): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988, 0x64
|
||||
// deposit(address,bool): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988, false -> 4
|
||||
// ~ emit Deposit(address,bool): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988, false
|
@ -0,0 +1,32 @@
|
||||
contract A {
|
||||
event Deposit();
|
||||
}
|
||||
|
||||
contract B {
|
||||
event Deposit(address _addr);
|
||||
}
|
||||
|
||||
contract ClientReceipt is A, B {
|
||||
event Deposit(address _addr, uint _amount);
|
||||
function deposit() public returns (uint) {
|
||||
emit Deposit();
|
||||
return 1;
|
||||
}
|
||||
function deposit(address _addr) public returns (uint) {
|
||||
emit Deposit(_addr);
|
||||
return 1;
|
||||
}
|
||||
function deposit(address _addr, uint _amount) public returns (uint) {
|
||||
emit Deposit(_addr, _amount);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
// ====
|
||||
// compileViaYul: also
|
||||
// ----
|
||||
// deposit() -> 1
|
||||
// ~ emit Deposit()
|
||||
// deposit(address): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988 -> 1
|
||||
// ~ emit Deposit(address): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988
|
||||
// deposit(address,uint256): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988, 100 -> 1
|
||||
// ~ emit Deposit(address,uint256): 0x5082a85c489be6aa0f2e6693bf09cc1bbd35e988, 0x64
|
@ -277,7 +277,7 @@ contract Test {
|
||||
input[7] = 9643208548031422463313148630985736896287522941726746581856185889848792022807;
|
||||
input[8] = 18066496933330839731877828156604;
|
||||
if (verify(input, proof) == 0) {
|
||||
emit Verified("Transaction successfully verified.");
|
||||
emit Verified("Successfully verified.");
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
@ -296,6 +296,7 @@ contract Test {
|
||||
// g() -> true
|
||||
// pair() -> true
|
||||
// verifyTx() -> true
|
||||
// gas irOptimized: 111716
|
||||
// gas legacy: 114371
|
||||
// gas legacyOptimized: 83947
|
||||
// ~ emit Verified(string): 0x20, 0x16, "Successfully verified."
|
||||
// gas irOptimized: 111439
|
||||
// gas legacy: 114094
|
||||
// gas legacyOptimized: 83670
|
||||
|
Loading…
Reference in New Issue
Block a user