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 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
@betaGraphQL directive for in-flight API fields (#1186) - Added per-tree end indexes (
zswapEndIndex,dustCommitmentEndIndex,dustGenerationEndIndex) toBlock(#1197) - Renamed dust nullifier byte fields with
LeBytessuffix, breaking change confined to@betafields (#1199) - Added lazy
transactionreference onDustNullifierTransactionandShieldedNullifierTransaction(#1208) - Fixed
dustGenerationssubscription to deliverDustGenerationDtimeUpdateitems 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.nullifierbecomesnullifierLeBytesDustNullifierTransaction.commitmentbecomescommitmentLeBytesdustNullifierTransactions(...)subscription argumentnullifierPrefixesbecomesnullifierLeBytesPrefixes
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)
Links and references
- GitHub release: v4.3.3 on GitHub
- Schema: Indexer API v4 schema
- API reference: Midnight Indexer API v4
- Docker images: Chain Indexer, Indexer API, Wallet Indexer, Indexer Standalone, SPO Indexer