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 (22)
Apr 09, 4-5 PM (51)
Apr 09, 5-6 PM (26)
Apr 09, 6-7 PM (23)
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 (15)
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 (30)
Apr 10, 7-8 AM (46)
Apr 10, 8-9 AM (47)
Apr 10, 9-10 AM (20)
Apr 10, 10-11 AM (61)
Apr 10, 11-12 PM (70)
Apr 10, 12-1 PM (46)
Apr 10, 1-2 PM (24)
Apr 10, 2-3 PM (36)
Apr 10, 3-4 PM (33)
Apr 10, 4-5 PM (38)
Apr 10, 5-6 PM (30)
Apr 10, 6-7 PM (11)
Apr 10, 7-8 PM (13)
Apr 10, 8-9 PM (7)
Apr 10, 9-10 PM (25)
Apr 10, 10-11 PM (47)
Apr 10, 11-12 AM (18)
Apr 11, 12-1 AM (6)
Apr 11, 1-2 AM (4)
Apr 11, 2-3 AM (2)
Apr 11, 3-4 AM (0)
Apr 11, 4-5 AM (8)
Apr 11, 5-6 AM (4)
Apr 11, 6-7 AM (5)
Apr 11, 7-8 AM (7)
Apr 11, 8-9 AM (3)
Apr 11, 9-10 AM (0)
Apr 11, 10-11 AM (10)
Apr 11, 11-12 PM (4)
Apr 11, 12-1 PM (7)
Apr 11, 1-2 PM (3)
Apr 11, 2-3 PM (7)
Apr 11, 3-4 PM (12)
Apr 11, 4-5 PM (18)
Apr 11, 5-6 PM (39)
Apr 11, 6-7 PM (0)
Apr 11, 7-8 PM (0)
Apr 11, 8-9 PM (2)
Apr 11, 9-10 PM (1)
Apr 11, 10-11 PM (19)
Apr 11, 11-12 AM (23)
Apr 12, 12-1 AM (4)
Apr 12, 1-2 AM (1)
Apr 12, 2-3 AM (9)
Apr 12, 3-4 AM (2)
Apr 12, 4-5 AM (0)
Apr 12, 5-6 AM (2)
Apr 12, 6-7 AM (2)
Apr 12, 7-8 AM (1)
Apr 12, 8-9 AM (3)
Apr 12, 9-10 AM (2)
Apr 12, 10-11 AM (11)
Apr 12, 11-12 PM (4)
Apr 12, 12-1 PM (1)
Apr 12, 1-2 PM (10)
Apr 12, 2-3 PM (24)
Apr 12, 3-4 PM (7)
Apr 12, 4-5 PM (7)
Apr 12, 5-6 PM (17)
Apr 12, 6-7 PM (2)
Apr 12, 7-8 PM (1)
Apr 12, 8-9 PM (8)
Apr 12, 9-10 PM (9)
Apr 12, 10-11 PM (38)
Apr 12, 11-12 AM (23)
Apr 13, 12-1 AM (5)
Apr 13, 1-2 AM (6)
Apr 13, 2-3 AM (5)
Apr 13, 3-4 AM (6)
Apr 13, 4-5 AM (2)
Apr 13, 5-6 AM (18)
Apr 13, 6-7 AM (23)
Apr 13, 7-8 AM (39)
Apr 13, 8-9 AM (43)
Apr 13, 9-10 AM (51)
Apr 13, 10-11 AM (75)
Apr 13, 11-12 PM (35)
Apr 13, 12-1 PM (55)
Apr 13, 1-2 PM (80)
Apr 13, 2-3 PM (42)
Apr 13, 3-4 PM (20)
Apr 13, 4-5 PM (31)
Apr 13, 5-6 PM (25)
Apr 13, 6-7 PM (18)
Apr 13, 7-8 PM (13)
Apr 13, 8-9 PM (15)
Apr 13, 9-10 PM (22)
Apr 13, 10-11 PM (29)
Apr 13, 11-12 AM (13)
Apr 14, 12-1 AM (6)
Apr 14, 1-2 AM (8)
Apr 14, 2-3 AM (15)
Apr 14, 3-4 AM (4)
Apr 14, 4-5 AM (4)
Apr 14, 5-6 AM (63)
Apr 14, 6-7 AM (50)
Apr 14, 7-8 AM (100)
Apr 14, 8-9 AM (33)
Apr 14, 9-10 AM (21)
Apr 14, 10-11 AM (34)
Apr 14, 11-12 PM (42)
Apr 14, 12-1 PM (72)
Apr 14, 1-2 PM (96)
Apr 14, 2-3 PM (44)
Apr 14, 3-4 PM (35)
Apr 14, 4-5 PM (9)
Apr 14, 5-6 PM (20)
Apr 14, 6-7 PM (22)
Apr 14, 7-8 PM (14)
Apr 14, 8-9 PM (10)
Apr 14, 9-10 PM (11)
Apr 14, 10-11 PM (24)
Apr 14, 11-12 AM (24)
Apr 15, 12-1 AM (3)
Apr 15, 1-2 AM (9)
Apr 15, 2-3 AM (8)
Apr 15, 3-4 AM (1)
Apr 15, 4-5 AM (1)
Apr 15, 5-6 AM (32)
Apr 15, 6-7 AM (6)
Apr 15, 7-8 AM (18)
Apr 15, 8-9 AM (46)
Apr 15, 9-10 AM (39)
Apr 15, 10-11 AM (125)
Apr 15, 11-12 PM (53)
Apr 15, 12-1 PM (58)
Apr 15, 1-2 PM (43)
Apr 15, 2-3 PM (45)
Apr 15, 3-4 PM (28)
Apr 15, 4-5 PM (43)
Apr 15, 5-6 PM (21)
Apr 15, 6-7 PM (33)
Apr 15, 7-8 PM (15)
Apr 15, 8-9 PM (17)
Apr 15, 9-10 PM (5)
Apr 15, 10-11 PM (20)
Apr 15, 11-12 AM (16)
Apr 16, 12-1 AM (12)
Apr 16, 1-2 AM (6)
Apr 16, 2-3 AM (7)
Apr 16, 3-4 AM (3)
Apr 16, 4-5 AM (4)
Apr 16, 5-6 AM (8)
Apr 16, 6-7 AM (33)
Apr 16, 7-8 AM (26)
Apr 16, 8-9 AM (27)
Apr 16, 9-10 AM (23)
Apr 16, 10-11 AM (31)
Apr 16, 11-12 PM (3)
3,785 commits this week Apr 09, 2026 - Apr 16, 2026
refactor: move TOKEN_REGISTRY_ENABLED to serialization, always serve decimals
Client feedback: on most Rosetta chains decimals is a native, mandatory
field on every asset — and on Cardano we need to enrich it via assets-ext
even when the rest of the token-registry metadata isn't exposed. So the
flag shouldn't gate DB access; it should gate only the extra enrichment
fields in currency.metadata.

