Midnight Indexer 4.3.3-rc.2
Pre-releaseMidnight 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.)