All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
-
(indexer-common) [breaking] Rename the ledger DB's
cache_sizetocache_max_nodes, make it a plain node count and raise it to 100000The value has always been a number of arena nodes (storage-core's own default is 10000), but it was parsed as a byte size, so the shipped
"1kiB"meant 1024 nodes β about 100x below where it should be. Operators must rename the key in their config and replace any byte-unit string with a plain integer; theAPP__INFRA__LEDGER_DB__CACHE_SIZEenvironment variable becomesAPP__INFRA__LEDGER_DB__CACHE_MAX_NODES.0means unbounded.
- (chain-indexer) Validate the first regular transaction against the parent block timestamp's mempool
tblockbump
- (chain-indexer) Avoid OutOfDustValidityWindow on the first transaction of a block by reproducing the node's mempool
tblockbump (#1367)
- (indexer-api) Add subscription quotas to graphql websocket (#1104)
- (indexer-api) Tighten shielded nullifier transactions input validation (#1126)
- (indexer-api) Introduce @beta GraphQL directive for in-flight API fields (#1186)
- (indexer-api) Add per-tree end indexes to Block (#1197)
- (indexer-api) Rename DustNullifier byte fields with LeBytes suffix (#1199)
- (indexer-api) Add transaction reference to nullifier event types (#1208)
- (indexer-api) Deliver DustGenerationDtimeUpdate items on fresh dustGenerations subscriptions (#1166)
- Bump midnight-ledger to 8.1.0 (#1141). Version bump only from 8.1.0-rc.1, no functional change for the indexer.
- Bump node to 1.0.0 (#1204). Test data regenerated against the 1.0.0 release tag (previously 1.0.0-rc.3); no functional change for the indexer.
- (indexer-api) Add /live HTTP endpoint for kubernetes liveness probe (#1145)
- (indexer-api) DustGenerations subscription terminates on chain progress, not per-wallet cursor (#1137)
- (indexer-standalone) Document mandatory APP__INFRA__SPO_NODE__BLOCKFROST_ID (#1149)
- (indexer-api) Add transactionHash to event subscription response types (#1116)
- Replace remaining production panics with error returns (#1105)
- (indexer-standalone) Run spo indexer in standalone sqlite mode (#979)
- (cli) Support --version without confg (#1083)
- (indexer-api) Include DustGenerationDtimeUpdate in dustGenerations subscription (#1080)
- (indexer-common) Keep in-memory pub/sub drain tasks alive after lag (#1063)
- (indexer-api) Tighten dust subscription input validation (#1090)
- (indexer-api) Avoid infinite redirect loop on unknown /api/v3 and /api/v4 paths (#1093)
- Bump to node 1.0.0-rc.3 and storage-core 1.2.0-rc.3 (#1077)
- (bench) Add preprod genesis and multi-tx apply benchmarks (#1076)
- (indexer-api) Add dustGenerationMerkleTreeUpdate query (#1062)
- Dust generations QDO fields and generation tree index (#1059)
- (indexer-common) Clamp block_fullness on post_block_update to match node (#1061)
- (chain-indexer) Replace backward traversal with forward iteration by block height (#1038)
- Log wallet ID on connect and disconnect mutations (#935)
- (indexer-api) Add query for zswap collapsed update (#982)
- Support node v1.0 (#985)
- (indexer-api) Add zswap Merkle tree root to block (#988)
- Add efficient dust wallet synchronisation endpoints (#980)
- Remove support for node 0.20 and 0.21 (#986)
- Add shieldedNullifierTransactions subscription (#996)
- Bridge async-graphql tracing to fastrace (#1037)
- Avoid unnecessary scans of shielded transactions (#1039)
- Support ledger 8.1 (#1033)
- Add node 1.0.0-rc.2 metadata and remove rc.1 (#1041)
- Pin upload-sarif-github-action to latest SHA (KICS/Trivy disabled)
- Add start_period to postgres healthcheck in docker-compose (#936)
- (chain-indexer) Falling back to metadata of parent block (#970)
- Per-generation capacity calculation and cursor pagination for dust queries (#997)
- (indexer-api) Make standalone sqlite spo queries match postgres (#977)
- (api) Align dustCommitmentMerkleTreeUpdate with zswapMerkleTreeCollapsedUpdate pattern (#1023)
- Compute transaction fees using ledger's Transaction::fees() API (#1031)
- Simplify and make recent code more consistent (#1035)
- (indexer-api) Introduce DataLoader for block-by-hash lookups (#1018)
- (indexer-api) Introduce DataLoader for transactions-by-block-id lookups (#1022)
- (indexer-api) Introduce DataLoader for contract-actions-by-transaction-id lookups (#1030)
- (indexer-api) Introduce DataLoader for transaction-by-id lookups (#1027)
- (security) Fix vulnerability (#914)
- (api) Add fee field and deprecate estimatedFees and fees wrapper (#1036)
- Bump midnight-storage-core to 1.2.0-rc.2 (#1052)
- Remove unused node 0.20 and 0.21 data (#1042)
- Flush pending inserts before delete/root-count to preserve batch_update ordering (#904)
- Rename cardano_address DB column to cardano_stake_key for clarity (#902)
- Batch ledger_db_nodes inserts to reduce SQL roundtrips (#892)
- Replace window function with scalar subquery in ledger events query (#890)
- Use lazy loading for ledger state deserialization to avoid recursion depth limit (#871)
- Use storage-core v1.1 with layout v2 (#861)
- Drop year from copyright notices (#848)
- Prevent processes from hanging on termination (#844)
- Update copyright year (#845)
- Add User-Agent header to subxt RPC client (#826)
- (indexer-api) Replace deterministic session ID with random per-session token (#807)
- Make some magic numbers configurable (#817)
- (indexer-api) /api/v3 alias for /api/v4 for backwards compatibility (#815)
- Prevent standalone pub-sub from busy spinning (#792)
- Use InitialNonce instead of HashOutput for night_utxo_hash in dtime update (#795)
- (chain-indexer) Fold system parameters update into save_block transaction (#793)
- (chain-indexer) Check all spent UTXOs are updated in save_spent_unshielded_utxos (#799)
- Make protocol version an enum (#800)
- (chain-indexer) Replace panic with result in storage impl (#791)
- Update debian trixie-slim base image to resolve CVE-2025-15467 (#801)
- Support ledger v8.0.0 (#766)
- Support node v0.22.0 (#770)
- Add ledger state translation (#773)
- (indexer-api) Add protocolVersion to ledger event types (#784)
- Bump API and package version to v4 (#788)
- Read genesis ledger state from chain spec (#772)
- (chain-indexer) Create ledger state for oldest version and translate (#780)
- (indexer-api) Only keep active wallets active (#775)
- (indexer-api) Correctly set next index for loading relevant transactions (#777)
- (chain-indexer) Treat unknown highest block on node as not caught up (#778)
- (wallet-indexer) Correctly set max_transaction_id (#783)
- (indexer-api) Prevent batch requests (#786)
- (chain-indexer) Less verbose debug level logging (#779)
- Remove obsolete schema-v3.graphql (#789)
- (chain-indexer) Fetch genesis cNight registrations from pallet storage (#733)
- (spo) Integrate SPO indexer into midnight-indexer (#735)
- Add support for node 0.21 (#761)
- (indexer-api) Only stream relevant txs for active wallets (#743)
- (indexer-api) Remove encode() call on varchar column in stakePoolOperators query (#753)
- Use ledger storage for ledger state persistence (#694)
- (indexer-api) Include ledger parameters in block query (#745)
- Use pre-built GHCR image for spo-indexer in docker-compose and remove unused NATS dependency (#752)
- Add spo-indexer docs, clean up unused NATS config and misleading blockfrost placeholder (#754)
- Update debian trixie-slim base image to resolve CVE-2025-15467 (#801)
- Unify configuration across components (#20)
- Extend PostgreSQL pool configuration (#50)
- (chain-indexer) Start supporting node 0.13 (#21)
- (indexer-api) Remove deprecated health endpoint (#52)
- Rename ApplyStage to TransactionResult and add segment results (#54)
- Remove support for node 0.12 (#60)
- Add unshielded token support to indexer (merging feat/ut to main) (#62)
- Enhance unshielded token subscription with sync progress data (PM-17159) (#73)
- Enhance transaction metadata with status, fees, and execution results (#82)
- (indexer-api) Node-like default ordering of database query results (#102)
- Implement unshielded token ownership by contracts (#97)
- Add transaction ID offset parameter to unshielded subscription (#120)
- Improve error handling for network ID mismatches in unshielded address queries (#137)
- Support multiple ledger versions (#134)
- (indexer-api) Introduce ApiError with client and server errors (#147)
- (indexer-api) Remove obsolete metrics, add wallets connected gauge (#151)
- Rework unshielded API and implementation (#156)
- Enable tracing for GraphQL subscriptions (#179)
- Make checkmarx issues visible in github (#208)
- Pin actions (#211)
- Replace checkmarx.yaml with composite action (#268)
- Upgrade checkout action to latest version and pin to hash (#319)
- (chain-indexer) Remove hex decoding for transactions (#320)
- (indexer-api) Rework shielded transactions (#315)
- End to end support for ledger events (#359)
- Add dustLedgerEvents subscription (#366)
- (indexer-api) Support system transactions in API (#375)
- Use untagged serialization for viewing key (#378)
- Store and expose ledger parameters in GraphQL API (PM-19727, PM-19761) (#382)
- Add DUST registration tracking to UnshieldedUtxo (#391)
- Correctly use and expose byte types (#398)
- (indexer-api) Change API version from v1 to v3 (#418)
- (api) Add dustGenerationStatus query for cNIGHT tracking (#419)
- Add ctime to unshielded UTXO (#425)
- Change network ID from enum to string (#426)
- Integrate CardanoRewardAddress changes from latest Node (#505)
- Validate network ID is lowercase at startup (#518)
- Ensure non-0 exit codes (#524)
- (api) Add maxCapacity field to DustGenerationStatus (#552)
- (api) Change dustAddress from HexEncoded to Bech32m format (#554)
- (api) Add Cardano UTXO reference to dustGenerationStatus (#575)
- Validate saving ledger state (#600)
- (nats) Add num_replicas config for JetStream stream replication (#626)
- (api) Validate Cardano reward address network against Midnight network (#620)
- Add governance system parameters (D-Parameter and T&C) to GraphQL API (#637)
- Support ledger v7.0.0 (#717)
- Support node v0.20.0 (#720)
- (indexer-api) Make viewing update stream infinite (#32)
- (chain-indexer) Reset zswap state if storage is empty (#35)
- Abstract over runtime-dependent UtxoInfo type (#80)
- (indexer-api) Correctly determine highest relevant index (#94)
- (indexer-api) Correctly determine highest relevant index for standalone (#95)
- (justfile) Create target/data directory before running standalone indexer (#103)
- (wallet-indexer) Avoid race condition saving relevant transactions (#107)
- (indexer-api) Ensure consistent UTXO ordering by output_index in GraphQL API (#119)
- Allow target dir to be changed (#122)
- (wallet-indexer) Index wallets when freshly started (#124)
- Return client error for unknown block hash in subscriptions (#172)
- Correctly determine transaction relevance (#237)
- Resolve panic when querying transaction field on ContractAction interface (#243)
- Add --wait flag to docker compose commands to prevent race condition (#244)
- Configure nextest to prevent test cancellation on failure (#255)
- Update chain-indexer to use 0.13.5 metadata for node-dev-01 compatibility (#275)
- Correctly determine transaction relevance (#313)
- (chain-indexer) Fetch authorities for historic block (#318)
- Correct node version extraction in GitHub Actions workflow (#326)
- Restore genesis UTXO aggregation for test compatibility (#350)
- Allow manual kick off of repo (#351)
- Remove incorrect assertion on stream ordering in chain-indexer (#368)
- Handle SystemTransactionApplied events from MidnightSystem pallet (#381)
- Use same intent hash for ClaimRewards as ledger (#400)
- Use correct intent hash for spent UTXOs (#402)
- Skip UTXO creation for failed transactions (#401)
- (chain-indexer) Create unshielded UTXOs from system transactions (#408)
- (indexer-api) Correct index update order in shieldedTransactions subscription (#455)
- Always populate zswap_state for contract actions (#471)
- Populate dust_generation_info from DustInitialUtxo events (#517)
- (chain-indexer) Skip balance for failed contract actions (#527)
- (api) DustGenerationStatus query returns zeros for some fields (#530)
- Treat dust public key as variable length encoded (#538)
- (indexer-api) Prevent duplicate transactions (#573)
- (chain-indexer) Add timeout-based recovery for stuck subscriptions (#576)
- Correct ledger state divergence from TX ordering and failed TX cost handling (#592)
- (chain-indexer) Rebuild ledger state from correct block height (#664)
- (indexer-api) Remove duplicate SIGTERM handler to allow graceful shutdown (#685)
- Add support for .envrc.local (#254)
- Simplify node update process (#322)
- Add cargo-deny SARIF output to security scanning (#370)
- (wallet-indexer) Minimize storage access (#42)
- Simpler handling of zswap state (#46)
- Remove subxt dependency from domain (#51)
- Remove redundant unshielded UTXO handling from storage (#64)
- Split indexer-api Storage into smaller parts (#69)
- (indexer-api) Move NoopStorage impls to respective submodules (#76)
- Align UnshieldedUtxoStorage with other storage traits (#74)
- (indexer-api) Break api/v1 module into smaller submodules (#143)
- Storage unification (#171)
- Remove unused code, better naming, etc. (#232)
- Rename GraphQL field from parameters to ledgerParameters (#384)
- Use ledger INITIAL_DUST_PARAMETERS via protocol-version-aware submodule (#558)
- Add "Running" section to README (#24)
- Add Development Setup section to README (#61)
- Correct misleading documentation in unshielded subscription (#85)
- Update the API documentation with transaction fees and unshielded progress tracking (#88)
- Update GraphQL API documentation to match current schema (#176)
- Add missing requirements to README (#253)
- Add comprehensive guide for updating node versions (#281)
- (api) Enhance v3 api documentation with DUST features and field updates (#473)
- Clarify currentCapacity limitations in dustGenerationStatus (#503)
- Extend comment for nightBalance, make clear it is in STAR (#551)
- Add composite index on transactions(variant, id) (#647)
- Add more and consistent tracing and logging (#27)
- Add logging related to caught-up state (#53)
- Some code hygiene (#63)
- (chain-indexer) Improve some code style (#105)
- Remove obsolete TryFrom byte slice impl for ViewingKey (#126)
- Commit staged changes across repos (#282)
- Update midnight-node to 0.16.0-da0b6c69 (#309)
- (cleanup) Use where clauses for trait bounds where possible (#321)
- Improve node update process robustness (#323)
- Upgrade upload-sarif-github-action to use Checkmarx CLI v2.3.35 (#357)
- (chain-indexer) Cleanup SubxtNode error handling (#364)
- Cleanup ledger parameter implementation (#387)
- Some code hygiene (#404)
- (indexer-api) Cleanup storage implementation (#406)
- Remove unnecessary clone in ledger event storage (#420)
- Enable TLS for PostgreSQL (#422)
- Update Checkmarx action to latest version (#452)
- (docker-compose) Use named volume for node data (#463)
- (test) Increased API_MAX_COMPLEXITY of standalone in native_e2e.rs, matching the cloud config. (#474)
- Address various audit findings (#477)
- Further address audit (#495)
- Richer error messages (#494)
- (chain-indexer) Add some debug level logging (#541)
- Propagate system parameters update errors (#673)
- (indexer-api) Correctly determine highest relevant index (#94)
- (indexer-api) Correctly determine highest relevant index for standalone (#95)
- (wallet-indexer) Avoid race condition saving relevant transactions (#107) (#110)
- Database migration (#111)
- Extend PostgreSQL pool configuration (#50)
- (wallet-indexer) Minimize storage access (#42)
- (indexer-api) Make viewing update stream infinite (#32)
- Add more and consistent tracing and logging (#27)
- (indexer-api) Queries return correct transactions and contract actions (#15)
- (chain-indexer) Easier, more idiomatic way to apply transactions (#10)
- (indexer-api) Add permissive CORS middleware (#635)
- Bump node to 0.12 and ledger to 4.0 (#537)
- (indexer-api) Redesign wallet subscription ProgressUpdates (#591)
- (indexer-api) Add tracing to API (#597)
- (indexer-api) Add counters for all GraphQL operations (#603)
- (indexer-api) Clean naming and inputs (#617)
- Only support bech32m encoded keys/addresses (#602)
- (indexer-api) Rename contract query and subscription contract_action (#625)
- (indexer-api) Add missing logging for wallet subscription (#575)
- Add missing error logging for loading config (#577)
- Remove common-macro from Dockerfiles, update to Rust 1.86.0 (#583)
- (indexer-api) Skip collapsed update for failed transactions (#588)
- (indexer-api) Add transaction to ContractCallOrDeploy (#608)
- (indexer-api) Add deploy to ContractCall (#609)
- (wallet-indexer) Silence harmless database error in active_wallets (#619)
- Use log, logforth and fastrace for telemetry (#544)
- Replace bytes attribute with byte newtypes (#574)
- Pass SessionId (Copy) by value (#594)
- Move main/run into main.rs (#596)
- (indexer-api) Pass block and tx hashes (arrays) by value (#610)
- (indexer-api) Lazy resolving of transactions and contract actions (#611)
- Updates, mainly reflecting API changes (#628)
- More updates/fixes for API doc (#630)
- (indexer-api) Apply consistent error handling (#601)
- (indexer-api) More debug logging (#612)
- Bump node to 0.12 and ledger to 4.0 (#537)
- (indexer-api) Redesign wallet subscription ProgressUpdates (#591)
- (indexer-api) Add tracing to API (#597)
- (indexer-api) Add counters for all GraphQL operations (#603)
- (indexer-api) Clean naming and inputs (#617)
- Only support bech32m encoded keys/addresses (#602)
- (indexer-api) Rename contract query and subscription contract_action (#625)
- (indexer-api) Add missing logging for wallet subscription (#575)
- (indexer-api) Skip collapsed update for failed transactions (#588)
- (indexer-api) Add transaction to ContractCallOrDeploy (#608)
- (indexer-api) Add deploy to ContractCall (#609)
- (wallet-indexer) Silence harmless database error in active_wallets (#619)
- Use log, logforth and fastrace for telemetry (#544)
- Replace bytes attribute with byte newtypes (#574)
- Pass SessionId (Copy) by value (#594)
- Move main/run into main.rs (#596)
- (indexer-api) Pass block and tx hashes (arrays) by value (#610)
- (indexer-api) Lazy resolving of transactions and contract actions (#611)
- Updates, mainly reflecting API changes (#628)
- More updates/fixes for API doc (#630)
- (indexer-api) Apply consistent error handling (#601)
- (indexer-api) More debug logging (#612)
- (indexer-api) Send correct ProgressUpdates on reconnect (#531)
- Wallet subscription keeps wallet active (#510)
- (adr) Use only bech32m format for unshielded address and remove bls/hex mentions (#486)
- (decision) Record decision to replace Scala indexer docs with Rust indexer docs (#13933) (#427)
- Rename local to standalone (#508)
The Midnight Indexer 1.0.0 is the first release of the Rust-based indexer, replacing the previous Scala implementation. This version improves performance, modularity, and deployment flexibility. The indexer efficiently processes data from Midnight network, providing a GraphQL API for queries and real-time subscriptions.