github morph-l2/go-ethereum morph-v2.2.3

5 hours ago

morph-v2.2.3

Patch release covering everything since morph-v2.2.0 (Jade). Includes the contents of the unreleased morph-v2.2.1 and morph-v2.2.2 tags. 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 dereference panic in debug_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-checker binary has been removed. Migration tools now live under build/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 lookupStorage call ensureAccount itself (no implicit ordering requirement).
  • Adding OnBalanceChange / OnNonceChange / OnCodeChange / OnStorageChange hooks so prestate is rebuilt correctly across system-call boundaries.
  • Bridging both V1 (OnSystemCallStart) and V2 (OnSystemCallStartV2) hooks in core/token_gas.go so 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, including web3ext registration (upstream #32591).
  • inspect-trie — full-parity command with upstream tooling (upstream #28892).
  • BlockTimestamp on RPCTransaction (upstream #33709).
  • --rpc.rangelimit alias 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 limit config; 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 nil parameter in morph_diskRoot to 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 nil check 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 VerifyRangeProof path-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 networkId from chainId when --networkid is 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); remove migration-checker (#320).
  • Remove sequencer batch write paths and unused NewL2Block batch 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_diskRoot nil 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.

Don't miss a new go-ethereum release

NewReleases is sending notifications on new releases.