morph-v2.2.3
Patch release covering everything since
morph-v2.2.0(Jade). Includes the contents of the unreleasedmorph-v2.2.1andmorph-v2.2.2tags. No fork / chain rules change; this release is safe to roll out node-by-node.
Highlights
- Upstream sync (go-ethereum v1.16.3 → v1.16.7). Brings RPC, txpool, filters, p2p and tooling improvements to parity with upstream — see "Upstream Sync" below.
- Tracer correctness for Morph fee-token paths. Fixes a
nil pointer dereferencepanic indebug_trace*(prestateTracer) when transactions exercise the alt-token gas path. Recommended upgrade for any node that serves trace RPCs. - Pruner reliability. Honors disk snapshot root when journals are missing, uses HEAD as the prune target, and validates the genesis root before pruning.
- Hardening across RPC / filters / WebSocket / GraphQL / txpool. Numerous defensive fixes (bounds, cancellation, locking, leak prevention) shipped together with the upstream sync.
Upgrade notes
- Drop-in replacement for
morph-v2.2.0,morph-v2.2.1,morph-v2.2.2. - Database format unchanged.
- Default config unchanged. New optional flags:
--rpc.rangelimit— alias for--rpc.getlogs.maxrange(upstream #33163).--metrics.influxdb.interval— InfluxDB reporting interval is now configurable (upstream #33767).cmd/geth override-genesis— new override genesis flag.
- The
migration-checkerbinary has been removed. Migration tools now live underbuild/bin/.
Tracing fix (debug_trace*)
Before this release, calling debug_traceBlock / debug_traceTransaction with prestateTracer on a tx that goes through the Morph alt-token gas path could panic:
panic: runtime error: invalid memory address or nil pointer dereference
github.com/morph-l2/go-ethereum/eth/tracers/native.(*prestateTracer).lookupStorage
eth/tracers/native/prestate.go:316
Root cause: lookupStorage assumed the contract had already been registered via lookupAccount, which is not true for the fee-token contract reached during preCheck → buyAltTokenGas → GetAltTokenBalanceByEVM → StaticCall. The system-call hook bridge also only fired for V2 tracer hooks, leaving legacy tracers unbracketed.
Fixed in #308 by:
- Making
lookupStoragecallensureAccountitself (no implicit ordering requirement). - Adding
OnBalanceChange/OnNonceChange/OnCodeChange/OnStorageChangehooks so prestate is rebuilt correctly across system-call boundaries. - Bridging both V1 (
OnSystemCallStart) and V2 (OnSystemCallStartV2) hooks incore/token_gas.goso all tracers see fee-token helper calls as system calls. - Hardening flatCallTracer / mux tracer to not leak hidden system-call frames.
Upstream Sync (v1.16.3 → v1.16.7)
Picked up in three batches (PRs #322 / #323 / #324):
eth_getStorageValues— batched storage RPC, includingweb3extregistration (upstream #32591).inspect-trie— full-parity command with upstream tooling (upstream #28892).BlockTimestamponRPCTransaction(upstream #33709).--rpc.rangelimitalias for--rpc.getlogs.maxrange(upstream #33163).- InfluxDB reporting interval is configurable (upstream #33767).
- txpool heartbeat semantics for non-executable transactions (upstream #33704).
Bug fixes & hardening
RPC / filters / GraphQL / WebSocket
- Reject negative
log query limitconfig; enforce filter logs block range; bound log query width. - Clean up filter subscriptions on event-system stop and on errors; prevent slow receipt subscriptions from blocking filters; improve filter locking during
GetFilterChanges. - Avoid state lookup for pending tx hash subscriptions; harden VM context and pending tx state lookup.
- Treat zero storage value slots as empty request; guard pending full transaction base fee lookup; handle empty EVM block context time.
- Cap WebSocket message reads; fix WebSocket read-limit race; simplify size-limit check.
- Limit GraphQL query depth.
- Handle pending block receipts; add transaction-receipts subscription.
- Add
eth_sendRawTransactionSync. - Validate proof hash inputs early.
- Handle
nilparameter inmorph_diskRootto prevent panic (#311). - Propagate errors from chain-event receipt fallback.
- Log malformed chain events / receipt marshal failures.
Core / VM / state / txpool
- Reject max nonce in txpool validation; strengthen nonce max validation tests.
- Skip code install for empty creates; skip code hooks for unchanged code.
- Reject duplicate tx messages in eth/protocols.
- Align tx sync max timeout with HTTP default; validate tx sync timeouts from config.
- Improve transaction fetching with on-chain cache.
- Head
nilcheck when getting block (#326).
Pruner / trie / state
- Pruner: fall back to disk snapshot root when journal is missing (#300), then re-stabilized via tee-writer + HEAD as prune target + genesis root validation (#310).
- Trie: fix
VerifyRangeProofpath-prefix check; harden range boundary tests. - Multi-package audit fixes (zkTrie gate, heartbeat, overflow guards, etc.).
p2p / fetcher / accounts
- Suppress normal listener close log; clean v4 discovery after v5 setup failure.
- Clear dropped peer alternates in fetcher.
- Guard smartcard pairing lookups.
- Fix Ledger EIP-155 / EIP-712 version gates.
Genesis / cmd / build / CI
- Validate chain ID before assigning to network ID; derive
networkIdfromchainIdwhen--networkidis omitted. - Add override-genesis flag to
cmd/geth. - Expose startup flags in
geth help. - Support Morph fork names in the statetest runner (#329).
- Multi-platform Docker images: amd64 + arm64 (#298).
- Route migration tools to
build/bin/(#321); removemigration-checker(#320). - Remove sequencer batch write paths and unused
NewL2Blockbatch hash (#319).
MorphTx
- Fix RLP decoding for
MorphTx(#299).
Folded-in tags
Released contents of the previously tagged but unpublished:
morph-v2.2.1(2026-03-17) — MorphTx RLP decoding fix (#299), multi-arch Docker (#298).morph-v2.2.2(2026-05-06) — tracer fee-token fix (#308), pruner reliability (#300/#309/#310),morph_diskRootnil guard (#311), migration-tooling cleanup (#319/#320/#321).
Full changelog
morph-v2.2.0...morph-v2.2.3 — 132 files changed, +11,776 / −1,428.