Apr 03, 2-3 PM (60)
Apr 03, 3-4 PM (15)
Apr 03, 4-5 PM (10)
Apr 03, 5-6 PM (5)
Apr 03, 6-7 PM (14)
Apr 03, 7-8 PM (20)
Apr 03, 8-9 PM (6)
Apr 03, 9-10 PM (15)
Apr 03, 10-11 PM (20)
Apr 03, 11-12 AM (17)
Apr 04, 12-1 AM (6)
Apr 04, 1-2 AM (1)
Apr 04, 2-3 AM (6)
Apr 04, 3-4 AM (1)
Apr 04, 4-5 AM (1)
Apr 04, 5-6 AM (5)
Apr 04, 6-7 AM (10)
Apr 04, 7-8 AM (3)
Apr 04, 8-9 AM (3)
Apr 04, 9-10 AM (5)
Apr 04, 10-11 AM (35)
Apr 04, 11-12 PM (9)
Apr 04, 12-1 PM (24)
Apr 04, 1-2 PM (11)
Apr 04, 2-3 PM (8)
Apr 04, 3-4 PM (12)
Apr 04, 4-5 PM (3)
Apr 04, 5-6 PM (9)
Apr 04, 6-7 PM (2)
Apr 04, 7-8 PM (3)
Apr 04, 8-9 PM (5)
Apr 04, 9-10 PM (17)
Apr 04, 10-11 PM (21)
Apr 04, 11-12 AM (23)
Apr 05, 12-1 AM (2)
Apr 05, 1-2 AM (0)
Apr 05, 2-3 AM (2)
Apr 05, 3-4 AM (1)
Apr 05, 4-5 AM (1)
Apr 05, 5-6 AM (9)
Apr 05, 6-7 AM (13)
Apr 05, 7-8 AM (4)
Apr 05, 8-9 AM (1)
Apr 05, 9-10 AM (0)
Apr 05, 10-11 AM (7)
Apr 05, 11-12 PM (7)
Apr 05, 12-1 PM (5)
Apr 05, 1-2 PM (2)
Apr 05, 2-3 PM (3)
Apr 05, 3-4 PM (3)
Apr 05, 4-5 PM (18)
Apr 05, 5-6 PM (3)
Apr 05, 6-7 PM (2)
Apr 05, 7-8 PM (2)
Apr 05, 8-9 PM (0)
Apr 05, 9-10 PM (5)
Apr 05, 10-11 PM (19)
Apr 05, 11-12 AM (18)
Apr 06, 12-1 AM (4)
Apr 06, 1-2 AM (6)
Apr 06, 2-3 AM (12)
Apr 06, 3-4 AM (11)
Apr 06, 4-5 AM (5)
Apr 06, 5-6 AM (7)
Apr 06, 6-7 AM (4)
Apr 06, 7-8 AM (8)
Apr 06, 8-9 AM (24)
Apr 06, 9-10 AM (15)
Apr 06, 10-11 AM (9)
Apr 06, 11-12 PM (2)
Apr 06, 12-1 PM (38)
Apr 06, 1-2 PM (49)
Apr 06, 2-3 PM (27)
Apr 06, 3-4 PM (8)
Apr 06, 4-5 PM (32)
Apr 06, 5-6 PM (18)
Apr 06, 6-7 PM (3)
Apr 06, 7-8 PM (11)
Apr 06, 8-9 PM (6)
Apr 06, 9-10 PM (9)
Apr 06, 10-11 PM (29)
Apr 06, 11-12 AM (16)
Apr 07, 12-1 AM (8)
Apr 07, 1-2 AM (8)
Apr 07, 2-3 AM (3)
Apr 07, 3-4 AM (4)
Apr 07, 4-5 AM (1)
Apr 07, 5-6 AM (17)
Apr 07, 6-7 AM (6)
Apr 07, 7-8 AM (14)
Apr 07, 8-9 AM (35)
Apr 07, 9-10 AM (38)
Apr 07, 10-11 AM (25)
Apr 07, 11-12 PM (63)
Apr 07, 12-1 PM (38)
Apr 07, 1-2 PM (56)
Apr 07, 2-3 PM (54)
Apr 07, 3-4 PM (24)
Apr 07, 4-5 PM (36)
Apr 07, 5-6 PM (19)
Apr 07, 6-7 PM (22)
Apr 07, 7-8 PM (21)
Apr 07, 8-9 PM (20)
Apr 07, 9-10 PM (16)
Apr 07, 10-11 PM (41)
Apr 07, 11-12 AM (21)
Apr 08, 12-1 AM (13)
Apr 08, 1-2 AM (6)
Apr 08, 2-3 AM (9)
Apr 08, 3-4 AM (9)
Apr 08, 4-5 AM (4)
Apr 08, 5-6 AM (21)
Apr 08, 6-7 AM (40)
Apr 08, 7-8 AM (72)
Apr 08, 8-9 AM (41)
Apr 08, 9-10 AM (24)
Apr 08, 10-11 AM (56)
Apr 08, 11-12 PM (43)
Apr 08, 12-1 PM (36)
Apr 08, 1-2 PM (64)
Apr 08, 2-3 PM (45)
Apr 08, 3-4 PM (17)
Apr 08, 4-5 PM (16)
Apr 08, 5-6 PM (17)
Apr 08, 6-7 PM (27)
Apr 08, 7-8 PM (12)
Apr 08, 8-9 PM (11)
Apr 08, 9-10 PM (6)
Apr 08, 10-11 PM (50)
Apr 08, 11-12 AM (18)
Apr 09, 12-1 AM (7)
Apr 09, 1-2 AM (5)
Apr 09, 2-3 AM (2)
Apr 09, 3-4 AM (4)
Apr 09, 4-5 AM (6)
Apr 09, 5-6 AM (15)
Apr 09, 6-7 AM (36)
Apr 09, 7-8 AM (22)
Apr 09, 8-9 AM (25)
Apr 09, 9-10 AM (33)
Apr 09, 10-11 AM (20)
Apr 09, 11-12 PM (60)
Apr 09, 12-1 PM (68)
Apr 09, 1-2 PM (43)
Apr 09, 2-3 PM (74)
Apr 09, 3-4 PM (21)
Apr 09, 4-5 PM (50)
Apr 09, 5-6 PM (26)
Apr 09, 6-7 PM (22)
Apr 09, 7-8 PM (21)
Apr 09, 8-9 PM (39)
Apr 09, 9-10 PM (18)
Apr 09, 10-11 PM (29)
Apr 09, 11-12 AM (14)
Apr 10, 12-1 AM (5)
Apr 10, 1-2 AM (4)
Apr 10, 2-3 AM (4)
Apr 10, 3-4 AM (12)
Apr 10, 4-5 AM (3)
Apr 10, 5-6 AM (9)
Apr 10, 6-7 AM (29)
Apr 10, 7-8 AM (45)
Apr 10, 8-9 AM (47)
Apr 10, 9-10 AM (19)
Apr 10, 10-11 AM (61)
Apr 10, 11-12 PM (68)
Apr 10, 12-1 PM (42)
Apr 10, 1-2 PM (14)
Apr 10, 2-3 PM (0)
3,150 commits this week Apr 03, 2026 - Apr 10, 2026
build: bump all yaci-store dependencies to 2.1.0-pre4-d358232-SNAPSHOT
Previously only the two yaci-store-assets-ext artifacts tracked the
upstream feature/asset-store-ext SNAPSHOT while the other seven
starters (spring-boot, blocks, transaction, utxo, staking, admin,
admin-ui, governance, epoch) stayed on 2.0.0. That version mismatch
triggered a runtime ClassNotFoundException for
com.bloxbean.cardano.yaci.store.core.service.SyncStatusService — the
class has been moved in 2.1.0 and the assets-ext starter transitively
pulls 2.1.0 interfaces that reference the new location, while the
other starters pulled the 2.0.0 jar where it doesn't exist.

