Skip to content

Conversation

manuelmauro
Copy link
Contributor

Description

Adds EIP-7702 support.

@manuelmauro manuelmauro marked this pull request as ready for review June 18, 2025 15:36
Copy link

@librelois librelois left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems that there is several special cases that might not be handled correctly in this implementation:

  1. Delegation Chain Protection: EIP-7702 specifies that clients must retrieve only the first code and stop following delegation chains to prevent infinite loops.
  2. Delegation to a Precompile: EIP-7702 specifies that when a precompile address is the target of delegation, the retrieved code should be considered empty.
  3. Opcodes CODESIZE and CODECOPY should follows delegation, can you add tests for that?

@sorpaas
Copy link
Member

sorpaas commented Jun 23, 2025

Delegation Chain Protection: EIP-7702 specifies that clients must retrieve only the first code and stop following delegation chains to prevent infinite loops.

See discussions above.

Delegation to a Precompile: EIP-7702 specifies that when a precompile address is the target of delegation, the retrieved code should be considered empty.

This seems to be correctly implemented. In case of delegating to precompile:

  • The initial precompile check will not be triggered because it checks against the authority address.
  • Then it would fetch delegated_code, and in case of precompile, it's empty.

So this seems fine.

Opcodes CODESIZE and CODECOPY should follows delegation, can you add tests for that?

Right now from my review it looks correct. CODESIZE and CODECOPY returns in all cases the runtime code (state.code).

But nevertheless as @librelois has said, it'll always be better to have some more test cases!

@manuelmauro
Copy link
Contributor Author

If address is 0x0000000000000000000000000000000000000000, do not write the delegation indicator. Clear the account’s code by resetting the account’s code hash to the empty code hash 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470.

Addressed in 3134553

@manuelmauro
Copy link
Contributor Author

Added a comprehensive test suite in f5cc851 and currently investigating the failing tests.

@manuelmauro
Copy link
Contributor Author

EIP-7702 states: "When multiple tuples from the same authority are present, set the code using the address in the last valid occurrence."

It is my understanding that, when multiple authorizations from the same authorities are present in a list, for them to be valid they must have increasing nonces.

I updated the corresponding test to reflect this in cc32e59

@librelois
Copy link

You tested EXTCODECOPY and EXTCODESIZE, but I didn’t find tests for the corresponding behavior of CODECOPY and CODESIZE. It’s very important to test all affected opcodes.

@librelois
Copy link

librelois commented Jun 24, 2025

It is my understanding that, when multiple authorizations from the same authorities are present in a list, for them to be valid they must have increasing nonces.

I did some research and it seems that geth increment the nonce for every valid tuple. So, if there is two authorizations for the same authority, the nonce must increase twice.

Copy link

@librelois librelois left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good now, great work!

@sorpaas sorpaas merged commit cf61183 into rust-ethereum:v0.x Jun 25, 2025
2 checks passed
manuelmauro added a commit to moonbeam-foundation/evm that referenced this pull request Jul 14, 2025
* feat: ✨ add pectra config

* feat: ⬆️ upgrade ethereum crate

* feat: ✨ add Authorization type

* feat: ✨ add EIP-7702 delegation logic to EVM

* feat: ✨ add EIP-7702 initialization and gas costs

* refactor: ♻️ lint and fmt

* style: 🎨 fmt

* feat: ✨ upgrade ethereum

* fix: ⬆️ upgrade rust toolchain

* refactor: 🔥 remove Authorization type from evm_core

* fix: 🐛 fix CODESIZE and CODECOPY behavior according to EIP-7702

* test: ✅ test opcodes impacted by EIP-7702

* test: ✅ merge test files

* perf: ⚡ avoid fetching code unnecessarily

* refactor: ⬆️ upgrade ethereum

* test: ✅ test delegation chains

* fix: 🐛 zero address delegation clears code

* refactor: 🔒 do not silence exit errors

* test: ✅ add comprehensive test suite for EIP-7702

* test: ✅ update assumptions on multiple autorizations from the same authority

* fix: 🐛 add authority to accessed_addresses

* test: ✅ correct gas expectations in test

* test: ✅ correct gas calculations in test

* refactor: 🚨 lint

* fix: 🐛 verify the code of authority is empty or already delegated

* fix: 🐛 fix nonce edge case

* test: ✅ fix assertion in test

* test: ✅ fix gas exhaustion test

* test: ✅ test CODESIZE and CODECOPY ops

* docs: 🔥 remove comments

* test: ✅ update test expectations
@RomarQ RomarQ mentioned this pull request Sep 5, 2025
12 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants