Skip to content

feat(spec,tests): Implement EIP-8282 - #3070

Merged
marioevz merged 9 commits into
forks/amsterdamfrom
eips/amsterdam/eip-8282
Jul 2, 2026
Merged

marioevz merged 9 commits into
forks/amsterdamfrom
eips/amsterdam/eip-8282

Conversation

@marioevz

@marioevz marioevz commented Jun 30, 2026

Copy link
Copy Markdown
Member

🗒️ Description

Implements the current spec iteration of this PR: ethereum/EIPs#11760.

Matches glamsterdam-devnet-6 specs.

🔗 Related Issues or PRs

N/A.

✅ Checklist

  • All: Ran fast static checks to avoid unnecessary CI fails, see also Code Standards and Enabling Pre-commit Checks:
    just static
  • All: PR title adheres to the repo standard - it will be used as the squash commit message and should start type(scope):.
  • All: Considered updating the online docs in the ./docs/ directory.
  • All: Set appropriate labels for the changes (only maintainers can apply labels).
  • Tests: Ran mkdocs serve locally and verified the auto-generated docs for new tests in the Test Case Reference are correctly formatted.
  • Tests: For PRs implementing a missed test case, update the post-mortem document to add an entry the list.
  • Ported Tests: All converted JSON/YML tests from ethereum/tests or tests/static have been assigned @ported_from marker.

Cute Animal Picture

Put a link to a cute animal picture inside the parenthesis-->

* feat(specs): Implement EIP-8282

* feat(test-forks): Implement EIP-8282 framework changes

* feat(tests): Implement EIP-8282 tests

* feat(tests): Add EIP-8282 to EIP-7685 tests

* fix(test-forks): Update EIP-8282 deposit contract to 537b9c1

* fix(tests): Update EIP-8282 builder deposit contract target/max to 32/256

* fix(tests): Failing tests after update

* refactor(test-forks): Introduce `minimum_block_gas_limit`

* refactor(test-forks): Update EIP-8282 `empty_block_bal_item_count`

* refactor(test-forks): Use pkgutil to load contract binaries

* refactor(test-forks): Use pkgutil to load EIP-8282 contract binaries

* refactor(test-forks): Remove pre_allocation_blockchain type: ignore comments

* refactor(test-forks): Remove EIP-8282 pre_allocation_blockchain type: ignore comments

* Update tests/amsterdam/eip8282_builder_execution_requests/__init__.py

Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>

* Update tests/amsterdam/eip8282_builder_execution_requests/spec.py

Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>

* chore(tests): Remove `dataclass` from `Spec` class EIP-8282

* chore(tests): Make test behavior more explicit

Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>

* chore(spec,tests): set EIP-8282 builder addresses for glamsterdam-devnet-6

---------

Co-authored-by: Sam Wilson <57262657+SamWilsn@users.noreply.github.com>
Co-authored-by: spencer-tb <spencer.tb@ethereum.org>
@marioevz
marioevz force-pushed the eips/amsterdam/eip-8282 branch from 34f05ea to 26c45dc Compare June 30, 2026 20:14
@marioevz
marioevz requested a review from spencer-tb June 30, 2026 20:15
@marioevz
marioevz marked this pull request as ready for review June 30, 2026 20:16
@codecov

codecov Bot commented Jun 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.23%. Comparing base (26f4786) to head (5d7a308).
⚠️ Report is 20 commits behind head on forks/amsterdam.

Additional details and impacted files
@@                 Coverage Diff                 @@
##           forks/amsterdam    #3070      +/-   ##
===================================================
+ Coverage            93.22%   93.23%   +0.01%     
===================================================
  Files                  624      624              
  Lines                36939    36936       -3     
  Branches              3377     3375       -2     
===================================================
+ Hits                 34436    34439       +3     
+ Misses                1709     1704       -5     
+ Partials               794      793       -1     
Flag Coverage Δ
unittests 93.23% <100.00%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@LouisTsai-Csie LouisTsai-Csie left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Good from my side, some suggestion that could done in follow-up PRs:

  • Add builder deposit / exit system contract to eth_config request.
  • Do we need a test_eip_mainnet.py / fork transition test (so that we could test out )?

@LouisTsai-Csie LouisTsai-Csie left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I have one question related to requests_hash , otherwise it looks good! I like the design of SystemContractInteractionMeasuredOutOfGasContract, amazing!

blocks=[
Block(
txs=txs,
requests_hash=Requests(*requests_list),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Suggested change
requests_hash=Requests(*requests_list),

This looks like a no-op?

requests_hash on Block is a field inherited from Header. We can pass it into Block.requests_hash, but it is never verified against anything:

The header used for verification is rebuilt from the transition-tool (t8n) output.

header = FixtureHeader(
**(
transition_tool_output.result.model_dump(
exclude_none=True,
exclude={"blob_gas_used", "transactions_trie"},
)
| env.model_dump(
exclude_none=True,
exclude={"blob_gas_used", "slot_number"},
)
),
blob_gas_used=blob_gas_used,
transactions_trie=Transaction.list_root(txs),
extra_data=(
block.extra_data if block.extra_data is not None else b""
),
slot_number=slot_number_value,
fork=fork,
)

requests_hash is an output field, so it isn't a t8n input (it's not carried into the Environment) and it isn't merged into the re-built header either, that is, header.requests_hash always comes from the transition output.

requests = Requests(
requests_lists=list(transition_tool_output.result.requests)
)
if Hash(requests) != header.requests_hash:
raise Exception(
"Requests root in header does not match the requests "
"root in the transition tool output: "
f"{header.requests_hash} != {Hash(requests)}"
)

I've confirmed this by updating to Block(requests_hash=requests_hash=Requests(*[]),). It sill fills successfully and the fixture header keeps the real t8n value, so the field configuration is unused.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Yep, and I can confirm that this is a copy-paste error because it's also in the source 7002 test file. We should fix this in the #3071.

@spencer-tb spencer-tb left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM!

Feel free to add these before merge: #3090

* fix(tests): exceed per-block max in builder deposit carry-over test

* chore(tests): clarify multi-type request test gas limit comment
@marioevz
marioevz merged commit b0d5cae into forks/amsterdam Jul 2, 2026
28 checks passed
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