New wire contract:
- currency.decimals              — always populated (CIP-26/CIP-68 value or 0 fallback)
- currency.metadata.policyId     — always populated
- currency.metadata.{subject,name,description,ticker,url,logo,version}
                                 — only when TOKEN_REGISTRY_ENABLED=true

Code changes:
- TokenQueryServiceImpl drops the enabled short-circuit and always
  queries the assets-ext tables; mergeMetadata seeds decimals=0 and
  always populates policyId + subject.
- TokenRegistryCurrencyData.decimals back to @Nonnull Integer.
- AccountMapperUtil / TransactionMapperUtils drop the
  getDecimalsWithFallback helper and inline metadata.getDecimals().
- DataMapper injects TOKEN_REGISTRY_ENABLED; when false it emits a
  policyId-only CurrencyMetadataResponse, when true it delegates to
  TokenRegistryMapper for the full mapping. Decimals continues to flow
  to CurrencyResponse.decimals unconditionally.

Tests:
- DataMapperTest gains a TokenRegistryEnabledFlagTests nested class
  covering both flag states and null-metadata input.
- AccountMapperUtilTest and TransactionMapperUtilsTest flip the flag on
  at construction since they assert on enrichment fields.
- TokenQueryServiceTest drops the RegistryEnabledFlagTests class and
  updates the 'nothing found' assertions to match the new contract
  (subject populated, decimals=0).

Env and docs:
- New .env.docker-compose-preview (NETWORK=preview, PROTOCOL_MAGIC=2,
  enrichment + logos on). Allow-listed in .gitignore.
- token-metadata.md rewritten to separate 'decimals always' from
  'enrichment gated'; per-network defaults table (mainnet off,
  preprod/preview on).
- env-vars.md, helm-values.md, kubernetes/deployment.md updated to
  reflect the new semantics.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
ci: add file hygiene workflow, lint configuration, and Gradle lintText
- .github/workflows/file-hygiene.yml: caller for reusable lint workflow
- .editorconfig: canonical baseline prepended to existing ktlint rules
  (indent_size = 4 for *.{kt,kts} to match existing code style)
- .gitattributes: LF normalization for text files, binary rules
- .markdownlint.yml, .markdownlint-cli2.yaml: markdownlint config
- .yamllint.yml: yamllint config with relaxations
- .shellcheckrc: suppress SC2034/SC3045 for generated gradlew
- build.gradle.kts: add lintText and lintTextFix Gradle tasks via npx
- Remove .markdownlint.json (superseded by .markdownlint.yml)

Refs: hyperledger-identus/hyperledger-identus#172

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Signed-off-by: Yurii Shynbuiev <[email protected]>
feat: working nix build for cage library, tests, and vectors
- Pin haskellNix/CHaP/iohkNix to revisions matching offchain
- Add ouroboros-consensus <0.28 constraint for cardano-node-clients fdf6fe1
- Add fix-libs module for cardano-crypto-praos/class
- Fix missing cardano-strict-containers dep, ProofStep import
- Add LICENSE file, fix license-file path in cabal

Verified: nix build .#cage-lib, .#cage-tests, .#cage-test-vectors
all succeed.
Fix BlockBody serialization and add DecCBOR instance
- Fix PerasCert to encode/decode as bytes (matching CDDL nil / VBytes)
- Use encodeNullStrictMaybe/decodeNullStrictMaybe for optional peras_certificate
- Handle both definite and indefinite length lists in BlockBody decoder
- Add index range validation in BlockBody decoder (matching Alonzo)
- Add DecCBOR instances for DijkstraBlockBodyRaw and DijkstraBlockBody in testlib
- Add NFData and EncCBOR deriving for DijkstraBlockBody newtype
- Export DijkstraBlockBodyRaw and MkDijkstraBlockBody from Internal module
- xdescribe block_body CDDL round-trip tests (invalid_transactions indices)