From 6f127906fe02cb67d5c318d3e5f141a47e8e39b8 Mon Sep 17 00:00:00 2001 From: Juliya Smith Date: Tue, 18 Jul 2023 17:30:09 -0500 Subject: [PATCH] chore: address feedback --- src/ape/contracts/base.py | 5 +-- src/ape/managers/chain.py | 74 +++++++++++++++++----------------- tests/functional/test_chain.py | 4 +- 3 files changed, 41 insertions(+), 42 deletions(-) diff --git a/src/ape/contracts/base.py b/src/ape/contracts/base.py index 51fa6f4f5b..737462cdd3 100644 --- a/src/ape/contracts/base.py +++ b/src/ape/contracts/base.py @@ -585,14 +585,13 @@ def range( """ if not hasattr(self.contract, "address"): - yield from [] return start_block = None stop_block = None if stop is None: - start_block = self.chain_manager.get_contract_receipt( + start_block = self.chain_manager.contracts.get_creation_receipt( self.contract.address ).block_number stop_block = start_or_stop @@ -845,7 +844,7 @@ def receipt(self) -> ReceiptAPI: return receipt # Brute force find the receipt. - receipt = self.chain_manager.get_contract_receipt(self.address) + receipt = self.chain_manager.contracts.get_creation_receipt(self.address) self._cached_receipt = receipt return receipt diff --git a/src/ape/managers/chain.py b/src/ape/managers/chain.py index 35e68317f7..e5b161f756 100644 --- a/src/ape/managers/chain.py +++ b/src/ape/managers/chain.py @@ -1333,6 +1333,43 @@ def _write_deployments_mapping(self, deployments_map: Dict): with self._deployments_mapping_cache.open("w") as fp: json.dump(deployments_map, fp, sort_keys=True, indent=2, default=sorted) + def get_creation_receipt( + self, address: AddressType, start_block: int = 0, stop_block: Optional[int] = None + ) -> ReceiptAPI: + """ + Get the receipt responsible for the initial creation of the contract. + + Args: + address (``AddressType``): The address of the contract. + start_block (int): The block to start looking from. + stop_block (Optional[int]): The block to stop looking at. + + Returns: + :class:`~ape.apt.transactions.ReceiptAPI` + """ + if stop_block is None and (stop := self.chain_manager.blocks.head.number): + stop_block = stop + elif stop_block is None: + raise ChainError("Chain missing blocks.") + + mid_block = (stop_block - start_block) // 2 + start_block + # NOTE: biased towards mid_block == start_block + + if start_block == mid_block: + for tx in self.chain_manager.blocks[mid_block].transactions: + if (receipt := tx.receipt) and receipt.contract_address == address: + return receipt + + return self.get_creation_receipt( + address, start_block=mid_block + 1, stop_block=stop_block + ) + + elif self.provider.get_code(address, block_id=mid_block): + return self.get_creation_receipt(address, start_block=start_block, stop_block=mid_block) + + else: + raise ChainError(f"Failed to find a contract-creation receipt for '{address}'.") + class ReportManager(BaseManager): """ @@ -1655,40 +1692,3 @@ def get_receipt(self, transaction_hash: str) -> ReceiptAPI: :class:`~ape.apt.transactions.ReceiptAPI` """ return self.chain_manager.history[transaction_hash] - - def get_contract_receipt( - self, address: AddressType, start_block: int = 0, stop_block: Optional[int] = None - ) -> ReceiptAPI: - """ - Get the receipt responsible for the initial creation of the contract. - - Args: - address (``AddressType``): The address of the contract. - start_block (int): The block to start looking from. - stop_block (Optional[int]): The block to stop looking at. - - Returns: - :class:`~ape.apt.transactions.ReceiptAPI` - """ - if stop_block is None and (stop := self.blocks.head.number): - stop_block = stop - elif stop_block is None: - raise ChainError("Chain missing blocks.") - - mid_block = (stop_block - start_block) // 2 + start_block - # NOTE: biased towards mid_block == start_block - - if start_block == mid_block: - for tx in self.blocks[mid_block].transactions: - if (receipt := tx.receipt) and receipt.contract_address == address: - return receipt - - return self.get_contract_receipt( - address, start_block=mid_block + 1, stop_block=stop_block - ) - - elif self.provider.get_code(address, block_id=mid_block): - return self.get_contract_receipt(address, start_block=start_block, stop_block=mid_block) - - else: - raise ChainError(f"Failed to find a contract-creation receipt for '{address}'.") diff --git a/tests/functional/test_chain.py b/tests/functional/test_chain.py index b7880a7d5d..162af856ee 100644 --- a/tests/functional/test_chain.py +++ b/tests/functional/test_chain.py @@ -630,9 +630,9 @@ def test_cache_non_checksum_address(chain, vyper_contract_instance): def test_get_contract_receipt(chain, vyper_contract_instance): address = vyper_contract_instance.address - receipt = chain.get_contract_receipt(address) + receipt = chain.contracts.get_creation_receipt(address) assert receipt.contract_address == address chain.mine() - receipt = chain.get_contract_receipt(address) + receipt = chain.contracts.get_creation_receipt(address) assert receipt.contract_address == address