diff --git a/newsfragments/3754.bugfix.rst b/newsfragments/3754.bugfix.rst new file mode 100644 index 0000000000..bf9ad4592d --- /dev/null +++ b/newsfragments/3754.bugfix.rst @@ -0,0 +1 @@ +Fix decoding of `argument_types` for `tuple` types in `base_contract.py`. diff --git a/tests/core/contracts/conftest.py b/tests/core/contracts/conftest.py index a2516d8edb..0840db6008 100644 --- a/tests/core/contracts/conftest.py +++ b/tests/core/contracts/conftest.py @@ -63,7 +63,10 @@ ) from web3._utils.contract_sources.contract_data.tuple_contracts import ( NESTED_TUPLE_CONTRACT_DATA, + TUPLE_CONTRACT_ABI, + TUPLE_CONTRACT_BYTECODE, TUPLE_CONTRACT_DATA, + TUPLE_CONTRACT_RUNTIME, ) from web3.exceptions import ( Web3ValueError, @@ -117,6 +120,34 @@ def math_contract(w3, math_contract_factory, address_conversion_func): return deploy(w3, math_contract_factory, address_conversion_func) +# --- tuple contract --- # + + +@pytest.fixture(scope="session") +def tuple_contract_bytecode(): + return TUPLE_CONTRACT_BYTECODE + + +@pytest.fixture(scope="session") +def tuple_contract_runtime(): + return TUPLE_CONTRACT_RUNTIME + + +@pytest.fixture(scope="session") +def tuple_contract_abi(): + return TUPLE_CONTRACT_ABI + + +@pytest.fixture +def tuple_contract_factory(w3): + return w3.eth.contract(**TUPLE_CONTRACT_DATA) + + +@pytest.fixture +def tuple_contract(w3, tuple_contract_factory, address_conversion_func): + return deploy(w3, tuple_contract_factory, address_conversion_func) + + # --- constructor contracts --- # @@ -471,12 +502,6 @@ def revert_contract(w3, address_conversion_func): return deploy(w3, revert_contract_factory, address_conversion_func) -@pytest.fixture -def tuple_contract(w3, address_conversion_func): - tuple_contract_factory = w3.eth.contract(**TUPLE_CONTRACT_DATA) - return deploy(w3, tuple_contract_factory, address_conversion_func) - - @pytest.fixture def nested_tuple_contract(w3, address_conversion_func): nested_tuple_contract_factory = w3.eth.contract(**NESTED_TUPLE_CONTRACT_DATA) diff --git a/tests/core/contracts/test_contract_class_construction.py b/tests/core/contracts/test_contract_class_construction.py index 674b21d76f..570b7a18cc 100644 --- a/tests/core/contracts/test_contract_class_construction.py +++ b/tests/core/contracts/test_contract_class_construction.py @@ -87,7 +87,7 @@ def test_error_to_call_non_existent_fallback( math_contract.fallback.estimate_gas() -def test_contract_events_init_with_class_vars( +def test_math_contract_events_init_with_class_vars( w3, math_contract_abi, math_contract_bytecode, math_contract_runtime ): math_contract = w3.eth.contract( @@ -125,7 +125,45 @@ def test_contract_events_init_with_class_vars( ) -def test_contract_functions_init_with_class_vars( +def test_tuple_contract_events_init_with_class_vars( + w3, tuple_contract_abi, tuple_contract_bytecode, tuple_contract_runtime +): + tuple_contract = w3.eth.contract( + abi=tuple_contract_abi, + bytecode=tuple_contract_bytecode, + bytecode_runtime=tuple_contract_runtime, + ) + + for event_abi in filter_abi_by_type("event", tuple_contract_abi): + # Check properties of tuple_contract.events.EventName + event_by_name = tuple_contract.events[event_abi["name"]] + if event_by_name.abi["inputs"] == event_abi["inputs"]: + assert event_by_name.name == get_name_from_abi_element_identifier( + event_abi["name"] + ) + assert event_by_name.abi == event_abi + assert event_by_name.abi_element_identifier == abi_to_signature(event_abi) + assert event_by_name.signature == abi_to_signature(event_abi) + assert event_by_name.argument_names == tuple(get_abi_input_names(event_abi)) + assert event_by_name.argument_types == tuple(get_abi_input_types(event_abi)) + + # Check properties of tuple_contract.events._EventName(arg_names) + event_by_signature = tuple_contract.events[f"_{abi_to_signature(event_abi)}"] + assert event_by_signature.name == get_name_from_abi_element_identifier( + abi_to_signature(event_abi) + ) + assert event_by_signature.abi == event_abi + assert event_by_signature.abi_element_identifier == abi_to_signature(event_abi) + assert event_by_signature.signature == abi_to_signature(event_abi) + assert event_by_signature.argument_names == tuple( + get_abi_input_names(event_abi) + ) + assert event_by_signature.argument_types == tuple( + get_abi_input_types(event_abi) + ) + + +def test_math_contract_functions_init_with_class_vars( w3, math_contract_abi, math_contract_bytecode, math_contract_runtime ): math_contract = w3.eth.contract( @@ -171,6 +209,52 @@ def test_contract_functions_init_with_class_vars( ) +def test_tuple_contract_functions_init_with_class_vars( + w3, tuple_contract_abi, tuple_contract_bytecode, tuple_contract_runtime +): + tuple_contract = w3.eth.contract( + abi=tuple_contract_abi, + bytecode=tuple_contract_bytecode, + bytecode_runtime=tuple_contract_runtime, + ) + + for function_abi in filter_abi_by_type("function", tuple_contract_abi): + # Check properties of tuple_contract.functions.FunctionName + function_by_name = tuple_contract.functions[function_abi["name"]] + if function_by_name.abi["inputs"] == function_abi["inputs"]: + assert function_by_name.name == get_name_from_abi_element_identifier( + function_abi["name"] + ) + assert function_by_name.abi == function_abi + assert function_by_name.abi_element_identifier == abi_to_signature( + function_abi + ) + assert function_by_name.signature == abi_to_signature(function_abi) + assert function_by_name.argument_names == tuple( + get_abi_input_names(function_abi) + ) + assert function_by_name.argument_types == tuple( + get_abi_input_types(function_abi) + ) + + # Check properties of tuple_contract.functions._functionName(arg_names) + function_by_signature = tuple_contract.functions[abi_to_signature(function_abi)] + assert function_by_signature.name == get_name_from_abi_element_identifier( + abi_to_signature(function_abi) + ) + assert function_by_signature.abi == function_abi + assert function_by_signature.abi_element_identifier == abi_to_signature( + function_abi + ) + assert function_by_signature.signature == abi_to_signature(function_abi) + assert function_by_signature.argument_names == tuple( + get_abi_input_names(function_abi) + ) + assert function_by_signature.argument_types == tuple( + get_abi_input_types(function_abi) + ) + + @pytest.mark.parametrize( "abi,namespace,expected_exception", ( diff --git a/web3/_utils/contract_sources/TupleContracts.sol b/web3/_utils/contract_sources/TupleContracts.sol index 23ca6e99f4..97f1c7bfa0 100644 --- a/web3/_utils/contract_sources/TupleContracts.sol +++ b/web3/_utils/contract_sources/TupleContracts.sol @@ -4,6 +4,8 @@ contract TupleContract { struct T { int x; bool[2] y; address[] z; } struct S { uint a; uint[] b; T[] c; } + event MethodCalled(S s); + function method(S memory s) public pure returns (S memory) { return s; } @@ -14,6 +16,8 @@ contract NestedTupleContract { struct T { U[] u; } struct S { T[] t; } + event MethodCalled(S s); + function method(S memory s) public pure returns (S memory) { return s; } diff --git a/web3/_utils/contract_sources/contract_data/tuple_contracts.py b/web3/_utils/contract_sources/contract_data/tuple_contracts.py index 1a1c682bdc..1cd6a5a975 100644 --- a/web3/_utils/contract_sources/contract_data/tuple_contracts.py +++ b/web3/_utils/contract_sources/contract_data/tuple_contracts.py @@ -1,12 +1,43 @@ """ Generated by `compile_contracts.py` script. -Compiled with Solidity v0.8.30. +Compiled with Solidity v0.8.17. """ # source: web3/_utils/contract_sources/TupleContracts.sol:TupleContract -TUPLE_CONTRACT_BYTECODE = "0x6080604052348015600e575f5ffd5b50610a688061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80638e1ae3c71461002d575b5f5ffd5b6100476004803603810190610042919061064d565b61005d565b6040516100549190610a12565b60405180910390f35b61006561006d565b819050919050565b60405180606001604052805f815260200160608152602001606081525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6100e8826100a2565b810181811067ffffffffffffffff82111715610107576101066100b2565b5b80604052505050565b5f61011961008d565b905061012582826100df565b919050565b5f5ffd5b5f819050919050565b6101408161012e565b811461014a575f5ffd5b50565b5f8135905061015b81610137565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561017f5761017e6100b2565b5b602082029050602081019050919050565b5f5ffd5b5f6101a66101a184610165565b610110565b905080838252602082019050602084028301858111156101c9576101c8610190565b5b835b818110156101f257806101de888261014d565b8452602084019350506020810190506101cb565b5050509392505050565b5f82601f8301126102105761020f610161565b5b8135610220848260208601610194565b91505092915050565b5f67ffffffffffffffff821115610243576102426100b2565b5b602082029050602081019050919050565b5f819050919050565b61026681610254565b8114610270575f5ffd5b50565b5f813590506102818161025d565b92915050565b5f67ffffffffffffffff8211156102a1576102a06100b2565b5b602082029050919050565b5f8115159050919050565b6102c0816102ac565b81146102ca575f5ffd5b50565b5f813590506102db816102b7565b92915050565b5f6102f36102ee84610287565b610110565b9050806020840283018581111561030d5761030c610190565b5b835b81811015610336578061032288826102cd565b84526020840193505060208101905061030f565b5050509392505050565b5f82601f83011261035457610353610161565b5b60026103618482856102e1565b91505092915050565b5f67ffffffffffffffff821115610384576103836100b2565b5b602082029050602081019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103be82610395565b9050919050565b6103ce816103b4565b81146103d8575f5ffd5b50565b5f813590506103e9816103c5565b92915050565b5f6104016103fc8461036a565b610110565b9050808382526020820190506020840283018581111561042457610423610190565b5b835b8181101561044d578061043988826103db565b845260208401935050602081019050610426565b5050509392505050565b5f82601f83011261046b5761046a610161565b5b813561047b8482602086016103ef565b91505092915050565b5f608082840312156104995761049861009e565b5b6104a36060610110565b90505f6104b284828501610273565b5f8301525060206104c584828501610340565b602083015250606082013567ffffffffffffffff8111156104e9576104e861012a565b5b6104f584828501610457565b60408301525092915050565b5f61051361050e84610229565b610110565b9050808382526020820190506020840283018581111561053657610535610190565b5b835b8181101561057d57803567ffffffffffffffff81111561055b5761055a610161565b5b8086016105688982610484565b85526020850194505050602081019050610538565b5050509392505050565b5f82601f83011261059b5761059a610161565b5b81356105ab848260208601610501565b91505092915050565b5f606082840312156105c9576105c861009e565b5b6105d36060610110565b90505f6105e28482850161014d565b5f83015250602082013567ffffffffffffffff8111156106055761060461012a565b5b610611848285016101fc565b602083015250604082013567ffffffffffffffff8111156106355761063461012a565b5b61064184828501610587565b60408301525092915050565b5f6020828403121561066257610661610096565b5b5f82013567ffffffffffffffff81111561067f5761067e61009a565b5b61068b848285016105b4565b91505092915050565b61069d8161012e565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6106d78383610694565b60208301905092915050565b5f602082019050919050565b5f6106f9826106a3565b61070381856106ad565b935061070e836106bd565b805f5b8381101561073e57815161072588826106cc565b9750610730836106e3565b925050600181019050610711565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61077d81610254565b82525050565b5f60029050919050565b5f81905092915050565b5f819050919050565b6107a9816102ac565b82525050565b5f6107ba83836107a0565b60208301905092915050565b5f602082019050919050565b6107db81610783565b6107e5818461078d565b92506107f082610797565b805f5b8381101561082057815161080787826107af565b9650610812836107c6565b9250506001810190506107f3565b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61085a816103b4565b82525050565b5f61086b8383610851565b60208301905092915050565b5f602082019050919050565b5f61088d82610828565b6108978185610832565b93506108a283610842565b805f5b838110156108d25781516108b98882610860565b97506108c483610877565b9250506001810190506108a5565b5085935050505092915050565b5f608083015f8301516108f45f860182610774565b50602083015161090760208601826107d2565b506040830151848203606086015261091f8282610883565b9150508091505092915050565b5f61093783836108df565b905092915050565b5f602082019050919050565b5f6109558261074b565b61095f8185610755565b93508360208202850161097185610765565b805f5b858110156109ac578484038952815161098d858261092c565b94506109988361093f565b925060208a01995050600181019050610974565b50829750879550505050505092915050565b5f606083015f8301516109d35f860182610694565b50602083015184820360208601526109eb82826106ef565b91505060408301518482036040860152610a05828261094b565b9150508091505092915050565b5f6020820190508181035f830152610a2a81846109be565b90509291505056fea26469706673582212207c5620c2257d173ed894791417ffad7e98aad1aab11d2ec22b5148e5d77de0c464736f6c634300081e0033" # noqa: E501 -TUPLE_CONTRACT_RUNTIME = "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80638e1ae3c71461002d575b5f5ffd5b6100476004803603810190610042919061064d565b61005d565b6040516100549190610a12565b60405180910390f35b61006561006d565b819050919050565b60405180606001604052805f815260200160608152602001606081525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6100e8826100a2565b810181811067ffffffffffffffff82111715610107576101066100b2565b5b80604052505050565b5f61011961008d565b905061012582826100df565b919050565b5f5ffd5b5f819050919050565b6101408161012e565b811461014a575f5ffd5b50565b5f8135905061015b81610137565b92915050565b5f5ffd5b5f67ffffffffffffffff82111561017f5761017e6100b2565b5b602082029050602081019050919050565b5f5ffd5b5f6101a66101a184610165565b610110565b905080838252602082019050602084028301858111156101c9576101c8610190565b5b835b818110156101f257806101de888261014d565b8452602084019350506020810190506101cb565b5050509392505050565b5f82601f8301126102105761020f610161565b5b8135610220848260208601610194565b91505092915050565b5f67ffffffffffffffff821115610243576102426100b2565b5b602082029050602081019050919050565b5f819050919050565b61026681610254565b8114610270575f5ffd5b50565b5f813590506102818161025d565b92915050565b5f67ffffffffffffffff8211156102a1576102a06100b2565b5b602082029050919050565b5f8115159050919050565b6102c0816102ac565b81146102ca575f5ffd5b50565b5f813590506102db816102b7565b92915050565b5f6102f36102ee84610287565b610110565b9050806020840283018581111561030d5761030c610190565b5b835b81811015610336578061032288826102cd565b84526020840193505060208101905061030f565b5050509392505050565b5f82601f83011261035457610353610161565b5b60026103618482856102e1565b91505092915050565b5f67ffffffffffffffff821115610384576103836100b2565b5b602082029050602081019050919050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6103be82610395565b9050919050565b6103ce816103b4565b81146103d8575f5ffd5b50565b5f813590506103e9816103c5565b92915050565b5f6104016103fc8461036a565b610110565b9050808382526020820190506020840283018581111561042457610423610190565b5b835b8181101561044d578061043988826103db565b845260208401935050602081019050610426565b5050509392505050565b5f82601f83011261046b5761046a610161565b5b813561047b8482602086016103ef565b91505092915050565b5f608082840312156104995761049861009e565b5b6104a36060610110565b90505f6104b284828501610273565b5f8301525060206104c584828501610340565b602083015250606082013567ffffffffffffffff8111156104e9576104e861012a565b5b6104f584828501610457565b60408301525092915050565b5f61051361050e84610229565b610110565b9050808382526020820190506020840283018581111561053657610535610190565b5b835b8181101561057d57803567ffffffffffffffff81111561055b5761055a610161565b5b8086016105688982610484565b85526020850194505050602081019050610538565b5050509392505050565b5f82601f83011261059b5761059a610161565b5b81356105ab848260208601610501565b91505092915050565b5f606082840312156105c9576105c861009e565b5b6105d36060610110565b90505f6105e28482850161014d565b5f83015250602082013567ffffffffffffffff8111156106055761060461012a565b5b610611848285016101fc565b602083015250604082013567ffffffffffffffff8111156106355761063461012a565b5b61064184828501610587565b60408301525092915050565b5f6020828403121561066257610661610096565b5b5f82013567ffffffffffffffff81111561067f5761067e61009a565b5b61068b848285016105b4565b91505092915050565b61069d8161012e565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f6106d78383610694565b60208301905092915050565b5f602082019050919050565b5f6106f9826106a3565b61070381856106ad565b935061070e836106bd565b805f5b8381101561073e57815161072588826106cc565b9750610730836106e3565b925050600181019050610711565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61077d81610254565b82525050565b5f60029050919050565b5f81905092915050565b5f819050919050565b6107a9816102ac565b82525050565b5f6107ba83836107a0565b60208301905092915050565b5f602082019050919050565b6107db81610783565b6107e5818461078d565b92506107f082610797565b805f5b8381101561082057815161080787826107af565b9650610812836107c6565b9250506001810190506107f3565b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61085a816103b4565b82525050565b5f61086b8383610851565b60208301905092915050565b5f602082019050919050565b5f61088d82610828565b6108978185610832565b93506108a283610842565b805f5b838110156108d25781516108b98882610860565b97506108c483610877565b9250506001810190506108a5565b5085935050505092915050565b5f608083015f8301516108f45f860182610774565b50602083015161090760208601826107d2565b506040830151848203606086015261091f8282610883565b9150508091505092915050565b5f61093783836108df565b905092915050565b5f602082019050919050565b5f6109558261074b565b61095f8185610755565b93508360208202850161097185610765565b805f5b858110156109ac578484038952815161098d858261092c565b94506109988361093f565b925060208a01995050600181019050610974565b50829750879550505050505092915050565b5f606083015f8301516109d35f860182610694565b50602083015184820360208601526109eb82826106ef565b91505060408301518482036040860152610a05828261094b565b9150508091505092915050565b5f6020820190508181035f830152610a2a81846109be565b90509291505056fea26469706673582212207c5620c2257d173ed894791417ffad7e98aad1aab11d2ec22b5148e5d77de0c464736f6c634300081e0033" # noqa: E501 +TUPLE_CONTRACT_BYTECODE = "0x608060405234801561001057600080fd5b50610abb806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80638e1ae3c714610030575b600080fd5b61004a6004803603810190610045919061067b565b610060565b6040516100579190610a63565b60405180910390f35b610068610070565b819050919050565b60405180606001604052806000815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100f3826100aa565b810181811067ffffffffffffffff82111715610112576101116100bb565b5b80604052505050565b6000610125610091565b905061013182826100ea565b919050565b600080fd5b6000819050919050565b61014e8161013b565b811461015957600080fd5b50565b60008135905061016b81610145565b92915050565b600080fd5b600067ffffffffffffffff821115610191576101906100bb565b5b602082029050602081019050919050565b600080fd5b60006101ba6101b584610176565b61011b565b905080838252602082019050602084028301858111156101dd576101dc6101a2565b5b835b8181101561020657806101f2888261015c565b8452602084019350506020810190506101df565b5050509392505050565b600082601f83011261022557610224610171565b5b81356102358482602086016101a7565b91505092915050565b600067ffffffffffffffff821115610259576102586100bb565b5b602082029050602081019050919050565b6000819050919050565b61027d8161026a565b811461028857600080fd5b50565b60008135905061029a81610274565b92915050565b600067ffffffffffffffff8211156102bb576102ba6100bb565b5b602082029050919050565b60008115159050919050565b6102db816102c6565b81146102e657600080fd5b50565b6000813590506102f8816102d2565b92915050565b600061031161030c846102a0565b61011b565b9050806020840283018581111561032b5761032a6101a2565b5b835b81811015610354578061034088826102e9565b84526020840193505060208101905061032d565b5050509392505050565b600082601f83011261037357610372610171565b5b60026103808482856102fe565b91505092915050565b600067ffffffffffffffff8211156103a4576103a36100bb565b5b602082029050602081019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103e0826103b5565b9050919050565b6103f0816103d5565b81146103fb57600080fd5b50565b60008135905061040d816103e7565b92915050565b600061042661042184610389565b61011b565b90508083825260208201905060208402830185811115610449576104486101a2565b5b835b81811015610472578061045e88826103fe565b84526020840193505060208101905061044b565b5050509392505050565b600082601f83011261049157610490610171565b5b81356104a1848260208601610413565b91505092915050565b6000608082840312156104c0576104bf6100a5565b5b6104ca606061011b565b905060006104da8482850161028b565b60008301525060206104ee8482850161035e565b602083015250606082013567ffffffffffffffff81111561051257610511610136565b5b61051e8482850161047c565b60408301525092915050565b600061053d6105388461023e565b61011b565b905080838252602082019050602084028301858111156105605761055f6101a2565b5b835b818110156105a757803567ffffffffffffffff81111561058557610584610171565b5b80860161059289826104aa565b85526020850194505050602081019050610562565b5050509392505050565b600082601f8301126105c6576105c5610171565b5b81356105d684826020860161052a565b91505092915050565b6000606082840312156105f5576105f46100a5565b5b6105ff606061011b565b9050600061060f8482850161015c565b600083015250602082013567ffffffffffffffff81111561063357610632610136565b5b61063f84828501610210565b602083015250604082013567ffffffffffffffff81111561066357610662610136565b5b61066f848285016105b1565b60408301525092915050565b6000602082840312156106915761069061009b565b5b600082013567ffffffffffffffff8111156106af576106ae6100a0565b5b6106bb848285016105df565b91505092915050565b6106cd8161013b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061070b83836106c4565b60208301905092915050565b6000602082019050919050565b600061072f826106d3565b61073981856106de565b9350610744836106ef565b8060005b8381101561077557815161075c88826106ff565b975061076783610717565b925050600181019050610748565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6107b78161026a565b82525050565b600060029050919050565b600081905092915050565b6000819050919050565b6107e6816102c6565b82525050565b60006107f883836107dd565b60208301905092915050565b6000602082019050919050565b61081a816107bd565b61082481846107c8565b925061082f826107d3565b8060005b8381101561086057815161084787826107ec565b965061085283610804565b925050600181019050610833565b505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61089d816103d5565b82525050565b60006108af8383610894565b60208301905092915050565b6000602082019050919050565b60006108d382610868565b6108dd8185610873565b93506108e883610884565b8060005b8381101561091957815161090088826108a3565b975061090b836108bb565b9250506001810190506108ec565b5085935050505092915050565b600060808301600083015161093e60008601826107ae565b5060208301516109516020860182610811565b506040830151848203606086015261096982826108c8565b9150508091505092915050565b60006109828383610926565b905092915050565b6000602082019050919050565b60006109a282610782565b6109ac818561078d565b9350836020820285016109be8561079e565b8060005b858110156109fa57848403895281516109db8582610976565b94506109e68361098a565b925060208a019950506001810190506109c2565b50829750879550505050505092915050565b6000606083016000830151610a2460008601826106c4565b5060208301518482036020860152610a3c8282610724565b91505060408301518482036040860152610a568282610997565b9150508091505092915050565b60006020820190508181036000830152610a7d8184610a0c565b90509291505056fea2646970667358221220042619588cda24763d7be2819b8c40cdd47f47ad92ac28dc1ec51552d143179e64736f6c63430008110033" # noqa: E501 +TUPLE_CONTRACT_RUNTIME = "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80638e1ae3c714610030575b600080fd5b61004a6004803603810190610045919061067b565b610060565b6040516100579190610a63565b60405180910390f35b610068610070565b819050919050565b60405180606001604052806000815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100f3826100aa565b810181811067ffffffffffffffff82111715610112576101116100bb565b5b80604052505050565b6000610125610091565b905061013182826100ea565b919050565b600080fd5b6000819050919050565b61014e8161013b565b811461015957600080fd5b50565b60008135905061016b81610145565b92915050565b600080fd5b600067ffffffffffffffff821115610191576101906100bb565b5b602082029050602081019050919050565b600080fd5b60006101ba6101b584610176565b61011b565b905080838252602082019050602084028301858111156101dd576101dc6101a2565b5b835b8181101561020657806101f2888261015c565b8452602084019350506020810190506101df565b5050509392505050565b600082601f83011261022557610224610171565b5b81356102358482602086016101a7565b91505092915050565b600067ffffffffffffffff821115610259576102586100bb565b5b602082029050602081019050919050565b6000819050919050565b61027d8161026a565b811461028857600080fd5b50565b60008135905061029a81610274565b92915050565b600067ffffffffffffffff8211156102bb576102ba6100bb565b5b602082029050919050565b60008115159050919050565b6102db816102c6565b81146102e657600080fd5b50565b6000813590506102f8816102d2565b92915050565b600061031161030c846102a0565b61011b565b9050806020840283018581111561032b5761032a6101a2565b5b835b81811015610354578061034088826102e9565b84526020840193505060208101905061032d565b5050509392505050565b600082601f83011261037357610372610171565b5b60026103808482856102fe565b91505092915050565b600067ffffffffffffffff8211156103a4576103a36100bb565b5b602082029050602081019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006103e0826103b5565b9050919050565b6103f0816103d5565b81146103fb57600080fd5b50565b60008135905061040d816103e7565b92915050565b600061042661042184610389565b61011b565b90508083825260208201905060208402830185811115610449576104486101a2565b5b835b81811015610472578061045e88826103fe565b84526020840193505060208101905061044b565b5050509392505050565b600082601f83011261049157610490610171565b5b81356104a1848260208601610413565b91505092915050565b6000608082840312156104c0576104bf6100a5565b5b6104ca606061011b565b905060006104da8482850161028b565b60008301525060206104ee8482850161035e565b602083015250606082013567ffffffffffffffff81111561051257610511610136565b5b61051e8482850161047c565b60408301525092915050565b600061053d6105388461023e565b61011b565b905080838252602082019050602084028301858111156105605761055f6101a2565b5b835b818110156105a757803567ffffffffffffffff81111561058557610584610171565b5b80860161059289826104aa565b85526020850194505050602081019050610562565b5050509392505050565b600082601f8301126105c6576105c5610171565b5b81356105d684826020860161052a565b91505092915050565b6000606082840312156105f5576105f46100a5565b5b6105ff606061011b565b9050600061060f8482850161015c565b600083015250602082013567ffffffffffffffff81111561063357610632610136565b5b61063f84828501610210565b602083015250604082013567ffffffffffffffff81111561066357610662610136565b5b61066f848285016105b1565b60408301525092915050565b6000602082840312156106915761069061009b565b5b600082013567ffffffffffffffff8111156106af576106ae6100a0565b5b6106bb848285016105df565b91505092915050565b6106cd8161013b565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061070b83836106c4565b60208301905092915050565b6000602082019050919050565b600061072f826106d3565b61073981856106de565b9350610744836106ef565b8060005b8381101561077557815161075c88826106ff565b975061076783610717565b925050600181019050610748565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6107b78161026a565b82525050565b600060029050919050565b600081905092915050565b6000819050919050565b6107e6816102c6565b82525050565b60006107f883836107dd565b60208301905092915050565b6000602082019050919050565b61081a816107bd565b61082481846107c8565b925061082f826107d3565b8060005b8381101561086057815161084787826107ec565b965061085283610804565b925050600181019050610833565b505050505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61089d816103d5565b82525050565b60006108af8383610894565b60208301905092915050565b6000602082019050919050565b60006108d382610868565b6108dd8185610873565b93506108e883610884565b8060005b8381101561091957815161090088826108a3565b975061090b836108bb565b9250506001810190506108ec565b5085935050505092915050565b600060808301600083015161093e60008601826107ae565b5060208301516109516020860182610811565b506040830151848203606086015261096982826108c8565b9150508091505092915050565b60006109828383610926565b905092915050565b6000602082019050919050565b60006109a282610782565b6109ac818561078d565b9350836020820285016109be8561079e565b8060005b858110156109fa57848403895281516109db8582610976565b94506109e68361098a565b925060208a019950506001810190506109c2565b50829750879550505050505092915050565b6000606083016000830151610a2460008601826106c4565b5060208301518482036020860152610a3c8282610724565b91505060408301518482036040860152610a568282610997565b9150508091505092915050565b60006020820190508181036000830152610a7d8184610a0c565b90509291505056fea2646970667358221220042619588cda24763d7be2819b8c40cdd47f47ad92ac28dc1ec51552d143179e64736f6c63430008110033" # noqa: E501 TUPLE_CONTRACT_ABI = [ + { + "anonymous": False, + "inputs": [ + { + "components": [ + {"internalType": "uint256", "name": "a", "type": "uint256"}, + {"internalType": "uint256[]", "name": "b", "type": "uint256[]"}, + { + "components": [ + {"internalType": "int256", "name": "x", "type": "int256"}, + {"internalType": "bool[2]", "name": "y", "type": "bool[2]"}, + { + "internalType": "address[]", + "name": "z", + "type": "address[]", + }, + ], + "internalType": "struct TupleContract.T[]", + "name": "c", + "type": "tuple[]", + }, + ], + "indexed": False, + "internalType": "struct TupleContract.S", + "name": "s", + "type": "tuple", + } + ], + "name": "MethodCalled", + "type": "event", + }, { "inputs": [ { @@ -61,7 +92,7 @@ ], "stateMutability": "pure", "type": "function", - } + }, ] TUPLE_CONTRACT_DATA = { "bytecode": TUPLE_CONTRACT_BYTECODE, @@ -71,9 +102,48 @@ # source: web3/_utils/contract_sources/TupleContracts.sol:NestedTupleContract -NESTED_TUPLE_CONTRACT_BYTECODE = "0x6080604052348015600e575f5ffd5b5061067b8061001c5f395ff3fe608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80632655aef11461002d575b5f5ffd5b610047600480360381019061004291906103f1565b61005d565b6040516100549190610625565b60405180910390f35b61006561006d565b819050919050565b6040518060200160405280606081525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6100db82610095565b810181811067ffffffffffffffff821117156100fa576100f96100a5565b5b80604052505050565b5f61010c610080565b905061011882826100d2565b919050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff82111561013f5761013e6100a5565b5b602082029050602081019050919050565b5f5ffd5b5f67ffffffffffffffff82111561016e5761016d6100a5565b5b602082029050602081019050919050565b5f819050919050565b6101918161017f565b811461019b575f5ffd5b50565b5f813590506101ac81610188565b92915050565b5f604082840312156101c7576101c6610091565b5b6101d16040610103565b90505f6101e08482850161019e565b5f8301525060206101f38482850161019e565b60208301525092915050565b5f61021161020c84610154565b610103565b9050808382526020820190506040840283018581111561023457610233610150565b5b835b8181101561025d578061024988826101b2565b845260208401935050604081019050610236565b5050509392505050565b5f82601f83011261027b5761027a610121565b5b813561028b8482602086016101ff565b91505092915050565b5f602082840312156102a9576102a8610091565b5b6102b36020610103565b90505f82013567ffffffffffffffff8111156102d2576102d161011d565b5b6102de84828501610267565b5f8301525092915050565b5f6102fb6102f684610125565b610103565b9050808382526020820190506020840283018581111561031e5761031d610150565b5b835b8181101561036557803567ffffffffffffffff81111561034357610342610121565b5b8086016103508982610294565b85526020850194505050602081019050610320565b5050509392505050565b5f82601f83011261038357610382610121565b5b81356103938482602086016102e9565b91505092915050565b5f602082840312156103b1576103b0610091565b5b6103bb6020610103565b90505f82013567ffffffffffffffff8111156103da576103d961011d565b5b6103e68482850161036f565b5f8301525092915050565b5f6020828403121561040657610405610089565b5b5f82013567ffffffffffffffff8111156104235761042261008d565b5b61042f8482850161039c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6104938161017f565b82525050565b604082015f8201516104ad5f85018261048a565b5060208201516104c0602085018261048a565b50505050565b5f6104d18383610499565b60408301905092915050565b5f602082019050919050565b5f6104f382610461565b6104fd818561046b565b93506105088361047b565b805f5b8381101561053857815161051f88826104c6565b975061052a836104dd565b92505060018101905061050b565b5085935050505092915050565b5f602083015f8301518482035f86015261055f82826104e9565b9150508091505092915050565b5f6105778383610545565b905092915050565b5f602082019050919050565b5f61059582610438565b61059f8185610442565b9350836020820285016105b185610452565b805f5b858110156105ec57848403895281516105cd858261056c565b94506105d88361057f565b925060208a019950506001810190506105b4565b50829750879550505050505092915050565b5f602083015f8301518482035f860152610618828261058b565b9150508091505092915050565b5f6020820190508181035f83015261063d81846105fe565b90509291505056fea2646970667358221220e9a46dd271224211ac317ab5deb76259a8309e527c859b3d977cfc261a3780db64736f6c634300081e0033" # noqa: E501 -NESTED_TUPLE_CONTRACT_RUNTIME = "0x608060405234801561000f575f5ffd5b5060043610610029575f3560e01c80632655aef11461002d575b5f5ffd5b610047600480360381019061004291906103f1565b61005d565b6040516100549190610625565b60405180910390f35b61006561006d565b819050919050565b6040518060200160405280606081525090565b5f604051905090565b5f5ffd5b5f5ffd5b5f5ffd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6100db82610095565b810181811067ffffffffffffffff821117156100fa576100f96100a5565b5b80604052505050565b5f61010c610080565b905061011882826100d2565b919050565b5f5ffd5b5f5ffd5b5f67ffffffffffffffff82111561013f5761013e6100a5565b5b602082029050602081019050919050565b5f5ffd5b5f67ffffffffffffffff82111561016e5761016d6100a5565b5b602082029050602081019050919050565b5f819050919050565b6101918161017f565b811461019b575f5ffd5b50565b5f813590506101ac81610188565b92915050565b5f604082840312156101c7576101c6610091565b5b6101d16040610103565b90505f6101e08482850161019e565b5f8301525060206101f38482850161019e565b60208301525092915050565b5f61021161020c84610154565b610103565b9050808382526020820190506040840283018581111561023457610233610150565b5b835b8181101561025d578061024988826101b2565b845260208401935050604081019050610236565b5050509392505050565b5f82601f83011261027b5761027a610121565b5b813561028b8482602086016101ff565b91505092915050565b5f602082840312156102a9576102a8610091565b5b6102b36020610103565b90505f82013567ffffffffffffffff8111156102d2576102d161011d565b5b6102de84828501610267565b5f8301525092915050565b5f6102fb6102f684610125565b610103565b9050808382526020820190506020840283018581111561031e5761031d610150565b5b835b8181101561036557803567ffffffffffffffff81111561034357610342610121565b5b8086016103508982610294565b85526020850194505050602081019050610320565b5050509392505050565b5f82601f83011261038357610382610121565b5b81356103938482602086016102e9565b91505092915050565b5f602082840312156103b1576103b0610091565b5b6103bb6020610103565b90505f82013567ffffffffffffffff8111156103da576103d961011d565b5b6103e68482850161036f565b5f8301525092915050565b5f6020828403121561040657610405610089565b5b5f82013567ffffffffffffffff8111156104235761042261008d565b5b61042f8482850161039c565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6104938161017f565b82525050565b604082015f8201516104ad5f85018261048a565b5060208201516104c0602085018261048a565b50505050565b5f6104d18383610499565b60408301905092915050565b5f602082019050919050565b5f6104f382610461565b6104fd818561046b565b93506105088361047b565b805f5b8381101561053857815161051f88826104c6565b975061052a836104dd565b92505060018101905061050b565b5085935050505092915050565b5f602083015f8301518482035f86015261055f82826104e9565b9150508091505092915050565b5f6105778383610545565b905092915050565b5f602082019050919050565b5f61059582610438565b61059f8185610442565b9350836020820285016105b185610452565b805f5b858110156105ec57848403895281516105cd858261056c565b94506105d88361057f565b925060208a019950506001810190506105b4565b50829750879550505050505092915050565b5f602083015f8301518482035f860152610618828261058b565b9150508091505092915050565b5f6020820190508181035f83015261063d81846105fe565b90509291505056fea2646970667358221220e9a46dd271224211ac317ab5deb76259a8309e527c859b3d977cfc261a3780db64736f6c634300081e0033" # noqa: E501 +NESTED_TUPLE_CONTRACT_BYTECODE = "0x608060405234801561001057600080fd5b506106b5806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80632655aef114610030575b600080fd5b61004a60048036038101906100459190610411565b610060565b604051610057919061065d565b60405180910390f35b610068610070565b819050919050565b6040518060200160405280606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100e58261009c565b810181811067ffffffffffffffff82111715610104576101036100ad565b5b80604052505050565b6000610117610083565b905061012382826100dc565b919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561014d5761014c6100ad565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff82111561017e5761017d6100ad565b5b602082029050602081019050919050565b6000819050919050565b6101a28161018f565b81146101ad57600080fd5b50565b6000813590506101bf81610199565b92915050565b6000604082840312156101db576101da610097565b5b6101e5604061010d565b905060006101f5848285016101b0565b6000830152506020610209848285016101b0565b60208301525092915050565b600061022861022384610163565b61010d565b9050808382526020820190506040840283018581111561024b5761024a61015e565b5b835b81811015610274578061026088826101c5565b84526020840193505060408101905061024d565b5050509392505050565b600082601f8301126102935761029261012d565b5b81356102a3848260208601610215565b91505092915050565b6000602082840312156102c2576102c1610097565b5b6102cc602061010d565b9050600082013567ffffffffffffffff8111156102ec576102eb610128565b5b6102f88482850161027e565b60008301525092915050565b600061031761031284610132565b61010d565b9050808382526020820190506020840283018581111561033a5761033961015e565b5b835b8181101561038157803567ffffffffffffffff81111561035f5761035e61012d565b5b80860161036c89826102ac565b8552602085019450505060208101905061033c565b5050509392505050565b600082601f8301126103a05761039f61012d565b5b81356103b0848260208601610304565b91505092915050565b6000602082840312156103cf576103ce610097565b5b6103d9602061010d565b9050600082013567ffffffffffffffff8111156103f9576103f8610128565b5b6104058482850161038b565b60008301525092915050565b6000602082840312156104275761042661008d565b5b600082013567ffffffffffffffff81111561044557610444610092565b5b610451848285016103b9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6104bb8161018f565b82525050565b6040820160008201516104d760008501826104b2565b5060208201516104ea60208501826104b2565b50505050565b60006104fc83836104c1565b60408301905092915050565b6000602082019050919050565b600061052082610486565b61052a8185610491565b9350610535836104a2565b8060005b8381101561056657815161054d88826104f0565b975061055883610508565b925050600181019050610539565b5085935050505092915050565b600060208301600083015184820360008601526105908282610515565b9150508091505092915050565b60006105a98383610573565b905092915050565b6000602082019050919050565b60006105c98261045a565b6105d38185610465565b9350836020820285016105e585610476565b8060005b858110156106215784840389528151610602858261059d565b945061060d836105b1565b925060208a019950506001810190506105e9565b50829750879550505050505092915050565b6000602083016000830151848203600086015261065082826105be565b9150508091505092915050565b600060208201905081810360008301526106778184610633565b90509291505056fea26469706673582212202a838dda2a296e490d48e2d6424968762b9d39ee3d67ce4681a98e1da712ec0864736f6c63430008110033" # noqa: E501 +NESTED_TUPLE_CONTRACT_RUNTIME = "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80632655aef114610030575b600080fd5b61004a60048036038101906100459190610411565b610060565b604051610057919061065d565b60405180910390f35b610068610070565b819050919050565b6040518060200160405280606081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100e58261009c565b810181811067ffffffffffffffff82111715610104576101036100ad565b5b80604052505050565b6000610117610083565b905061012382826100dc565b919050565b600080fd5b600080fd5b600067ffffffffffffffff82111561014d5761014c6100ad565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff82111561017e5761017d6100ad565b5b602082029050602081019050919050565b6000819050919050565b6101a28161018f565b81146101ad57600080fd5b50565b6000813590506101bf81610199565b92915050565b6000604082840312156101db576101da610097565b5b6101e5604061010d565b905060006101f5848285016101b0565b6000830152506020610209848285016101b0565b60208301525092915050565b600061022861022384610163565b61010d565b9050808382526020820190506040840283018581111561024b5761024a61015e565b5b835b81811015610274578061026088826101c5565b84526020840193505060408101905061024d565b5050509392505050565b600082601f8301126102935761029261012d565b5b81356102a3848260208601610215565b91505092915050565b6000602082840312156102c2576102c1610097565b5b6102cc602061010d565b9050600082013567ffffffffffffffff8111156102ec576102eb610128565b5b6102f88482850161027e565b60008301525092915050565b600061031761031284610132565b61010d565b9050808382526020820190506020840283018581111561033a5761033961015e565b5b835b8181101561038157803567ffffffffffffffff81111561035f5761035e61012d565b5b80860161036c89826102ac565b8552602085019450505060208101905061033c565b5050509392505050565b600082601f8301126103a05761039f61012d565b5b81356103b0848260208601610304565b91505092915050565b6000602082840312156103cf576103ce610097565b5b6103d9602061010d565b9050600082013567ffffffffffffffff8111156103f9576103f8610128565b5b6104058482850161038b565b60008301525092915050565b6000602082840312156104275761042661008d565b5b600082013567ffffffffffffffff81111561044557610444610092565b5b610451848285016103b9565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6104bb8161018f565b82525050565b6040820160008201516104d760008501826104b2565b5060208201516104ea60208501826104b2565b50505050565b60006104fc83836104c1565b60408301905092915050565b6000602082019050919050565b600061052082610486565b61052a8185610491565b9350610535836104a2565b8060005b8381101561056657815161054d88826104f0565b975061055883610508565b925050600181019050610539565b5085935050505092915050565b600060208301600083015184820360008601526105908282610515565b9150508091505092915050565b60006105a98383610573565b905092915050565b6000602082019050919050565b60006105c98261045a565b6105d38185610465565b9350836020820285016105e585610476565b8060005b858110156106215784840389528151610602858261059d565b945061060d836105b1565b925060208a019950506001810190506105e9565b50829750879550505050505092915050565b6000602083016000830151848203600086015261065082826105be565b9150508091505092915050565b600060208201905081810360008301526106778184610633565b90509291505056fea26469706673582212202a838dda2a296e490d48e2d6424968762b9d39ee3d67ce4681a98e1da712ec0864736f6c63430008110033" # noqa: E501 NESTED_TUPLE_CONTRACT_ABI = [ + { + "anonymous": False, + "inputs": [ + { + "components": [ + { + "components": [ + { + "components": [ + { + "internalType": "int256", + "name": "x", + "type": "int256", + }, + { + "internalType": "int256", + "name": "y", + "type": "int256", + }, + ], + "internalType": "struct NestedTupleContract.U[]", + "name": "u", + "type": "tuple[]", + } + ], + "internalType": "struct NestedTupleContract.T[]", + "name": "t", + "type": "tuple[]", + } + ], + "indexed": False, + "internalType": "struct NestedTupleContract.S", + "name": "s", + "type": "tuple", + } + ], + "name": "MethodCalled", + "type": "event", + }, { "inputs": [ { @@ -144,7 +214,7 @@ ], "stateMutability": "pure", "type": "function", - } + }, ] NESTED_TUPLE_CONTRACT_DATA = { "bytecode": NESTED_TUPLE_CONTRACT_BYTECODE, diff --git a/web3/contract/base_contract.py b/web3/contract/base_contract.py index 6e9c3c9a04..fb8f42eaad 100644 --- a/web3/contract/base_contract.py +++ b/web3/contract/base_contract.py @@ -32,6 +32,7 @@ from eth_utils import ( abi_to_signature, add_0x_prefix, + collapse_if_tuple, combomethod, encode_hex, filter_abi_by_type, @@ -193,7 +194,9 @@ def __init__(self, *argument_names: str, abi: Optional[ABIEvent] = None) -> None event_inputs = self.abi.get("inputs", []) self.argument_names = tuple([input.get("name", None) for input in event_inputs]) - self.argument_types = tuple([input["type"] for input in event_inputs]) + self.argument_types = tuple( + [collapse_if_tuple(input) for input in event_inputs] + ) def __repr__(self) -> str: if self.abi: @@ -594,7 +597,9 @@ def __init__(self, abi: Optional[ABIFunction] = None) -> None: event_inputs = self.abi.get("inputs", []) self.argument_names = tuple([input.get("name", None) for input in event_inputs]) - self.argument_types = tuple([input["type"] for input in event_inputs]) + self.argument_types = tuple( + [collapse_if_tuple(input) for input in event_inputs] + ) @combomethod def _get_abi(cls) -> ABIFunction: