|
| 1 | +import pytest |
| 2 | + |
| 3 | +from web3.contract.utils import ( |
| 4 | + get_function_info, |
| 5 | +) |
| 6 | + |
| 7 | + |
| 8 | +def get_contract_fn_abi(fn_name, args, kwargs, contract_abi): |
| 9 | + fn_abis_with_name = [abi for abi in contract_abi if abi["name"] == fn_name] |
| 10 | + |
| 11 | + # match function by args |
| 12 | + if len(args) > 0: |
| 13 | + for abi in fn_abis_with_name: |
| 14 | + if len(abi["inputs"]) == len(args): |
| 15 | + return abi |
| 16 | + |
| 17 | + # match function by kwargs |
| 18 | + if len(kwargs.keys()) > 0: |
| 19 | + for abi in fn_abis_with_name: |
| 20 | + inputs = [input["name"] for input in abi["inputs"]] |
| 21 | + if set(inputs) == kwargs.keys(): |
| 22 | + return abi |
| 23 | + |
| 24 | + return fn_abis_with_name[0] |
| 25 | + |
| 26 | + |
| 27 | +@pytest.mark.parametrize( |
| 28 | + "fn_name,args,kwargs,fn_selector,fn_arguments", |
| 29 | + [ |
| 30 | + ("add", (1, 2), {}, "0xa5f3c23b", (1, 2)), |
| 31 | + ("counter", (), {}, "0x61bc221a", ()), |
| 32 | + ("incrementCounter", (), {}, "0x5b34b966", ()), |
| 33 | + ("incrementCounter", (), {"amount": 1}, "0x6abbb3b4", (1,)), |
| 34 | + ("incrementCounter", (1,), {}, "0x6abbb3b4", (1,)), |
| 35 | + ("multiply7", (100,), {}, "0xdcf537b1", (100,)), |
| 36 | + ("return13", (), {}, "0x16216f39", ()), |
| 37 | + ], |
| 38 | +) |
| 39 | +def test_get_function_info_for_math_contract( |
| 40 | + w3, math_contract_abi, fn_name, args, kwargs, fn_selector, fn_arguments |
| 41 | +): |
| 42 | + fn_info_abi, fn_info_selector, fn_info_arguments = get_function_info( |
| 43 | + # fn_info = get_function_info( |
| 44 | + fn_name, |
| 45 | + w3.codec, |
| 46 | + contract_abi=math_contract_abi, |
| 47 | + args=args, |
| 48 | + kwargs=kwargs, |
| 49 | + ) |
| 50 | + |
| 51 | + # Identify abi for fn_name from math_contract_abi |
| 52 | + fn_abi = get_contract_fn_abi(fn_name, args, kwargs, math_contract_abi) |
| 53 | + |
| 54 | + assert fn_info_abi == fn_abi |
| 55 | + assert fn_info_selector == fn_selector |
| 56 | + assert len(fn_info_arguments) == len(fn_arguments) |
| 57 | + assert fn_info_arguments == fn_arguments |
0 commit comments