Follow-up to #199. Do not delete that carve-out when EIP-7623 arrives — convert it to a fork gate.
Background
morph-reth disables EIP-7623 during execution (CfgEnv::disable_eip7623, crates/evm/src/config.rs:39,90), matching production morph-geth 5744b8f66, whose IntrinsicGas has no floor term at all. But reth's pool derives its SpecId from the Prague flag, and MorphChainSpec activates Prague at Viridian time so EIP-7702 works, so the pool applied the EIP-7623 calldata floor while nothing else on the network did. #199 re-adjudicates that one verdict so the pool matches execution.
Why this is interim
morph-geth has EIP-7623 implemented on the unmerged eip7623 branch (morph-l2/go-ethereum, tip c685e19d3, 2026-07-02). That branch does not flip a flag on an existing fork: it introduces a new hardfork NextFork (nextForkTime, ordered after Jade) and enables the floor at IsNextFork in both core/state_transition.go and core/tx_pool.go. NextForkTime is not scheduled on any network yet.
So the two clients gate the same rule at different points:
|
floor active from |
| morph-reth pool (today) |
Viridian (Prague-mapped, already live) |
morph-geth eip7623 branch |
NextFork (after Jade, unscheduled) |
#199 closes the gap for the Viridian → NextFork interval. Once NextFork exists it must not simply be reverted, or the pool goes back to applying the floor one hardfork early.
What to do when NextFork lands
- Add the
NextFork hardfork to morph-chainspec with the same ordering constraint geth uses (nextForkTime requires jadeForkTime).
- Execution: replace the unconditional
cfg_env.disable_eip7623 = true in crates/evm/src/config.rs with a gate on NextFork activation for the block being executed.
- Pool: make
intrinsic_gas_is_sufficient (crates/txpool/src/validator.rs) apply the floor when NextFork is active at the pool's tip timestamp and skip it otherwise, instead of skipping it unconditionally.
- Match geth's L1-message exemption: its branch computes the floor only when
!st.msg.IsL1MessageTx().
- Keep both regression tests in
crates/txpool/src/validator.rs and add their post-NextFork mirrors, so each side of the boundary is pinned.
Also worth doing independently
Upstream reth has no knob for this. ensure_intrinsic_gas takes only the ForkTracker, while max_initcode_size and tx_gas_limit_cap on that same tracker are already sourced from the EVM config. Teaching it to read disable_eip7623 the same way would let morph-reth drop the copied validate_one_with_provider skeleton in #199 and replace it with one builder call, removing the drift risk called out in that PR.
Context: the pre-migration cross-client audit, POOL-01.
Follow-up to #199. Do not delete that carve-out when EIP-7623 arrives — convert it to a fork gate.
Background
morph-reth disables EIP-7623 during execution (
CfgEnv::disable_eip7623,crates/evm/src/config.rs:39,90), matching production morph-geth5744b8f66, whoseIntrinsicGashas no floor term at all. But reth's pool derives itsSpecIdfrom the Prague flag, andMorphChainSpecactivates Prague at Viridian time so EIP-7702 works, so the pool applied the EIP-7623 calldata floor while nothing else on the network did. #199 re-adjudicates that one verdict so the pool matches execution.Why this is interim
morph-geth has EIP-7623 implemented on the unmerged
eip7623branch (morph-l2/go-ethereum, tipc685e19d3, 2026-07-02). That branch does not flip a flag on an existing fork: it introduces a new hardforkNextFork(nextForkTime, ordered after Jade) and enables the floor atIsNextForkin bothcore/state_transition.goandcore/tx_pool.go.NextForkTimeis not scheduled on any network yet.So the two clients gate the same rule at different points:
eip7623branch#199 closes the gap for the Viridian → NextFork interval. Once NextFork exists it must not simply be reverted, or the pool goes back to applying the floor one hardfork early.
What to do when NextFork lands
NextForkhardfork tomorph-chainspecwith the same ordering constraint geth uses (nextForkTimerequiresjadeForkTime).cfg_env.disable_eip7623 = trueincrates/evm/src/config.rswith a gate on NextFork activation for the block being executed.intrinsic_gas_is_sufficient(crates/txpool/src/validator.rs) apply the floor when NextFork is active at the pool's tip timestamp and skip it otherwise, instead of skipping it unconditionally.!st.msg.IsL1MessageTx().crates/txpool/src/validator.rsand add their post-NextFork mirrors, so each side of the boundary is pinned.Also worth doing independently
Upstream reth has no knob for this.
ensure_intrinsic_gastakes only theForkTracker, whilemax_initcode_sizeandtx_gas_limit_capon that same tracker are already sourced from the EVM config. Teaching it to readdisable_eip7623the same way would let morph-reth drop the copiedvalidate_one_with_providerskeleton in #199 and replace it with one builder call, removing the drift risk called out in that PR.Context: the pre-migration cross-client audit, POOL-01.