Jun 05, 9-10 PM (2)
Jun 05, 10-11 PM (20)
Jun 05, 11-12 AM (9)
Jun 06, 12-1 AM (6)
Jun 06, 1-2 AM (0)
Jun 06, 2-3 AM (3)
Jun 06, 3-4 AM (4)
Jun 06, 4-5 AM (0)
Jun 06, 5-6 AM (24)
Jun 06, 6-7 AM (1)
Jun 06, 7-8 AM (2)
Jun 06, 8-9 AM (3)
Jun 06, 9-10 AM (0)
Jun 06, 10-11 AM (3)
Jun 06, 11-12 PM (6)
Jun 06, 12-1 PM (2)
Jun 06, 1-2 PM (2)
Jun 06, 2-3 PM (2)
Jun 06, 3-4 PM (18)
Jun 06, 4-5 PM (1)
Jun 06, 5-6 PM (6)
Jun 06, 6-7 PM (0)
Jun 06, 7-8 PM (6)
Jun 06, 8-9 PM (0)
Jun 06, 9-10 PM (1)
Jun 06, 10-11 PM (27)
Jun 06, 11-12 AM (9)
Jun 07, 12-1 AM (14)
Jun 07, 1-2 AM (2)
Jun 07, 2-3 AM (0)
Jun 07, 3-4 AM (0)
Jun 07, 4-5 AM (1)
Jun 07, 5-6 AM (1)
Jun 07, 6-7 AM (3)
Jun 07, 7-8 AM (0)
Jun 07, 8-9 AM (0)
Jun 07, 9-10 AM (1)
Jun 07, 10-11 AM (2)
Jun 07, 11-12 PM (2)
Jun 07, 12-1 PM (5)
Jun 07, 1-2 PM (35)
Jun 07, 2-3 PM (2)
Jun 07, 3-4 PM (4)
Jun 07, 4-5 PM (2)
Jun 07, 5-6 PM (4)
Jun 07, 6-7 PM (0)
Jun 07, 7-8 PM (0)
Jun 07, 8-9 PM (17)
Jun 07, 9-10 PM (1)
Jun 07, 10-11 PM (21)
Jun 07, 11-12 AM (9)
Jun 08, 12-1 AM (9)
Jun 08, 1-2 AM (5)
Jun 08, 2-3 AM (3)
Jun 08, 3-4 AM (4)
Jun 08, 4-5 AM (2)
Jun 08, 5-6 AM (9)
Jun 08, 6-7 AM (5)
Jun 08, 7-8 AM (25)
Jun 08, 8-9 AM (36)
Jun 08, 9-10 AM (41)
Jun 08, 10-11 AM (24)
Jun 08, 11-12 PM (22)
Jun 08, 12-1 PM (40)
Jun 08, 1-2 PM (48)
Jun 08, 2-3 PM (33)
Jun 08, 3-4 PM (27)
Jun 08, 4-5 PM (12)
Jun 08, 5-6 PM (23)
Jun 08, 6-7 PM (14)
Jun 08, 7-8 PM (3)
Jun 08, 8-9 PM (6)
Jun 08, 9-10 PM (19)
Jun 08, 10-11 PM (29)
Jun 08, 11-12 AM (8)
Jun 09, 12-1 AM (5)
Jun 09, 1-2 AM (3)
Jun 09, 2-3 AM (1)
Jun 09, 3-4 AM (3)
Jun 09, 4-5 AM (26)
Jun 09, 5-6 AM (5)
Jun 09, 6-7 AM (23)
Jun 09, 7-8 AM (51)
Jun 09, 8-9 AM (35)
Jun 09, 9-10 AM (45)
Jun 09, 10-11 AM (51)
Jun 09, 11-12 PM (46)
Jun 09, 12-1 PM (86)
Jun 09, 1-2 PM (84)
Jun 09, 2-3 PM (36)
Jun 09, 3-4 PM (38)
Jun 09, 4-5 PM (16)
Jun 09, 5-6 PM (18)
Jun 09, 6-7 PM (18)
Jun 09, 7-8 PM (19)
Jun 09, 8-9 PM (16)
Jun 09, 9-10 PM (16)
Jun 09, 10-11 PM (28)
Jun 09, 11-12 AM (10)
Jun 10, 12-1 AM (11)
Jun 10, 1-2 AM (16)
Jun 10, 2-3 AM (11)
Jun 10, 3-4 AM (19)
Jun 10, 4-5 AM (5)
Jun 10, 5-6 AM (2)
Jun 10, 6-7 AM (46)
Jun 10, 7-8 AM (82)
Jun 10, 8-9 AM (18)
Jun 10, 9-10 AM (59)
Jun 10, 10-11 AM (46)
Jun 10, 11-12 PM (134)
Jun 10, 12-1 PM (49)
Jun 10, 1-2 PM (33)
Jun 10, 2-3 PM (32)
Jun 10, 3-4 PM (28)
Jun 10, 4-5 PM (36)
Jun 10, 5-6 PM (12)
Jun 10, 6-7 PM (12)
Jun 10, 7-8 PM (38)
Jun 10, 8-9 PM (11)
Jun 10, 9-10 PM (9)
Jun 10, 10-11 PM (20)
Jun 10, 11-12 AM (7)
Jun 11, 12-1 AM (10)
Jun 11, 1-2 AM (2)
Jun 11, 2-3 AM (0)
Jun 11, 3-4 AM (2)
Jun 11, 4-5 AM (8)
Jun 11, 5-6 AM (12)
Jun 11, 6-7 AM (34)
Jun 11, 7-8 AM (106)
Jun 11, 8-9 AM (36)
Jun 11, 9-10 AM (20)
Jun 11, 10-11 AM (105)
Jun 11, 11-12 PM (25)
Jun 11, 12-1 PM (38)
Jun 11, 1-2 PM (37)
Jun 11, 2-3 PM (14)
Jun 11, 3-4 PM (20)
Jun 11, 4-5 PM (5)
Jun 11, 5-6 PM (7)
Jun 11, 6-7 PM (26)
Jun 11, 7-8 PM (90)
Jun 11, 8-9 PM (11)
Jun 11, 9-10 PM (5)
Jun 11, 10-11 PM (25)
Jun 11, 11-12 AM (5)
Jun 12, 12-1 AM (8)
Jun 12, 1-2 AM (2)
Jun 12, 2-3 AM (2)
Jun 12, 3-4 AM (4)
Jun 12, 4-5 AM (7)
Jun 12, 5-6 AM (15)
Jun 12, 6-7 AM (46)
Jun 12, 7-8 AM (19)
Jun 12, 8-9 AM (28)
Jun 12, 9-10 AM (22)
Jun 12, 10-11 AM (29)
Jun 12, 11-12 PM (42)
Jun 12, 12-1 PM (24)
Jun 12, 1-2 PM (26)
Jun 12, 2-3 PM (22)
Jun 12, 3-4 PM (38)
Jun 12, 4-5 PM (23)
Jun 12, 5-6 PM (18)
Jun 12, 6-7 PM (26)
Jun 12, 7-8 PM (11)
Jun 12, 8-9 PM (15)
Jun 12, 9-10 PM (0)
3,215 commits this week Jun 05, 2026 - Jun 12, 2026
fix(ledger): guard against nil DReps in GetDRepState
Defensively skip nil entries when building the GetDRepState result so the
dereferences (drep.Credential, drep.ExpiryEpoch) can't panic. The current
contracts already prevent nil — Database.GetDrep returns ErrDrepNotFound
rather than (nil, nil), and GetActiveDreps yields no nil entries — but the
guard covers both the filtered and all-DReps paths at the dereference site
and is robust to future contract changes.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
fix(ledger): guard currentPParams read with RLock in drepDeposit
drepDeposit read ls.currentPParams without the read lock, racing concurrent
ledger updates during local-state-query handling. Take ls.RLock() like the
other currentPParams readers; the sole caller (queryShelleyDRepState) does
not hold the lock, so there is no double-acquire.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
feat(ledger): implement GetAccountState local-state-query
The final ledger-state query cardano-cli issues while balancing a
transaction. Return the chain's treasury and reserves pots (from the network
state) wrapped in the single-element result array, so the wire shape is
[ [treasury, reserves] ], matching cardano-node. Values are signed because
Coin is an Integer in the ledger.

With this, GetStakePools + GetDRepState + GetAccountState cover the full
query set cardano-cli sends, and `cardano-cli conway transaction build`
completes against Dingo, producing a valid Tx ConwayEra (verified on a Conway
devnet with cardano-cli 11.0.0.0).

Depends on the gouroboros GetAccountState query type; requires a gouroboros
release and a go.mod bump before this builds in CI.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
feat(ledger): implement GetDRepState local-state-query
The second ledger-state query cardano-cli issues while balancing a
transaction (after GetStakePools). Like the others, leaving it unhandled
tore down the local-state-query connection.

Return the registration state of the requested DReps — or of all DReps when
the credential set is empty (matching the Haskell ledger's "empty means
all") — as a map of stake credential -> {expiry epoch, optional anchor,
deposit}, wrapped in the single-element result array cardano-cli expects.
The wire shape was verified against cardano-node: an empty result is the
CBOR `81 a0` ([ {} ]) — note gouroboros' own DRepStateResult client type
omits that wrapper, so cardano-node's bytes are the reference, not the type.

Verified with cardano-cli 11.0.0.0 against the Conway devnet:
`query drep-state --all-dreps` now returns `[]`, matching cardano-node, and
`transaction build` progresses past GetDRepState.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
feat(ledger): implement GetStakePools local-state-query
cardano-cli issues the GetStakePools ledger-state query while balancing a
transaction (e.g. `transaction build`). Dingo did not handle it, so the
query returned an "unsupported query type" error, which tears down the
local-state-query connection — the client sees
`BearerClosed "<socket: 11> closed when reading data"`.

