Skip to content

Fork-gate the txpool EIP-7623 carve-out when NextFork lands #201

Description

@panos-xyz

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

  1. Add the NextFork hardfork to morph-chainspec with the same ordering constraint geth uses (nextForkTime requires jadeForkTime).
  2. 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.
  3. 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.
  4. Match geth's L1-message exemption: its branch computes the floor only when !st.msg.IsL1MessageTx().
  5. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions