Merge pull request #3014 from theref/functionAbi

Resolve `function_abi` AFTER condition is initialized
pull/3020/head
KPrasch 2022-11-15 16:29:53 +00:00 committed by GitHub
commit 0f27f974b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 27 additions and 8 deletions

View File

@ -0,0 +1 @@
Call `_resolve_abi` after the condition is initialized

View File

@ -251,14 +251,13 @@ class ContractCondition(RPCCondition):
super().__init__(*args, **kwargs)
self.w3 = Web3() # used to instantiate contract function without a provider
if standard_contract_type and function_abi:
raise InvalidCondition(
"Only one of 'standard_contract_type' or 'function_abi' may be provided."
)
# preprocessing
contract_address = to_checksum_address(contract_address)
function_abi = _resolve_abi(
w3=self.w3,
standard_contract_type=standard_contract_type,
method=self.method,
function_abi=function_abi
)
# spec
self.contract_address = contract_address
@ -281,9 +280,15 @@ class ContractCondition(RPCCondition):
def _get_unbound_contract_function(self) -> ContractFunction:
"""Gets an unbound contract function to evaluate for this condition"""
function_abi = _resolve_abi(
w3=self.w3,
standard_contract_type=self.standard_contract_type,
method=self.method,
function_abi=self.function_abi,
)
try:
contract = self.w3.eth.contract(
address=self.contract_address, abi=[self.function_abi]
address=self.contract_address, abi=[function_abi]
)
contract_function = getattr(contract.functions, self.method)
return contract_function

View File

@ -111,3 +111,17 @@ def test_invalid_contract_condition():
":hrac",
],
)
# standard contract type and function ABI
with pytest.raises(InvalidCondition):
_ = ContractCondition(
contract_address="0xaDD9D957170dF6F33982001E4c22eCCdd5539118",
method="balanceOf",
chain=TESTERCHAIN_CHAIN_ID,
standard_contract_type="ERC20",
function_abi={"rando": "ABI"},
return_value_test=ReturnValueTest("!=", 0),
parameters=[
":hrac",
],
)

View File

@ -37,7 +37,6 @@ def test_evm_condition_json_serializers(ERC1155_balance_condition_data):
serialized_data = condition.to_json()
deserialized_data = json.loads(serialized_data)
deserialized_data.pop("functionAbi")
assert json.loads(original_data) == deserialized_data