Skip to content

feat(tests): EIP-7708 - finalization burn log ordering + coinbase fee no-log#2717

Merged
marioevz merged 4 commits into
ethereum:eips/amsterdam/eip-7708from
spencer-tb:tests/eip-7708-finalization-burn-log-ordering
Apr 20, 2026
Merged

feat(tests): EIP-7708 - finalization burn log ordering + coinbase fee no-log#2717
marioevz merged 4 commits into
ethereum:eips/amsterdam/eip-7708from
spencer-tb:tests/eip-7708-finalization-burn-log-ordering

Conversation

@spencer-tb
Copy link
Copy Markdown
Contributor

@spencer-tb spencer-tb commented Apr 19, 2026

🗒️ Description

Adds three focused tests filling EIP-7708 coverage gaps reported in #2691 #2692, and #2717 (review) .

test_finalization_burn_logs_multi_account_ordering

Verifies finalization Burn logs are emitted in lexicographical address order when multiple accounts are marked for deletion in the same tx:

  • N accounts are created in the same tx via CREATE and immediately SELFDESTRUCT'd (ETH sent to a shared beneficiary, zeroing their balance).
  • N payer contracts then fund each destroyed account in REVERSE sorted address order with a distinct nonzero amount.
  • At finalization each destroyed account has a unique nonzero residual balance, so exactly one Burn log per account.
  • Expected receipt lists burn logs in sorted address order, so a client emitting them in call order (reverse sorted) or creation order would fail.

test_call_with_value_to_coinbase_no_priority_fee_log

Verifies no Transfer log is emitted for the coinbase priority fee payment:

  • A contract executes CALL with nonzero value to the coinbase address.
  • The tx pays a nonzero priority fee to that same coinbase.
  • Expected receipt has exactly one Transfer log (for the CALL). An implementation that over-logs protocol-level balance changes would emit an extra log for the fee and fail.

test_finalization_burn_log_single_account_multiple_transfers

Verifies finalization emits exactly one Burn log for a single to-be-deleted account even when it receives multiple ETH transfers after SELFDESTRUCT in the same tx:

  • One account is created in the tx via CREATE and immediately SELFDESTRUCT'd to a beneficiary, zeroing its balance.
  • N payer contracts then each fund that same destroyed account with a distinct nonzero amount.
  • At finalization the destroyed account has one residual balance equal to the sum of those transfers.
  • Expected receipt contains exactly one Burn log for that account with the combined amount, so a client emitting one Burn log per transfer would fail.

🔗 Related Issues or PRs

✅ 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).

Adds a dedicated test that proves finalization burn logs are emitted
in lexicographical address order when multiple accounts are marked for
deletion in the same transaction.

Parametrized over N in {2, 5}. N accounts are created and
SELFDESTRUCT'd in the same tx, then funded via payer contracts called
in REVERSE sorted address order with distinct nonzero amounts. Each
destroyed account ends with a unique nonzero balance at finalization,
so ordering by address vs. by call order is always distinguishable.

Addresses issue ethereum#2691.
@spencer-tb spencer-tb added C-feat Category: an improvement or new feature A-tests Area: Consensus tests. labels Apr 19, 2026
@spencer-tb spencer-tb requested a review from Carsons-Eels April 19, 2026 13:59
Adds a dedicated test proving the coinbase priority fee payment does
not produce a Transfer log.

A contract CALLs the coinbase address with nonzero value while the tx
pays a nonzero priority fee to that same coinbase. Only the
CALL-with-value must produce a Transfer log; the priority fee credit
happens outside the EVM as a protocol-level balance change.

An implementation that hooks every balance addition (instead of only
CALL / SELFDESTRUCT / tx-level value transfers) would emit an extra
Transfer log for the fee and fail the exact-log assertion.

Addresses issue ethereum#2692.
@spencer-tb spencer-tb changed the title feat(tests): EIP-7708 - multi-account finalization burn log ordering feat(tests): EIP-7708 - finalization burn log ordering + coinbase fee no-log Apr 19, 2026
@spencer-tb
Copy link
Copy Markdown
Contributor Author

