Skip to content

Commit 6ea308a

Browse files
author
Stuart Reed
committed
get_event_data, get_function_info utilities available via public API
1 parent 87152bd commit 6ea308a

File tree

7 files changed

+98
-5
lines changed

7 files changed

+98
-5
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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

tests/core/contracts/test_extracting_event_data.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
dissoc,
99
)
1010

11-
from web3._utils.events import (
11+
from web3.contract.utils import (
1212
get_event_data,
1313
)
1414
from web3.exceptions import (

tests/core/contracts/test_extracting_event_data_old.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
is_same_address,
55
)
66

7-
from web3._utils.events import (
7+
from web3.contract.utils import (
88
get_event_data,
99
)
1010

web3/contract/async_contract.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545
)
4646
from web3._utils.events import (
4747
AsyncEventFilterBuilder,
48-
get_event_data,
4948
)
5049
from web3._utils.filters import (
5150
AsyncLogFilter,
@@ -76,6 +75,7 @@
7675
async_estimate_gas_for_function,
7776
async_transact_with_contract_function,
7877
find_functions_by_identifier,
78+
get_event_data,
7979
get_function_by_identifier,
8080
)
8181
from web3.exceptions import (

web3/contract/base_contract.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@
6565
from web3._utils.events import (
6666
AsyncEventFilterBuilder,
6767
EventFilterBuilder,
68-
get_event_data,
6968
is_dynamic_sized_type,
7069
)
7170
from web3._utils.filters import (
@@ -78,6 +77,9 @@
7877
from web3._utils.normalizers import (
7978
BASE_RETURN_NORMALIZERS,
8079
)
80+
from web3.contract.utils import (
81+
get_event_data,
82+
)
8183
from web3.datastructures import (
8284
AttributeDict,
8385
MutableAttributeDict,

web3/contract/contract.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
)
4242
from web3._utils.events import (
4343
EventFilterBuilder,
44-
get_event_data,
4544
)
4645
from web3._utils.filters import (
4746
LogFilter,
@@ -74,6 +73,7 @@
7473
call_contract_function,
7574
estimate_gas_for_function,
7675
find_functions_by_identifier,
76+
get_event_data,
7777
get_function_by_identifier,
7878
transact_with_contract_function,
7979
)

web3/contract/utils.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,18 @@
1111
Union,
1212
)
1313

14+
from eth_abi.codec import (
15+
ABICodec,
16+
)
1417
from eth_abi.exceptions import (
1518
DecodingError,
1619
)
1720
from eth_typing import (
1821
ChecksumAddress,
22+
HexStr,
23+
)
24+
from eth_utils.toolz import (
25+
curry,
1926
)
2027
from hexbytes import (
2128
HexBytes,
@@ -33,8 +40,12 @@
3340
)
3441
from web3._utils.contracts import (
3542
find_matching_fn_abi,
43+
get_function_info as _get_function_info,
3644
prepare_transaction,
3745
)
46+
from web3._utils.events import (
47+
get_event_data as _get_event_data,
48+
)
3849
from web3._utils.normalizers import (
3950
BASE_RETURN_NORMALIZERS,
4051
)
@@ -46,9 +57,12 @@
4657
)
4758
from web3.types import (
4859
ABI,
60+
ABIEvent,
4961
ABIFunction,
5062
BlockIdentifier,
63+
EventData,
5164
FunctionIdentifier,
65+
LogReceipt,
5266
StateOverride,
5367
TContractFn,
5468
TxParams,
@@ -269,6 +283,26 @@ def get_function_by_identifier(
269283
return fns[0]
270284

271285

286+
def get_function_info(
287+
fn_name: str,
288+
abi_codec: ABICodec,
289+
contract_abi: Optional[ABI] = None,
290+
fn_abi: Optional[ABIFunction] = None,
291+
args: Optional[Sequence[Any]] = None,
292+
kwargs: Optional[Any] = None,
293+
) -> Tuple[ABIFunction, HexStr, Tuple[Any, ...]]:
294+
return _get_function_info(fn_name, abi_codec, contract_abi, fn_abi, args, kwargs)
295+
296+
297+
@curry
298+
def get_event_data(
299+
abi_codec: ABICodec,
300+
event_abi: ABIEvent,
301+
log_entry: LogReceipt,
302+
) -> EventData:
303+
return _get_event_data(abi_codec, event_abi, log_entry)
304+
305+
272306
# --- async --- #
273307

274308

0 commit comments

Comments
 (0)