# Erigon v3.7.0 — TBD

### Changed

- node: RPC HTTP gzip compression moved from the cgo-based `go-libdeflate` to the pure-Go `klauspost/compress`, and fully buffered (one-shot) responses now compress at `BestSpeed` (level 1) instead of level 6; streaming responses were already at `BestSpeed`. Large one-shot responses gain ~10-14% latency and roughly half the compression CPU, in exchange for slightly larger compressed bodies (+2-8% wire size — relevant for operators who pay for egress). Also removes the libdeflate compressor pool and its `libdeflate_pool_*` metrics, eliminating the cgo leak class fixed in #22700 (#22882) — by @lupin012

---

# Erigon v3.6.0 — Upstream Underbelly — TBD

### Breaking Changes

#### `--prune.include-receipts`: historical receipts cache now off by default in all prune modes

The historical ("fat") receipts cache is no longer enabled by default on non-archive nodes. Previously
`--prune.include-receipts` (formerly `--persist.receipts`, still accepted as an alias) defaulted on for every prune mode
except `archive`; it now defaults off everywhere. The consensus layer was the consumer that justified retaining these
receipts on pruned nodes, and it no longer needs them ([#21617](https://github.com/erigontech/erigon/issues/21617)).

**What changed:**

| `--prune.mode` | Before | After |
|---|---|---|
| `archive` | off | off |
| `full` | on | off |
| `blocks` | on | off |
| `minimal` | on | off |

Receipts and logs stay available within a node's retention window regardless: without the cache they are re-executed on
demand from state history, so `eth_getLogs` and `eth_getBlockReceipts` keep working, at higher latency. For `full` and
`minimal` nodes the availability window is unchanged (receipts follow the state-history window either way). For `blocks`
nodes the cache previously made receipts and logs queryable back to genesis; without it they follow the state-history
window (last 262,144 blocks) — pass `--prune.include-receipts` if you rely on full-range `eth_getLogs`.

**Migration:** existing datadirs are unaffected — the receipts-cache setting is recorded at datadir creation and the
stored value wins, so a node already syncing with the cache keeps it. Such a node now logs a startup notice that
`--prune.include-receipts` differs from the value stored in the datadir; pass `--prune.include-receipts` explicitly to
silence it. Only newly-created `full`/`minimal`/`blocks` datadirs start without the cache; pass
`--prune.include-receipts` on a fresh datadir to opt back in.

(#22296) — by @yperbasis

---

#### CLI: receipts and commitment-history pruning flags moved under `--prune.*`

The receipt cache and commitment history now share the `--prune.*` naming used by the rest of the pruning flags. All
former names keep working as aliases, and stored datadir settings are unaffected.

- `--persist.receipts` → `--prune.include-receipts` (alias: `--persist.receipts`, `--experiment.persist.receipts.v2`).
- New `--prune.receipts.distance` (alias: `--persist.receipts.distance`) bounds how far back the receipt cache is kept:
  a block count, `keep-all`, or empty/`0` (default) to follow the state-history window. Requires
  `--prune.include-receipts`. Snapshots older than the window are skipped at download time.
- `--prune.commitment-history.distance` now also accepts `keep-all` (in addition to a block count); empty or `0` still
  keeps everything.

(#22349) — by @AskAlexSharov

---

#### JSON-RPC: block-number strings must use the `0x` hex format

Quoted decimal strings (e.g., `"3"`) are no longer accepted as block-number
parameters; use the canonical hex form (e.g., `"0x3"`) instead. Bare JSON
integers (`3`) and named tags (`"latest"`, `"earliest"`, `"pending"`,
`"safe"`, `"finalized"`) are unchanged.

**What changed:**

| Input | Before | After |
|---|---|---|
| `"3"` (quoted decimal) | accepted | rejected with `-32602` |
| `"0x3"` (hex string) | accepted | accepted |
| `3` (bare integer) | accepted | accepted |

**Migration:** replace any quoted decimal block number with its `0x`
equivalent — e.g., `"3"` → `"0x3"`, `"1000000"` → `"0xf4240"`.

---

#### `eth_simulateV1`: base fee too low error code corrected to `-38012`

Aligns Erigon with the `eth_simulateV1` error code specification ([NethermindEth/nethermind#11412](https://github.com/NethermindEth/nethermind/issues/11412)).

**What changed:**

| Aspect | Before | After |
|---|---|---|
| `ErrFeeCapTooLow` error code | `-32602` (generic "Invalid params") | `-38012` (spec-mandated "baseFeePerGas is too low") |

**Migration:**

- If your tooling matches on error code `-32602` to detect base-fee-too-low conditions in `eth_simulateV1` responses, update it to match `-38012` instead.

---

#### JSON-RPC: idle polling filters are evicted after 5 minutes

Filters created with `eth_newFilter`, `eth_newBlockFilter`, and `eth_newPendingTransactionFilter` are now evicted when not polled for 5 minutes, matching geth's stale-filter deadline. Previously they lived — and kept buffering data — until `eth_uninstallFilter` or a restart.

**What changed:**

| Aspect | Before | After |
|---|---|---|
| Idle polling filter | kept until uninstalled or restart | evicted after 5 minutes without a poll |
| `eth_getFilterChanges` / `eth_getFilterLogs` on an evicted id | — | `filter not found` |

**Migration:** poll more often than the timeout, or recreate the filter when `filter not found` is returned (as with geth). Tune with `--rpc.subscription.filters.timeout`; set it to 0 to restore the previous keep-forever behavior. (#22261 by @onelapahead)

### Added

#### CLI & Operations

- `--prune.distance.blocks` now accepts readable policy names — `keep-post-merge` and `keep-all` — instead of the raw `MaxUint64`-based magic numbers (`18446744073709551615` / `18446744073709551614`); `--prune.distance` likewise accepts `keep-all`. Numeric values still work (#22119) — by @yperbasis
- `--rpc.subscription.filters.timeout` — deadline for evicting idle RPC polling filters (default 5m; 0 disables). New `subscriptions_active` gauge and `subscriptions_created_total` / `subscriptions_unsubscribed_total` / `subscriptions_reaped_total` counters track the filter lifecycle (#22261) — by @onelapahead
- `--witness.cache.blocks`, `--witness.cache.head-capture`, and `--witness.cache.maxmb` enable an eager in-memory cache of recent-block legacy `debug_executionWitness` results, keyed by block hash. Head-capture mode lets a minimal node (no commitment-domain history) serve witnesses for the last N head blocks cache-only — a miss returns out-of-window rather than recomputing from history. New `witness_cache_*` metrics track hits, misses, builds, and resident entries. Embedded RPC only — by @awskii

---

# Erigon v3.5.4 — Tidal Tails — 2026-07-28

v3.5.4 is a bugfix release recommended for all users, and especially for operators running the RPC daemon with response compression enabled — archive nodes and high-traffic RPC endpoints — where a native-memory leak in the gzip path could grow by ~9-15 GiB/day (#22700). It is a drop-in upgrade from 3.5.3 — no re-sync required.

**Bugfixes**

- node: fix a native (C-allocated) memory leak in the RPC gzip path (#22700) by @AskAlexSharov — the `libdeflate.Compressor` was pooled in a `sync.Pool` whose GC-evicted entries never had `Close()` called, leaking the C context (~9-15 GiB/day on an archive node). Replaced with a bounded channel pool that closes compressors on overflow. Fixes #22672.
- cmd: expand a leading `~/` (or `~\` on Windows) and `$VAR` in `--datadir` for the cobra-based binaries (#22785) by @lystopad — rpcdaemon and the other cobra commands previously used the raw path, so a tilde/env-prefixed `--datadir` was not resolved the way the main erigon binary resolves it. Fixes #14629.

**Improvements**

- build: update `google.golang.org/grpc` to v1.82.1 (#22690) by @AskAlexSharov — brings `release/3.5` in line with `release/3.6` and `main`.

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.5.3...v3.5.4

---

# Erigon v3.5.3 — Tidal Tails — 2026-07-23

v3.5.3 is a bugfix release recommended for all users. It is a drop-in upgrade from 3.5.2 — no re-sync required.

**Bugfixes**

- execution/stagedsync: restore log/receipt notifications for mid-block resumed blocks (#22648) by @lupin012 — backports the notification-completeness half of #22235. After the earlier `ReceiptDomain` fix, both executors still gated `RecentReceipts.Add` on a stale `isPartial`/`startTxIndex==0` flag, so a block resumed mid-block never emitted a correct receipt/log notification over `eth_subscribe("logs"/"newReceipts")`. Both executors now reconstruct the resumed block's prefix receipts and gate on a `receiptsComplete` field.
- rpc: return a JSON-RPC error instead of panicking on a null transaction in the trace path (#22668) by @AskAlexSharov — `trace_transaction` / `trace_filter` could dereference a nil txn when `TxnByIdxInBlock` resolves a txIndex whose body hasn't materialized yet at the chain tip. Fixes #22643.
- rpc: fix the `handleBatch` deadlock (#22459) by @yperbasis — a filtered JSON-RPC batch could wedge on `wg.Wait()` and time the request out. Fixes #22424.
- types: reject legacy transactions wrapped in a typed (EIP-2718) envelope (#22525) by @taratorio.
- types: reject an empty-string element in RLP transaction-list decoding (#22524) by @taratorio.
- cl/phase1/stages: fix `uint64` underflow in the "Downloading Execution History" progress log (#22462) by @lystopad — once the live EL head advanced past the frozen initial progress, the `toprocess` subtraction wrapped to ~2⁶⁴ and produced a garbage ETA. Fixes #22455.
- cl/phase1/stages: guard the "[Caplin] Forward Sync" progress log against slot under/overflow (#22465) by @lystopad — the same unguarded-subtraction / `time.Duration`-overflow pattern on the forward-sync line.

**Improvements**

- rpc: make the `eth_getLogs` per-position address/topic limit configurable via `--rpc.logs.querylimit` (#22477) by @lupin012 — replaces the hardcoded 1000-entry limit; default 1000 preserves current behaviour, 0 = unlimited.
- cl/phase1/stages: route the history-download and forward-sync progress ETAs through the shared, overflow-safe `utils.ETA` helper (#22493, #22512) by @lystopad.

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.5.2...v3.5.3

---

# Erigon v3.5.2 — Tidal Tails — 2026-07-13

v3.5.2 is a bugfix release recommended for all users, and especially for anyone running 3.5.1 — it fixes a sync-halting trie-root regression introduced there (#22399). It is a drop-in upgrade from 3.5.1 — no re-sync required.

**Bugfixes**

- db/state: clear the StateCache on `SharedDomains` unwind below the reorg window (#22402) by @Sahil-4555 — after the v3.5.1 changeset-isolation backport, a block that failed execution within the reorg window did a disk-noop overlay unwind that left dirty, uncommitted writes in the state cache; on the next run execution read those stale values instead of the database, producing a deterministic trie-root mismatch that halted sync. Closes #22399.
- rpc, node: fix the nil-pointer panic in the gzip batch flush race (#22383) by @lupin012 — a gzipped JSON-RPC batch with two or more streamable methods invoked the shared gzip-streaming flush hook concurrently from per-call goroutines; `gzipResponseWriter.Flush` is not concurrency-safe, so the calls raced on the underlying gzip writer and could dereference a nil flate compressor, crashing the node. Closes #22334.

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.5.1...v3.5.2

---

# Erigon v3.5.1 — Tidal Tails — 2026-07-10

v3.5.1 is a bugfix release recommended for all users. It is a drop-in upgrade from 3.5.0 — no re-sync required.

**Bugfixes**

- execution/stagedsync: fix parallel-execution commitment consistency at step boundaries (#22111, #22135, #22147, #22094) by @awskii, @sudeepdino008 — a block straddling a step boundary left that step's commitment inconsistent with the account/storage/code domains, so published snapshots could mis-serve state-read RPCs (`eth_getProof`, `debug_executionWitness`) and, on a later run, wedge the Execution stage in a zero-progress loop with nothing logged. Closes #21992, #22101.
- execution/stagedsync: fix log index reset and missing WebSocket notifications in parallel execution (#22155) by @Sahil-4555 — restores `logs` / `newHeads` subscription notifications and correct log indexing when executing in parallel.
- execution/stagedsync: fix pruning in `stage_custom_trace` (#22052) by @sudeepdino008 — regenerated domains were never pruned and accumulated unbounded in the DB. Closes #22013.
- cl/persistence: fix caplin historical state reconstruction loop at the Bellatrix transition (#22370) by @Sahil-4555 — a Caplin node could stop advancing at the Merge (Bellatrix) slot; pre-Merge blocks carry an all-zero execution payload header, and reconstruction now detects the zero block hash and skips the EL transaction lookup. Closes #22337.
- cl/phase1/forkchoice: replace latestMessagesStore interning with a flat per-validator slice (#22355) by @lystopad — the prune scan walked the whole message map on every update and stalled `GetHead` past the attestation deadline. Closes #22351.
- cl/antiquary: commit reconstructed state in bounded batches (#22348) by @awskii — committing up to 30 minutes of replayed beacon state in a single MDBX transaction could overflow libmdbx and crash on large (100+ GB) archive databases.
- cl: bound caplin archive blob-column backfill so it can't wedge on Fulu (#22318) by @awskii — prevents an archive node from getting stuck while backfilling blob (data-column) sidecars.
- cl, db/snapshotsync: caplin snapshot correctness — don't freeze empty block/state roots (#22323) and remove overlapping state snapshots on retire (#22317) by @awskii.
- cl: allow boundary attestations while head state lags (#22251) by @domiwei — fixes attestation validation at epoch boundaries when the wall-clock slot has advanced but the head state briefly lags behind.
- rpc/jsonrpc: gate `debug_executionWitness` on `keys[]` completeness and keep preimages for in-block-deleted accounts (#22320) by @awskii — avoids returning an incomplete witness.
- rpc: remove the state-history check from block-data-only endpoints (#22073) by @Sahil-4555 — endpoints that only need block data no longer error on nodes pruned below the requested block's state history.
- cmd/utils: allow snapshot reset on upgraded datadirs by restricting the table config (#22291) by @Sahil-4555 — snapshot reset failed to resolve the chain name on upgraded datadirs. Closes #22275.

**Improvements**

- execution: disable gzip compression for the Engine API (#22369) by @taratorio — removes compression overhead on `engine_*` responses, lowering `engine_getPayload` / `getBlobs` latency.
- p2p: re-resolve the STUN external IP at runtime (#22188) by @lystopad — with `--nat=stun`, a node whose public IP changes while running now re-resolves and re-advertises it instead of keeping the stale startup value.
- db/version: relax the minor-version check in `Supports` (#22205) by @sudeepdino008 — a newer, backward-readable minor version within a supported major is now accepted, so the binary won't refuse newer minor-versioned files.

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.5.0...v3.5.1

---

# Erigon v3.5.0 — Tidal Tails — 2026-06-26

Erigon 3.5.0 is a major release headlined by **parallel block execution becoming the default** and **initial support for Ethereum's upcoming Glamsterdam hardfork**. It is a drop-in upgrade for 3.4.x users — no re-sync required; existing datadirs upgrade their prune configuration automatically (see Breaking Changes).

### Key Features

- **Parallel block execution, on by default.** Erigon now executes EVM transactions across multiple cores by default, using the Block-STM (software transactional memory) design pioneered by Aptos: transactions run optimistically in parallel and are re-validated against a multi-version state, re-executing only on conflict (#21591 by @mh0lt, closes #17630). Revert to serial with `EXEC3_PARALLEL=false` or `--exec.serial`.
- **Glamsterdam devnet support.** Initial implementation of Ethereum's next hardfork: Block-Level Access Lists (EIP-7928), enshrined Proposer-Builder Separation / "Gloas" (EIP-7732) in Caplin, gas repricings (EIP-8037, EIP-7976, EIP-7981), larger contracts (EIP-7954), transfer logs (EIP-7708), and the `eth/71` Block Access List wire protocol (EIP-8159). **Devnet/testing only — not scheduled on mainnet or any public testnet.**
- **`debug_executionWitness`.** Stateless execution-witness generation (EIP-7928/8025) with reth-compatible output, for zkEVM and stateless clients (#20205 by @antonis19, #21629 by @awskii).
- **More aggressive history pruning by default.** `--prune.mode=full` now follows the EIP-8252 reorg-retention window (~36 days / 262,144 blocks) — see Breaking Changes.
- **GraphQL API revival.** Broad resolver coverage restored — queries, logs, `call`, `sendRawTransaction`, `estimateGas`, `gasPrice`, storage, and EIP-4844 fields.

### Breaking Changes

#### `--prune.mode=full`: EIP-8252 retention window replaces pre-merge history-expiry

Full mode now retains state and block data for the last `262,144` blocks (~36.4 days), matching [EIP-8252](https://github.com/ethereum/EIPs/pull/11601)'s `REORG_RETENTION_WINDOW` ([#21342](https://github.com/erigontech/erigon/pull/21342)). Previously full mode pruned only pre-merge block data ([EIP-4444](https://eips.ethereum.org/EIPS/eip-4444) history-expiry) and kept the last 100,000 blocks of state history.

**What changed:**

| | Before | After |
|---|---|---|
| State history retention | last 100,000 blocks | last 262,144 blocks |
| Block data retention | pre-merge pruned, all post-merge kept (EIP-4444) | last 262,144 blocks |

**Migration:** existing datadirs upgrade automatically and silently. To keep the old "retain all post-merge block data" behavior, set `--prune.distance.blocks=18446744073709551615`.

Note: physical deletion of frozen snapshot files is not implemented yet (see [#21306](https://github.com/erigontech/erigon/issues/21306)), so existing on-disk historical blocks persist for now, though the new cutoff is already recorded at the config level.

_In practice, this means only freshly synced `full` nodes will have a reduced disk footprint._

#### `--prune.mode=blocks`: state history retention bumped to 262,144 blocks

`--prune.mode=blocks` keeps the same shape as before (all block data retained), but its state history retention also bumps from 100,000 to 262,144 blocks. `--prune.mode=minimal` is unchanged — both block and state history retain the 100,000-block window, deliberately sub-EIP-8252 for disk-constrained operators. See [#21342](https://github.com/erigontech/erigon/pull/21342) for details.

---

#### Single p2p listener: `--p2p.allowed-ports` removed, all eth versions multiplex on `--port`

Erigon now opens a single TCP listener on `--port` (default 30303) carrying every configured eth protocol version, instead of one listener per protocol on 30303/30304/30305. This fixes a discovery-DHT race that left inbound peers stuck at a fraction of `--maxpeers` for multi-protocol deployments: per-protocol ENRs collided under one Node ID, so only one survived in the DHT and peers dialed the wrong listener (#21335).

**What changed:**

| Aspect | Before | After |
|---|---|---|
| Inbound peer ports | `30303`, `30304`, `30305`, … (one per eth version) | `30303` only |
| `--p2p.allowed-ports` flag | Picked one port per protocol from this list | **Removed** — passing it now errors |
| `--maxpeers` semantics | Per-protocol cap; actual ceiling ≈ N × maxpeers | Honest total cap |
| Default `--maxpeers` | `32` | `64` (compensates for the now-honest cap) |
| Enode database directory | `<datadir>/nodes/eth68`, `<datadir>/nodes/eth69`, … | `<datadir>/nodes/eth` |

**Migration:**

- Remove `--p2p.allowed-ports=...` from CLI args / config files; it is no longer recognised.
- Firewall, Kubernetes Service, and monitoring rules that explicitly opened 30304/30305 can drop those entries — only `--port` is bound now.
- If you previously lowered `--maxpeers` because you knew the per-protocol multiplication inflated the real ceiling, raise it back to the target total (the cap is now what the flag says).
- First run after upgrade loses the warm peer cache in `nodes/eth{68,69,…}` — nothing on disk is deleted, the directories are simply no longer read; discovery rebuilds the peer set from bootnodes within a few minutes.

Standalone `sentry` binary (`cmd/sentry`) and `--sentry.api.addr` (remote sentry over gRPC) are unaffected — neither had the bug.

---

#### `debug_trace*` RPC: `enableMemory` / `enableReturnData` replace `disableMemory` / `disableReturnData`

Aligns Erigon with the execution-apis specification ([ethereum/execution-apis#762](https://github.com/ethereum/execution-apis/pull/762)) and Geth behavior.

**What changed:**

| Field | Before (Erigon) | After (Erigon / Geth / Spec) |
|-------|-----------------|------------------------------|
| Memory in trace | `disableMemory` (default: included) | `enableMemory` (default: excluded) |
| Return data in trace | `disableReturnData` (default: included) | `enableReturnData` (default: excluded) |

Both the key and its default changed: `disable*` → `enable*`, and memory and return data are now **excluded** unless explicitly enabled — matching the spec and Geth.

**Migration:** memory and return data are now excluded by default. To include them, add the new opt-in key (omit it to keep the default):

- Memory: `{ "enableMemory": true }`
- Return data: `{ "enableReturnData": true }`

Affected RPC methods: `debug_traceTransaction`, `debug_traceBlockByHash`, `debug_traceBlockByNumber`, `debug_traceCall`.

---

#### Clique PoA consensus engine removed

The legacy Clique proof-of-authority engine has been removed (#20532 by @yperbasis). `--chain=dev` now runs on an embedded proof-of-stake consensus instead of Clique (#20451 by @mh0lt), matching how all live networks operate post-Merge. Networks or tooling that still depended on Clique are no longer supported.

---

#### Silkworm integration removed

The optional Silkworm C++ execution-backend integration and its `--silkworm.*` flags have been removed (#19662 by @canepat). Erigon uses its native Go execution engine exclusively.

---

### Glamsterdam (Devnet Support)

3.5.0 adds an initial implementation of Ethereum's next hardfork — **Glamsterdam** (consensus-layer "Gloas" + execution-layer "Amsterdam") — for devnet testing and validation. **It is not scheduled on mainnet or any public testnet**, and these code paths are inert on production networks until an activation time is configured.

- **EIP-7928 — Block-Level Access Lists (BAL):** records every account and storage slot a block touches, enabling deterministic parallel validation. Full builder, validator, and strict-validation support (#19627, #19656, #20602, #20776), plus the `eth_getBlockAccessList` RPC method (#19929) — by @mh0lt, @yperbasis, @Sahil-4555
- **EIP-7732 — Enshrined Proposer-Builder Separation (ePBS / "Gloas"):** implemented in Caplin — execution-payload envelope, PTC, and builder payments (#18956) — with follow-up audit and fork-choice fixes (#21248, #21228) — by @domiwei
- **Gas repricings:** EIP-8037 State Creation Gas Cost Increase (#19596), EIP-7976 calldata floor cost (#20613), EIP-7981 access-list cost (#20671) — by @taratorio
- **EIP-7954 — Increase Maximum Contract Size** (#19624) — by @yperbasis
- **EIP-7843 — slot-number opcode (`SLOTNUM`)**, wired into Caplin block production and `engine_forkchoiceUpdatedV4` (#20175) — by @yperbasis
- **Networking:** `eth/71` Block Access List exchange (EIP-8159, #20793, #20794, #20795) — by @mh0lt

### Added

#### RPC

- `debug_executionWitness`: generate stateless execution witnesses (EIP-7928/8025), with `legacy` and `canonical` output modes — the `legacy` format is reth-compatible — for zkEVM and stateless clients (#20205, #21371, #21518, #21629) — by @antonis19, @lupin012, @awskii
- `eth_capabilities`: report the set of supported RPC methods (#20951) — by @lupin012
- `debug_setHead`: rewind the chain head (#19577) — by @canepat
- **GraphQL** substantially revived — transaction, logs, `call`, `sendRawTransaction`, `estimateGas`, `gasPrice`, and storage resolvers, plus EIP-4844 fields (#20389, #20916, #21219, #21379, #21060) — by @lupin012
- `testing_` namespace exposed via `--http.api` for engine/spec test harnesses (#20482) — by @lupin012
- `eth_simulateV1`: per-call gas and result limits (#20232) — by @Sahil-4555

#### CLI & Operations

- `--exec.no-prune` (disable all DB pruning), `--exec.serial` (force single-threaded execution), and `--exec.*` executor-tuning flags (#20915, #20853, #20797) — by @mh0lt
- `seg du` (snapshot disk-usage analysis, #20104) and `seg rm-blocks` (remove latest block snapshots, #20554) — by @awskii, @sudeepdino008

### Changed

#### RPC

- WebSocket transport rewritten on `coder/websocket`, with overload protection, clean close frames, and bounded write timeouts (#20097, #20446, #20788, #20923) — by @lystopad, @lupin012, @Sahil-4555
- Admission control: uniform `503` responses under load (#20303); optional response compression via libdeflate (#20665) — by @lupin012
- Geth compatibility: `debug_traceTransaction` index format (#20210), `trace_rawTransaction` (#20448), `debug_accountRange` (#20057), null `v,r,s` for unsigned transactions (#21321) — by @lupin012
- Performance: faster `eth_getLogs` (#20561), `trace_block` (#20182), `eth_gasPrice` (#19678), canonical-hash cache (#19173); `engine_getPayload` ~2.4× and `getBlobs` ~10× faster (#21615, #21606) — by @lupin012, @taratorio
- `trace_*` returns an explicit error when an unsupported custom tracer is supplied (#21544) — by @lupin012

#### Networking & P2P

- New `eth/70` wire protocol: partial block receipt lists (EIP-7975, #19755) — by @yperbasis
- All eth protocol versions now multiplex on a single TCP listener (see Breaking Changes, #21335) — by @lystopad
- Peer hygiene / DoS hardening: cap and rate-limit inbound `NewBlockHashes` (#21557), enforce the 4096-hash limit on `NewPooledTransactionHashes` (#20577), drop peers failing blob KZG verification (#21421), and bound fan-out stream buffers (#20783) — by @yperbasis
- Skip chain-specific bootnodes on genesis-hash mismatch (#19807); honour an explicitly empty `--bootnodes` (#20630) — by @yperbasis

#### TxPool

- Proactive dormancy-based eviction of stale queued transactions (#19862) — by @lystopad
- Transaction parsing migrated onto the shared `execution/types` transaction types (#19757); malformed EIP-7702 authorization tuples are now tolerated rather than rejected wholesale (#20809) — by @yperbasis

#### Caplin (Consensus Layer)

- Unified Engine API client for standalone mode (#20035) — by @mh0lt
- Fork-choice and ENR-stability fixes — recovery from a post-Gloas fork-choice stall and a persistent node key for stable ENR across restarts (#21228, #21276) — by @domiwei
- Block production: give the EL builder a build window before stopping it, fixing near-empty proposed blocks (~0–2% gas) on otherwise-healthy validators (#21990) — by @lystopad

#### Storage & Performance

- Off-heap Elias-Fano index building (#20640) and parallel commitment computation (#20805) — by @AskAlexSharov, @mh0lt
- Transient-storage zero-write fast path (#20568) and opcode-scoped intern cache to eliminate duplicate `unique.Make()` (#20552) — by @Sahil-4555, @AskAlexSharov

### Removed

- Clique PoA engine (#20532 by @yperbasis) and Silkworm integration (#19662 by @canepat) — see Breaking Changes.
- Unused `hack` (#20412), `state` (#20420), and `diag` (#21351) helper binaries — by @awskii, @AskAlexSharov

### Security

- `--ethstats` credentials are redacted from the startup command log (#20890) — by @MysticRyuujin
- DoS-resistance limits on inbound P2P message volume (#20577, #21557) and bounded RPC/stream buffers (#20446, #20783) — by @yperbasis, @lupin012

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.4.4...v3.5.0

---

# Erigon v3.4.4 — Splashing Saga — 2026-06-18

v3.4.4 is a bugfix release recommended for all users.

**Bugfixes**

- execution/stagedsync: prune in-RAM overlay when execution unwind is a no-op (#21824, #21847) by @JkLondon  — third fix for the post-reorg `gas used mismatch`.
- caplin: serialize uint64 beacon API fields as JSON strings (#21805) by @BitWonka - Per the beacon-APIs spec, Uint64/Gwei fields must be serialized as JSON strings. Several Caplin response types were emitting them as JSON numbers, breaking spec-compliant clients. Fixes #20562.

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.4.3...v3.4.4

---

# Erigon v3.4.3 — Splashing Saga — 2026-06-02

v3.4.3 is a bugfix release recommended for all users.

**Bugfixes**

- db/state: prune `TemporalMemBatch` overlay entries past the unwind point (#21538) by @JkLondon — second
  fix for the post-reorg `gas used mismatch` / state-leak some users still hit on v3.4.2. After a tip reorg
  a stale read in the in-memory overlay could return a write made *inside* the unwound `txNum` range,
  flipping an `SSTORE` from cold to warm gas pricing. Complements the #21157 diffset fix shipped in v3.4.2.
- rpc: match Geth semantics in `debug_getModifiedAccountsByHash` / `debug_getModifiedAccountsByNumber`
  (#21507) by @lupin012 — corrects the block-range convention (exclusive start), now also reports contracts
  whose storage changed without an account change, and excludes touched-but-unchanged precompiles and
  self-destructed accounts.
- node/cli: register `--rpc.logs.maxresults` in `DefaultFlags` so it takes effect via the CLI (#21389) by
  @lupin012 — the limit was documented in 3.4.0 but never wired into the flag set, so setting it on the
  command line had no effect; it now applies.

**Improvements**

- execution/p2p, execution/engineapi: fail-fast `engine_newPayload` backward download when the gap exceeds
  the reorg limit (#21502) by @yperbasis — when a payload's parent is more than `MaxReorgDepth` blocks from
  the local head, the download short-circuits instead of fetching a header batch every slot, and logs the
  expected gap at INFO instead of WARN. The gap is still closed by the following fork-choice update.

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.4.2...v3.4.3

---

# Erigon v3.4.2 — Splashing Saga — 2026-05-22

v3.4.2 is a bugfix release recommended for all users.

**Bugfixes**

- execution/stagedsync: find diffset by actually-executed hash on unwind (#21157) by @JkLondon — fixes a
  state-leak bug in `unwindExec3` that surfaces as `gas used mismatch` / `Cannot update chain head` after
  a tip reorg whose unwound block deployed a contract via `CREATE`/`CREATE2` to a counterfactual address
  (safe-wallets, EIP-1167 clone factories, ERC-4337 accounts, deterministic deployers). The unwind now
  walks every header at the height to find the diffset of the block actually executed, instead of
  assuming the (already-flipped) canonical hash matches.
- rawdb: ignore invalid receipt cache transaction indexes (#21262) by @Sahil-4555

**Improvements**

- db/state, ethconfig: bound domain merge; add `--erigondb.domain.steps-in-frozen-file` (#21148) by
  @wmitsuda

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.4.1...v3.4.2

---

# Erigon v3.4.1 — Splashing Saga — 2026-05-11

**Bugfixes**

- commitment: segfault fix - caused by branch slice returned by TrieContext.Branch (#21044) by @awskii

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.4.0...v3.4.1

---

# Erigon v3.4.0 — Splashing Saga — 2026-04-28

Erigon 3.4.0 is a major update for node operators and validators, focused on stability, performance, and
efficiency at ChainTip. It is a drop-in upgrade for 3.3.x users — no data migration or re-sync required.

### Key Features

- **Fast restart on ChainTip**: no more blocking indexing or pruning at startup; Caplin doesn't lose its
  download progress.
- **4x smaller Chaindata (~20 GB)**: improves ChainTip speed. Available via re-sync, or by running
  `./build/bin/erigon seg step-rebase --datadir=<your_path> --new-step-size=390625` (takes ~10 seconds).
- **Historical `eth_getProof`**: is no longer experimental. Recommended: 32 GB+ RAM. Re-sync with
  `--prune.include-commitment-history` to apply the latest data fixes.
- **New RPC endpoints**: `trace_rawTransaction`, `eth_getStorageValues`, `admin_addTrustedPeer`,
  `admin_removeTrustedPeer`, flat tracers, `engine_getBlobsV3`.
- **Reduced impact on ChainTip performance**: from RPC, background file merging, pruning, and optional
  heavy flags (`--persist.receipts`, `--prune.include-commitment-history`).

### Breaking Changes

- Minimum Go version: 1.25
- `--rpc.blockrange.limit=1_000` new limit. Maximum block range (end - begin) allowed for range queries
  over RPC. 0 - means unlimited. Default: 1_000
- `--rpc.logs.maxresults=20_000` new limit. Maximum number of logs returned by eth_getLogs,
  erigon_getLogs, erigon_getLatestLogs. 0 - means unlimited. Default: 20_000
- `--rpc.max.concurrency=0` new limit. Maximum number of concurrent HTTP RPC requests (HTTP admission
  control). 0 = use db.read.concurrency, -1 = unlimited (no admission control). Default: 0
- p2p: switched to `discv5`. `discv4` disabled by default.

### Added

#### RPC Endpoints

- `trace_rawTransaction`: execute and trace a raw signed transaction without broadcasting it (#19524)
- `eth_getStorageValues`: batch fetch of multiple storage slots in a single call (#19442)
- `admin_addTrustedPeer` / `admin_removeTrustedPeer`: manage trusted peers at runtime (#19413)
- Call flat tracers (`trace_call` family): flat trace output format support (#18556)
- `engine_getBlobsV3`: Engine API blob retrieval v3 (#18512)
- `trace_call`: `StateOverrides` precompile support (#18401, #18492)

#### Consensus & Execution

- Fusaka scheduled for Chiado (Gnosis Chain testnet) at slot 21 651 456, epoch 1 353 216, timestamp
  1 773 653 580 (Mon 16 Mar 2026 09:33:00 UTC) (#19682)
- Chiado bootstrap nodes updated to match the Lighthouse built-in Chiado network config (#19693)
- Balancer hard fork for Gnosis Chain mainnet (#18122)
- Amsterdam signer support and BAL non-determinism fix (#19434)
- BAL selfdestruct net-zero fix (#19528)
- Parallel execution fixes for block-access-list (BAL) workloads (#17319)
- execution/vm: EIP-8024 (`SWAPN`, `DUPN`, `EXCHANGE`) opcodes implemented (#18670)
- Pectra requests-hash validation: fix partial block receipt reconstruction when execution resumes from
  a snapshot boundary mid-block — resolves `invalid requests root hash in header` on mainnet re-sync at
  block 24966723 (#20452)

#### Caplin (Consensus Layer)

- Persistent historical download — Caplin now persists and resumes historical beacon block downloads
  across restarts (#18320)
- Discovery v5 enabled by default — `discv5` is now the default peer discovery protocol (#18578)
- cl/p2p, cl/sentinel: fix DISCV5 ENR missing IP when the discovery address is unspecified (#19585)
- Fix missing attestations by using GossipSub for subnet peer coverage (#19523)
- cl/gossip: fix conditions forwarding, ENR lifecycle, and epoch-mismatch — prevents false peer banning,
  reduces log flooding from redundant ENR updates, and guards against stale RANDAO committee
  computation (#20777)
- cl/beacon: add `single_attestation` event topic support (#18142)
- cl/beacon: set `Eth-Consensus-Version` header when versioned (#18377)

### Changed

#### RPC Reliability

- `eth_getBlockReceipts`: limit over-concurrency — prevents latency growth and out-of-memory (OOM) at
  high request rates (#19725)
- `debug_traceCallMany`: fix global `BlockOverrides` and `StateOverrides` not being applied (#19547)
- `debug_traceCall`: fix state and block overrides interaction (#18480)
- `eth_blobBaseFee`: fix incorrect value returned (#18506)
- `eth_getBalance` and others: fix block-not-found error for certain historical queries (#18457)
- Block-hash canonicality check added to APIs that accept a block hash and state (#19356)
- rpc: fix batch limit exceeded error to comply with the JSON-RPC spec (#18260)
- `trace_replayTransaction()`: add stack info for `TLOAD` opcode (#19550)
- `eth_feeHistory`: performance optimisation and pending block support (#19526, #19455)
- `debug_trace*`: zero-alloc memory word encoding in `JsonStreamLogger` — eliminates per-word heap
  allocations and prevents OOM on large block traces (#20754)
- prestateTracer: fix diff mode missing deleted accounts to match geth behaviour (#20775)
- rpc/mcp: fix `tools/call` hanging indefinitely under DB load by switching the SSE context to
  non-blocking read-tx acquire (#20778)

#### TxPool

- Zombie queued transactions: transactions exceeding `MaxNonceGap` are now evicted (#19449)
- txnprovider/shutter: fix premature encrypted txn pool cleanup and peer drops (#18351)
- txpool: cache `pendingBaseFee` for queue comparisons to reduce recomputation (#18341)

#### P2P

- p2p/sentry: fix wrong OR in case statement for `wit` protocol messages (#19580)
- p2p: better handling of RLP errors in `wit` (#19569)
- discv4 disabled by default on mainnet (discv5 preferred) (#18640)

#### Snapshot & Storage

- merge: prioritize Domain merge over History — 2x less disk space required, and less impact to
  ChainTip from history-merge (#19441)
- merge: fix O(n²) InvertedIndex re-merge — eliminates quadratic time complexity during re-merge
  (#19680)
- `SequenceBuilder`: avoids an intermediate Elias-Fano representation during sequence building and
  merge (#19552, #19567)
- Faster startup: state-file index building deferred to reduce restart latency (#19583, #19407)
- Graceful restart in history download: `SpawnStageHistoryDownload` now honours the stage context, so
  Ctrl+C during history download exits promptly instead of waiting for the download to finish (#20766)
- DB integrity checks: time budget added so checks no longer run unbounded (#20714)
- Commitment-history integrity: skip the integrity check when commitment history is disabled (#20835)
- `seg ls`: report dictionary size and memory usage in the output (#20790)
- anacrolix/torrent: fix peerconn panic on bad reads while serving peer requests (#20748)

### Security

- github.com/buger/jsonparser: bump 1.1.1 → 1.1.2 to address CVE-2026-32285 (HIGH, CVSS 7.5 —
  out-of-bounds read) (#20018)

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.10...v3.4.0

---

# Erigon v3.3.10 — Rocky Romp — 2026-03-27

This release schedules Fusaka on **Gnosis Chain mainnet** at **Tue 14 April 2026, 12:06:20 UTC** and
thus is **mandatory for all Gnosis users**. It is also recommended for all users in general.

**Changes**

- Schedule Gnosis Fusaka (#20090) by @domiwei
- txpool: fully discard pre-Osaka blob txns in best() (#20120) by @yperbasis
- rpc: auto-convert legacy blob sidecar to v1 cell proofs after Osaka (#20087) by @domiwei
- rpc: add blockRangeLimit param for API works on blocks range (#19614) by @lupin012
- cl: fall back to local head state when remote checkpoint sync fails (#20003) by @domiwei
- cl: fix fork choice block validation and error propagation (#19927) by @domiwei
- cl: re-enable voluntary_exit gossip topic subscription (#19764) by @Giulio2002

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.9...v3.3.10

---

# Erigon v3.3.9 — Rocky Romp — 2026-03-09

This release schedules Fusaka on Chiado on **Mon 16 March 2026, 09:33:00 UTC** and thus is mandatory
for all Chiado users.

**Changes**

- fix(txpool): evict zombie queued txns exceeding MaxNonceGap (cherry-pick #19449 → release/3.3)
  (#19591) by @Giulio2002
- cl/sentinel: fix DISCV5 ENR missing IP when discovery address is unspecified (#19647) by @lystopad
- rpc: accept only canonical hash for block receipts (#19649) by @canepat
- Schedule Fusaka for Chiado (#19681) by @yperbasis
- cl: amend Chiado bootstrap nodes (#19692) by @yperbasis

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.8...v3.3.9

---

# Erigon v3.3.8 — Rocky Romp — 2026-02-20

**Changes**

- New Chiado boot nodes (cherry-pick #18867) (#19241) by @sudeepdino008
- eth_getLogs: receipts availability check to be aware about `--persist.receipts` and
  `--prune.mode=minimal` (#19226) by @AskAlexSharov
- txnprovider/shutter: fix decryption keys processing when keys do not follow txnIndex order (#18951)
  (#18959) by @taratorio
- execution: fix Chiado re-exec from genesis (#18887) by @yperbasis

**Bugfixes**

- execution/tests: minor fix chainmaker add withdrawals in shanghai (#18886) by @taratorio
- Reduce impact of background merge/compress to ChainTip (#18995) by @AskAlexSharov
- fix(caplin): Fixes for DataColumnSidecar (#18268) (#19003) by @taratorio
- rpc: bound checks in receipts cache V2 and generator (#19046) by @canepat
- execution/execmodule: fix unwinding logic when side forks go back in height (#18993) (#19063) by
  @taratorio
- p2p: fix nil pointer crash with --nodiscover (#19056) by @sudeepdino008
- rpc: add check on latest executed block (#19133) by @canepat
- protect History from events duplication (#19230) by @AskAlexSharov

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.7...v3.3.8

---

# Erigon v3.3.7 — Rocky Romp — 2026-01-30

P2P stability. Prune performance.

**Changes**

- prune: remove early-exit based on DirtySpace() (#18787) by @AskAlexSharov
- execution: fix commitment state key txNum when last block tx is at step boundary (#18858) by
  @taratorio
- p2p deadlock fix (#18862) by @Copilot
- Forward compatibility: Fixed index building for v0 snapshot format (#18824) by @eastorski
- Backward compatibility: Add --v5disc alias (#18785) by @anacrolix
- Show the default P2P discovery bools in --help (#18819) by @anacrolix

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.4...v3.3.7

---

# Erigon v3.3.4 — Rocky Romp — 2026-01-23

v3.3.4 is a bugfix release recommended for all users.

**Changes**

- Fix for missing rcache at stepBoundary (#18698) by @sudeepdino008
- execution/stagedsync: port --experimental.always-generate-changesets flag for gas repricing
  benchmarks (#18733) by @taratorio
- execution: add --fcu.timeout and --fcu.background.prune flags (#18723) by @taratorio
- Not needed collector erased in prune domains (#18665) by @JkLondon
- Forward compatible snapshots format (#18746) by @eastorski

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.3...v3.3.4

---

# Erigon v3.3.3 — Rocky Romp — 2026-01-14

v3.3.3 is a bugfix release recommended for all users.

**Fixes**

- CL: Fix incorrect committee count in process_attestation (#18316) by @domiwei
- CL: Fix for periodic retry of not-ready response (#18376) by @taratorio
- Shutter: fix premature encrypted txn pool cleanup bug and peer drops (#18264) by @taratorio
- Half block exec fix in receipts (#18426, #18505) by @sudeepdino008
- p2p: resolve security vulnerability (#18650) by @yperbasis

**Improvements**

- p2p: Turn on discovery v5 by default (#18639) by @anacrolix

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.2...v3.3.3

---

# Erigon v3.3.2 — Rocky Romp — 2025-12-13

Gnosis hardfork support.

**Changes**

- rpc: fix panic on `GetEthV1BeaconBlobs` (#17992) (#18232) by @domiwei
- rpc: fix invalid key error code in `eth_getStorageAt` (#18238) by @canepat
- cl/beacon: add single_attestation event topic support (#18142) (#18277) by @domiwei
- Gnosis Balancer (#18282) by @mh0lt
- bittorrent: torrent excessive wantPeers event fix (#18256) by @anacrolix

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.1...v3.3.2

---

# Erigon v3.3.1 — Rocky Romp — 2025-12-07

- We have new Docs and HelpCenter: https://docs.erigon.tech/
- Support of historical `eth_getProof` (https://github.com/erigontech/erigon/issues/12984). It requires
  `--prune.include-commitment-history` flag.

**RPC**

- rpc: fix txpool_content crash: unknown (#18120) by @canepat

**CL**

- Caplin: Simplified peer refreshing (#18123) (#18152) by @domiwei

**TxPool**

- txpool: remove double PopWorst() in pending pool overflow (#18159) by @AskAlexSharov

**Sync**

- Torrent client fixes (#18179) by @anacrolix

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.3.0...v3.3.1

---

# Erigon v3.3.0 — Rocky Romp — 2025-11-27

### Added

- Support of historical `eth_getProof` (https://github.com/erigontech/erigon/issues/12984). It requires
  `--prune.experimental.include-commitment-history` flag.
- Look our new Docs and HelpCenter: https://docs.erigon.tech/

#### RPC Endpoints

- `eth_simulateV1`: Complete implementation of Ethereum simulation API with support for state overrides, blob
  transactions, block overrides, and historical state roots (#15771)
- `eth_createAccessList`: StateOverrides parameter support (#17653)
- Support for `eth_call` with blockOverrides (#17261)
- `trace_filter`: Block tags support (#17238)
- `debug_traceTransaction`: Self-destruct operation validation (EIP 6780) (#17728)

#### Consensus & Execution

- EIP-7928: BlockAccessList type support (#17544)
- EIP-7934: EstimateGas capped by MaxTxnGasLimit in Osaka (#17251)
- EIP-7702 transaction support in `(r *Receipt) decodeTyped` (#17412)
- Rewrite bytecode support for post-Merge blocks (#17770)

#### Caplin (Consensus Layer)

- Get blobs support (Fusaka compatibility) (#17829)

### Changed

#### RPC Improvements

- `eth_getTransactionReceipt`: Pre-Byzantium transaction handling (#17479, #17509)
- `eth_estimateGas`: Improved handling with StateOverrides (#17914, #17295)
- `debug_traceCall`: System contract execution support (#17339)
- Blob transaction and blob base fee override support (#17313)

#### Execution Engine

- Experimental Parallel Exec (#16922)
- MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP for Gnosis (#17501)
- Reduce goroutines amount produced by BitTorrent library (#17765)
- Up base image to `Go 1.25-trixie` (#17837)

### Removed

- PoW mining was removed in #17813. The `--chain=dev` mode now uses an embedded PoS
  consensus layer (Caplin) with deterministic validators instead of Clique. See
  `docs/DEV_CHAIN.md` for usage.
- Holesky network support removed (#17685)
- eth/67 protocol support removed (#17318)
- SkipAnalysis VM optimization removed (#17217)

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.2.2...v3.3.0

---

# Erigon v3.2.3 — Quirky Quests — 2025-11-25

**Changes**

- Caplin: add getBlobs support (fusaka) (#17840) by @Giulio2002

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.2.2...v3.2.3

---

# Erigon v3.2.2 — Quirky Quests — 2025-11-03

v3.2.2 schedules Fusaka on Ethereum mainnet on December 3, 2025 at 09:49:11pm UTC. Thus it is a mandatory update for all Ethereum mainnet users.

**New features**

- Schedule Fusaka on Ethereum mainnet in #17736 by @yperbasis
- Tool to fetch and recover blobs from a remote beacon API in #17611 by @Giulio2002 

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.2.1...v3.2.2

---

# Erigon v3.2.1 — Quirky Quests — 2025-10-20

v3.2.1 is a bugfix release recommended for all users, especially validators.

**Fixes**

- Fix validators producing bad blocks on Hoodi in #17487 by @mh0lt 
- RPC: fix "insufficient funds for gas * price + value" error in traces retrieval for a specific block (Issues #16909, #17232) in #17523 by @antonis19
- RPC: fix no changes and filter not found in eth_getFilter* (Issue #17246) in #17350 by @canepat
- RPC: debug_traceCall fix avoid to trace sysContract (Issue #17220) in #17360 by @lupin012
- CL: fix initial previous_version in fork_schedule (Issue #17262) in #17331 by @domiwei

**Improvements**

- Ethereum mainnet default block gas limit is raised to 60M in #17321 by @yperbasis
- CL: Allow blob requests after Fusaka in #17500 by @domiwei

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.2.0...v3.2.1

---

# Erigon v3.2.0 — Quirky Quests — 2025-10-02

Erigon 3.2.0 has a complete implementation of [Fusaka](https://eips.ethereum.org/EIPS/eip-7607) and schedules it on the
test nets (#17197):

- Holesky on Wednesday, 1 October 2025 08:48:00 UTC
- Sepolia on Tuesday, 14 October 2025 07:36:00 UTC
- Hoodi on Tuesday, 28 October 2025 18:53:12 UTC

**Fixes**

- Re-org/unwind fixes (#17105, #17165) by @taratorio
- RPC: Fixes to eth_getProof (#16220, #16251, #16564, #16606, #16687) by @awskii
- tracer: fix prestates for EIP7702 transactions (#16497) by @nebojsa94

**Improvements**

- New EL block downloader (#16270, #16673) by @taratorio
- Caplin p2p improvements (#16719, #16995) by @Giulio2002
- EVM: MODEXP precompile performance improvements (#16579, #16583, #16396, #17151) by @chfast & @yperbasis
- execution: more accurate bad block responses (#16994) by @taratorio
- Block builder: improve txpool polling (#16412) by @taratorio
- execution/stagedsync: handle sync loop block limit exhaustion (#16268) by @taratorio
- RPC: Apply batch limit to WebSocket/IPC connections (#16255) by @grandchildrice
- RPC: Estimate gas align to geth (#16397) by @lupin012
- snapshotsync: add support for `--snap.download.to.block` (#16938) by @taratorio

**New features**

- Complete Fusaka implementation (#16183, #16185, #16186, #16187, #16184, #16391, #16401, #16207, #16420, #16428,
  #16494, #16457, #16644, #16928, #16945, #17060, #16989, #17076, #17169) by @taratorio, @yperbasis, @Giulio2002 and
  @domiwei
- Implement eth/69 (#15279, #17186, #17171) by @shohamc1
- RPC: implement new eth_config spec (#16218, #16410) by @taratorio
- RPC: impl admin_RemovePeer (#16292) by @lupin012

**Full Changelog**: https://github.com/erigontech/erigon/compare/v3.1.0...v3.2.0
