May 13, 8-9 PM (9)
May 13, 9-10 PM (24)
May 13, 10-11 PM (30)
May 13, 11-12 AM (11)
May 14, 12-1 AM (18)
May 14, 1-2 AM (3)
May 14, 2-3 AM (4)
May 14, 3-4 AM (21)
May 14, 4-5 AM (11)
May 14, 5-6 AM (18)
May 14, 6-7 AM (18)
May 14, 7-8 AM (47)
May 14, 8-9 AM (53)
May 14, 9-10 AM (35)
May 14, 10-11 AM (20)
May 14, 11-12 PM (114)
May 14, 12-1 PM (54)
May 14, 1-2 PM (151)
May 14, 2-3 PM (32)
May 14, 3-4 PM (17)
May 14, 4-5 PM (14)
May 14, 5-6 PM (38)
May 14, 6-7 PM (12)
May 14, 7-8 PM (22)
May 14, 8-9 PM (37)
May 14, 9-10 PM (35)
May 14, 10-11 PM (27)
May 14, 11-12 AM (14)
May 15, 12-1 AM (18)
May 15, 1-2 AM (15)
May 15, 2-3 AM (5)
May 15, 3-4 AM (3)
May 15, 4-5 AM (13)
May 15, 5-6 AM (14)
May 15, 6-7 AM (10)
May 15, 7-8 AM (31)
May 15, 8-9 AM (23)
May 15, 9-10 AM (52)
May 15, 10-11 AM (71)
May 15, 11-12 PM (70)
May 15, 12-1 PM (73)
May 15, 1-2 PM (73)
May 15, 2-3 PM (66)
May 15, 3-4 PM (26)
May 15, 4-5 PM (13)
May 15, 5-6 PM (30)
May 15, 6-7 PM (29)
May 15, 7-8 PM (25)
May 15, 8-9 PM (8)
May 15, 9-10 PM (34)
May 15, 10-11 PM (34)
May 15, 11-12 AM (25)
May 16, 12-1 AM (2)
May 16, 1-2 AM (2)
May 16, 2-3 AM (3)
May 16, 3-4 AM (3)
May 16, 4-5 AM (0)
May 16, 5-6 AM (6)
May 16, 6-7 AM (2)
May 16, 7-8 AM (10)
May 16, 8-9 AM (1)
May 16, 9-10 AM (2)
May 16, 10-11 AM (1)
May 16, 11-12 PM (13)
May 16, 12-1 PM (11)
May 16, 1-2 PM (8)
May 16, 2-3 PM (15)
May 16, 3-4 PM (10)
May 16, 4-5 PM (2)
May 16, 5-6 PM (2)
May 16, 6-7 PM (2)
May 16, 7-8 PM (10)
May 16, 8-9 PM (6)
May 16, 9-10 PM (9)
May 16, 10-11 PM (29)
May 16, 11-12 AM (42)
May 17, 12-1 AM (9)
May 17, 1-2 AM (1)
May 17, 2-3 AM (0)
May 17, 3-4 AM (1)
May 17, 4-5 AM (0)
May 17, 5-6 AM (3)
May 17, 6-7 AM (2)
May 17, 7-8 AM (1)
May 17, 8-9 AM (1)
May 17, 9-10 AM (1)
May 17, 10-11 AM (6)
May 17, 11-12 PM (6)
May 17, 12-1 PM (4)
May 17, 1-2 PM (5)
May 17, 2-3 PM (9)
May 17, 3-4 PM (4)
May 17, 4-5 PM (8)
May 17, 5-6 PM (14)
May 17, 6-7 PM (10)
May 17, 7-8 PM (2)
May 17, 8-9 PM (4)
May 17, 9-10 PM (2)
May 17, 10-11 PM (20)
May 17, 11-12 AM (13)
May 18, 12-1 AM (10)
May 18, 1-2 AM (4)
May 18, 2-3 AM (5)
May 18, 3-4 AM (9)
May 18, 4-5 AM (14)
May 18, 5-6 AM (2)
May 18, 6-7 AM (37)
May 18, 7-8 AM (28)
May 18, 8-9 AM (35)
May 18, 9-10 AM (41)
May 18, 10-11 AM (43)
May 18, 11-12 PM (29)
May 18, 12-1 PM (136)
May 18, 1-2 PM (34)
May 18, 2-3 PM (89)
May 18, 3-4 PM (33)
May 18, 4-5 PM (45)
May 18, 5-6 PM (21)
May 18, 6-7 PM (16)
May 18, 7-8 PM (13)
May 18, 8-9 PM (23)
May 18, 9-10 PM (4)
May 18, 10-11 PM (25)
May 18, 11-12 AM (12)
May 19, 12-1 AM (7)
May 19, 1-2 AM (2)
May 19, 2-3 AM (9)
May 19, 3-4 AM (5)
May 19, 4-5 AM (10)
May 19, 5-6 AM (3)
May 19, 6-7 AM (53)
May 19, 7-8 AM (23)
May 19, 8-9 AM (46)
May 19, 9-10 AM (66)
May 19, 10-11 AM (30)
May 19, 11-12 PM (48)
May 19, 12-1 PM (81)
May 19, 1-2 PM (71)
May 19, 2-3 PM (41)
May 19, 3-4 PM (51)
May 19, 4-5 PM (15)
May 19, 5-6 PM (20)
May 19, 6-7 PM (18)
May 19, 7-8 PM (9)
May 19, 8-9 PM (21)
May 19, 9-10 PM (10)
May 19, 10-11 PM (28)
May 19, 11-12 AM (13)
May 20, 12-1 AM (21)
May 20, 1-2 AM (9)
May 20, 2-3 AM (4)
May 20, 3-4 AM (5)
May 20, 4-5 AM (9)
May 20, 5-6 AM (37)
May 20, 6-7 AM (47)
May 20, 7-8 AM (53)
May 20, 8-9 AM (50)
May 20, 9-10 AM (16)
May 20, 10-11 AM (40)
May 20, 11-12 PM (28)
May 20, 12-1 PM (50)
May 20, 1-2 PM (92)
May 20, 2-3 PM (19)
May 20, 3-4 PM (326)
May 20, 4-5 PM (23)
May 20, 5-6 PM (22)
May 20, 6-7 PM (17)
May 20, 7-8 PM (21)
May 20, 8-9 PM (4)
4,241 commits this week May 13, 2026 - May 20, 2026
tx-generator: adapt to Leios-extended Codecs + Reception-wrapped recv
The consensus Leios chunks extended 'NTN.Codecs' with two extra type
parameters ('bLN' / 'bLF', for LeiosNotify and LeiosFetch), and the
network-side BearerBytes/Reception work changed 'runPeerWithLimits' to
return 'Maybe (Reception bytes)' (instead of 'Maybe bytes') and made
'byteLimitsKeepAlive' parameter-less.