Implement the query: return the key hashes of the currently active
(registered, non-retired) stake pools as a CBOR set (tag 258) of pool IDs.
cardano-cli is strict about the encoding — a plain (untagged) array fails to
decode with "expected tag", and an unsorted set fails with "Canonicity
violation while decoding Set" — so the IDs are emitted in ascending
canonical byte order, wrapped in the single-element result array the
query's result type decodes from.

Adds a Database.GetActivePoolKeyHashes wrapper over the existing metadata
store method. Verified end-to-end against a Conway devnet with cardano-cli
11.0.0.0: `query stake-pools` now returns the pool set and decodes
successfully, matching cardano-node.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
chore(deps): bump gouroboros to v0.183.0 and ouroboros-mock to v0.13.0 (#2550)
v0.183.0 removes leios as a ledger era: the endorser-block types
(LeiosEndorserBlock, LeiosTransactionReference,
NewLeiosEndorserBlockFromCbor) moved from ledger/leios to ledger/common,
and the leios era id and its block/tx/header type constants were dropped.

- Repoint the three endorser-block usages in ouroboros/leios_merged.go and
  ledger/forging/forger.go to ledger/common (types unchanged).
- Update the nonce-stability-window era-dispatch test to use Dijkstra — the
  real post-Conway Praos era that production already enumerates — as the
  4k/f regression guard in place of the removed Leios era.
- Bump ouroboros-mock to v0.13.0, which renames its Dijkstra-era fixture
  decoders off the removed leios constants; v0.12.0 fails to compile against
  gouroboros v0.183.0.

No production behavior change; the endorser-block CBOR and the post-Conway
4k/f window are unchanged.

Signed-off-by: Chris Guiney <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
ci(e2e): add u5c (utxorpc) legs for mainnet/preprod/preview
Move the manual tmp_u5c_test checks into the streamlined e2e suite as three
`kind: u5c` legs against the Demeter utxorpc endpoints. Converts the old
time-bounded run.sh approach to the standard exit-code gate via a WorkStats
finalization policy (3 blocks → exit 0); a #921-style regression (reset loop,
no apply events) never finalizes → timeout → fail.

API keys are parameterized as ${DMTR_UTXORPC_KEY_*} (resolved by envsubst from
GitHub secrets) rather than hardcoded — the scratch files held real-looking
keys and this repo is public. The e2e image is built --all-features, so U5C is
available (and now TLS-safe per the preceding crypto-provider fix).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix: install default rustls CryptoProvider for the u5c TLS path
The U5C source connects over TLS via tonic/rustls. In builds that pull more
than one rustls crypto provider (e.g. the `aws` feature brings in aws-lc-rs
alongside ring), rustls has no process-default provider and panics on the
first TLS handshake (`no process-level CryptoProvider available`). Install the
ring provider once at startup, gated on the `u5c` feature.

This only surfaced now because nothing exercised U5C in a multi-provider build;
the manual u5c tests built `--features u5c` alone (single provider).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
chore(deps): bump gouroboros to v0.183.0 and ouroboros-mock to v0.13.0
v0.183.0 removes leios as a ledger era: the endorser-block types
(LeiosEndorserBlock, LeiosTransactionReference,
NewLeiosEndorserBlockFromCbor) moved from ledger/leios to ledger/common,
and the leios era id and its block/tx/header type constants were dropped.

- Repoint the three endorser-block usages in ouroboros/leios_merged.go and
  ledger/forging/forger.go to ledger/common (types unchanged).
- Update the nonce-stability-window era-dispatch test to use Dijkstra — the
  real post-Conway Praos era that production already enumerates — as the
  4k/f regression guard in place of the removed Leios era.
- Bump ouroboros-mock to v0.13.0, which renames its Dijkstra-era fixture
  decoders off the removed leios constants; v0.12.0 fails to compile against
  gouroboros v0.183.0.

No production behavior change; the endorser-block CBOR and the post-Conway
4k/f window are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Signed-off-by: Chris Guiney <[email protected]>
chore(deps): bump gouroboros to v0.183.0 (#215)
v0.183.0 removes leios as a ledger era and renames the Dijkstra era's
block/tx/header type constants accordingly. Update the fixture era decoders
to the new names: BlockTypeLeiosRanking -> BlockTypeDijkstra, TxTypeLeios ->
TxTypeDijkstra, BlockHeaderTypeLeios -> BlockHeaderTypeDijkstra (the
"dijkstra" era cases). No behavior change.

Signed-off-by: Chris Guiney <[email protected]>
Co-authored-by: Claude Opus 4.8 (1M context) <[email protected]>
ci(e2e): map Demeter relays per network
The three relay.cnode-m1.demeter.run endpoints are different networks, not
redundant mainnet relays:
  :3000 = Mainnet, :3001 = PreProd, :3002 = Preview

Point the mainnet legs at :3000 (only) and the preview n2n legs at :3002,
replacing the public preview relay. (:3001/PreProd is unused — no preprod legs.)

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