Skip to content

Commit

Permalink
chore: address feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
antazoey committed Jul 18, 2023
1 parent 98cdfc4 commit 6f12790
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 42 deletions.
5 changes: 2 additions & 3 deletions src/ape/contracts/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
74 changes: 37 additions & 37 deletions src/ape/managers/chain.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
"""
Expand Down Expand Up @@ -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}'.")
4 changes: 2 additions & 2 deletions tests/functional/test_chain.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 6f12790

Please sign in to comment.