May 28, 11-12 PM (21)
May 28, 12-1 PM (47)
May 28, 1-2 PM (50)
May 28, 2-3 PM (23)
May 28, 3-4 PM (43)
May 28, 4-5 PM (86)
May 28, 5-6 PM (13)
May 28, 6-7 PM (31)
May 28, 7-8 PM (44)
May 28, 8-9 PM (34)
May 28, 9-10 PM (17)
May 28, 10-11 PM (36)
May 28, 11-12 AM (32)
May 29, 12-1 AM (12)
May 29, 1-2 AM (13)
May 29, 2-3 AM (4)
May 29, 3-4 AM (3)
May 29, 4-5 AM (0)
May 29, 5-6 AM (2)
May 29, 6-7 AM (5)
May 29, 7-8 AM (16)
May 29, 8-9 AM (37)
May 29, 9-10 AM (34)
May 29, 10-11 AM (69)
May 29, 11-12 PM (25)
May 29, 12-1 PM (44)
May 29, 1-2 PM (66)
May 29, 2-3 PM (61)
May 29, 3-4 PM (26)
May 29, 4-5 PM (26)
May 29, 5-6 PM (83)
May 29, 6-7 PM (11)
May 29, 7-8 PM (19)
May 29, 8-9 PM (15)
May 29, 9-10 PM (9)
May 29, 10-11 PM (27)
May 29, 11-12 AM (7)
May 30, 12-1 AM (9)
May 30, 1-2 AM (2)
May 30, 2-3 AM (1)
May 30, 3-4 AM (7)
May 30, 4-5 AM (2)
May 30, 5-6 AM (11)
May 30, 6-7 AM (0)
May 30, 7-8 AM (2)
May 30, 8-9 AM (11)
May 30, 9-10 AM (13)
May 30, 10-11 AM (10)
May 30, 11-12 PM (5)
May 30, 12-1 PM (8)
May 30, 1-2 PM (5)
May 30, 2-3 PM (18)
May 30, 3-4 PM (5)
May 30, 4-5 PM (1)
May 30, 5-6 PM (9)
May 30, 6-7 PM (9)
May 30, 7-8 PM (1)
May 30, 8-9 PM (5)
May 30, 9-10 PM (4)
May 30, 10-11 PM (27)
May 30, 11-12 AM (12)
May 31, 12-1 AM (17)
May 31, 1-2 AM (0)
May 31, 2-3 AM (1)
May 31, 3-4 AM (1)
May 31, 4-5 AM (0)
May 31, 5-6 AM (0)
May 31, 6-7 AM (7)
May 31, 7-8 AM (4)
May 31, 8-9 AM (10)
May 31, 9-10 AM (3)
May 31, 10-11 AM (4)
May 31, 11-12 PM (4)
May 31, 12-1 PM (1)
May 31, 1-2 PM (2)
May 31, 2-3 PM (24)
May 31, 3-4 PM (16)
May 31, 4-5 PM (2)
May 31, 5-6 PM (1)
May 31, 6-7 PM (2)
May 31, 7-8 PM (2)
May 31, 8-9 PM (2)
May 31, 9-10 PM (7)
May 31, 10-11 PM (25)
May 31, 11-12 AM (11)
Jun 01, 12-1 AM (14)
Jun 01, 1-2 AM (7)
Jun 01, 2-3 AM (3)
Jun 01, 3-4 AM (10)
Jun 01, 4-5 AM (13)
Jun 01, 5-6 AM (16)
Jun 01, 6-7 AM (10)
Jun 01, 7-8 AM (14)
Jun 01, 8-9 AM (46)
Jun 01, 9-10 AM (50)
Jun 01, 10-11 AM (19)
Jun 01, 11-12 PM (27)
Jun 01, 12-1 PM (49)
Jun 01, 1-2 PM (40)
Jun 01, 2-3 PM (44)
Jun 01, 3-4 PM (34)
Jun 01, 4-5 PM (54)
Jun 01, 5-6 PM (5)
Jun 01, 6-7 PM (32)
Jun 01, 7-8 PM (37)
Jun 01, 8-9 PM (9)
Jun 01, 9-10 PM (12)
Jun 01, 10-11 PM (30)
Jun 01, 11-12 AM (22)
Jun 02, 12-1 AM (13)
Jun 02, 1-2 AM (8)
Jun 02, 2-3 AM (5)
Jun 02, 3-4 AM (14)
Jun 02, 4-5 AM (10)
Jun 02, 5-6 AM (43)
Jun 02, 6-7 AM (32)
Jun 02, 7-8 AM (58)
Jun 02, 8-9 AM (65)
Jun 02, 9-10 AM (28)
Jun 02, 10-11 AM (19)
Jun 02, 11-12 PM (15)
Jun 02, 12-1 PM (47)
Jun 02, 1-2 PM (66)
Jun 02, 2-3 PM (97)
Jun 02, 3-4 PM (23)
Jun 02, 4-5 PM (15)
Jun 02, 5-6 PM (27)
Jun 02, 6-7 PM (29)
Jun 02, 7-8 PM (18)
Jun 02, 8-9 PM (9)
Jun 02, 9-10 PM (19)
Jun 02, 10-11 PM (33)
Jun 02, 11-12 AM (22)
Jun 03, 12-1 AM (13)
Jun 03, 1-2 AM (31)
Jun 03, 2-3 AM (16)
Jun 03, 3-4 AM (0)
Jun 03, 4-5 AM (7)
Jun 03, 5-6 AM (12)
Jun 03, 6-7 AM (80)
Jun 03, 7-8 AM (15)
Jun 03, 8-9 AM (24)
Jun 03, 9-10 AM (22)
Jun 03, 10-11 AM (39)
Jun 03, 11-12 PM (76)
Jun 03, 12-1 PM (93)
Jun 03, 1-2 PM (28)
Jun 03, 2-3 PM (62)
Jun 03, 3-4 PM (26)
Jun 03, 4-5 PM (24)
Jun 03, 5-6 PM (23)
Jun 03, 6-7 PM (15)
Jun 03, 7-8 PM (17)
Jun 03, 8-9 PM (16)
Jun 03, 9-10 PM (8)
Jun 03, 10-11 PM (31)
Jun 03, 11-12 AM (14)
Jun 04, 12-1 AM (12)
Jun 04, 1-2 AM (4)
Jun 04, 2-3 AM (1)
Jun 04, 3-4 AM (3)
Jun 04, 4-5 AM (1)
Jun 04, 5-6 AM (0)
Jun 04, 6-7 AM (14)
Jun 04, 7-8 AM (7)
Jun 04, 8-9 AM (10)
Jun 04, 9-10 AM (13)
Jun 04, 10-11 AM (1)
Jun 04, 11-12 PM (0)
3,484 commits this week May 28, 2026 - Jun 04, 2026
fix: coalesce expiry_threshold MAX to avoid NULL three-valued logic
If the boundary epoch has no blocks, MAX(tx.id) returns NULL and the
`expired` predicate evaluates to NULL instead of FALSE, which silently
drops every row from BOTH `expired=true` and `expired=false` filter
results. COALESCE to 0 so the predicate is always a real boolean and
the "fails open" comment in the file is actually true.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Trim Leios fetch loop and block BlockFetch on staged CertRBs
Two related fixes to the issue-#890 staging plumbing:

