diff --git a/src/ethereum/forks/amsterdam/vm/eoa_delegation.py b/src/ethereum/forks/amsterdam/vm/eoa_delegation.py index 1fe2e1e7bd..90a8bb13a5 100644 --- a/src/ethereum/forks/amsterdam/vm/eoa_delegation.py +++ b/src/ethereum/forks/amsterdam/vm/eoa_delegation.py @@ -13,6 +13,7 @@ from ethereum.crypto.hash import keccak256 from ethereum.exceptions import InvalidBlock, InvalidSignatureError +from ..block_access_lists.tracker import track_address_access from ..fork_types import Address, Authorization from ..state import account_exists, get_account, increment_nonce, set_code from ..utils.hexadecimal import hex_to_address @@ -131,6 +132,10 @@ def access_delegation( The delegation address, code, and access gas cost. """ state = evm.message.block_env.state + + # EIP-7928: Track the authority address (delegated account being called) + track_address_access(state.change_tracker, address) + code = get_account(state, address).code if not is_valid_delegation(code): return False, address, code, Uint(0) @@ -143,6 +148,10 @@ def access_delegation( access_gas_cost = GAS_COLD_ACCOUNT_ACCESS code = get_account(state, address).code + # EIP-7928: Track delegation target when loaded as call target + # `address` here is now the delegation target account + track_address_access(state.change_tracker, address) + return True, address, code, access_gas_cost @@ -181,6 +190,10 @@ def set_delegation(message: Message) -> U256: authority_account = get_account(state, authority) authority_code = authority_account.code + # EIP-7928: Track authority account access in BAL even if delegation + # fails + track_address_access(state.change_tracker, authority) + if authority_code and not is_valid_delegation(authority_code): continue diff --git a/src/ethereum/forks/amsterdam/vm/instructions/system.py b/src/ethereum/forks/amsterdam/vm/instructions/system.py index 075472a227..5d0d0c9a5c 100644 --- a/src/ethereum/forks/amsterdam/vm/instructions/system.py +++ b/src/ethereum/forks/amsterdam/vm/instructions/system.py @@ -494,10 +494,6 @@ def callcode(evm: Evm) -> None: ) charge_gas(evm, message_call_gas.cost + extend_memory.cost) - track_address_access( - evm.message.block_env.state.change_tracker, code_address - ) - # OPERATION evm.memory += b"\x00" * extend_memory.expand_by sender_balance = get_account( @@ -636,10 +632,6 @@ def delegatecall(evm: Evm) -> None: ) charge_gas(evm, message_call_gas.cost + extend_memory.cost) - track_address_access( - evm.message.block_env.state.change_tracker, code_address - ) - # OPERATION evm.memory += b"\x00" * extend_memory.expand_by generic_call( diff --git a/src/ethereum/forks/amsterdam/vm/interpreter.py b/src/ethereum/forks/amsterdam/vm/interpreter.py index f217c8dafd..b16b754965 100644 --- a/src/ethereum/forks/amsterdam/vm/interpreter.py +++ b/src/ethereum/forks/amsterdam/vm/interpreter.py @@ -139,6 +139,12 @@ def process_message_call(message: Message) -> MessageCallOutput: message.code = get_account(block_env.state, delegated_address).code message.code_address = delegated_address + # EIP-7928: Track delegation target when loaded as call target + track_address_access( + block_env.state.change_tracker, + delegated_address, + ) + evm = process_message(message) if evm.error: