▁▂▃▅▇█▇▅▃▂▁▁▂▃▅▇█▇▅▃▂▁▁▂▃▅▇█▇▅▃▂▁▁▂▃▅▇█▇▅▃▂▁▁▂▃▅▇█▇▅▃▂▁
A Z T E C · 5 · 2 · 0
Date: 2026-08-17 · Tag: v5.2.0 · Baseline: v5.1.0 · Minor release
Install: aztec-up install 5.2.0 · Docker: aztecprotocol/aztec:5.2.0
Summary
A maintenance release focused on running nodes: prover nodes use much less memory, epoch proving recovers from faults instead of giving up, p2p and mempool handling is hardened, and several L1 interactions stop wasting gas and RPC calls. Contract developers get a new Noir compiler with one breaking change (a one-line fix per note type). Wallets and PXE get faster sync with no API changes.
Protocol constants are unchanged, so v5.1.0 and v5.2.0 nodes interoperate. Upgrading needs no coordination, no downtime window, and no contract redeployment.
Should you upgrade?
- Node operators — recommended. Not strictly required, but this release carries substantial p2p hardening and prover reliability and memory improvements. It is drop-in against the current rollup: upgrade the image and restart, in any order across your fleet.
- Contract developers — upgrade when ready; one breaking change when you do. Contracts built with v5.1.0 keep working. When you move to the v5.2.0 toolchain, note types declared inside a
contractblock needpub— see below. - Wallet / PXE developers — a plain version bump. No breaking API changes, and sync gets faster.
Breaking changes
-
[Aztec.nr]Note types declared inside a contract must bepub— the new Noir compiler enforces visibility more strictly. If a#[note]struct is declared directly inside yourcontractblock withoutpub, compilation fails withFunction `get_id` is private. Addpub; that's the whole fix. Notes declared in their own module are alreadypuband unaffected (#24907).#[derive(Packable, Eq)] #[note] - struct MyNote { + pub struct MyNote { owner: AztecAddress, }
For contract developers
- Noir compiler:
v1.0.0-beta.22→v1.0.0-beta.25(#24907). Besides thepubchange above, Noir itself removed some long-deprecated stdlib items (theas_slicemethods and thestd::hash::keccakmodule) and reports previously-silent ambiguous method calls as errors. If your contract used none of these, it compiles as before. - The
getTxEffectsoracle now works — reading an element of the array it returns previously failed to compile, becauseTxEffectdid not implementDeserialize. It now does (#25109).
For node operators
The bulk of the release. There are no consensus or protocol changes: v5.1.0 and v5.2.0 nodes interoperate, so roll your fleet at your own pace.
Prover nodes
- Much lower memory use. The prover stack kept large data in memory long after it was needed — every checkpoint's transactions, circuit inputs, and proofs, some of it duplicating what was already on disk; one duplication alone accounted for ~7.6 GiB in a 5 TPS test. This data is now released promptly and read back from disk when needed (#24982, #24983, #24990, #25027).
- Epoch proving retries instead of giving up. An epoch is declared failed only when its submission window expires, not on the first fault; a chain prune during proving no longer counts as a failure; and stuck epochs aren't pointlessly re-proved. Diagnostics for each failed checkpoint are uploaded as they happen (#24678).
Mempool and p2p
- Incoming gossiped transactions are no longer held up by the pool's background archiving work (#25148).
- A node whose p2p service fails to start now exits at startup instead of running in a broken state (#25177). While a node has zero peers it warns periodically (#25183) and holds off proposing, slash voting, and accepting transactions until it reconnects (#25185).
L1
- Event watching switched from
eth_newFilterto pollinggetLogs. Server-side filters break behind load-balanced RPC providers — nodes were re-polling dead filters at 30–40 req/s and silently missing slashing and governance events (#25176). - A stale governance payload setting no longer wastes gas. A sequencer left with an outdated
GOVERNANCE_PROPOSER_PAYLOADkept signalling a payload that had already executed, burning ~100k gas per slot. It now detects this and stops (#24764). - Spurious "insufficient funds" errors when simulating L1 calls are fixed (#25202).
- The KZG trusted setup loads at startup rather than stalling the first blob operation (#24775).
Validators and sync
- You are warned when the network votes to slash your validators. The node now logs warnings and exposes metrics when its own validators appear as slash targets — previously operators found out only after stake was lost (#25058).
- Block proposals containing invalid transactions are correctly flagged as slashable. An error in transaction validation previously let such proposers escape accountability (#25031).
- A sync race causing spurious
block_not_availableerrors is fixed (#25206). - Reorged blocks are fully cleaned from the archiver, including blocks whose transactions were re-included elsewhere (#24765); a related race when reading L2→L1 message proofs is fixed (#24754).
- Transactions dropped from the mempool now log the reason at warn level (#25000).
For wallet / PXE developers
No breaking API changes.
- Faster sync. Data fetched from the node is cached and reused instead of re-fetched on every sync (#24969, #25074, #25076), and note discovery does less scanning work (#24275, #25045, #24667).
- Contracts built against the v5.0.1 handshake registry keep working — the client and release image now ship the historical registry artifacts (#25032, #25155).
- One failing write no longer aborts unrelated writes running alongside it (#25208).
aztec.jswaits briefly before the first receipt poll after sending a transaction, removing a round trip that could never succeed (#25089).
Security & correctness
Everything the node parses from untrusted input now has explicit size bounds, closing memory-exhaustion holes. Most of this lives in shared serialization code, so clients that talk to a node they don't trust get the same protection.
- Tree sibling paths and vectors are bounded (#25028); arrays in the
TxandHashedValuesschemas are capped (#25029); simulation overrides and checkpoint queries on the RPC surface are capped (#25026). - Gaps in checkpoint block-shape and block-count validation are closed (#25229).
- JSON-RPC responses always include a
resultkey, as the spec requires, so an empty result can't be confused with a malformed response (#24840).
New in this release
- Declarative deployments at
@aztec/aztec/deploy— describe a deployment as data (contracts, dependencies, bridging, fees) and let the runner work out the order and execute it, instead of hand-written deploy scripts (#24685).
Also in this release
- JSON-RPC servers report metrics (#25159), and log levels map to AWS severity (#25022).
- JSON-RPC clients accept and send cookies, so load balancers that use session affinity work (#25231). The RPC server's HTTP timeouts and CORS headers are configurable via
RPC_HTTP_KEEP_ALIVE_TIMEOUT_MS,RPC_HTTP_HEADERS_TIMEOUT_MSandRPC_CORS_ALLOWED_HEADERS; defaults are unchanged (#25242). - Browser: an undersized CRS no longer fails to load (#24894), and wasm load settings are respected when opening SQLite (#24937).
snappyis pinned to 7.2.2 and theaztec-uplocal-network wait no longer hangs forever (#25198); bb's socket startup no longer times out while the bb process is alive (#24802).
Protocol constants
Unchanged from v5.1.0:
vk root 0x2b3b6ea4412b9c8f6457a37f91a2870306f8641e07e16a49b68bda6f8bc02892
protocol contracts 0x2c075866eafc88a1f6f9addc7e337c6e64e45d1cb7fd7c0d612ebcec72aab2ca
Protocol circuits and protocol contracts ship as pinned, pre-built artifacts that are byte-identical to v5.1.0's — they are not recompiled, so the Noir compiler upgrade cannot change them. Compatibility tests re-enabled in this release assert both values against the live mainnet and testnet rollups (#25136). This is why the upgrade is drop-in.
Reference
- v5.1.0 release notes — the previous minor release and this release's baseline.
- v5.0.0 release notes — the first stable v5 release and full v4→v5 migration reference.
- Migration notes — per-change migration reference. Note that entries under the "TBD" heading are staged for a future release and do not all apply to v5.2.0; the only breaking change in this release is the one listed above.