Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions src/ethereum/forks/amsterdam/vm/eoa_delegation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand All @@ -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


Expand Down Expand Up @@ -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

Expand Down
8 changes: 0 additions & 8 deletions src/ethereum/forks/amsterdam/vm/instructions/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand Down
6 changes: 6 additions & 0 deletions src/ethereum/forks/amsterdam/vm/interpreter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading