Cardano Rosetta Java v2.3.0
Cardano Rosetta Java v2.3.0 is a maintenance release that hardens transaction construction with protocol-level output validation, fixes several data-endpoint edge cases, and embeds database index management directly into the indexer.
⚠️ This is not a mandatory release.
Breaking Changes ⚠️ ⚠️ ⚠️
- Token registry logo encoding fixed (hex → base64). Logo values in currency metadata were declared as base64 but contained the raw hex served by CIP-26 registries. They are now delivered as actual base64. Clients that worked around the old behavior by hex-decoding the value must switch to base64 decoding.
/search/transactionsno longer acceptslovelaceas a currency symbol. Previously such requests were accepted even though lovelace is not a native asset; they now return a validation error./construction/payloadsenforces protocol output limits. Requests whose outputs are below the minimum UTxO requirement or exceedmax_val_sizenow fail with a clear error instead of returning an unsigned transaction. Only transactions that the node would have rejected at submission are affected.
See API / Configuration below for error codes and full details.
Key Improvements
- Yaci Store upgraded to 2.0.2.1 (2.0.2.1 has a permanent restart feature, see: bloxbean/yaci-store#1003)
- Transaction construction now validates outputs against Cardano protocol limits (minimum ADA per output and maximum value size), rejecting invalid transactions early with clear errors instead of failing at submission time
- Database index management is now embedded in the indexer — the separate index-applier container is gone, with automatic crash recovery, bounded retries of failed builds, and a dedicated monitoring endpoint. See the updated Index Management documentation.
- Token registry (CIP-26) logos are now returned correctly encoded so images render directly in clients
- Data endpoints stay schema-valid on pruned deployments, and multi-asset token bundles with duplicate policy IDs now parse correctly
- Runtime migrated to JDK 25 LTS with dependency updates;
Upgrade / Compatibility
- From v2.0.0 / v2.1.x / v2.2.0: Compatible, no resync required. On first start after the upgrade,
yaci-indexerdetects the already-existing database indexes and reportsLIVEimmediately. - From v1.x.x: Requires a full resync of the yaci-indexer only (Cardano Node data can be kept). See the resync procedure.
- The
index-applierone-shot container has been removed:docker-compose-index-applier.yamlno longer exists and the Helm chart no longer ships theindexApplierJob and ConfigMap. No action is needed for standard deployments; if your own orchestration or scripts referenced theindex-appliercontainer, remove those references.
API / Configuration
-
/construction/payloads: outputs are validated against the minimum UTxO requirement.- Each transaction output's ADA value is checked against the protocol minimum (derived from the
coinsPerUtxoSizeprotocol parameter). Outputs below the minimum are rejected with new non-retriable error5060("Output ADA value is below the minimum UTxO requirement").
- Each transaction output's ADA value is checked against the protocol minimum (derived from the
-
/construction/payloads: outputs are validated againstmax_val_size.- The serialized byte size of each output's value is checked against the
max_val_sizeprotocol parameter. Oversized outputs are rejected with new non-retriable error5061("UTxO value byte size exceeds the allowed max_val_size protocol parameter"). The check is skipped whenmax_val_sizeis absent or zero in the provided protocol parameters.
- The serialized byte size of each output's value is checked against the
-
/construction/parse: token bundles with duplicate policy IDs parse correctly.- MultiAsset entries are now grouped by policy ID before building the token bundle, so transaction bodies containing multiple entries for the same policy no longer produce malformed operation metadata.
-
/search/transactions:lovelacerejected as currency symbol.- Passing
lovelace(any casing) ascurrency.symbolnow returns error4024("Invalid token name"). Previously the symbol was accepted and treated as a native asset filter.
- Passing
-
/block,/block/transaction,/search/transactions: empty account objects removed from operations.- Operations whose account address cannot be resolved (for example inputs referencing UTXOs already removed on pruned instances) no longer include an empty
accountobject, keeping responses valid against the Rosetta schema.
- Operations whose account address cannot be resolved (for example inputs referencing UTXOs already removed on pruned instances) no longer include an empty
-
Breaking: token registry logos converted from hex to base64.
- CIP-26 registries serve logo bytes hex-encoded; responses now convert them to base64 as clients expect. Malformed logo values are omitted instead of being passed through. Affects currency metadata on
/account/balance,/account/coins,/block,/block/transaction, and/search/transactionswhen the token registry integration is enabled.
- CIP-26 registries serve logo bytes hex-encoded; responses now convert them to base64 as clients expect. Malformed logo values are omitted instead of being passed through. Affects currency metadata on
-
/network/options: error list and versions updated.- The
allow.errorslist now includes codes5060and5061, andversion.middleware_versionis2.3.0.
- The
-
yaci-indexer: new actuator endpoint/actuator/rosetta-indexes.- Reports overall and per-index lifecycle state (
READY/BUILDING/FAILED/MISSING) including per-index error messages, replacing log-watching of the removed index-applier container. See Index Management for details.
- Reports overall and per-index lifecycle state (
Environment updates:
RELEASE_VERSION:2.2.0→2.3.0INDEX_STALL_TIMEOUT_MINUTES:360(new — liveness stall timeout while an index build is in progress)INDEX_FAILED_RETRY_MAX_ATTEMPTS:3(new — retry cap after a failed index build)INDEX_FAILED_RETRY_DELAY_MINUTES:5(new — delay between failed-build retries)INDEX_QUERY_TIMEOUT_SECONDS:21600(new — statement timeout per index creation)
What's Changed
- chore: migrate to JDK 25 LTS and update dependencies by @matiwinnetou in #721
- fix: group MultiAsset entries by policyId before merging in parseToke… in #729
- docs: fix duplicated trailing column in env-vars table by @matiwinnetou in #754
- fix: update TOKEN_REGISTRY_BASE_URL by @Sotatek-HenryDo in #756
- fix(search-service): reject lovelace as currency symbol in /search/tr… in #752
- build(docker): harden apt against transient Ubuntu-mirror failures by @matiwinnetou in #739
- UTXO size (max_val_size) validation for payload endpoints in #738
- fix: payloads endpoint be validate min ada value during txn construction in #735
- fix(token-registry): convert CIP-26 logo from hex to base64 before re… in #751
- feat: replace 'apply indexes' with a native solution in #746
- fix: block data endpoints when indexer is syncing by @Sotatek-HenryDo in #758
- fix: integration test by @Sotatek-HenryDo in #760
- fix: drop empty account identifier from operations by @Sotatek-HenryDo in #762
- feat: add 5s cache for sync status verification by @Sotatek-HenryDo in #761
- chore: bump yaci-store to 2.0.2.1 by @matiwinnetou in #765
- feat(sync) status refresh scheduler by @Sotatek-HenryDo in #767
- Revert sync-status gating/caching/scheduler (#758, #761, #767) by @Sotatek-HenryDo in #773
- chore: prepare 2.3.0 by @matiwinnetou in #755
New Contributors
- @Sotatek-HenryDo made their first contribution in #756
Full Changelog: 2.2.0...2.3.0