Releases: midnightntwrk/midnight-indexer
Release list
Midnight Indexer 4.3.3
Midnight Indexer 4.3.3 Release Notes
Release date: 2026-06-04
Release type: Patch release (4.3.2 → 4.3.3), Midnight 1.1 indexer line
Git tag: v4.3.3
Tree hash: 1d8a93ff2cd9b5ef9573a42dc8bf9e31b18fe4c3
Environment: All public networks (mainnet, preprod, preview, devnet, qanet)
Note: this release pairs with node 1.0.0 and ledger 8.1.0 and is part of the Midnight 1.1 indexer line. Refer to MNF advisories for current deployment recommendations.
Summary
Final 4.3.3, consolidating the rc.2/rc.3/rc.4 changes. It adds GraphQL WebSocket subscription quotas (#1104), the '@beta' directive for in-flight API fields (#1186), per-tree end indexes on Block (#1197), and a lazy transaction reference on the nullifier event types (#1208), tightens shielded nullifier input validation (#1126), and fixes fresh dustGenerations subscriptions to deliver dtime updates (#1166). It renames the dust nullifier byte fields with a LeBytes suffix (#1199), a breaking change confined to '@beta' (in-flight) fields. 4.3.3 is a patch release on top of 4.3.2: the only breaking change is on '@beta' surface, so there is no stable-API break.
Dependencies
- Node: 1.0.0 (supports 0.22.x as well)
- Ledger: 8.1.0
- Bundle tracking issue: Midnight Release 1.1
Both dependency bumps in this release are non-functional for the indexer: midnight-ledger 8.1.0 (#1141) is a version bump only from 8.1.0-rc.1, and node 1.0.0 (#1204) regenerated test data against the 1.0.0 release tag (previously 1.0.0-rc.3).
Upgrade from 4.3.2
A patch upgrade: bump the image tag and rolling-restart. It applies one additive migration (Postgres 003_block_tree_end_indexes / SQLite 004_block_tree_end_indexes), which backfills the new Block end-index columns, forward-only, no chain reset. The ledger and node deps were finalised from release candidates (ledger 8.1.0-rc.1 to 8.1.0, node 1.0.0-rc.3 to 1.0.0), non-functional for the indexer.
Docker Images
midnightntwrk/chain-indexer:4.3.3midnightntwrk/indexer-api:4.3.3midnightntwrk/wallet-indexer:4.3.3midnightntwrk/indexer-standalone:4.3.3midnightntwrk/spo-indexer:4.3.3
Audience
- Operators running an indexer on public networks (paired with node 1.0.0).
- Testnet and devnet administrators.
- DApp and wallet developers integrating against the indexer GraphQL API, in particular consumers of the dust subscriptions and the
dustNullifierTransactions/shieldedNullifierTransactionssubscriptions. - QA and release managers.
What Changed
| Change | Type | PR |
|---|---|---|
| Add subscription quotas to the GraphQL WebSocket | New feature | #1104 |
| Tighten shielded nullifier transactions input validation | New feature | #1126 |
Introduce '@beta' GraphQL directive for in-flight API fields |
New feature | #1186 |
Add per-tree end indexes to Block |
New feature (dust end indexes '@beta') | #1197 |
Rename DustNullifier byte fields with LeBytes suffix |
Breaking ('@beta') | #1199 |
| Add transaction reference to nullifier event types | New feature ('@beta') | #1208 |
Deliver DustGenerationDtimeUpdate items on fresh dustGenerations subscriptions |
Fixed defect | #1166 |
New Features
Subscription quotas on the GraphQL WebSocket (#1104)
Adds per-connection and per-client subscription limits to the GraphQL WebSocket, so 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 finding (pen-test HAL-02), bounding the database load a single client can drive.
Tighter shielded nullifier transactions input validation (#1126)
Hardens input validation on the shielded nullifier transactions surface so malformed or out-of-range arguments are rejected at the API boundary rather than propagating into query execution.
'@beta' GraphQL directive for in-flight API fields (#1186)
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. Several dust and nullifier fields shipped in this line are annotated '@beta'; consumers should treat those as subject to change without a major version bump.
Per-tree end indexes on Block (#1197)
Adds zswapEndIndex and the '@beta' dustCommitmentEndIndex / dustGenerationEndIndex fields to Block. Each is the chain's first_free (exclusive, "next free index") for that tree as of the block, written after all transactions — including system transactions — are applied, and is monotonic non-decreasing across the chain. Lets clients track per-tree growth directly from a block without a separate query.
Transaction reference on nullifier event types (#1208)
Adds a transaction: Transaction! field ('@beta') to DustNullifierTransaction and ShieldedNullifierTransaction, resolved lazily via the existing transaction DataLoader so it is fetched only when selected, with no payload cost for consumers that don't request it. This lets wallet sync pull the full transaction inline from a nullifier match instead of gathering hashes and querying separately. transactionId and transactionHash are retained as the resumption cursor and sequencing key.
Breaking Changes or Required Actions
Dust nullifier byte fields renamed with a LeBytes suffix (#1199)
Confined to '@beta' (in-flight) fields, so there is no impact on stable-API consumers. These fields are new in the 4.3.x API line and are not present in the 4.0.x production line, so production deployments are unaffected. Consumers of the beta dust nullifier API must update field and argument names:
DustNullifierTransaction.nullifier→nullifierLeBytesDustNullifierTransaction.commitment→commitmentLeBytesdustNullifierTransactions(...)subscription argumentnullifierPrefixes→nullifierLeBytesPrefixes
The shielded nullifier types are unchanged. The rename makes the little-endian byte encoding explicit in the field name.
Known Issues
To confirm before publishing: run gh issue list --repo midnightntwrk/midnight-indexer --label "priority:critical,priority:high" --state open and list any open critical/high issues not fixed in this release (Description / Issue link / Workaround). None known to be blocking at the time of writing.
Fixed Defects
| Defect / PR | Description |
|---|---|
| #1166 | Fresh dustGenerations subscriptions (startIndex 0, no prior cutoff) now deliver their DustGenerationDtimeUpdate items instead of short-circuiting the dtime drain, so a freshly connected wallet receives dtime updates for the historical range. |
Links and References
- Full changelog: CHANGELOG.md
- GitHub release: https://github.com/midnightntwrk/midnight-indexer/releases/tag/v4.3.3
- GraphQL schema: schema-v4.graphql
- QA test evidence: qa/tests/evidence/4.3.3/README.md
- Bundle tracking issue: Midnight Release 1.1
(Per-PR links are embedded in the What Changed, New Features, Breaking Changes, and Fixed Defects sections above.)
Midnight Indexer 4.3.3-rc.4
Midnight Indexer 4.3.3-rc.4 Release Notes
Release date: 2026-06-01
Release type: Pre-release (development line)
Git tag: v4.3.3-rc.4
Tree hash: 18fa059cf3bb1df49b7d49c20f0af4193c399cb4
Environment: All public networks (mainnet, preprod, preview, devnet, qanet)
Note: this release candidate pairs with node 1.0.0 and ledger 8.1.0 and is the fast-follow patch on the Midnight 1.1 indexer line. Refer to MNF advisories for current deployment recommendations.
Summary
Release candidate on top of 4.3.3-rc.3. Adds a lazy transaction reference field to the dust and shielded nullifier transaction subscriptions (#1208), so consumers can navigate from a nullifier match to the full transaction without a separate lookup query. The field is @ beta. This is the only change since rc.3.
Dependencies
- Node: 1.0.0 (supports 0.22.x as well)
- Ledger: 8.1.0
- Bundle tracking issue: Midnight Release 1.1
No dependency changes in this release candidate; the only change since rc.3 is #1208. Node 1.0.0 and ledger 8.1.0 are the paired versions carried by the 4.3.3 line (set in rc.3 and rc.2 respectively).
Docker Images
midnightntwrk/chain-indexer:4.3.3-rc.4midnightntwrk/indexer-api:4.3.3-rc.4midnightntwrk/wallet-indexer:4.3.3-rc.4midnightntwrk/indexer-standalone:4.3.3-rc.4midnightntwrk/spo-indexer:4.3.3-rc.4
Audience
- Operators running an indexer on public networks (paired with node 1.0.0).
- Testnet and devnet administrators.
- DApp and wallet developers integrating against the indexer GraphQL API, in particular consumers of the
dustNullifierTransactionsandshieldedNullifierTransactionssubscriptions. - QA and release managers.
What Changed
| Change | Type | PR |
|---|---|---|
| Add transaction reference to nullifier event types | New feature (@ beta) | #1208 |
New Features
Transaction reference on nullifier event types (#1208)
Adds a transaction: Transaction! field (@beta) to DustNullifierTransaction and ShieldedNullifierTransaction. It is resolved lazily via the existing transaction DataLoader, so it is fetched only when the field is selected, with no payload cost for consumers that don't request it. This lets wallet sync pull the full transaction inline from a nullifier match instead of gathering hashes and querying separately. Both source tables (dust_nullifiers, zswap_nullifiers) have transaction_id NOT NULL, so the field is non-null. transactionId and transactionHash are retained as the resumption cursor and sequencing key.
Breaking Changes or Required Actions
None for stable API consumers. The transaction field added in #1208 is additive and @beta (no stability guarantee), so existing queries are unaffected.
Links and References
- Full changelog: CHANGELOG.md
- GitHub release: https://github.com/midnightntwrk/midnight-indexer/releases/tag/v4.3.3-rc.4
- GraphQL schema: schema-v4.graphql
- Bundle tracking issue: Midnight Release 1.1
- Cumulative 4.3.3 patch release note (network-ops):
releases/patches/indexer-4-3-3/indexer-4-3-3.md
(Per-PR links are embedded in the What Changed and Breaking Changes sections above.)
Midnight Indexer 4.3.3-rc.3
Midnight Indexer 4.3.3-rc.3 Release Notes
Release date: 2026-05-29
Release type: Pre-release (development line)
Git tag: v4.3.3-rc.3
Tree hash: 45a08a986c7190e344a9519eb2c6e94881ab6bfa
Environment: All public networks (mainnet, preprod, preview, devnet, qanet)
Note: this release candidate pairs with node 1.0.0 and ledger 8.1.0 and is the fast-follow patch on the Midnight 1.1 indexer line. Refer to MNF advisories for current deployment recommendations.
Summary
Release candidate on top of 4.3.3-rc.2. Adds per-tree end indexes to the Block GraphQL type so clients can read a chain-aligned upper bound without walking transactions, and renames the dust nullifier byte fields with a LeBytes suffix so their constant-length little-endian encoding is explicit. Both surfaces are @ beta. Also aligns the node test fixtures to the node 1.0.0 release tag.
Dependencies
- Node: 1.0.0 (supports 0.22.x as well)
- Ledger: 8.1.0
- Bundle tracking issue: Midnight Release 1.1
Both the node 1.0.0 and ledger 8.1.0 moves on this line are rc → release tag alignments (node from 1.0.0-rc.3, ledger from 8.1.0-rc.1) with no functional change for the indexer.
Docker Images
midnightntwrk/chain-indexer:4.3.3-rc.3midnightntwrk/indexer-api:4.3.3-rc.3midnightntwrk/wallet-indexer:4.3.3-rc.3midnightntwrk/indexer-standalone:4.3.3-rc.3midnightntwrk/spo-indexer:4.3.3-rc.3
Audience
- Operators running an indexer on public networks (paired with node 1.0.0).
- Testnet and devnet administrators.
- DApp and wallet developers integrating against the indexer GraphQL API, in particular consumers of the
dustNullifierTransactionssubscription and theBlock*EndIndexfields. - QA and release managers.
What Changed
| Change | Type | PR |
|---|---|---|
Add per-tree end indexes to Block |
New feature | #1197 |
Rename dust nullifier byte fields with LeBytes suffix |
Improvement (@ beta) | #1199 |
New Features
Per-tree end indexes on Block (#1197)
Adds zswapEndIndex, dustCommitmentEndIndex (@beta), and dustGenerationEndIndex (@beta) to the Block type. Clients get a chain-aligned upper bound for dustGenerations and the zswap / dust-commitment merkle update queries directly from block(offset), without walking back through transactions to find a RegularTransaction (the only variant that carries these on the transaction level). The values are the chain's per-tree first_free as of each block, monotonic non-decreasing.
Improvements
- Renamed the dust nullifier byte fields and prefix argument on the
dustNullifierTransactionssubscription with aLeBytessuffix (#1199) so the constant-length little-endian encoding is explicit in the name:nullifier→nullifierLeBytes,commitment→commitmentLeBytes,nullifierPrefixes→nullifierLeBytesPrefixes. These are@betafields introduced in 4.3.2, the wire contract is unchanged (still raw little-endian bytes), and the only consumer (the wallet team) has been notified. The shielded nullifier surface is unchanged.
Breaking Changes or Required Actions
None for stable API consumers. The dust nullifier fields renamed in #1199 are @beta (no stability guarantee) and were only introduced in 4.3.2, so the rename is within the in-flight caveat rather than a stable-API break.
Links and References
- Full changelog: CHANGELOG.md
- GitHub release: https://github.com/midnightntwrk/midnight-indexer/releases/tag/v4.3.3-rc.3
- GraphQL schema: schema-v4.graphql
- Bundle tracking issue: Midnight Release 1.1
- Cumulative 4.3.3 patch release note (network-ops):
releases/patches/indexer-4-3-3/indexer-4-3-3.md
(Per-PR links are embedded in the What Changed and Breaking Changes sections above.)
Midnight Indexer 4.3.3-rc.2
Midnight Indexer 4.3.3-rc.2 Release Notes
Release date: 2026-05-27
Release type: Pre-release (development line)
Git tag: v4.3.3-rc.2
Tree hash: 0671545f7897517f553d83f899e5f2014f2bb1dc
Environment: All public networks (mainnet, preprod, preview, devnet, qanet)
Note: This release pairs with node
1.0.0and is the first release candidate for the4.3.3patch on top of the MN 1.1 indexer (4.3.2). Refer to MNF advisories for current deployment recommendations.
Summary
Fast-follow patch on indexer 4.3.2. Ships four targeted changes: a dtime fresh-subscription bug fix on the dust generation path, a per-connection subscription quota in indexer-api GraphQL WS closing Halborn pen-test finding HAL-03 (SSE-196), tighter input validation on shielded nullifier transaction queries, and a @beta GraphQL schema directive marking in-flight dust-generation work as unstable ahead of broader MN 2.0 changes.
Dependencies
- Node:
1.0.0(supports 0.22.x as well) - Ledger:
8.1.0 - Bundle tracking issue: Midnight Release 1.1
- Bundle review (shielded): shielded#21
Docker Images
midnightntwrk/chain-indexer:4.3.3-rc.2midnightntwrk/indexer-api:4.3.3-rc.2midnightntwrk/wallet-indexer:4.3.3-rc.2midnightntwrk/indexer-standalone:4.3.3-rc.2midnightntwrk/spo-indexer:4.3.3-rc.2
Audience
- Operators who run an indexer on the
4.3.xline (paired withnode 1.0.0). - SDK consumers and dApp developers integrating against the indexer GraphQL schema, in particular consumers of
dust*fields. - SREs and downstream service operators (wallet, faucet, mn.js, block-explorer) sizing per-connection subscription quota usage (per-connection cap enforced from
4.3.3-rc.2onward on this line). - QA and release managers validating the MN 1.1 indexer patch line.
What Changed
| Change | Type | PR |
|---|---|---|
| Add per-connection subscription quotas to GraphQL WebSocket | New Feature | #1104 |
| Tighten shielded nullifier transactions input validation | New Feature | #1126 |
Introduce @beta GraphQL directive for in-flight API fields |
New Feature | #1186 |
Deliver DustGenerationDtimeUpdate items on fresh dustGenerations subscriptions |
Bug Fix | #1166 |
New Features
Per-connection subscription quotas on GraphQL WebSocket (#1104)
Adds a per-connection cap on the number of concurrent GraphQL subscriptions a single WebSocket client can hold open, with a per-session_id rate cap on the shielded_transactions subscription. Default per-connection cap is 20 concurrent subscriptions; default shielded_transactions rate cap is 10 per minute (token bucket). Both are configurable via indexer-api/config.yaml and indexer-standalone/config.yaml.
Closes Halborn pen-test finding HAL-03 (SSE-196): unbounded GraphQL WebSocket subscriptions leading to resource exhaustion. QA coverage shipped in #1184 (subscription-quotas.test.ts, two cases: per-connection cap rejection and slot reclamation on subscription close).
Operator note: downstream services holding many concurrent subscriptions (wallet, faucet, mn.js, block-explorer) should size their connection usage against the cap. Connections exceeding the cap receive a client-error response on subscription start.
Tighten shielded nullifier transactions input validation (#1126)
Hardens input validation on the shieldedNullifierTransactions query path. Invalid bech32m addresses, malformed hex inputs, and out-of-range cursor values now produce explicit client-side ApiError responses rather than reaching the storage layer.
Developer note: clients should treat Client variant errors on this query path as deterministic input rejections; previously some malformed inputs produced opaque server-side failures.
@beta GraphQL schema directive for in-flight API fields (#1186)
Introduces a @beta schema directive in indexer-api (declared via async-graphql 7.2's TypeDirective, mirroring the shape of the existing @deprecated directive). Backfills existing in-flight dust* fields and applies from day one to upcoming dust-generation schema changes targeted for MN 2.0 (tracked as midnight-indexer issues #1181, #1174, #1168, #1182).
Consumers should treat any field marked @beta as unstable: behaviour, naming, and presence may change without notice between releases. Production integrations should not rely on @beta fields until they are promoted to stable.
Annotated surface in 4.3.3-rc.2:
Subscription.dustGenerationsDustGenerationsItem,DustGenerationDtimeUpdateItem,DustGenerationsProgressQuery.dustGenerationMerkleTreeUpdate,Query.dustCommitmentMerkleTreeUpdateRegularTransaction.dustGenerationStartIndex/dustGenerationEndIndex/dustCommitmentStartIndex/dustCommitmentEndIndexDustNullifierTransaction.nullifier,DustNullifierTransaction.commitment
No runtime enforcement; documentation-only directive on the contract maturity of the annotated surface.
Improvements
None in this release.
Deprecations
None in this release.
Breaking Changes or Required Actions
None.
Fixed Defects
| Defect / PR | Description |
|---|---|
| #1166 | dustGenerations subscription did not emit DustGenerationDtimeUpdateItem records for clients subscribing from startIndex=0 (fresh subscription, no prior owned entries). Fix replaces the Option<u64> cutoff guard with an explicit fallback to 0, so the dtime backfill replays all updates owned by the subscriber's dustAddress regardless of prior subscription state. SQL filters by owner and per-stream event-id cursor, so the cutoff=0 path remains safe against duplicate emissions. |
Links and References
- Full changelog (this release):
CHANGELOG.mdat v4.3.3-rc.2 - GitHub release: v4.3.3-rc.2
- GraphQL schema (this release):
indexer-api/graphql/schema-v4.graphqlat v4.3.3-rc.2 - Bundle tracking: Midnight Release 1.1
- Bundle review (shielded): shielded#21
- Halborn HAL-03 / SSE-196 tracking: shielded-security-engineering#196
(Per-PR links are embedded in the What Changed and Fixed Defects tables above.)
Midnight Indexer 4.3.2
https://github.com/midnightntwrk/midnight-indexer/releases/tag/v4.3.2
Midnight Indexer 4.3.2
Midnight Indexer 4.3.2 Release Notes
Release date: 2026-05-15
Release type: Bundle component — Midnight 1.1 (patch release on the development line)
Git tag: v4.3.2
Tree hash: 9b2de1658b375e22323e6420eef372c0bf924aec
Environment: All public networks (mainnet, preprod, preview, devnet, qanet)
Note: This release pairs with node 1.0.0 and ships as part of the Midnight 1.1 bundle. Operators on node 0.22.x should track the 4.0.x maintenance line, not this release.
The 4.3.x line pairs with node 1.0.0 / ledger 8.1 and carries accumulated schema and fee-computation changes since the 4.0.x maintenance line (node 0.22.x). Index state built on 4.0.x cannot be reused — reset the indexer and re-index from genesis on upgrade. Budget ~3–4 days at mainnet/preprod scale. Upgrades within the 4.3.x line (4.3.0 → 4.3.1 → 4.3.2) are drop-in and require no reset.
Summary
Small patch release on the development line. Adds a /live HTTP liveness endpoint to indexer-api, allowing kubernetes to detect a stuck process the existing file-based liveness check could not. Fixes a dustGenerations subscription bug where the termination signal could miss in-flight wallet entries, replacing the per-wallet cursor check with chain progress and adding a re-drain to close the race window.
Dependencies
Unchanged from 4.3.1:
- Paired ledger: 8.1
- Paired node: 1.0.0 (supports 0.22.x as well)
- Bundle tracking issue: Midnight Release 1.1
- Sibling release: indexer 4.0.x maintenance line continues for operators on node 0.22.x (latest: 4.0.2)
Docker Images
Five images publish at this tag (per .github/workflows/build-indexer-images.yaml at v4.3.2):
midnightntwrk/chain-indexer:4.3.2midnightntwrk/indexer-api:4.3.2midnightntwrk/wallet-indexer:4.3.2midnightntwrk/indexer-standalone:4.3.2midnightntwrk/spo-indexer:4.3.2
Audience
These release notes are intended for:
- Operators running the Midnight Indexer against node 1.0+
- Wallet integrators consuming the
dustGenerationssubscription, especially clients passing anendIndexthat does not coincide with a wallet-owned generation index - SREs configuring kubernetes liveness probes on indexer-api
- QA and release managers tracking the Midnight 1.1 bundle
(Operators on node 0.22.x should track the 4.0.x maintenance line, not this release.)
What Changed
| Change | Type | PR |
|---|---|---|
/live HTTP endpoint for kubernetes liveness probe |
New feature | #1145 |
dustGenerations subscription terminates on chain progress, not per-wallet cursor (with race-window re-drain) |
Bug fix | #1137 |
New Features
/live HTTP endpoint for kubernetes liveness probe (#1145)
Adds an HTTP /live endpoint to indexer-api alongside the existing /ready endpoint. SREs can configure this as the kubernetes liveness probe, replacing the previous file-existence check (cat /var/run/indexer-api/running) which could not detect a stuck HTTP server. With /live, kubelet auto-recovers indexer-api pods that have entered an unresponsive state by triggering a restart after the probe failure threshold.
Operator note: this is opt-in. To use it, update the deployment manifest's livenessProbe to an httpGet against /live on the api port. The file-existence probe continues to work for backward compatibility.
Breaking Changes or Required Actions
None. Drop-in upgrade for operators already on the indexer 4.x.y development line.
Known Issues
Runtime-park hang under heavy concurrent merkle-tree-update load (midnight-ledger#521)
Under heavy concurrent merkle-tree-update load, Sp::force_as_arc (called via BackendLoader::get from make_dust_commitments_collapsed_update, make_dust_generations_collapsed_update, and related collapsed-update paths) can park the entire tokio runtime indefinitely. The pod produces zero log output (no errors, no panics, no background heartbeats) until kubelet's /live probe fails and the container is SIGTERM'd.
Per @tkerber on the ledger ticket:
Note: We are moving to a mainnet release with this as a known defect. This is likely to have the following effects:
- Indexer instances will be forcibly restarted when a deadlock/stall is detected
- Such stalls are increasingly likely to occur under heavy load
- An indexer restart may cause disconnection in connected wallet instances, which may lead to stalls in syncing until reconnected. This has not been fully tested.
We are moving ahead with a release without fixing this because:
- A prior fix attempt midnight-ledger#499 did not resolve this issue
- Evidence pinpointing the cause is very weak, and we cannot definitively attribute it.
- Restart/reconnect was deemed an acceptable mitigation while we work to find the underlying cause.
The /live HTTP endpoint shipped in this release is the detection half of that mitigation; the kubernetes restart path closes the loop. Root cause investigation ongoing at midnight-ledger#521.
Operators tracking other open issues in the indexer should consult the priority:critical and priority:high labels in the indexer GitHub issues.
Fixed Defects
| Defect | Description |
|---|---|
| #1137 | dustGenerations subscription hung in live-tail when the user-supplied endIndex did not coincide with a wallet-owned generation index. Termination signal moved from the per-wallet cursor (cursor > end_index strict) to chain progress (chain_first_free > end_index), aligning with the canonical pattern used by dustNullifierTransactions and shieldedNullifierTransactions. A re-drain step before yielding Progress closes the small race window between the storage drain ending and the chain-progress read. Wallets passing the chain's current dustGenerationEndIndex as endIndex now terminate cleanly. |
Links and References
(Per-PR links are embedded in the What Changed and Fixed Defects tables above.)
Midnight Indexer 4.3.1
Midnight Indexer 4.3.1 Release Notes
- Release date: 2026-05-11
- Release type: Patch release
- Git tag: v4.3.1
- Tree hash: fd9810c546d66b589709e937f1f0de83696eb306
- Environment: Development line, ships to public networks alongside the Midnight 1.1 bundle (formal QA against node 1.0+ runs on QAET before promotion)
High-level summary
Small patch release on the development line. Adds a transactionHash field to dust/shielded nullifier subscription response types — additive change unblocking wallet team integration that needed transaction correlation without an extra lookup. Plus one reliability fix replacing remaining production panics with error returns.
Dependencies
Unchanged from 4.3.0:
- Paired ledger: 8.1
- Paired node: 1.0.0 (supports 0.22.x as well)
- Sibling release: indexer 4.0.x maintenance line continues for operators on node 0.22.x (latest: 4.0.2)
Docker Images
Five images publish at this tag (per .github/workflows/build-indexer-images.yaml at v4.3.1):
midnightntwrk/chain-indexer:4.3.1midnightntwrk/indexer-api:4.3.1midnightntwrk/wallet-indexer:4.3.1midnightntwrk/indexer-standalone:4.3.1midnightntwrk/spo-indexer:4.3.1
Audience
These release notes are intended for:
- Operators running the Midnight Indexer against node 1.0+
- Developers integrating against the Indexer API, specifically wallet integrators consuming
dustGenerations,dustNullifierTransactions, andshieldedNullifierTransactionssubscriptions - QA and release managers tracking patch releases
(Operators on node 0.22.x should track the 4.0.x maintenance line, not this release.)
What changed
| Change | Type | PR |
|---|---|---|
transactionHash field on event subscription response types |
New feature | #1116 |
| Replace remaining production panics with error returns | Bug fix | #1105 |
New features
transactionHash on event subscription response types (#1116)
Added a non-null transactionHash: HexEncoded! field to:
DustGenerationsItem(in thedustGenerationssubscription)DustNullifierTransaction(in thedustNullifierTransactionssubscription)ShieldedNullifierTransaction(in theshieldedNullifierTransactionssubscription)
Additive change, no breaking impact on existing consumers. Wallet integrations can now correlate subscription events directly with transactions without a separate lookup by id. The transaction hash matches the hash exposed elsewhere in the schema (e.g. Transaction.hash).
New features requiring configuration updates
None.
Improvements
None in this release.
Deprecations
None.
Breaking changes
None. Drop-in upgrade for operators already on the indexer 4.x.y development line.
Known issues
No new known issues introduced by this release.
Fixed defect list
The following defects were fixed in Indexer 4.3.1:
| Defect / PR | Description |
|---|---|
| #1105 | Replaced remaining production panic paths with proper error returns. Improves reliability against unexpected state shapes by surfacing errors through normal error paths instead of panicking the process. |
Links and references
- Full changelog: https://github.com/midnightntwrk/midnight-indexer/blob/v4.3.1/CHANGELOG.md
- GitHub release: https://github.com/midnightntwrk/midnight-indexer/releases/tag/v4.3.1
- Indexer API GraphQL schema: https://github.com/midnightntwrk/midnight-indexer/blob/v4.3.1/indexer-api/graphql/schema-v4.graphql
- Indexer API docs and examples: https://github.com/midnightntwrk/midnight-indexer/blob/v4.3.1/docs/api/v4/api-documentation.md
(Per-PR links are embedded in the What changed and Fixed defect tables above.)
Midnight Indexer 4.3.0
Midnight Indexer 4.3.0 Release Notes
Compatibility note: This release pairs with node 1.0.0 and ships as part of the Midnight 1.1 bundle (May release). Refer to MNF advisories for current deployment recommendations. Operators currently on node 0.22.x should follow the 4.0.x maintenance line (latest: 4.0.2) instead.
- Release date: 2026-04-30
- Release type: Bundle component, Midnight 1.1
- Git tag: v4.3.0
- Tree hash: cc0edf48419bdb942ea8e4bb0aecbb90e71ae9c5
- Environment: Development line, ships to public networks once the Midnight 1.1 bundle is promoted (currently exercised on QAET secondary against node 0.22.2; formal QA against node 1.0.0 happens before promotion)
High-level summary
Development-line release on the node 1.0.0 / ledger 8.1 track, the indexer side of the Midnight 1.1 bundle. Three new features (SPO indexer in standalone SQLite mode, CLI --version without config, dust generation dtime updates in the subscription stream) and three bug fixes (in-memory pub/sub drain task lifecycle, dust subscription input validation, /api/v3 and /api/v4 redirect loop). No GraphQL schema breaking changes.
Dependencies
This release is part of Midnight Release 1.1:
- Bundle tracking issue: midnightntwrk/midnight-engineering#1
- Paired ledger: 8.1
- Paired node: 1.0.0 (supports 0.22.x as well)
- Sibling release: indexer 4.0.x maintenance line continues to ship for operators still on node 0.22.x (latest: 4.0.2)
Docker Images
Five images publish at this tag (per .github/workflows/build-indexer-images.yaml at v4.3.0):
midnightntwrk/chain-indexer:4.3.0midnightntwrk/indexer-api:4.3.0midnightntwrk/wallet-indexer:4.3.0midnightntwrk/indexer-standalone:4.3.0midnightntwrk/spo-indexer:4.3.0
Audience
These release notes are intended for:
- Operators running the Midnight Indexer against node 1.0+
- Developers integrating against the Indexer API (queries and subscriptions)
- QA and release managers tracking bundle component versions for the May release
(Operators on node 0.22.x should track the 4.0.x maintenance line, not this release.)
What changed
| Change | Type | PR |
|---|---|---|
| SPO indexer in standalone SQLite mode | New feature | #979 |
--version flag works without config |
New feature | #1083 |
DustGenerationDtimeUpdate in dustGenerations subscription |
New feature | #1080 |
| In-memory pub/sub drain tasks survive lag | Bug fix | #1063 |
| Dust subscription input validation tightened | Bug fix | #1090 |
Infinite redirect loop on unknown /api/v3 and /api/v4 paths |
Bug fix | #1093 |
New features
SPO indexer in standalone SQLite mode (#979)
indexer-standalone (the single-binary, SQLite-backed deployment) now bundles the SPO indexer alongside the existing chain-indexer / indexer-api / wallet-indexer paths. Previously SPO indexing required the cloud topology (separate spo-indexer binary against PostgreSQL plus NATS). Standalone operators can now produce SPO data without the cloud-mode dependency stack. External community contribution from hlolli.
--version without config (#1083)
indexer --version (and the per-binary CLIs) now print version output without requiring a valid configuration file. Aligns with standard CLI conventions and removes an unnecessary failure mode in environments where config has not yet been mounted (debugging, CI inspection, container introspection).
DustGenerationDtimeUpdate in dustGenerations subscription (#1080)
The dustGenerations GraphQL subscription now emits DustGenerationDtimeUpdate events alongside the existing dust-generation events. Wallet integrators get the dtime-advance signal directly through the subscription stream instead of needing to poll for it.
New features requiring configuration updates
None.
Improvements
None in this release. (Performance work continues on subsequent releases; perf entries in 4.1.0 introduced DataLoader batching across several lookups.)
Deprecations
None.
Breaking changes
None. This is a drop-in upgrade for operators already on the indexer 4.x.y development line. The Indexer API GraphQL schema is unchanged at v4.
Known issues
No new known issues introduced by this release. The broader audit-finding work-in-progress (subscription guardrails per SSE #196, CI/CD hardening, etc.) is tracked under separate tickets and is not specific to 4.3.0.
Fixed defect list
The following defects were fixed in Indexer 4.3.0:
| Defect / PR | Description |
|---|---|
| #1063 | Standalone-mode in-memory broadcast pub/sub drain tasks could exit after a lag event, leaving subscribers without further messages. Drain tasks now stay alive across lag. |
| #1090 | Dust subscription accepted overly permissive input. Validation tightened against malformed input on the dust subscription path. |
| #1093 | Unknown paths under /api/v3 and /api/v4 triggered an infinite redirect loop. Redirect handling no longer loops on unknown sub-paths under each API version prefix. |
Links and references
- Full changelog: https://github.com/midnightntwrk/midnight-indexer/blob/v4.3.0/CHANGELOG.md
- GitHub release: https://github.com/midnightntwrk/midnight-indexer/releases/tag/v4.3.0
- Indexer API GraphQL schema: https://github.com/midnightntwrk/midnight-indexer/blob/v4.3.0/indexer-api/graphql/schema-v4.graphql
- Indexer API docs and examples: https://github.com/midnightntwrk/midnight-indexer/blob/v4.3.0/docs/api/v3/api-documentation.md
- Midnight 1.1 bundle issue: midnightntwrk/midnight-engineering#1
(Per-PR links are embedded in the What changed and Fixed defect tables above.)
Midnight Indexer 4.2.1
Release notes
Note: This release pairs with node 1.0.0 and ships as part of the May release bundle. Refer to MNF advisories for current deployment recommendations.
Release name
Version: 4.2.1
Date: 2026-04-27
⚙️ Dependencies
- Bump to node 1.0.0-rc.3 and storage-core 1.2.0-rc.3 (#1077)
🚀 Features
- (bench) Add preprod genesis and multi-tx apply benchmarks (#1076)
Audience
This release note is critical for developers who:
- use the Midnight Indexer via the Indexer API
- run the Midnight Indexer
Links and references
- Full changelog: https://github.com/midnightntwrk/midnight-indexer/blob/v4.2.1/CHANGELOG.md
- Indexer API schema: https://github.com/midnightntwrk/midnight-indexer/blob/v4.2.1/indexer-api/graphql/schema-v4.graphql
- Indexer API docs/examples: https://github.com/midnightntwrk/midnight-indexer/blob/v4.2.1/docs/api/v3/api-documentation.md
- Chain Indexer Docker image: https://hub.docker.com/r/midnightntwrk/chain-indexer
- Indexer API Docker image: https://hub.docker.com/r/midnightntwrk/indexer-api
- Wallet Indexer Docker image: https://hub.docker.com/r/midnightntwrk/wallet-indexer
- Indexer Standalone Docker image: https://hub.docker.com/r/midnightntwrk/indexer-standalone
Midnight Indexer 4.2.0
Release notes
Note: This release pairs with node 1.0.0 and ships as part of the May release bundle. Refer to MNF advisories for current deployment recommendations.
Release name
Version: 4.2.0
Date: 2026-04-23
🚀 Features
- (indexer-api) Add dustGenerationMerkleTreeUpdate query (#1062)
- Dust generations QDO fields and generation tree index (#1059)
🐛 Bug Fixes
- (indexer-common) Clamp block_fullness on post_block_update to match node (#1061)
⚡ Performance
- (chain-indexer) Replace backward traversal with forward iteration by block height (#1038)
Audience
This release note is critical for developers who:
- use the Midnight Indexer via the Indexer API
- run the Midnight Indexer
Links and references
- Full changelog: https://github.com/midnightntwrk/midnight-indexer/blob/v4.2.0/CHANGELOG.md
- Indexer API schema: https://github.com/midnightntwrk/midnight-indexer/blob/v4.2.0/indexer-api/graphql/schema-v4.graphql
- Indexer API docs/examples: https://github.com/midnightntwrk/midnight-indexer/blob/v4.2.0/docs/api/v3/api-documentation.md
- Chain Indexer Docker image: https://hub.docker.com/r/midnightntwrk/chain-indexer
- Indexer API Docker image: https://hub.docker.com/r/midnightntwrk/indexer-api
- Wallet Indexer Docker image: https://hub.docker.com/r/midnightntwrk/wallet-indexer
- Indexer Standalone Docker image: https://hub.docker.com/r/midnightntwrk/indexer-standalone
Midnight Indexer 4.0.2
Release notes
Release name
Version: 4.0.2
Date: 2026-04-23
[4.0.2] - 2026-04-23
The paidFees correction (#1068) recomputes transaction fees for already-indexed data, so existing index state must be rebuilt. Reset the indexer and re-index from genesis on upgrade. Budget ~3–4 days for the re-index at mainnet/preprod scale.
🐛 Bug Fixes
Audience
This release note is critical for developers who:
- use the Midnight Indexer via the Indexer API
- run the Midnight Indexer
Links and references
- Full changelog: https://github.com/midnightntwrk/midnight-indexer/blob/v4.0.2/CHANGELOG.md
- Indexer API schema: https://github.com/midnightntwrk/midnight-indexer/blob/v4.0.2/indexer-api/graphql/schema-v4.graphql
- Indexer API docs/examples: https://github.com/midnightntwrk/midnight-indexer/blob/v4.0.2/docs/api/v3/api-documentation.md
- Chain Indexer Docker image: https://hub.docker.com/r/midnightntwrk/chain-indexer
- Indexer API Docker image: https://hub.docker.com/r/midnightntwrk/indexer-api
- Wallet Indexer Docker image: https://hub.docker.com/r/midnightntwrk/wallet-indexer
- Indexer Standalone Docker image: https://hub.docker.com/r/midnightntwrk/indexer-standalone