Skip to main content

Midnight Indexer v4.3.3 release notes

For the complete documentation index, see llms.txt
  • Version: v4.3.3
  • Date: June 4, 2026
  • Paired node: 1.0.0
  • Paired ledger: 8.1.0

High-level summary

Midnight Indexer 4.3.3 is a patch release on the 4.3.x development line, shipping as part of the Midnight 1.1 bundle. It adds GraphQL WebSocket subscription quotas, introduces the @beta directive for in-flight API fields, exposes per-tree end indexes on Block, and adds a lazy transaction reference on nullifier event types. It also tightens shielded nullifier input validation and fixes dustGenerations subscriptions to deliver dtime updates on fresh connections.

This release pairs with Node 1.0.0 and Ledger 8.1.0. Operators on Node 0.22.x should track the 4.0.x maintenance line instead.

Upgrading from 4.0.x

Upgrading from the 4.0.x line to 4.3.3 requires an indexer reset and re-index from genesis. Budget approximately 3-4 days at Mainnet/Preprod scale. Upgrades within the 4.3.x line (from 4.3.2 to 4.3.3) are drop-in: bump the image tag and rolling-restart. One additive migration (003_block_tree_end_indexes / 004_block_tree_end_indexes) runs automatically with no chain reset.


Audience

This release note is relevant for:

  • Operators running the Midnight Indexer against Node 1.0.0 or later
  • DApp and wallet developers integrating against the Indexer GraphQL API
  • Wallet integrators consuming dust subscriptions (dustGenerations, dustNullifierTransactions)
  • SREs configuring kubernetes probes on indexer-api

Operators on Node 0.22.x should track the 4.0.x maintenance line, not this release.


What changed

  • Added per-connection and per-client subscription quotas to the GraphQL WebSocket (#1104)
  • Tightened shielded nullifier transactions input validation (#1126)
  • Introduced @beta GraphQL directive for in-flight API fields (#1186)
  • Added per-tree end indexes (zswapEndIndex, dustCommitmentEndIndex, dustGenerationEndIndex) to Block (#1197)
  • Renamed dust nullifier byte fields with LeBytes suffix, breaking change confined to @beta fields (#1199)
  • Added lazy transaction reference on DustNullifierTransaction and ShieldedNullifierTransaction (#1208)
  • Fixed dustGenerations subscription to deliver DustGenerationDtimeUpdate items on fresh subscriptions (#1166)

New features

Below are the new features introduced in this release.

Subscription quotas on GraphQL WebSocket

Adds per-connection and per-client subscription limits to the GraphQL WebSocket. A single connection or client can no longer open an unbounded number of concurrent subscriptions. This is the indexer-side guardrail for the unbounded-subscription pen-test finding (HAL-02), bounding the database load a single client can drive.

@beta GraphQL directive for in-flight API fields

Introduces a @beta schema directive (applicable to FIELD_DEFINITION and OBJECT) to mark API surface that is still in flight and carries no stability guarantee. This release annotates several dust and nullifier fields with @beta. Consumers should treat those fields as subject to change without a major version bump.

Per-tree end indexes on Block

Adds zswapEndIndex and the @beta fields dustCommitmentEndIndex and dustGenerationEndIndex to Block. Each value is the chain's first_free (exclusive) for that tree as of the block, written after the chain applies all transactions. The values are monotonic non-decreasing across the chain. This lets clients track per-tree growth directly from a block without a separate query.

Transaction reference on nullifier event types

Adds a transaction: Transaction! field (@beta) to DustNullifierTransaction and ShieldedNullifierTransaction, resolved lazily via the existing transaction DataLoader. The DataLoader fetches the field only when selected, with no payload cost for consumers that do not request it. This lets wallet sync pull the full transaction inline from a nullifier match instead of gathering hashes and querying separately. The existing transactionId and transactionHash fields remain available.

Tighter shielded nullifier transactions input validation

Hardens input validation on the shielded nullifier transactions surface. The API boundary now rejects malformed or out-of-range arguments rather than propagating them into query execution.


Breaking changes

Dust nullifier byte fields renamed with LeBytes suffix

Confined to @beta (in-flight) fields, so there is no impact on stable-API consumers. If you are on the 4.0.x production line (paired with Node 0.22.x), this change does not affect you. These fields do not exist in the 4.0.x API surface. Only consumers of the beta dust nullifier API on the 4.3.x line need to update field and argument names:

  • DustNullifierTransaction.nullifier becomes nullifierLeBytes
  • DustNullifierTransaction.commitment becomes commitmentLeBytes
  • dustNullifierTransactions(...) subscription argument nullifierPrefixes becomes nullifierLeBytesPrefixes

The shielded nullifier types remain the same. The rename makes the little-endian byte encoding explicit in the field name.


Bug fixes

Fix for dustGenerations subscription dtime updates

Fresh dustGenerations subscriptions (starting from index 0 with no prior cutoff) previously short-circuited the dtime drain, causing the subscription to skip DustGenerationDtimeUpdate items. The subscription now delivers these items correctly, so a freshly connected wallet receives dtime updates for the full historical range. (#1166)