Background
morph-reth currently sets cfg_env.disable_eip7623 = true in two places (crates/evm/src/config.rs:39, :90) to match morph-geth's behavior — morph-geth has not implemented EIP-7623 and treats calldata floor gas as not applicable.
However, reth's upstream mempool ensure_intrinsic_gas enforces EIP-7623 floor gas based on the active SpecId, without consulting cfg_env.disable_eip7623. The upstream cfg → mempool sync channel only propagates tx_gas_limit_cap etc., not disable_eip7623. As a result morph-reth's mempool is stricter than its own execution layer (and stricter than morph-geth) — see QA finding X18.
A 41,000-gas tx with 5,000 zero-byte calldata is accepted by morph-geth and imports cleanly into morph-reth's execution layer (stateRoot matches), but rejected by morph-reth's mempool with intrinsic gas too low.
Decision
Will be fixed alongside morph-geth at the next Morph hardfork that activates EIP-7623.
Once EIP-7623 is activated, removing the disable_eip7623 = true override here aligns morph-reth's execution layer with the new "EIP-7623 enabled" state, and reth's mempool floor-gas check (which already enforces EIP-7623) becomes correct.
Scope
crates/evm/src/config.rs: remove cfg_env.disable_eip7623 = true from both evm_env() and next_evm_env()
- Verify mempool / execution behavior is identical (both enforce EIP-7623)
- Verify behavior matches morph-geth post-hardfork
- Update tests that asserted
cfg_env.disable_eip7623 == true (e.g. crates/evm/src/config.rs:266)
Acceptance Criteria
Reference
Background
morph-reth currently sets
cfg_env.disable_eip7623 = truein two places (crates/evm/src/config.rs:39, :90) to match morph-geth's behavior — morph-geth has not implemented EIP-7623 and treats calldata floor gas as not applicable.However, reth's upstream mempool
ensure_intrinsic_gasenforces EIP-7623 floor gas based on the active SpecId, without consultingcfg_env.disable_eip7623. The upstreamcfg → mempoolsync channel only propagatestx_gas_limit_capetc., notdisable_eip7623. As a result morph-reth's mempool is stricter than its own execution layer (and stricter than morph-geth) — see QA finding X18.A 41,000-gas tx with 5,000 zero-byte calldata is accepted by morph-geth and imports cleanly into morph-reth's execution layer (stateRoot matches), but rejected by morph-reth's mempool with
intrinsic gas too low.Decision
Will be fixed alongside morph-geth at the next Morph hardfork that activates EIP-7623.
Once EIP-7623 is activated, removing the
disable_eip7623 = trueoverride here aligns morph-reth's execution layer with the new "EIP-7623 enabled" state, and reth's mempool floor-gas check (which already enforces EIP-7623) becomes correct.Scope
crates/evm/src/config.rs: removecfg_env.disable_eip7623 = truefrom bothevm_env()andnext_evm_env()cfg_env.disable_eip7623 == true(e.g.crates/evm/src/config.rs:266)Acceptance Criteria
cfg_env.disable_eip7623 = trueremoved from bothevm_env()andnext_evm_env()disable_eip7623is updated/removedintrinsic gas too low— now intentionally, matching geth post-hardforkgas_limit ≥ 71000is accepted by both morph-geth and morph-rethcargo nextest run --workspaceand e2e tests passReference