Skip to content

feat(tests): adopt EIP 7708 7843 7981 7997 8024 8246 - #53

Merged
pdobacz merged 53 commits into
forks/monad_ninefrom
eips/monad_next/eip-7708+7843+7981+7997+8024+8246
Oct 20, 2026
Merged

pdobacz merged 53 commits into
forks/monad_ninefrom
eips/monad_next/eip-7708+7843+7981+7997+8024+8246

Conversation

@pdobacz

@pdobacz pdobacz commented Aug 27, 2026 •

Copy link
Copy Markdown
Collaborator

#29 + #45 + #46 + #47 🪄

also including some tack-on tests for edge cases only appearing on Monad - amended in monad_eight/monad_nine tests, or, those which didn't belong there, in a special monad_amsterdam monad_eleven dir.

The big portion of new coverage is the selfdestruct_to_self variant of the reserve balance tests, which covers the interactions with EIP-8246

There are some tangential changes in the framework here too, required to make MONAD_TEN / Amsterdam fit together as "parents" of MONAD_ELEVEN:

  • Fork succession as a trait. follows() lets a fork order after Amsterdam without inheriting it; BaseFork subclass checks honour it.
  • Block access list hash header without BALs. header_bal_hash_required() is separated from supports_block_access_lists(); the spec, fixtures, hive genesis, t8n and the fork loader carry the field fixed at zero for a fork that has the header field but builds no BAL.

RetriggerView in GreptileConfidence Score: 5/5

The update appears safe to merge; the previous finding is fixed.

Summary

Adds MONAD_ELEVEN with six selected Amsterdam EIPs and expands Monad-specific test coverage.

  • MONAD_ELEVEN becomes the next configured Monad fork.
  • Fork order and block-access-list headers work independently of EIP inheritance.
  • SELFDESTRUCT clears account data while keeping any balance left behind.
  • Nonzero ETH transfers now emit transfer logs.
  • Contracts can read the current block's slot number.
  • Contracts can copy, swap, and exchange deeper stack items.
  • Access-list entries count toward the transaction data-floor cost.
  • Tests cover reaching the deterministic factory through delegated calls.
  • Amsterdam tests reflect which rules and gas totals apply on Monad.

Reviews (2) · Last reviewed commit: "test(monad_eleven): expect the delegated..." · Reviewed by Greptile

pdobacz added 30 commits August 19, 2026 16:44
Emit LOG3/LOG2 from SYSTEM_ADDRESS for value transfers, selfdestruct
beneficiary transfers/burns, and finalization burns of deleted accounts.
Co-Authored-By: Claude <claude-opus-4-8>
Add SLOTNUM (0x4b, gas BASE) pushing the block slot number, a slot_number
U64 field on the header and block environment, and fork.py plumbing.
Co-Authored-By: Claude <claude-opus-4-8>
Add DUPN (0xe6), SWAPN (0xe7), EXCHANGE (0xe8) stack instructions with a
1-byte immediate, gas VERY_LOW, plus immediate-aware jumpdest analysis.
Co-Authored-By: Claude <claude-opus-4-8>
Inherit MONAD_NEXT from Amsterdam, taking only EIP-7708/7843/8024 changes
(opcodes, slot number header) and pinning EIP-7928/7954/7976/7981 members
back to MONAD_TEN. Relocated after Amsterdam to resolve the base reference.
Co-Authored-By: Claude <claude-opus-4-8>
Single-fork (--fork MONAD_NEXT) feature covering only the adopted Amsterdam
EIP dirs (7708/7843/8024); released via tag tests-monad_amsterdam@v0.1.0.
Co-Authored-By: Claude <claude-opus-4-8>
Disable collection of non-adopted Amsterdam EIP tests on Monad forks.
Co-Authored-By: Claude <claude-fable-5>
Header field sits between requests_hash and slot_number and must be zero.
Co-Authored-By: Claude <claude-fable-5>
Inheriting Amsterdam routed its gas schedule and unadopted EIPs into MONAD_NEXT through the MRO; `follows` keeps the fork order without the behavior.

Co-Authored-By: Claude <claude-opus-5>
MONAD_NEXT follows Amsterdam, so its `valid_from` suites select the fork; the seven EIPs it does not adopt now exclude Monad like the rest.

Co-Authored-By: Claude <claude-opus-5>
MONAD_NEXT clears selfdestructed accounts in place, ordered after Amsterdam by succession, and releases as the monad_eip8246 feature.

Co-Authored-By: Claude <claude-opus-5>
A fork can enable EIP-7708 without EIP-8246 and still burn a swept or stranded balance, which the sweep helper now accounts for.

Co-Authored-By: Claude <claude-opus-5>
MONAD_NEXT charges access list bytes at its own floor token rate, ordered after Amsterdam by succession, and releases as the monad_eip7981 feature.

Co-Authored-By: Claude <claude-opus-5>
MONAD_NEXT carries the factory in its pre-allocation, ordered after Amsterdam by succession, and releases as the monad_eip7997 feature.