Update 'tx-generator' to compile against the rebased stack:

  - Pull in 'ouroboros-network:framework-tracing' as a sublib dependency.
  - Extend the local 'myCodecs' type to 9 'ByteString' parameters (was 7).
  - Update 'kaClient' return type to 'IO ((), Maybe (Mux.Reception ByteString))'.
  - Drop the size-function argument from 'byteLimitsKeepAlive'.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
N3: LeiosDbConfig configuration entry + thread to consensus
Introduces 'Cardano.Node.Configuration.Leios.LeiosDbConfig' with two
constructors:

  - LeiosDbInMemory          (matches 'LeiosDbConnection's in-memory backend)
  - LeiosDbSQLite !FilePath  (SQLite backend, file relative to node CWD)

Wired through 'PartialNodeConfiguration' / 'NodeConfiguration' as
'ncLeiosDbConfig' with JSON parsing ('"LeiosDbConfig":{"Backend":...,
"Filepath":...}') and a default of 'LeiosDbSQLite "leios.db"'.

At node startup ('Cardano.Node.Run.handleSimpleNode'), the configured
backend is materialised into a 'LeiosDbHandle' (via 'newLeiosDBInMemory'
/ 'newLeiosDBSQLite') and passed into 'RunNodeArgs' through a new
'rnLeiosDb :: Maybe (LeiosDbHandle m)' field, which consensus's
'runWith' threads into the Leios kernel's shared connection.
'Nothing' falls back to the in-memory default.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
N2: wire Leios tracers into cardano-node Tracers / OrphanInstances
The consensus Leios chunks added four fields to the consensus tracer
records that cardano-node assembles in 'Cardano.Tracing.Tracers' (old
style) and 'Cardano.Node.Tracing.Tracers' (new style):

  - Consensus.Tracers'      gained 'leiosKernelTracer' and 'leiosPeerTracer'
  - NodeToNode.Tracers'     gained 'tLeiosNotifyTracer' and 'tLeiosFetchTracer'

