Skip to content

Commit 5b4c87f

Browse files
committed
contract caller tests added and passing
1 parent 4872693 commit 5b4c87f

File tree

5 files changed

+114
-35
lines changed

5 files changed

+114
-35
lines changed

tests/core/contracts/test_contract_caller_interface.py

Lines changed: 80 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ def test_caller_with_args_and_no_transaction_keyword(
149149

150150
add_result = contract.add(3, 5)
151151
assert add_result == 8
152-
152+
153153

154154
@pytest.mark.parametrize(
155155
"method_input, expected, type_str, namedtuple_repr",
@@ -207,12 +207,13 @@ def test_caller_with_args_and_no_transaction_keyword(
207207
),
208208
)
209209
def test_tuple_contract_caller_with_decode_tuples(
210-
tuple_contract_with_decode_tuples, method_input, expected, type_str, namedtuple_repr, transaction_dict
210+
tuple_contract_with_decode_tuples,
211+
method_input,
212+
expected,
213+
type_str,
214+
namedtuple_repr,
211215
):
212-
# result = tuple_contract_with_decode_tuples.caller(transaction=transaction_dict).method(method_input)
213-
result = tuple_contract_with_decode_tuples.caller(decode_tuples=True).method(method_input)
214-
caller = tuple_contract_with_decode_tuples.caller
215-
breakpoint()
216+
result = tuple_contract_with_decode_tuples.caller.method(method_input)
216217
assert result == expected
217218
assert str(type(result)) == type_str
218219
assert result.__repr__() == namedtuple_repr
@@ -221,7 +222,6 @@ def test_tuple_contract_caller_with_decode_tuples(
221222
assert str(type(result)) == type_str
222223
assert result.__repr__() == namedtuple_repr
223224

224-
225225
# --- async --- #
226226

227227

@@ -369,3 +369,76 @@ async def test_async_caller_with_args_and_no_transaction_keyword(
369369

370370
add_result = await contract.add(3, 5)
371371
assert add_result == 8
372+
373+
374+
@pytest.mark.parametrize(
375+
"method_input, expected, type_str, namedtuple_repr",
376+
(
377+
(
378+
{
379+
"a": 123,
380+
"b": [1, 2],
381+
"c": [
382+
{
383+
"x": 234,
384+
"y": [True, False],
385+
"z": [
386+
"0x4AD7E79d88650B01EEA2B1f069f01EE9db343d5c",
387+
"0xfdF1946A9b40245224488F1a36f4A9ed4844a523",
388+
"0xfdF1946A9b40245224488F1a36f4A9ed4844a523",
389+
],
390+
},
391+
{
392+
"x": 345,
393+
"y": [False, False],
394+
"z": [
395+
"0xefd1FF70c185A1C0b125939815225199079096Ee",
396+
"0xf35C0784794F3Cd935F5754d3a0EbcE95bEf851e",
397+
],
398+
},
399+
],
400+
},
401+
(
402+
123,
403+
[1, 2],
404+
[
405+
(
406+
234,
407+
[True, False],
408+
[
409+
"0x4AD7E79d88650B01EEA2B1f069f01EE9db343d5c",
410+
"0xfdF1946A9b40245224488F1a36f4A9ed4844a523",
411+
"0xfdF1946A9b40245224488F1a36f4A9ed4844a523",
412+
],
413+
),
414+
(
415+
345,
416+
[False, False],
417+
[
418+
"0xefd1FF70c185A1C0b125939815225199079096Ee",
419+
"0xf35C0784794F3Cd935F5754d3a0EbcE95bEf851e",
420+
],
421+
),
422+
],
423+
),
424+
"<class 'web3._utils.abi.abi_decoded_namedtuple_factory.<locals>.ABIDecodedNamedTuple'>", # noqa: E501
425+
"ABIDecodedNamedTuple(a=123, b=[1, 2], c=[ABIDecodedNamedTuple(x=234, y=[True, False], z=['0x4AD7E79d88650B01EEA2B1f069f01EE9db343d5c', '0xfdF1946A9b40245224488F1a36f4A9ed4844a523', '0xfdF1946A9b40245224488F1a36f4A9ed4844a523']), ABIDecodedNamedTuple(x=345, y=[False, False], z=['0xefd1FF70c185A1C0b125939815225199079096Ee', '0xf35C0784794F3Cd935F5754d3a0EbcE95bEf851e'])])", # noqa: E501
426+
),
427+
),
428+
)
429+
@pytest.mark.asyncio
430+
async def test_async_tuple_contract_caller_with_decode_tuples(
431+
async_tuple_contract_with_decode_tuples,
432+
method_input,
433+
expected,
434+
type_str,
435+
namedtuple_repr,
436+
):
437+
result = await async_tuple_contract_with_decode_tuples.caller.method(method_input)
438+
assert result == expected
439+
assert str(type(result)) == type_str
440+
assert result.__repr__() == namedtuple_repr
441+
result = await async_tuple_contract_with_decode_tuples.caller().method(method_input)
442+
assert result == expected
443+
assert str(type(result)) == type_str
444+
assert result.__repr__() == namedtuple_repr

tests/core/contracts/test_contract_example.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,7 @@ def test_initial_greeting(foo_contract):
8383

8484
def test_can_update_greeting(w3, foo_contract):
8585
# send transaction that updates the greeting
86-
tx_hash = foo_contract.functions.setBar(
87-
"testing contracts is easy",
88-
).transact(
86+
tx_hash = foo_contract.functions.setBar("testing contracts is easy",).transact(
8987
{
9088
"from": w3.eth.accounts[1],
9189
}
@@ -99,9 +97,7 @@ def test_can_update_greeting(w3, foo_contract):
9997

10098
def test_updating_greeting_emits_event(w3, foo_contract):
10199
# send transaction that updates the greeting
102-
tx_hash = foo_contract.functions.setBar(
103-
"testing contracts is easy",
104-
).transact(
100+
tx_hash = foo_contract.functions.setBar("testing contracts is easy",).transact(
105101
{
106102
"from": w3.eth.accounts[1],
107103
}

web3/contract/async_contract.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,9 +117,11 @@ def __init__(self, address: Optional[ChecksumAddress] = None) -> None:
117117
"The address argument is required to instantiate a contract."
118118
)
119119
self.functions = AsyncContractFunctions(
120-
self.abi, self.w3, self.address, self.decode_tuples
120+
self.abi, self.w3, self.address, decode_tuples=self.decode_tuples
121+
)
122+
self.caller = AsyncContractCaller(
123+
self.abi, self.w3, self.address, decode_tuples=self.decode_tuples
121124
)
122-
self.caller = AsyncContractCaller(self.abi, self.w3, self.address)
123125
self.events = AsyncContractEvents(self.abi, self.w3, self.address)
124126
self.fallback = AsyncContract.get_fallback_function(
125127
self.abi, self.w3, AsyncContractFunction, self.address
@@ -151,10 +153,13 @@ def factory(
151153
),
152154
)
153155
contract.functions = AsyncContractFunctions(
154-
contract.abi, contract.w3, contract.decode_tuples
156+
contract.abi, contract.w3, decode_tuples=contract.decode_tuples
155157
)
156158
contract.caller = AsyncContractCaller(
157-
contract.abi, contract.w3, contract.address
159+
contract.abi,
160+
contract.w3,
161+
contract.address,
162+
decode_tuples=contract.decode_tuples,
158163
)
159164
contract.events = AsyncContractEvents(contract.abi, contract.w3)
160165
contract.fallback = AsyncContract.get_fallback_function(
@@ -254,6 +259,7 @@ async def call(
254259
block_identifier: BlockIdentifier = "latest",
255260
state_override: Optional[CallOverride] = None,
256261
ccip_read_enabled: Optional[bool] = None,
262+
decode_tuples: Optional[bool] = None,
257263
) -> Any:
258264
"""
259265
Execute a contract function call using the `eth_call` interface.
@@ -294,7 +300,7 @@ async def call(
294300
self.abi,
295301
state_override,
296302
ccip_read_enabled,
297-
self.decode_tuples,
303+
decode_tuples,
298304
*self.args,
299305
**self.kwargs,
300306
)
@@ -502,4 +508,5 @@ def __call__(
502508
transaction=transaction,
503509
block_identifier=block_identifier,
504510
ccip_read_enabled=ccip_read_enabled,
511+
decode_tuples=self.decode_tuples,
505512
)

web3/contract/base_contract.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,7 @@ def call(
691691
block_identifier: BlockIdentifier = "latest",
692692
state_override: Optional[CallOverride] = None,
693693
ccip_read_enabled: Optional[bool] = None,
694+
decode_tuples: Optional[bool] = False,
694695
) -> Any:
695696
# This was needed for typing
696697
raise NotImplementedError(
@@ -1092,7 +1093,6 @@ def __init__(
10921093
ccip_read_enabled: Optional[bool] = None,
10931094
decode_tuples: Optional[bool] = False,
10941095
) -> None:
1095-
print(decode_tuples)
10961096
self.w3 = w3
10971097
self.address = address
10981098
self.abi = abi
@@ -1111,6 +1111,7 @@ def __init__(
11111111
contract_abi=self.abi,
11121112
address=self.address,
11131113
function_identifier=func["name"],
1114+
decode_tuples=decode_tuples,
11141115
)
11151116

11161117
block_id = parse_block_identifier(self.w3, block_identifier)
@@ -1120,6 +1121,7 @@ def __init__(
11201121
transaction=transaction,
11211122
block_identifier=block_id,
11221123
ccip_read_enabled=ccip_read_enabled,
1124+
decode_tuples=decode_tuples,
11231125
)
11241126

11251127
setattr(self, func["name"], caller_method)
@@ -1158,6 +1160,7 @@ def call_function(
11581160
transaction: Optional[TxParams] = None,
11591161
block_identifier: BlockIdentifier = "latest",
11601162
ccip_read_enabled: Optional[bool] = None,
1163+
decode_tuples: Optional[bool] = False,
11611164
**kwargs: Any,
11621165
) -> Any:
11631166
if transaction is None:
@@ -1166,4 +1169,5 @@ def call_function(
11661169
transaction=transaction,
11671170
block_identifier=block_identifier,
11681171
ccip_read_enabled=ccip_read_enabled,
1172+
decode_tuples=decode_tuples,
11691173
)

web3/contract/contract.py

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,11 @@ def __init__(self, address: Optional[ChecksumAddress] = None) -> None:
233233
)
234234

235235
self.functions = ContractFunctions(
236-
self.abi, _w3, self.address, self.decode_tuples
236+
self.abi, _w3, self.address, decode_tuples=self.decode_tuples
237+
)
238+
self.caller = ContractCaller(
239+
self.abi, _w3, self.address, decode_tuples=self.decode_tuples
237240
)
238-
self.caller = ContractCaller(self.abi, _w3, self.address, self.decode_tuples)
239241
self.events = ContractEvents(self.abi, _w3, self.address)
240242
self.fallback = Contract.get_fallback_function(
241243
self.abi,
@@ -272,17 +274,15 @@ def factory(
272274
normalizers=normalizers,
273275
),
274276
)
275-
# if contract.decode_tuples:
276-
# breakpoint()
277-
# else:
278-
# print("passsing!", contract.all_functions())
279-
280277
contract.functions = ContractFunctions(
281-
contract.abi, contract.w3, contract.decode_tuples
278+
contract.abi, contract.w3, decode_tuples=contract.decode_tuples
279+
)
280+
contract.caller = ContractCaller(
281+
contract.abi,
282+
contract.w3,
283+
contract.address,
284+
decode_tuples=contract.decode_tuples,
282285
)
283-
contract.caller = ContractCaller(contract.abi, contract.w3, contract.address, contract.decode_tuples)
284-
# if contract.decode_tuples:
285-
# breakpoint()
286286
contract.events = ContractEvents(contract.abi, contract.w3)
287287
contract.fallback = Contract.get_fallback_function(
288288
contract.abi,
@@ -376,6 +376,7 @@ def call(
376376
block_identifier: BlockIdentifier = "latest",
377377
state_override: Optional[CallOverride] = None,
378378
ccip_read_enabled: Optional[bool] = None,
379+
decode_tuples: Optional[bool] = False,
379380
) -> Any:
380381
"""
381382
Execute a contract function call using the `eth_call` interface.
@@ -416,7 +417,7 @@ def call(
416417
self.abi,
417418
state_override,
418419
ccip_read_enabled,
419-
self.decode_tuples,
420+
decode_tuples,
420421
*self.args,
421422
**self.kwargs,
422423
)
@@ -477,7 +478,6 @@ def __init__(
477478
ccip_read_enabled: Optional[bool] = None,
478479
decode_tuples: Optional[bool] = False,
479480
) -> None:
480-
# breakpoint()
481481
super().__init__(
482482
abi=abi,
483483
w3=w3,
@@ -493,18 +493,17 @@ def __call__(
493493
self,
494494
transaction: Optional[TxParams] = None,
495495
block_identifier: BlockIdentifier = "latest",
496-
state_override: Optional[CallOverride] = None,
497496
ccip_read_enabled: Optional[bool] = None,
498-
decode_tuples: Optional[bool] = False,
499497
) -> "ContractCaller":
500498
if transaction is None:
501499
transaction = {}
500+
502501
return type(self)(
503502
self.abi,
504503
self.w3,
505504
self.address,
506505
transaction=transaction,
507506
block_identifier=block_identifier,
508507
ccip_read_enabled=ccip_read_enabled,
509-
decode_tuples=decode_tuples,
508+
decode_tuples=self.decode_tuples,
510509
)

0 commit comments

Comments
 (0)