Skip to content

Commit ed3f244

Browse files
authored
fix(Contracts): only update contract cache with proper merge of ABI (#2568)
1 parent 7985c6a commit ed3f244

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
"web3[tester]>=6.20.1,<8",
122122
# ** Dependencies maintained by ApeWorX **
123123
"eip712>=0.2.10,<0.3",
124-
"ethpm-types>=0.6.23,<0.7",
124+
"ethpm-types>=0.6.25,<0.7",
125125
"eth_pydantic_types>=0.1.3,<0.2",
126126
"evmchains>=0.1.0,<0.2",
127127
"evm-trace>=0.2.3,<0.3",

src/ape/managers/_contractscache.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -955,5 +955,9 @@ def _merge_abis(base_contract: ContractType, extra_abis: list[ABI]) -> ContractT
955955
def _merge_contract_types(
956956
base_contract_type: ContractType, additive_contract_type: ContractType
957957
) -> ContractType:
958+
existing_methods = set(_get_relevant_additive_abis(base_contract_type))
958959
relevant_abis = _get_relevant_additive_abis(additive_contract_type)
959-
return _merge_abis(base_contract_type, relevant_abis)
960+
return _merge_abis(
961+
base_contract_type,
962+
[abi for abi in relevant_abis if abi not in existing_methods],
963+
)

tests/functional/test_contracts_cache.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from ape.contracts import ContractInstance
66
from ape.exceptions import ContractNotFoundError, ConversionError
77
from ape.logging import LogLevel, logger
8+
from ape.managers._contractscache import _merge_contract_types
89
from ape_ethereum.proxies import ProxyInfo, ProxyType, _make_minimal_proxy
910
from tests.conftest import explorer_test, skip_if_plugin_installed
1011

@@ -19,6 +20,15 @@ def contract_1(solidity_contract_container):
1920
return solidity_contract_container
2021

2122

23+
def test_merge_contract_types(contract_instance):
24+
ct = contract_instance.contract_type
25+
modified_ct = ct.model_copy(deep=True)
26+
modified_ct.view_methods[0].name = "foo"
27+
new_ct = _merge_contract_types(ct, modified_ct)
28+
assert len(new_ct.abi) == len(ct.abi) + 1 == len(modified_ct.abi) + 1
29+
assert len(new_ct.abi) == len(_merge_contract_types(new_ct, modified_ct).abi)
30+
31+
2232
def test_instance_at(chain, contract_instance):
2333
contract = chain.contracts.instance_at(str(contract_instance.address))
2434
assert contract.contract_type == contract_instance.contract_type

0 commit comments

Comments
 (0)