This commit populates those fields in both 'mkTracers' code paths so
the record-construction sites are total. All four are wired to
'nullTracer' for now; the corresponding 'Transformable' / 'MetaTrace'
instances and EKG metrics are left as TODO. The new-style tracing
system will accordingly emit a 'TracerConsistencyWarnings' for the
four Leios namespaces declared in the config.yaml — that surfaces the
gap explicitly rather than silently dropping the configuration.

Adds the corresponding selectors to 'TraceSelection' / 'PartialTraceSelection'
and their JSON parsing:

  - traceLeiosKernel          / Consensus.LeiosKernel
  - traceLeiosPeer            / Consensus.LeiosPeer
  - traceLeiosNotifyProtocol  / LeiosNotify.Remote
  - traceLeiosFetchProtocol   / LeiosFetch.Remote

Also drops the duplicate 'LogFormatting (Simple/Stateful.TraceSendRecv)'
and 'MetaTrace (Simple/Stateful.TraceSendRecv)' instances that the
upstream leios-prototype branch carried in
'Cardano/Node/Tracing/Tracers/NodeToClient.hs' — they are now provided
by 'ouroboros-network:framework-tracing' and would collide if redefined
here.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Pin SRPs at the Leios prototype remake forks (consensus / ledger / network)
Updates cabal.project to point at the three rebased Leios forks that
ship with this cardano-node 11.0.1 build:

  - ouroboros-consensus  @  IntersectMBO/ouroboros-consensus
    branch leios-prototype-remake-3.0.1.0
    Single squashed Leios commit on top of release-3.0.1.0
    (mempool + diffusion + chain inclusion + voting + demo).
  - ouroboros-network    @  IntersectMBO/ouroboros-network
    branch leios-prototype-remake-1.1.0.0
    Three Leios commits on top of ouroboros-network-1.1.0.0
    (BearerBytes, Reception arrival-time, drop unused imports)
    + a trace-dispatcher version bump for compat with cardano-node 11.0.1.
  - cardano-ledger       @  IntersectMBO/cardano-ledger
    branch leios-prototype-remake
    Adds 'Maybe LeiosCert' on the Dijkstra block body
    (Dijkstra-only, mirrors 'Maybe PerasCert').

Also drops the 'dmq-node' extra-package (its latest CHaP release
requires ouroboros-network:framework-tracing, a sublib name that
the remade network fork doesn't carry).

Vendors a one-line 'ekg-forward' source patch (left untouched here)
to match the network's pre-bump 'ConnectToArgs' shape.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
ResolveLeiosBlock: narrow to chain-dep state
The only non-default instance (Dijkstra-era ShelleyBlock) consumes only
the Praos chain-dep state from its HeaderState argument, the tip is
never used. Taking the full HeaderState forced the HFC dispatch in
Cardano.Block to fabricate a HeaderState with 'headerStateTip = Origin'
purely to satisfy the record. The original leios-prototype branch worked
around the same smell with a partial toConwayHeaderState projection and
an 'error "Must be in Conway"' arm.

Narrowing the class to only taking the chain-dep state collapses the HFC
instance to a single combined case on (chainDepState, block), using the
existing ChainDepStateDijkstra pattern synonym. Also, the Dijkstra-era
Shelley instance drops the redundant 'headerStateChainDep' projection on
its argument.
Leios voting: LeiosVoteState + leiosVoting thread + threadnet test
Add the voting capability on top of the diffusion layer: an EB
becomes eligible for certification once enough peers have voted
'yes' on it (via the 'MsgLeiosVotes' message on the LeiosNotify
protocol from the previous chunk).

Voting state
- 'LeiosVoteState' (new module) — aggregated vote state across all
  peers, with 'addVote' / 'subscribeVotes' write/read API.
- 'NodeKernel.getLeiosVoteState' field plus the
  'NodeKernelArgs.leiosVotingKey' / 'NodeKernel.leiosVoting' background
  thread that subscribes to local 'AcquiredEbTxs' notifications and
  emits one vote per acquired EB.

LeiosNotify wiring
- The 'MsgLeiosVotes' server case now calls 'addVote' on each
  incoming vote (replacing the chunk-2 no-op stub).
- The notify server multiplexes EB offers with a 'processVote' loop
  that drains 'subscribeVotes leiosVoteState' and publishes
  'MsgLeiosVotes' to peers.

Tests
- 'Test.LeiosVoteState' (foundation-level unit tests).
- 'Test.ThreadNet.Leios' — end-to-end threadnet driver that asserts
  cert blocks happen, no vacuous runs, gap > 'minCertificationGap',
  all nodes converge, and the post-resolve replay matches the live
  ledger.

cabal
- Exposes 'LeiosVoteState'; wires 'Test.LeiosVoteState' /
  'Test.ThreadNet.Leios' into the test suites.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios resolving + chain inclusion
Plumb a 'ResolveLeiosBlock' typeclass through the block-application
pipeline so a Dijkstra-era block carrying 'SJust LeiosCert' has its
(empty) tx list spliced in from the EB closure in the LeiosDb before
validation. Plumbing only — no chain-selection rule change.

- 'Storage.LedgerDB.Forker' defines 'ResolveLeiosBlock' as a typeclass
  with a no-op default, and the 'applyBlock' hook calls
  'resolveLeiosBlock leiosDb hdrSt b' before
  'tickThen{Apply,Reapply}'. The forker reads the 'ExtLedgerState' to
  extract 'headerState' for the splice (used to look up the previous
  EB announcement on the chain-dep state).
- 'Storage.LedgerDB.V2' threads 'LeiosDbConnection' alongside the
  existing args so the new 'applyBlock' signature reaches the V2
  pipeline.
- Explicit no-op instances for every block type that doesn't carry
  Leios: 'ByronBlock', 'DualBlock', 'ShelleyBlock proto era',
  'HardForkBlock xs' (OVERLAPPABLE), 'TestBlockWith ptype', the
  storage-test 'TestBlock', the mock 'SimpleBlock''.
- Real-work instance: 'ShelleyBlock (Praos c) DijkstraEra' splices the
  EB closure from the previously-announced point (looked up via
  'praosStateLeiosAnnouncement' + 'praosStateLastSlot' on the Praos
  chain-dep state).
- 'Ouroboros.Consensus.Cardano.Block' routes per-era dispatch to the
  appropriate instance.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios demo: ImmDBServer schedule-driven Leios + schedule generator
Adapt the ImmDBServer tool to drive a Leios demo from a pre-recorded
schedule: replay EBs / cert-blocks at slot timestamps and serve them
over the LeiosNotify / LeiosFetch mini-protocols introduced in the
diffusion chunk. The actual schedule generator lives at
'ouroboros-consensus/app/leios-schedule-gen.hs' (committed with the
diffusion chunk for cabal layout reasons).

- 'immdb-server' grows --leios-db / --leios-schedule / --initial-slot
  / --initial-time / --address.
- 'Cardano.Tools.ImmDBServer.Diffusion' adds the LeiosSchedule type
  and a scheduler thread that ticks through schedule entries.
- 'Cardano.Tools.ImmDBServer.MiniProtocols' grows LeiosNotify /
  LeiosFetch responders, send/recv tracers, and a slot-delay aware
  chainSyncServer.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios diffusion: LeiosNotify + LeiosFetch mini-protocols + Reception
Wire LeiosNotify and LeiosFetch mini-protocols into the node-to-node
diffusion layer, plus the consensus-side adaptation to the network
fork's BearerBytes + arrival-time 'Reception' API.

Mini-protocols (live in consensus, not network)
- LeiosDemoOnlyTestFetch — request/response for EB bodies and the
  accompanying tx closures.
- LeiosDemoOnlyTestNotify — server pushes 'MsgLeiosBlockOffer' /
  'MsgLeiosBlockTxsOffer' as EBs arrive, plus 'MsgLeiosVotes' which
  this chunk handles as a no-op stub (the voting chunk replaces it).
- New 'NodeKernel' fields: 'getLeiosDB', 'getLeiosPeersVars',
  'getLeiosOutstanding', 'getLeiosReady'. The 'leiosFetchLogic'
  thread (0.5s loop) reads peers' offerings, runs the fetch-decision
  iteration and dispatches fetches.

Network wiring
- 'Ouroboros.Consensus.Network.NodeToNode' grows codecs + handlers
  for both protocols and threads the LeiosDbConnection through to the
  inbound side.
- 'Ouroboros.Consensus.Node' opens the in-memory LeiosDb and passes
  the handle + connection to the kernel / NTN / ChainDB layers.

BearerBytes + Reception migration
- All codec entry points drop the 'dataSize :: bytes -> Word'
  argument (now a 'BearerBytes' constraint).
- 'recv' returns 'Maybe (Reception a)' carrying per-chunk arrival
  times; the threadnet harness wraps reads via 'MkReception
  IntMap.empty', the PeerSimulator strips via 'fmap received'.
- 'TraceSendRecv' grows arrival-time on the receive side
  ('TraceRecvMsg :: Maybe Time -> AnyMessage ps -> ...').

Threadnet harness
- 'MinimalChainDbArgs.mcdbLeiosDbVar' backs the in-memory LeiosDb
  with a TVar so the test infrastructure can inspect it.

cabal
- Exposes 'LeiosDemoOnlyTestFetch' / 'LeiosDemoOnlyTestNotify' and
  adds network-mux, pretty-simple, typed-protocols:cborg deps.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Leios mempool access + forging
Foundations for the Leios prototype's production side, plus the
Dijkstra-era forging path that produces EBs / cert blocks.

Foundations
- LeiosDemo{Types,Logic,Exception} — placeholder types (EbAnnouncement,
  LeiosPoint, TxHash, LeiosVote), EB-forging logic, exception type.
- LeiosDemoDb / LeiosDemoDb.{Common,InMemory,SQLite} — pluggable
  storage for forged EBs + cert lookup.
- ouroboros-consensus.cabal exposes the foundation modules; the
  consensus-test suite gains Test.LeiosDemoDb and Test.LeiosDemoTypes;
  new leios-db-bench benchmark.
- cabal.project pins cardano-ledger at leios-prototype-remake-on-chap
  for 'Maybe LeiosCert' on the Dijkstra block body.

Mempool access (cumulative tx bytes)
- 'shelleyCumulativeTxBytes :: Word64' on ShelleyLedgerState +
  TickedShelleyLedgerState, threaded through CBOR + the tick step.
- HFC mempool threads it per-era so the kernel can read the running
  total of bytes that have entered the ledger.

Forging — Praos header EB announcement
- 'hbLeiosEbAnnouncement :: !(StrictMaybe EbAnnouncement)' on the
  Praos block header (chunked CBOR-after the existing field set).
- 'PraosState.praosStateLeiosAnnouncement' / 'praosStateLastSlot'
  on the Praos chain-dep state, written non-stickily on each tick.
- 'ProtocolHeaderSupportsKES.protocolStateLeiosInfo' projects the
  pair out; TPraos returns Nothing. No certify flag — the
  certificate, when forged, lives on the block body (see ledger PR).

Forging — Dijkstra-era 'decideLeios'
- 'ForgeBlockArgs' extended with fbEbTxs / fbLeiosDb /
  fbCurrentTickedLedgerState / fbChainDepState / fbLeiosTracer so
  the forger has read access to the EB-candidate tx pool, the
  LeiosDb (to look up certificates and store newly-forged EBs),
  the ticked ledger state and the chain-dep state.
- Dijkstra-only forging path: 'decideLeios' returns either a
  Leios certificate (when a previously-announced EB has gap >
  'minCertificationGap' and is locally available with a cert)
  or a new EB announcement (forged from fbEbTxs).
- Cert-block forging emits an empty tx sequence on the wire; the
  full transaction list is re-attached at apply time by
  resolveLeiosBlock (see resolving chunk).
- ForgeBlockArgs adaptation propagates through Byron, ByronDual,
  Mock and Shelley forging.

Plumbing
- ChainDB.Impl{,.Args} + LedgerDB{,.Args} grow a LeiosDbConnection
  so downstream chunks (diffusion, resolving) can reach it via
  ChainDbArgs / LedgerDbArgs.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
Add ToJSON/FromJSON instances for EraTxWits
* Add ToJSON, FromJSON and NFData as EraTxWits superclass constraints
* Add ToJSON/FromJSON for WitVKey, BootstrapWitness
* Add ToJSONKey/FromJSONKey for AccountId
* Add ToJSON/FromJSON for Inclusive and Exclusive
* Add FromJSON for TxIn; fix txInToText to use unTxIx
* Add FromJSON for PoolCert
* Add ToJSON/FromJSON for ShelleyTxWits era
* Add FromJSON for AsIx, AlonzoPlutusPurpose AsIx, TxDats, Redeemers, AlonzoTxWits
* Add FromJSON for ConwayDelegCert, ConwayGovCert, ConwayTxCert era, ConwayPlutusPurpose
* Add FromJSON for GovActionId, Voter, Vote, VotingProcedure, ProposalProcedure, GovAction, GovPurposeId
* Add ToJSON/FromJSON for AccountBalanceInterval, DijkstraScript
* Add FromJSON for DijkstraDelegCert, DijkstraTxCert era
* Add round-trip JSON property test for TxWits era