cc @chfast

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 20, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 86.26%. Comparing base (bf16746) to head (6fe6843).
⚠️ Report is 328 commits behind head on eips/amsterdam/eip-7708.

Additional details and impacted files
@@                     Coverage Diff                     @@
##           eips/amsterdam/eip-7708    #2717      +/-   ##
===========================================================
+ Coverage                    86.14%   86.26%   +0.11%     
===========================================================
  Files                          599      599              
  Lines                        39491    37016    -2475     
  Branches                      3782     3802      +20     
===========================================================
- Hits                         34021    31930    -2091     
+ Misses                        4848     4522     -326     
+ Partials                       622      564      -58     
Flag Coverage Δ
unittests 86.26% <ø> (+0.11%) ⬆️

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

☔ View full report in Codecov by Sentry.
📢 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.

Copy link
Copy Markdown
Member

@chfast chfast left a comment

Choose a reason for hiding this comment

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

Description looks good.

Can you also check if we have the "final burn" test were there are multiple ETH transfers to the single to-be-destructed account?

@spencer-tb spencer-tb force-pushed the tests/eip-7708-finalization-burn-log-ordering branch from b7d3f05 to bd3b41b Compare April 20, 2026 10:21
@spencer-tb spencer-tb requested a review from marioevz April 20, 2026 10:44
@spencer-tb
Copy link
Copy Markdown
Contributor Author

Description looks good.

Can you also check if we have the "final burn" test were there are multiple ETH transfers to the single to-be-destructed account?

Thanks! Added and updated the PR description!

Copy link
Copy Markdown
Member

@marioevz marioevz left a comment

Choose a reason for hiding this comment

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

LGTM, I pushed a couple of small fixes.