Co-Authored-By: Claude <claude-opus-5>
`follows()` sits with the other fork traits, so `__init_subclass__` is untouched and a successor fork inherits the order without restating it.

Co-Authored-By: Claude <claude-opus-5>
`follows()` sits with the other fork traits, so `__init_subclass__` is untouched and a successor fork inherits the order without restating it.

Co-Authored-By: Claude <claude-opus-5>
`follows()` sits with the other fork traits, so `__init_subclass__` is untouched and a successor fork inherits the order without restating it.

Co-Authored-By: Claude <claude-opus-5>
`follows()` sits with the other fork traits, so `__init_subclass__` is untouched and a successor fork inherits the order without restating it.

Co-Authored-By: Claude <claude-opus-5>
A fork builds the lists when EIP-7928 is enabled, so the trait needs no abstract declaration, no genesis default and no mixin override.

Co-Authored-By: Claude <claude-opus-5>
Collect and fill each feature on PRs, `from-upstream` and `eips/**`.

Co-Authored-By: Claude <claude-opus-5>
# Conflicts:
#	.github/configs/feature.yaml
#	packages/testing/src/execution_testing/forks/forks/forks.py
# Conflicts:
#	.github/configs/feature.yaml
#	packages/testing/src/execution_testing/forks/forks/forks.py
EIP-8246 removes the balance burn EIP-7708 logged, so the merged fork emits the transfer log alone and clears deleted accounts while preserving their balance.

Co-Authored-By: Claude <claude-opus-5>
The merged fork adopts EIP-7708, EIP-7843, EIP-7997, EIP-8024 and EIP-8246, so their suites lose the Monad exclusion; the EIP-7976 hook lands once.

Co-Authored-By: Claude <claude-opus-5>
EIP-8246 keeps the balance a swept account holds, so the sweep emits a Transfer log or nothing at all.

Co-Authored-By: Claude <claude-opus-5>
Name the six adopted EIPs in the fork docstring and the release feature.

Co-Authored-By: Claude <claude-opus-5>
Record how the single-EIP adoption branches consolidate onto one fork.

Co-Authored-By: Claude <claude-opus-5>
The fork-named marker skipped every fork that adopts EIP-7997 on its own.

Co-Authored-By: Claude <claude-opus-5>
Filling without a path never reaches tests/benchmark, so neither hook
was load-bearing.

Co-Authored-By: Claude <claude-opus-5>
Keep the header call as it stands and merge the field in as a mapping.

Co-Authored-By: Claude <claude-opus-5>
Monad bills the whole limit, with no refund and no floor comparison.

Co-Authored-By: Claude <claude-opus-5>
The access list entry charges outgrow Monad's floor rate, so a fixed
calldata length lands the cases in the wrong regime.

Co-Authored-By: Claude <claude-opus-5>
MONAD_NEXT holds the exact deposit fit under its cap with no reservoir.

Co-Authored-By: Claude <claude-fable-5-1>
@pdobacz
pdobacz force-pushed the eips/monad_next/eip-7708+7843+7981+7997+8024+8246 branch from 0bf0f6a to d20bef1 Compare October 1, 2026 14:25
…+8246

Conflict markers are committed as-is; resolved in the follow-up commit.

Co-Authored-By: Claude <claude-fable-5-1>
Keep the Bogota fork class next to MONAD_NEXT and stack upstream's new
parametrizations on the no_bal_dependency BAL tests.

Co-Authored-By: Claude <claude-fable-5-1>
…eserve and gas billing

The delegated EOA keeps the reserve on top of what it sends, and the
created coinbase earns the tip on the whole gas limit.

Co-Authored-By: Claude <claude-fable-5-1>
Release MONAD_ELEVEN from the monad and monad_runloop features instead
of the EIP bundle's own feature.

Co-Authored-By: Claude <claude-fable-5-1>
The factory reached by DELEGATECALL or CALLCODE from a delegated frame
halts, as the client checks the recipient's delegation at create time.

Co-Authored-By: Claude <claude-fable-5-1>
A delegated EOA's creating code and a creator reached from a delegated
frame, each entered by every call opcode, on Monad forks and through
the EIP-7997 factory alike.

Co-Authored-By: Claude <claude-fable-5-1>
Mirror upstream, where the skipped immediates can be neither JUMPDEST
nor PUSH, so the jump destination set never changed.

Co-Authored-By: Claude <claude-fable-5-1>
@pdobacz
pdobacz marked this pull request as ready for review October 19, 2026 08:06
@pdobacz
pdobacz requested review from QEDK and mijovic as code owners October 19, 2026 08:06
Comment thread tests/monad_eleven/eip7997_delegated_create/test_factory_reach.py
The nonce and the absent contract also hold for a client that skips
the banned CREATE2 instead of halting.

Co-Authored-By: Claude <claude-fable-5-1>
@pdobacz
pdobacz merged commit 0f78277 into forks/monad_nine Oct 20, 2026
12 checks passed
@pdobacz
pdobacz deleted the eips/monad_next/eip-7708+7843+7981+7997+8024+8246 branch October 20, 2026 10:16
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.

2 participants