Skip to content

Releases: midnightntwrk/midnight-indexer

Midnight Indexer 4.3.3

Choose a tag to compare

@cosmir17 cosmir17 released this 04 Jun 17:09
v4.3.3
a89e1d3

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

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.3
  • midnightntwrk/indexer-api:4.3.3
  • midnightntwrk/wallet-indexer:4.3.3
  • midnightntwrk/indexer-standalone:4.3.3
  • midnightntwrk/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 / shieldedNullifierTransactions subscriptions.
  • 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.nullifiernullifierLeBytes
  • DustNullifierTransaction.commitmentcommitmentLeBytes
  • dustNullifierTransactions(...) subscription argument nullifierPrefixesnullifierLeBytesPrefixes

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

(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

Pre-release

Choose a tag to compare

@cosmir17 cosmir17 released this 01 Jun 15:04
v4.3.3-rc.4
2ddbd90

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

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.4
  • midnightntwrk/indexer-api:4.3.3-rc.4
  • midnightntwrk/wallet-indexer:4.3.3-rc.4
  • midnightntwrk/indexer-standalone:4.3.3-rc.4
  • midnightntwrk/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 dustNullifierTransactions and shieldedNullifierTransactions subscriptions.
  • 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

(Per-PR links are embedded in the What Changed and Breaking Changes sections above.)

Midnight Indexer 4.3.3-rc.3

Pre-release

Choose a tag to compare

@cosmir17 cosmir17 released this 29 May 16:11
v4.3.3-rc.3
c1406af

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

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.3
  • midnightntwrk/indexer-api:4.3.3-rc.3
  • midnightntwrk/wallet-indexer:4.3.3-rc.3
  • midnightntwrk/indexer-standalone:4.3.3-rc.3
  • midnightntwrk/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 dustNullifierTransactions subscription and the Block *EndIndex fields.
  • 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 dustNullifierTransactions subscription with a LeBytes suffix (#1199) so the constant-length little-endian encoding is explicit in the name: nullifiernullifierLeBytes, commitmentcommitmentLeBytes, nullifierPrefixesnullifierLeBytesPrefixes. These are @beta fields 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

(Per-PR links are embedded in the What Changed and Breaking Changes sections above.)

Midnight Indexer 4.3.3-rc.2

Pre-release

Choose a tag to compare

@cosmir17 cosmir17 released this 27 May 13:55
v4.3.3-rc.2
e4f2b17

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.0 and is the first release candidate for the 4.3.3 patch 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

Docker Images

  • midnightntwrk/chain-indexer:4.3.3-rc.2
  • midnightntwrk/indexer-api:4.3.3-rc.2
  • midnightntwrk/wallet-indexer:4.3.3-rc.2
  • midnightntwrk/indexer-standalone:4.3.3-rc.2
  • midnightntwrk/spo-indexer:4.3.3-rc.2

Audience

  • Operators who run an indexer on the 4.3.x line (paired with node 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.2 onward 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.dustGenerations
  • DustGenerationsItem, DustGenerationDtimeUpdateItem, DustGenerationsProgress
  • Query.dustGenerationMerkleTreeUpdate, Query.dustCommitmentMerkleTreeUpdate
  • RegularTransaction.dustGenerationStartIndex / dustGenerationEndIndex / dustCommitmentStartIndex / dustCommitmentEndIndex
  • DustNullifierTransaction.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

(Per-PR links are embedded in the What Changed and Fixed Defects tables above.)

Midnight Indexer 4.3.2

Choose a tag to compare

@cosmir17 cosmir17 released this 15 May 19:14
v4.3.2
7b6d40e

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.

⚠️ Requires an indexer reset when upgrading from the 4.0.x line to 4.3.2

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.2
  • midnightntwrk/indexer-api:4.3.2
  • midnightntwrk/wallet-indexer:4.3.2
  • midnightntwrk/indexer-standalone:4.3.2
  • midnightntwrk/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 dustGenerations subscription, especially clients passing an endIndex that 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

Choose a tag to compare

@cosmir17 cosmir17 released this 11 May 17:10
v4.3.1
3ccabeb

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.1
  • midnightntwrk/indexer-api:4.3.1
  • midnightntwrk/wallet-indexer:4.3.1
  • midnightntwrk/indexer-standalone:4.3.1
  • midnightntwrk/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, and shieldedNullifierTransactions subscriptions
  • 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 the dustGenerations subscription)
  • DustNullifierTransaction (in the dustNullifierTransactions subscription)
  • ShieldedNullifierTransaction (in the shieldedNullifierTransactions subscription)

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

(Per-PR links are embedded in the What changed and Fixed defect tables above.)

Midnight Indexer 4.3.0

Choose a tag to compare

@cosmir17 cosmir17 released this 30 Apr 23:21
v4.3.0
cf55cb9

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.0
  • midnightntwrk/indexer-api:4.3.0
  • midnightntwrk/wallet-indexer:4.3.0
  • midnightntwrk/indexer-standalone:4.3.0
  • midnightntwrk/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

(Per-PR links are embedded in the What changed and Fixed defect tables above.)

Midnight Indexer 4.2.1

Choose a tag to compare

@cosmir17 cosmir17 released this 27 Apr 20:14
v4.2.1
5503a07

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

Midnight Indexer 4.2.0

Choose a tag to compare

@cosmir17 cosmir17 released this 23 Apr 19:57
v4.2.0
5ac2c2f

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

Midnight Indexer 4.0.2

Choose a tag to compare

@cosmir17 cosmir17 released this 27 Apr 09:01
v4.0.2
426a5d4

Release notes

Release name

Version: 4.0.2
Date: 2026-04-23

[4.0.2] - 2026-04-23

⚠️ Requires an indexer reset when upgrading from 4.0.1 to 4.0.2

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