Summary
morph-reth v1.4.0 is the Celadon hardfork release and a mandatory upgrade. It schedules Celadon on Hoodi and Mainnet, adds MorphTx v2 with EIP-7702 authorization lists, changes alt-token refund rounding for every ERC20-fee transaction from Celadon on, and aligns call-mode fee-token execution with morph-geth.
Highlights
- Celadon activation (#225) — Hoodi (chain 2910) at
1793167200(2026-10-28 06:00 UTC), Mainnet (chain 2818) at1793772000(2026-11-04 06:00 UTC). The timestamps match morph-geth'sMorphHoodiChainConfig/MorphMainnetChainConfig. - MorphTx v2 with EIP-7702 authorization lists (#211) — a new
0x7Fversion (0x7f || 0x02 || rlp) that carries an EIP-7702 authorization list on top of the v1 fields. An empty list behaves like v1; a non-empty list forbids contract creation; v0/v1 must not carry a list. v2 is rejected by consensus and the txpool before Celadon. Authorizations are applied through the same path and refund accounting as type0x04, the static EIP-7702 rules are enforced, upstream pool authority/delegation limits apply, and the L1 data fee of simulated transactions is sized with the list. JSON always emitsauthorizationListfor v2 ([]when empty) and never for v0/v1. - Celadon alt-token refund rounding (#211) — applies to every ERC20-fee transaction, not only v2. Before Celadon, the prepaid fee and the unused-gas refund are each rounded up, so the caller could be charged up to one token unit less than the ceiling of the net fee. From Celadon on, the deduction records the rounding credit and the refund adds it back before rounding down, so the caller is always charged the ceiling of the net fee. A refund that rounds down to zero returns early, matching morph-geth (no
Transfer(.., 0)log). - Call-mode fee-token parity with morph-geth (#210) — for fee tokens registered without a
balanceSlot(the EVM-call path, e.g. USDC on Mainnet), morph-reth diverged from morph-geth in ways that changegasUsed, receipts and state roots, so a morph-reth follower could reject blocks a morph-geth producer accepts. Now: the feetransfer()frame's SSTORE refund is carried into the user's refund; internalbalanceOf/transferframes keep the outer transaction's ORIGIN and GASPRICE and run in the executing block's environment, withbalanceOfas a static frame under geth's 200k gas allowance; a transfer that fails a later business check keeps its state and logs as geth does; zero fees skiptransfer(0)but still query the balance. Pinned by geth-derived golden fixtures (state root, logs root and gas) across Emerald and Jade.
Other Changes
rustlsbumped to 0.23.45 for RUSTSEC-2026-0285 (#211).- Build targets moved to
MakefileBuild.mkfor the separated build/deploy release system; target names are unchanged (#217). - CI action updates (#209).
Breaking Changes & Upgrade Notes
- Upgrade before Celadon activates: Hoodi nodes by 2026-10-28 06:00 UTC, Mainnet nodes by 2026-11-04 06:00 UTC. v1.3.0 and earlier do not know Celadon: they reject MorphTx v2 and keep the pre-Celadon refund rounding, which can change the state root of any ERC20-fee transaction, so they fork off at activation.
- Cross-client rollout: Celadon must be live in both execution clients with identical
celadonTimevalues. Upgrade morph-geth nodes to a Celadon-enabled release that carries the same timestamps before activation. - Upgrade even before Celadon: the call-mode fee-token fixes (#210) correct a live divergence. On v1.3.0, post-Jade strict state-root validation can reject blocks containing call-mode fee-token transactions that morph-geth accepts.
- RPC request change: transaction requests no longer accept a MorphTx
versionselector. The version is derived from the content — v1 is the baseline (the request layer no longer produces v0) and a non-emptyauthorizationListselects v2. A legacyversionkey is ignored like any other unknown key. - Custom genesis: Celadon is configured with the
celadonTimekey. - No breaking change to the v0/v1 MorphTx wire format; v2 is additive.
All Changes
- chore: prepare v1.4.0 release (#227)
- feat(chainspec): set Celadon fork activation timestamps (#225)
- feat: support MorphTx v2 with EIP-7702 authorization lists (#211)
- build: split build targets into MakefileBuild.mk (#217)
- fix(revm): align call-mode fee-token execution with go-ethereum (#210)
- chore(ci): bump taiki-e/install-action in the actions-weekly group (#209)
Binaries
| System | Architecture | Binary |
|---|---|---|
| x86_64 | morph-reth-1.4.0-x86_64-linux.tar.gz | |
| aarch64 | morph-reth-1.4.0-aarch64-linux.tar.gz | |
| Docker | ghcr.io/morph-l2/morph-reth:v1.4.0 |