Skip to content

Midnight Indexer 4.3.3-rc.2

Pre-release
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.)