Unify everything via the yaci-store.version property (now
2.1.0-pre4-d358232-SNAPSHOT) so the whole dependency graph resolves
against the same upstream commit.

Required code changes:
- YaciSyncHealthIndicator and YaciSyncHealthIndicatorTest: import
  SyncStatusService from core.service (not adminui.service), and
  use the new common.domain.SyncStatus record instead of the old
  adminui.dto.SyncStatusDto class. Accessor calls switch from
  getSlot() / getNetworkSlot() / getSyncPercentage() / isSynced()
  to the record accessors slot() / networkSlot() / syncPercentage()
  / synced().

Tests: yaci-indexer 63/63 pass. api module recompiles clean.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
refactor: guarantee non-null decimals + TokenQueryService interface/impl split
Main change: TokenRegistryCurrencyData.decimals is now guaranteed non-null
for every token the query service returns. TokenQueryService.mergeMetadata
seeds the builder with decimals=0 before applying CIP-26 and CIP-68 overrides,
so tokens that advertise no decimal count in either standard get the canonical
default instead of null. The @Nullable annotation on the field is replaced by
@Nonnull (picked up by Lombok's AllArgsConstructor which now enforces the
contract at build time).

Downstream consequences:
- AccountMapperUtil and TransactionMapperUtils both had a duplicated
  getDecimalsWithFallback() helper applying the same .orElse(0) default.
  Both deleted; callers inline metadata.getDecimals() directly since the
  contract now guarantees non-null.

Interface/impl split:
- TokenQueryService is now an interface in the common.service package
- The implementation moves to TokenQueryServiceImpl (fixes the earlier
  typo'd TokenQueryServiceIImpl class name across 5 files)
- @Override added on queryMetadataBatch in the impl
- TokenQueryService interface gets a Javadoc describing the contract
  (merge priority, CIP-68 prefix conversion, non-null decimals guarantee)

Defensive numeric conversion:
- applyCip26 / applyCip68 use Math.toIntExact(Long) instead of .intValue()
  when narrowing the decimals column. Silent truncation at Integer.MAX_VALUE
  is now a loud IllegalStateException — a nit that will never fire in
  practice (decimal counts are 0-18) but removes a footgun.

Tests: 78/78 pass. TokenQueryServiceTest.shouldLeaveNullDecimalsAsNull
renamed to shouldDefaultDecimalsToZeroWhenBothStandardsLackIt and asserts
equal-to-0 instead of null. TokenRegistryMapperTest.shouldHandleAllNullFields
renamed to shouldHandleAllNullableFieldsNull and seeds decimals=0 on the
builder. Several DataMapperTest and TokenRegistryMapperTest cases needed
.decimals(0) added since the builder now rejects null.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>