* Drop the per-tick LeiosDb.leiosDbQueryFetchWork call from the fetch
  loop. Its own API doc declared it startup-only (O(|leios.db|)). The
  synth pipeline now only derives missing EB *body* entries +
  per-peer offerings from the staging snapshot — no DB scan, no
  tx-closure synth, no strip dance. Gated on Map.null stagedNow so
  the synth block is skipped entirely in steady state, and the
  remaining synth is short-circuited against outstanding's
  acquiredEbBodies to avoid the per-tick re-add+filter round-trip.

  Restart recovery of partial tx closures (the case
  leiosDbQueryFetchWork was working around) is deferred to a
  follow-up that primes LeiosOutstanding from the DB once at
  MVar creation. Sketch in leios-fetch-loop-sketch.md (local).

* Block the BlockFetch client thread inside the staging gate until
  the drain releases the entry, instead of returning a synthetic
  AddBlockPromise that lied about blockWrittenToDisk. The previous
  approach + the getIsFetched widening together did not suppress
  BlockFetch's redecision, causing each staged CertRB to be
  re-fetched many times during the staging window. In iosim runs
  the resulting decision-loop spin was the dominant retainer of
  SimTrace state and made prop_leios_late_join OOM at numSlots=200.

  After this change, prop_leios_late_join @ numSlots=200 runs in
  ~52s at 134 MB peak residency (was 119s, OOM at 4 GB cap).
  Restoring numSlots=200 in the test.

  Cost: head-of-line blocking on the affected peer's BlockFetch
  pipeline for the closure-fetch duration. The closure fetch runs
  on a separate LeiosFetch channel so progress is not deadlocked.
  Caveat: a peer set that empties before the closure arrives would
  leak the parked client thread — see PR open point #4 (no GC of
  staged entries); the GC pass needs to wake parked threads with a
  FailedToAddBlock verdict before evicting an entry.
feat(mithril-stm): implement halo2 IVC prover input preparation
Add prepare_prover_input() to RollingState, executing 8 off-circuit steps:
1. SHA256 hash of protocol-message preimage to base-field element
2. Epoch classification (genesis / same-epoch / next-epoch)
3. Certificate accumulator: verify SNARK proof, extract DualMSM, collapse
4. Genesis signature: carry from rolling state unchanged
5. Witness construction: package genesis sig, merkle root, cert message, preimage
6. Chain state advancement: apply transition rules for msg, merkle root, params
7. Self-proof accumulator: trivial at genesis, verify previous IVC proof otherwise
8. Accumulator folding: combine [chain_acc, cert_acc, self_acc] and collapse

Genesis step special-casing: skips certificate proof verification and returns
a trivial accumulator from folding to match in-circuit scale_by_bit behavior.
Includes epoch validation (must be current or next), step counter overflow
protection via checked_add(), and typed error variants for all failure modes.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
feat(mithril-stm): add poseidon off-circuit verifier for halo2 IVC proofs
Add verify_and_prepare_poseidon() to CertificateProof: verifies a PLONK proof
using a Poseidon transcript off-circuit and returns a DualMSM for downstream
accumulator folding. Accepts a raw VerifyingKey (matching IvcSetup storage
format) with a cheap pairing check for early abort and an empty transcript
assertion.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
feat(mithril-stm): add IVC infrastructure — types, errors, and epoch data accessors
- Remove #[cfg(test)] gates from StepCounter::as_u64(), CertificateProofBytes::as_bytes(),
  and IvcProofBytes::as_bytes() so they are available in production code
- Add StepCounter::as_u64() explicit implementation for state transition arithmetic
- Add new error variants: IvcProofRejected, StepCounterOverflow, InvalidEpoch
- Refactor EpochData to store epoch as raw u64 and expose typed accessors:
  current_epoch() -> BaseFieldElement, epoch_number() -> EpochNumber,
  next_merkle_tree_commitment(), next_protocol_parameters_hash()
- Add cert_proof field to IvcProverInput struct (required by IVC circuit downstream)

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
feat: extend /governance/dreps with status, voting power, metadata + new query params
Augments the paginated /governance/dreps response so wallets can render and rank
DReps without a follow-up call per row. Each DRep now also returns has_script,
amount, retired, expired, last_active_epoch, and an embedded metadata object
matching the shape of /dreps/{drep_id}/metadata. Deprecated fields (active,
active_epoch) are intentionally omitted from this enriched response.

New query parameters:
- order_by=amount  (in addition to existing order=asc|desc)
- retired=true|false
- expired=true|false

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
cardano-node: discard local JSON instances; restore original output and
config parsing

Replace locally-defined orphan `ToJSON`/`FromJSON` instances that
already exist in `Cardano.Network.OrphanInstances` (from the
`cardano-diffusion:orphan-instances` sublibrary) with imports of that
module:

- `TopologyP2P`: remove `FromJSON/ToJSON PeerTrustable`,
  `FromJSON/ToJSON (NetworkTopology UseBootstrapPeers PeerTrustable)`,
  and `FromJSON UseBootstrapPeers`; add `Cardano.Network.OrphanInstances ()`
  and `Ouroboros.Network.OrphanInstances ()` imports.

- `StateRep`: remove local `ToJSON/FromJSON NodeToNodeVersion`,
  `ToJSON/FromJSON NodeToClientVersion`, and `parseBoundedEnum`; add
  `Cardano.Network.OrphanInstances ()` import.

- `Tracers`: remove Show-based `ToJSON NodeToNodeVersionData` and
  `ToJSON NodeToClientVersionData` stubs; add
  `Cardano.Network.OrphanInstances ()` import.

Additionally fix two pre-existing issues in `Consensus.hs`:

- `deltaq`: use `toJSON gsv` (structured JSON via
  `Ouroboros.Network.OrphanInstances`) instead of `String . show`.

- `TraceDecisionEvent`: restore the `dtal >= DMaximum` conditional
  branch (replacing the reversed fold), using `forMachine DMaximum`
  for the verbose case.

In `Startup.hs`, fix `ConsensusNetworkVersionTuple` to emit proper
structured JSON for `nodeToClientVersion`/`nodeToNodeVersion` via
`ToJSON` from `Cardano.Network.OrphanInstances`, and fix the
`maxNodeToNode/ClientVersion` field to show only the version key
rather than the full `(key, value)` pair.
build(deps): bump protobufjs in /bench/grafana-datasource
Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 7.5.6 to 7.6.2.
- [Release notes](https://github.com/protobufjs/protobuf.js/releases)
- [Changelog](https://github.com/protobufjs/protobuf.js/blob/protobufjs-v7.6.2/CHANGELOG.md)
- [Commits](https://github.com/protobufjs/protobuf.js/compare/protobufjs-v7.5.6...protobufjs-v7.6.2)

---
updated-dependencies:
- dependency-name: protobufjs
  dependency-version: 7.6.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>