@marioevz marioevz merged commit 42b54ae into ethereum:eips/amsterdam/eip-7708 Apr 20, 2026
18 checks passed
spencer-tb added a commit to spencer-tb/execution-specs that referenced this pull request Apr 20, 2026
… no-log (ethereum#2717)

* feat(tests): EIP-7708 - multi-account finalization burn log ordering

Adds a dedicated test that proves finalization burn logs are emitted
in lexicographical address order when multiple accounts are marked for
deletion in the same transaction.

Parametrized over N in {2, 5}. N accounts are created and
SELFDESTRUCT'd in the same tx, then funded via payer contracts called
in REVERSE sorted address order with distinct nonzero amounts. Each
destroyed account ends with a unique nonzero balance at finalization,
so ordering by address vs. by call order is always distinguishable.

Addresses issue ethereum#2691.

* feat(tests): EIP-7708 - coinbase priority fee must not emit transfer log

Adds a dedicated test proving the coinbase priority fee payment does
not produce a Transfer log.

A contract CALLs the coinbase address with nonzero value while the tx
pays a nonzero priority fee to that same coinbase. Only the
CALL-with-value must produce a Transfer log; the priority fee credit
happens outside the EVM as a protocol-level balance change.

An implementation that hooks every balance addition (instead of only
CALL / SELFDESTRUCT / tx-level value transfers) would emit an extra
Transfer log for the fee and fail the exact-log assertion.

Addresses issue ethereum#2692.

* feat(tests): add single account multi transfer test

* fix(tests): minor nit

---------

Co-authored-by: marioevz <marioevz@gmail.com>
Carsons-Eels pushed a commit to Carsons-Eels/execution-specs that referenced this pull request Apr 27, 2026
… no-log (ethereum#2717)

* feat(tests): EIP-7708 - multi-account finalization burn log ordering

Adds a dedicated test that proves finalization burn logs are emitted
in lexicographical address order when multiple accounts are marked for
deletion in the same transaction.

Parametrized over N in {2, 5}. N accounts are created and
SELFDESTRUCT'd in the same tx, then funded via payer contracts called
in REVERSE sorted address order with distinct nonzero amounts. Each
destroyed account ends with a unique nonzero balance at finalization,
so ordering by address vs. by call order is always distinguishable.

Addresses issue ethereum#2691.

* feat(tests): EIP-7708 - coinbase priority fee must not emit transfer log

Adds a dedicated test proving the coinbase priority fee payment does
not produce a Transfer log.

A contract CALLs the coinbase address with nonzero value while the tx
pays a nonzero priority fee to that same coinbase. Only the
CALL-with-value must produce a Transfer log; the priority fee credit
happens outside the EVM as a protocol-level balance change.

An implementation that hooks every balance addition (instead of only
CALL / SELFDESTRUCT / tx-level value transfers) would emit an extra
Transfer log for the fee and fail the exact-log assertion.

Addresses issue ethereum#2692.

* feat(tests): add single account multi transfer test

* fix(tests): minor nit

---------

Co-authored-by: marioevz <marioevz@gmail.com>
marioevz added a commit that referenced this pull request May 13, 2026
…2844)

* feat(spec-specs): Add transfer log for all `CALL*` and `SELFDESTRUCT`

fix(spec-specs): correct CR issues, fix formatting

fix(spec-specs): inline `execute_code()` to `process_message()`

chore(spec-specs): backport changes

fix(spec-specs): trim out whitespace in topic hash to match tests

feat(spec-specs): add selfdestruct event topic and logging function

feat(spec-specs): selfdestruct to self emits selfdestruct event

feat(spec-specs): define call success constant

feat(spec-specs): emit selfdestruct finalization log for remaining balance

* fix(spec-specs): emit account closure logs in lexicographical order

* feat(test-tests): add eip-7708 eth transfer log tests

test(test-tests): add selfdestruct topic and use empty account

test(test-tests): add nested calls log ordering test

feat(test-tests): add selfdestruct finalization test

fix(test-tests): use spaces in event signature to match spec

* fix(spec-specs): Refactor topic strings to match EIP

* fix(spec-tests): formatting fixes so static checks pass

* fix(spec-specs): Move account closure log emission before priority fee charges (#2059)

* fix(spec-specs): Move account closure log emission before priority fee charges

* fix(spec-specs): formatting and spelling tweaks

* fix(spec-specs): remove duplicate WriteInStaticContext check

* refactor(spec-specs): align memory expansion with other opcodes

* fix(testing/test): Fix unit test expectation

* refactor(spec-specs): move post-mining coinbase balance calculation

---------

Co-authored-by: Mario Vega <marioevz@gmail.com>

* feat(test-specs): add extra eip-7708 test coverage (#2062)

* feat(test-specs): add/refactor tests, add mainnet marked, checklist, coverage check

* feat(test-specs): add fork transition test for selfdestruct logs

* fix: tests

* chore(test-specs): fix fork transition tests

* test(test-specs): add code deposit oog test case

---------

Co-authored-by: carsons-eels <carson@ethereum.org>
Co-authored-by: Mario Vega <marioevz@gmail.com>

* feat(spec,test): EIP-7708 spec updates for self as target (#2086)

* fix(spec,text): Updates to EIP-7708 spec for bal-devnet-2

- fix(spec,test): EIP-7708 emit selfdestruct logs only in same tx
- fix(spec,test): EIP-7708, only emit on transfers to other accounts
- Add more tests that match these edge cases

* feat(test): tests for finalization selfdest + bal transfer in lexicographic order

* fix: changes from comments on PR #2086

* add more variants to test_selfdestruct_same_tx_via_call

* fix: docstring

* refactor: improvements from comments on PR #2086

* Update test to use dynamic addresses

---------

Co-authored-by: Mario Vega <marioevz@gmail.com>

* feat(test): extend EIP-7708 tests from cases in tracker (#1875) (#2106)

- Add CREATE2 support via with_all_create_opcodes marker
- Add tests for SELFDESTRUCT to coinbase - revealed a change needed since
  the last update was made to the EIP that should be included in the
  currect refspec (miner fees paid before finalization LOG2).

* fix(test): Use new ``pre_alloc_mutable`` marker for eip7708 test (#2199)

* fix(test): Update test to account for recent Initcode updates

* 🧹 chore: Remove duplicate test (#2210)

Co-authored-by: raxhvl <raxhvl@users.noreply.github.com>

* ♻️ refactor(tests): Rename EIP 7708 selfdestruct log to burn (#2211)

* ♻️ refactor: Rename selfdestruct log to burn

* 🥢 nit:

* chore(tests): fix stale selfdestruct references and rename to burn

---------

Co-authored-by: raxhvl <raxhvl@users.noreply.github.com>
Co-authored-by: spencer-tb <spencer.tb@ethereum.org>

* fix(specs): Merge issues

* fix(tests): Merge issues

* refactor(test-forks): Add EIP-7708

* refactor(tests): Condition EIP-7708 tests to EIP inclusion

* feat(tests): EIP-7708 - finalization burn log ordering + coinbase fee no-log (#2717)

* feat(tests): EIP-7708 - multi-account finalization burn log ordering

Adds a dedicated test that proves finalization burn logs are emitted
in lexicographical address order when multiple accounts are marked for
deletion in the same transaction.

Parametrized over N in {2, 5}. N accounts are created and
SELFDESTRUCT'd in the same tx, then funded via payer contracts called
in REVERSE sorted address order with distinct nonzero amounts. Each
destroyed account ends with a unique nonzero balance at finalization,
so ordering by address vs. by call order is always distinguishable.

Addresses issue #2691.

* feat(tests): EIP-7708 - coinbase priority fee must not emit transfer log

Adds a dedicated test proving the coinbase priority fee payment does
not produce a Transfer log.

A contract CALLs the coinbase address with nonzero value while the tx
pays a nonzero priority fee to that same coinbase. Only the
CALL-with-value must produce a Transfer log; the priority fee credit
happens outside the EVM as a protocol-level balance change.

An implementation that hooks every balance addition (instead of only
CALL / SELFDESTRUCT / tx-level value transfers) would emit an extra
Transfer log for the fee and fail the exact-log assertion.

Addresses issue #2692.

* feat(tests): add single account multi transfer test

* fix(tests): minor nit

---------

Co-authored-by: marioevz <marioevz@gmail.com>

* fix(tests): rename GAS_CODE_DEPOSIT_PER_BYTE to CODE_DEPOSIT_PER_BYTE

Align EIP-7708 selfdestruct finalization test with the gas constant
rename on forks/amsterdam.

* fix(tests): EIP-7708 + 8037 cross-EIP fixes

* feat(tests): Add EIP-7708 checks to 6780 tests (#2743)

* feat(tests): Add EIP-7708 checks to 6780 tests

* fix: add another call and properly accumulate so that burn logs are validated

* fix(tests): Review fixes

---------

Co-authored-by: carsons-eels <carson@ethereum.org>

* feat(tests): cover EIP-7708 CREATE log rollback on outer revert (#2785)

* feat(tests): cover EIP-7708 CREATE log rollback on outer revert

Mirror `test_inner_call_succeeds_outer_reverts_no_log` for the bal-devnet-5 update that brings CREATE/CREATE2 under EIP-7708. A factory CREATEs a child with value (the deployment succeeds and a `factory -> created` log is emitted in the child frame) and then REVERTs; the receipt must record no logs because the outer revert discards the factory's frame along with every log it produced.

* feat(tests): Review comments

---------

Co-authored-by: marioevz <marioevz@gmail.com>

* fix(specs-spec, tests): CR comment fixes

* Apply suggestion from @marioevz

---------

Co-authored-by: spencer-tb <spencer.tb@ethereum.org>
Co-authored-by: Mario Vega <marioevz@gmail.com>
Co-authored-by: spencer <spencer.taylor-brown@ethereum.org>
Co-authored-by: felipe <fselmo2@gmail.com>
Co-authored-by: raxhvl <raxhvl@users.noreply.github.com>
Co-authored-by: raxhvl <10168946+raxhvl@users.noreply.github.com>
Co-authored-by: danceratopz <danceratopz@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-tests Area: Consensus tests. C-feat Category: an improvement or new feature P-high

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants