Skip to content

Releases: morph-l2/morph-reth

v1.0.0

24 Jun 12:16
773887b

Choose a tag to compare

Summary

This is the 1.0.0 milestone for morph-reth. It realigns the client onto upstream
Reth, adds first-class support for the centralized-sequencer execution-layer flow,
and lands a wave of Morph-geth RPC-compatibility, audit, and consensus-correctness
fixes hardened against Morph mainnet and Hoodi testnet.

Highlights

  • Unfork onto upstream Reth v2.2.0 (#98) — morph-reth now tracks
    paradigmxyz/reth v2.2.0 directly instead of a hard fork, with retroactive
    state-root trust so historical Morph blocks continue to validate. This greatly
    reduces the maintenance surface for pulling future upstream Reth releases.
  • Centralized-sequencer EL support (#124) — adds the V2 Engine API surface,
    reorg handling, and next_l1_msg_index hardening required to run morph-reth as
    the execution layer behind the centralized sequencer.
  • Morph-geth RPC compatibility (#114, #115, #117) — Morph transaction and
    receipt serialization is aligned with morph-geth, and L1-message RPC responses
    now emit the expected placeholders (nonce/v/r/s, gasPrice=0x0) so
    existing geth-oriented tooling keeps working unchanged.
  • Transaction-pool admission gates (#120) — the txpool now enforces
    Morph-specific admission rules, rejecting transactions that violate Morph
    constraints before they enter the pool.
  • Standalone morph-statetest runner (#113) — a dedicated binary for running
    Ethereum/Morph state tests, easing conformance and regression testing.

Security & Audit

  • MorphTx audit findings + follow-ups (#134, #116) — addressed the issues
    raised in the MorphTx audit and subsequent follow-up review.
  • Dependency advisory fix (#119) — bumped tar to 0.4.46 to resolve
    GHSA-3pv8-6f4r-ffg2.

Correctness Fixes

  • fix(consensus): future block timestamps are now treated as transient rather
    than permanent failures (#133).
  • fix(engine-api): finalized tags are preserved during safe imports (#130).
  • fix(revm): L1 fee fallback encoding is now tx-type exact (#131).
  • fix(node): a zero withdraw-trie root is treated as unspecified (#127).

Operational

  • Improved Grafana dashboard signal quality (#110).
  • Workspace Rust version lowered to 1.93 for broader toolchain compatibility (#129),
    plus assorted CI/dependency bumps.

All Changes

  • fix x86 build (#137)
  • chore: bump version to 1.0.0 (#135)
  • fix: address MorphTx audit findings (#134)
  • fix(consensus): mark future timestamps as transient (#133)
  • chore(ci): bump actions/checkout from 6 to 7 (#136)
  • fix(engine-api): preserve finalized tags during safe imports (#130)
  • fix(revm): make L1 fee fallback encoding tx-type exact (#131)
  • chore(engine-api): remove per-block debug timing logs (#132)
  • fix(node): treat zero withdraw trie root as unspecified (#127)
  • chore: lower workspace Rust version to 1.93 (#129)
  • chore(ci): bump actions/github-script from 8 to 9 (#126)
  • feat: centralized-sequencer EL support (V2 engine API + reorg + next_l1_msg_index hardening) (#124)
  • fix(txpool): enforce Morph transaction admission gates (#120)
  • chore(deps): bump tar to 0.4.46 to fix GHSA-3pv8-6f4r-ffg2 (#119)
  • fix(primitives): emit gasPrice=0x0 placeholder for L1 message RPC (#117)
  • chore(ci): bump actions/download-artifact from 4 to 8 (#118)
  • fix: address audit follow-ups (#116)
  • fix(primitives): emit nonce/v/r/s placeholders for L1 message RPC (#115)
  • fix(rpc): align Morph transaction and receipt serialization with morph-geth (#114)
  • feat(bin): add standalone morph-statetest runner (#113)
  • chore(ci): bump docker/setup-buildx-action from 3 to 4 (#111)
  • Improve Grafana dashboard signal quality (#110)
  • chore(ci): bump actions/checkout from 4 to 6 (#109)
  • feat: unfork reth to paradigmxyz/reth v2.2.0 with retroactive state-root trust (#98)
  • chore(ci): bump actions/upload-artifact from 4 to 7 (#108)

Binaries

System Architecture Binary
x86_64 morph-reth-1.0.0-x86_64-linux.tar.gz
aarch64 morph-reth-1.0.0-aarch64-linux.tar.gz
Docker ghcr.io/morph-l2/morph-reth:v1.0.0

v0.3.0

09 May 09:30
da08e9e

Choose a tag to compare

Summary

Highlights

  • New morph_ RPC namespace (#106) — adds morph_getTransactionHashesByReference,
    backed by a new morph-reference-index crate (dedicated MDBX store) and an ExEx
    that indexes Morph-tx references from the Jade activation block onward. Ships
    with startup backfill + reorg-aware reconcile, gated readiness, and
    lag-threshold guards. Compatible with geth-style hex-quantity offset /
    limit on the wire.

  • Build-profile gradient and production-deploy retune (#104) — adds explicit
    dev / release / profiling / maxperf / bench / hivetests profiles
    to the workspace. Production deploys (Dockerfile, EC2 build, tag-push release
    CI) now default to the profiling profile, which captured ~80% of maxperf's
    hot-path gains in our benchmarks while avoiding maxperf's ERC20 long-tail
    regression. x86_64 release artifacts now target the x86-64-v3 baseline
    (Haswell+ / Excavator+) plus pclmulqdq.

Breaking Changes

  • Removed engine_appendBatchSignature and BatchSignature (#105) — the
    consensus layer (tendermint / morphnode) stopped calling this method after
    batch generation moved out of the consensus path into the tx-submitter
    (morph-l2/go-ethereum#319, morph-l2/tendermint#35,
    morph-l2/morph#939). Operators must run a tendermint / morphnode build
    that no longer issues the call.

Notable Cleanups

  • refactor(evm): removed unreachable apply_curie_hard_fork dead code; every
    Morph chain config sets curieBlock = 0 and the L1GasPriceOracle Curie slots
    are initialized post-launch via a regular transaction (mainnet block 863) (#101).
  • fix(clippy): silenced unnecessary_sort_by (#100).

Compatibility

  • No state-DB schema changes for the main reth datadir.
  • New optional reference-index DB at <datadir>/morph/reference_index/
    created and backfilled on first start; takes a few minutes for the
    post-Jade range to become queryable. The RPC returns
    -32000 "reference index initializing" until ready.

Full Changelog: v0.2.2...v0.3.0

All Changes

  • chore: bump version to 0.3.0 (#107)
  • chore(ci): bump docker/metadata-action from 5 to 6 (#99)
  • refactor(evm): remove unused apply_curie_hard_fork dead code (#101)
  • feat(rpc): implement morph_getTransactionHashesByReference (#106)
  • refactor(engine-api): remove engine_appendBatchSignature and BatchSignature (#105)
  • chore: add workspace build profile gradient and wire prod deploys to profiling (#104)
  • fix(evm): use sort_by_key to satisfy clippy unnecessary_sort_by lint (#100)

Binaries

System Architecture Binary
x86_64 morph-reth-0.3.0-x86_64-linux.tar.gz
aarch64 morph-reth-0.3.0-aarch64-linux.tar.gz
Docker ghcr.io/morph-l2/morph-reth:v0.3.0

v0.2.2

16 Apr 08:10
faec4c8

Choose a tag to compare

Summary

This release introduces Prometheus metrics for observability, fixes --version to correctly display morph-reth identity, and
updates CI dependencies.

Highlights

  • Engine API & Payload Builder Metrics: Added Prometheus counters, histograms, and gauges for Engine API calls
    (newL2Block, assembleL2Block, fork_choice_updated) and payload building (block gas, tx counts, build duration). Enables
    Grafana dashboards and alerting for node operators.
  • Version Metadata Override: morph-reth --version now shows morph-reth's own version, commit SHA, and build info instead
    of the upstream reth fork values. The -dev suffix is automatically appended for non-tagged builds.
  • CI: Bumped docker/build-push-action from v6 to v7.

All Changes

  • feat(metrics): add Prometheus metrics for Engine API and payload builder (#97)
  • feat(node): override version metadata with morph-reth info (#95)
  • chore(ci): bump docker/build-push-action from 6 to 7 (#96)

Binaries

System Architecture Binary
x86_64 morph-reth-0.2.2-x86_64-linux.tar.gz
aarch64 morph-reth-0.2.2-aarch64-linux.tar.gz
Docker ghcr.io/morph-l2/morph-reth:v0.2.2

v0.2.1

13 Apr 06:19
c957148

Choose a tag to compare

Summary

All Changes

  • feat(p2p): hardcode Morph bootnodes in chainspec and simplify startup (#94)
  • fix(engine-api): add engine_appendBatchSignature no-op stub for sync nodes (#93)
  • chore: bump version to 0.2.1 (#90)
  • fix(evm): restore tx_gas_limit_cap override to disable EIP-7825 on Morph (#91)
  • fix(build): use git CLI for fetching cargo git dependencies on EC2 (#92)
  • fix(release): remove checklists from release notes (#85)
  • fix(rpc): handle eth_config when no timestamp fork is active yet (#86)
  • perf(txpool): reuse state provider across batch transaction validation (#88)
  • chore(deps): upgrade vergen/vergen-git2 to 9.1.0, remove [patch.crates-io] (#89)

Binaries

System Architecture Binary
x86_64 morph-reth-0.2.1-x86_64-linux.tar.gz
aarch64 morph-reth-0.2.1-aarch64-linux.tar.gz
Docker ghcr.io/morph-l2/morph-reth:v0.2.1

v0.2.0

08 Apr 02:45
7d75856

Choose a tag to compare

Summary

This is the first public release of morph-reth, the Reth-based execution client for Morph L2. It establishes the complete CI/CD
infrastructure and delivers a series of correctness fixes validated against Morph mainnet and Hoodi testnet.

New Features

  • eth_config RPC method — Morph-specific chain configuration endpoint (#72)
  • Jade fork activation timestamps — Mainnet and Hoodi hardfork schedules are now set (#51)

Bug Fixes

  • BLOCKHASH opcode — Aligned with Morph geth semantics (chain_id || block_number hash) (#38)
  • State root validator — Restored pre-Jade ZK-trie state root hook (#47)
  • L2 header alignment — Fixed field mismatch between assemble and import paths (#58)
  • Trace replay — Fixed Morph trace replay on Cancun-active chains (#57)
  • L1 message gas price — baseFee now returned as effectiveGasPrice for L1 messages (#60)
  • Payload serialization — nextL1MessageIndex serialized as bare uint64 instead of hex (#73)
  • EVM — Removed unnecessary EIP-7825 tx gas limit cap override (#79)
  • Chainspec — MORPH_BASE_FEE used as genesis default (#74)
  • Engine API — resolve_kind(WaitForPending) used for correct payload resolution (#82)
  • Security — Fixed lz4_flex memory leak (GHSA-vvp9-7p8x-rfvv) and keccak ARMv8 unsoundness (GHSA-2326-pfpj-vk5v) (#41, #53)

Infrastructure

  • Multi-platform Docker images (linux/amd64, linux/arm64) — build time reduced from ~200min to ~20min via cross-compilation
  • Full CI pipeline: build, lint, test, cargo-deny, release, and Docker workflows
  • Reproducible release binaries for x86_64 and aarch64 Linux with SHA256 checksums

All Changes

  • fix(release): use cross main branch to fix mdbx-sys build (#84)
  • chore: add Cross.toml for cross-compilation clang/llvm dependencies (#83)
  • fix(engine-api): use resolve_kind(WaitForPending) instead of best_payload (#82)
  • chore: add Makefile and MakefileEc2.mk, update README (#78)
  • fix(evm): remove unnecessary EIP-7825 tx gas limit cap override (#79)
  • refactor(chainspec): rename jadeTime to jadeForkTime for go-ethereum compatibility (#80)
  • chore: bump version to 0.2.0 (#77)
  • chore(ci): bump docker/login-action from 3 to 4 (#81)
  • fix(chainspec): use MORPH_BASE_FEE as genesis default instead of INITIAL_BASE_FEE (#74)
  • chore(ci): bump marocchino/sticky-pull-request-comment from 2 to 3 (#75)
  • ci: use mold linker for faster CI builds (#71)
  • ci: add Docker multi-platform build and Release workflows (#70)
  • ci: add dependabot for GitHub Actions version updates (#69)
  • ci: add automatic PR labeling from linked issues (#67)
  • ci: add PR title conventional commit validation (#66)
  • ci(lint): add typos spell checker and editorconfig (#65)
  • test: add E2E test infrastructure and helpers (#63)
  • test: add unit tests across all morph-reth crates (#62)
  • ci: replace manual cargo cache with Swatinem/rust-cache (#68)
  • ci(deny): add cargo-deny dependency audit workflow (#61)
  • feat: implement eth_config RPC with morph extension (#72)
  • fix(payload): serialize nextL1MessageIndex as bare uint64, not hex string (#73)
  • fix(txpool): enforce hardfork activation for EIP-7702 and MorphTx (#59)
  • fix(primitives): return baseFee as effectiveGasPrice for L1 messages (#60)
  • fix: align L2 header fields between assemble and import paths (#58)
  • Fix Morph trace replay on Cancun-active chains (#57)
  • refactor: simplify logic across crates (#56)
  • chore(local-test): unify mainnet/hoodi scripts with MORPH_NETWORK selector (#54)
  • fix(deps): bump tracing-subscriber to 0.3.20 to fix ANSI log poisoning (#52)
  • fix(deps): bump lz4_flex to 0.11.6 to fix uninitialized memory leak (GHSA-vvp9-7p8x-rfvv) (#53)
  • docs: sync README and tooling docs (#50)
  • feat(chainspec): set Jade fork activation timestamps (#51)
  • fix: pre-audit security hardening and bug fixes (#48)
  • fix(node): restore StateRootValidator hook for pre-Jade state root ha… (#47)
  • deps: downgrade reth to paradigmxyz/reth v1.10.0 (#46)
  • fix(serde): add default for TxMorph version/feeTokenId/feeLimit fields (#44)
  • docs: improve README accuracy, add LICENSE and CONTRIBUTING files (#42)
  • fix(deps): upgrade keccak to 0.1.6 to fix ARMv8 unsoundness (GHSA-2326-pfpj-vk5v) (#41)
  • fix(revm): restore original_value after revm-state 9.0.0 (#39)
  • fix(revm): align BLOCKHASH with Morph geth semantics (#38)
  • refactor(engine-api): simplify engine API and fix code quality issues (#35)

Binaries

System Architecture Binary
x86_64 morph-reth-0.2.0-x86_64-linux.tar.gz
aarch64 morph-reth-0.2.0-aarch64-linux.tar.gz
Docker ghcr.io/morph-l2/morph-reth:v0.2.0