Skip to content

Commit

Permalink
fix: combine when default differs
Browse files Browse the repository at this point in the history
  • Loading branch information
antazoey committed Feb 20, 2025
1 parent 5aa0683 commit 25ea540
Showing 1 changed file with 26 additions and 9 deletions.
35 changes: 26 additions & 9 deletions src/ape/managers/_contractscache.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,9 +556,11 @@ def get(
if contract_type := self.contract_types[address_key]:
# The ContractType was previously cached.
if default and default != contract_type:
# Replacing contract type
self.contract_types[address_key] = default
return default
# The given default ContractType is different than the cached one.
# Merge the two and cache the merged result.
combined_contract_type = _merge_contract_types(contract_type, default)
self.contract_types[address_key] = combined_contract_type
return combined_contract_type

return contract_type

Expand Down Expand Up @@ -927,16 +929,31 @@ def _get_combined_contract_type(
proxy_info: ProxyInfoAPI,
implementation_contract_type: ContractType,
) -> ContractType:
proxy_abis = [
abi for abi in proxy_contract_type.abi if abi.type in ("error", "event", "function")
]
proxy_abis = _get_relevant_additive_abis(proxy_contract_type)

# Include "hidden" ABIs, such as Safe's `masterCopy()`.
if proxy_info.abi and proxy_info.abi.signature not in [
abi.signature for abi in implementation_contract_type.abi
]:
proxy_abis.append(proxy_info.abi)

combined_contract_type = implementation_contract_type.model_copy(deep=True)
combined_contract_type.abi.extend(proxy_abis)
return combined_contract_type
return _merge_abis(implementation_contract_type, proxy_abis)


def _get_relevant_additive_abis(contract_type: ContractType) -> list[ABI]:
# Get ABIs you would want to add to a base contract as extra,
# such as unique ABIs from proxies.
return [abi for abi in contract_type.abi if abi.type in ("error", "event", "function")]


def _merge_abis(base_contract: ContractType, extra_abis: list[ABI]) -> ContractType:
contract_type = base_contract.model_copy(deep=True)
contract_type.abi.extend(extra_abis)
return contract_type


def _merge_contract_types(
base_contract_type: ContractType, additive_contract_type: ContractType
) -> ContractType:
relevant_abis = _get_relevant_additive_abis(additive_contract_type)
return _merge_abis(base_contract_type, relevant_abis)

0 comments on commit 25ea540

Please sign in to comment.