Mar 11, 5-6 PM (51)
Mar 11, 6-7 PM (35)
Mar 11, 7-8 PM (20)
Mar 11, 8-9 PM (39)
Mar 11, 9-10 PM (14)
Mar 11, 10-11 PM (57)
Mar 11, 11-12 AM (43)
Mar 12, 12-1 AM (4)
Mar 12, 1-2 AM (8)
Mar 12, 2-3 AM (6)
Mar 12, 3-4 AM (3)
Mar 12, 4-5 AM (4)
Mar 12, 5-6 AM (8)
Mar 12, 6-7 AM (46)
Mar 12, 7-8 AM (15)
Mar 12, 8-9 AM (62)
Mar 12, 9-10 AM (50)
Mar 12, 10-11 AM (88)
Mar 12, 11-12 PM (29)
Mar 12, 12-1 PM (60)
Mar 12, 1-2 PM (51)
Mar 12, 2-3 PM (48)
Mar 12, 3-4 PM (62)
Mar 12, 4-5 PM (23)
Mar 12, 5-6 PM (26)
Mar 12, 6-7 PM (14)
Mar 12, 7-8 PM (39)
Mar 12, 8-9 PM (28)
Mar 12, 9-10 PM (10)
Mar 12, 10-11 PM (41)
Mar 12, 11-12 AM (16)
Mar 13, 12-1 AM (7)
Mar 13, 1-2 AM (21)
Mar 13, 2-3 AM (13)
Mar 13, 3-4 AM (7)
Mar 13, 4-5 AM (1)
Mar 13, 5-6 AM (2)
Mar 13, 6-7 AM (7)
Mar 13, 7-8 AM (32)
Mar 13, 8-9 AM (48)
Mar 13, 9-10 AM (90)
Mar 13, 10-11 AM (25)
Mar 13, 11-12 PM (32)
Mar 13, 12-1 PM (54)
Mar 13, 1-2 PM (59)
Mar 13, 2-3 PM (35)
Mar 13, 3-4 PM (58)
Mar 13, 4-5 PM (26)
Mar 13, 5-6 PM (30)
Mar 13, 6-7 PM (17)
Mar 13, 7-8 PM (39)
Mar 13, 8-9 PM (28)
Mar 13, 9-10 PM (14)
Mar 13, 10-11 PM (23)
Mar 13, 11-12 AM (26)
Mar 14, 12-1 AM (1)
Mar 14, 1-2 AM (1)
Mar 14, 2-3 AM (9)
Mar 14, 3-4 AM (2)
Mar 14, 4-5 AM (0)
Mar 14, 5-6 AM (1)
Mar 14, 6-7 AM (0)
Mar 14, 7-8 AM (1)
Mar 14, 8-9 AM (19)
Mar 14, 9-10 AM (3)
Mar 14, 10-11 AM (0)
Mar 14, 11-12 PM (3)
Mar 14, 12-1 PM (1)
Mar 14, 1-2 PM (20)
Mar 14, 2-3 PM (5)
Mar 14, 3-4 PM (0)
Mar 14, 4-5 PM (0)
Mar 14, 5-6 PM (0)
Mar 14, 6-7 PM (2)
Mar 14, 7-8 PM (4)
Mar 14, 8-9 PM (11)
Mar 14, 9-10 PM (10)
Mar 14, 10-11 PM (20)
Mar 14, 11-12 AM (66)
Mar 15, 12-1 AM (6)
Mar 15, 1-2 AM (23)
Mar 15, 2-3 AM (8)
Mar 15, 3-4 AM (0)
Mar 15, 4-5 AM (1)
Mar 15, 5-6 AM (1)
Mar 15, 6-7 AM (0)
Mar 15, 7-8 AM (0)
Mar 15, 8-9 AM (2)
Mar 15, 9-10 AM (14)
Mar 15, 10-11 AM (1)
Mar 15, 11-12 PM (7)
Mar 15, 12-1 PM (20)
Mar 15, 1-2 PM (19)
Mar 15, 2-3 PM (30)
Mar 15, 3-4 PM (2)
Mar 15, 4-5 PM (4)
Mar 15, 5-6 PM (4)
Mar 15, 6-7 PM (8)
Mar 15, 7-8 PM (8)
Mar 15, 8-9 PM (11)
Mar 15, 9-10 PM (7)
Mar 15, 10-11 PM (28)
Mar 15, 11-12 AM (23)
Mar 16, 12-1 AM (7)
Mar 16, 1-2 AM (19)
Mar 16, 2-3 AM (14)
Mar 16, 3-4 AM (9)
Mar 16, 4-5 AM (0)
Mar 16, 5-6 AM (5)
Mar 16, 6-7 AM (21)
Mar 16, 7-8 AM (32)
Mar 16, 8-9 AM (57)
Mar 16, 9-10 AM (90)
Mar 16, 10-11 AM (61)
Mar 16, 11-12 PM (78)
Mar 16, 12-1 PM (50)
Mar 16, 1-2 PM (60)
Mar 16, 2-3 PM (29)
Mar 16, 3-4 PM (84)
Mar 16, 4-5 PM (48)
Mar 16, 5-6 PM (23)
Mar 16, 6-7 PM (87)
Mar 16, 7-8 PM (29)
Mar 16, 8-9 PM (24)
Mar 16, 9-10 PM (17)
Mar 16, 10-11 PM (34)
Mar 16, 11-12 AM (33)
Mar 17, 12-1 AM (13)
Mar 17, 1-2 AM (14)
Mar 17, 2-3 AM (6)
Mar 17, 3-4 AM (5)
Mar 17, 4-5 AM (7)
Mar 17, 5-6 AM (16)
Mar 17, 6-7 AM (15)
Mar 17, 7-8 AM (36)
Mar 17, 8-9 AM (198)
Mar 17, 9-10 AM (39)
Mar 17, 10-11 AM (37)
Mar 17, 11-12 PM (20)
Mar 17, 12-1 PM (119)
Mar 17, 1-2 PM (110)
Mar 17, 2-3 PM (48)
Mar 17, 3-4 PM (88)
Mar 17, 4-5 PM (28)
Mar 17, 5-6 PM (13)
Mar 17, 6-7 PM (12)
Mar 17, 7-8 PM (30)
Mar 17, 8-9 PM (39)
Mar 17, 9-10 PM (30)
Mar 17, 10-11 PM (35)
Mar 17, 11-12 AM (21)
Mar 18, 12-1 AM (1)
Mar 18, 1-2 AM (11)
Mar 18, 2-3 AM (9)
Mar 18, 3-4 AM (0)
Mar 18, 4-5 AM (6)
Mar 18, 5-6 AM (5)
Mar 18, 6-7 AM (3)
Mar 18, 7-8 AM (12)
Mar 18, 8-9 AM (19)
Mar 18, 9-10 AM (78)
Mar 18, 10-11 AM (86)
Mar 18, 11-12 PM (64)
Mar 18, 12-1 PM (72)
Mar 18, 1-2 PM (49)
Mar 18, 2-3 PM (125)
Mar 18, 3-4 PM (40)
Mar 18, 4-5 PM (16)
Mar 18, 5-6 PM (2)
4,538 commits this week Mar 11, 2026 - Mar 18, 2026
Fix CommitFinalized version-race causing permanently stuck snapshots
  After a deposit snapshot confirms, maybeRequestNextSnapshot fires
  ReqSn(ver=N) immediately for pending L2 txs. With a slow network,
  CommitFinalized arrives and bumps the version to N+1 before the echo
  returns. The stale ReqSn(ver=N) is rejected with ReqSvNumberInvalid
  and nobody re-triggers a fresh request, leaving the head stuck.

  Two-part fix mirroring the DecommitFinalized fix:
  - aggregateNodeState: use LastSeenSnapshot{lastSeen=confirmedSn}
    instead of toLastSeenSnapshot, keeping seenSnapshotNumber at the
    confirmed value so the next ReqSn number is correct
  - onOpenChainIncrementTx: add maybeRequestSnapshotAfterCommit so the
    leader immediately sends ReqSn(ver=newVersion) for pending L2 txs
    after CommitFinalized, instead of waiting for the next timer tick

Signed-off-by: Sasha Bogicevic <[email protected]>
Add failing test for CommitFinalized version-race snapshot stuck bug
  After a deposit snapshot confirms, maybeRequestNextSnapshot fires
  ReqSn(ver=0) immediately. With a 25s network delay, CommitFinalized
  arrives first and bumps the version to 1. The stale ReqSn(ver=0) echo
  is rejected with ReqSvNumberInvalid and nobody re-triggers ReqSn(ver=1),
  leaving the head permanently stuck.

Signed-off-by: Sasha Bogicevic <[email protected]>
chore: upgrade crate versions and `mithril-test-lab/mithril-devnet/VERSION` version
 name = "client-cardano-database-v2" -version = "0.0.17" +version = "0.0.18" * client-cardano-database from `0.1.40` to `0.1.41`
* client-cardano-stake-distribution from `0.1.16` to `0.1.17`
* client-cardano-transaction from `0.1.25` to `0.1.26`
* client-mithril-stake-distribution from `0.2.14` to `0.2.15`
* mithril-metric from `0.1.20` to `0.1.21`
* mithril-aggregator from `0.8.35` to `0.8.36`
* mithril-client-cli from `0.12.43` to `0.12.44`
* mithril-client-wasm from `0.9.12` to `0.9.13`
* mithril-client from `0.13.5` to `0.13.6`
* mithril-common from `0.6.57` to `0.6.58`
* mithril-relay from `0.2.3` to `0.2.4`
* mithril-signer from `0.3.23` to `0.3.24`
* mithril-end-to-end from `0.4.122` to `0.4.123`
* [js] mithril-client-wasm from `0.9.12` to `0.9.13`
* mithril-test-lab/mithril-devnet/VERSION from `0.4.24` to `0.4.25`
Unify cert indexing via indexCertificatesWith, fix Nothing-witness bug
Extract shared indexCertificatesWith helper that preserves certificates
with Nothing witnesses (non-witnessed certs like ConwayRegCert without
deposit). Previously, all three indexTxCertificates implementations
filtered out Nothing-witness certs, causing mapScriptWitnessesCertificates
in both the legacy and experimental APIs to silently drop them during
fee balancing.

Also replaces the inlined cert-indexing in the experimental API's
mapScriptWitnessesCertificates with a call to indexTxCertificates,
and expands the cert-preservation property test to cover delegation
and registration+delegation cert types.

Fixes #1138
Add Flat encoding test coverage across all packages
Pay down test coverage debt for Flat serialization instances.
This ensures encoding stability is verified by tests before
we attempt to fix the Generic derivation bug in a follow-up PR.

Adds roundtrip and stable byte encoding tests for:
- Flat library types (Maybe, Either, NonEmpty, Complex, Ratio,
  Set, Tree, Map, Seq, DList, Filler, PreAligned, and
  monoid/semigroup wrappers)
- TPLC types (Version, Name, Kind, DeBruijn, NamedDeBruijn,
  SrcSpan, SrcSpans, DefaultFun, DefaultUni, and all newtype
  wrappers including TyName, Unique, TyDeBruijn, etc.)
- PIR types (Recursivity, Strictness)
- UPLC types (Binder variants, FakeNamedDeBruijn, minimal
  Program encoding)
- Value types (K encodes as ByteString, Quantity as Integer)

Also adds a standalone encoding generator executable
(cabal run flat-encoding-generator) for reproducing expected
byte constants.
Fixing the stuck snapshots by re-requesting ReqSn
  DecommitFinalized aggregate now resets seenSnapshot to
  LastSeenSnapshot{confirmedSn} instead of toLastSeenSnapshot(seenSnapshot).
  This prevents seenSnapshotNumber from advancing to the requested snapshot
  number (which blocked re-requesting), and allows onOpenChainDecrementTx
  to emit a fresh ReqSn with the new version for any pending L2 txs.

Signed-off-by: Sasha Bogicevic <[email protected]>
Fix snapshot stuck after DecommitFinalized due to stale ReqSn version
  After a decommit snapshot confirms, the leader immediately requests the
  next snapshot via maybeRequestNextSnapshot, sending ReqSn(ver=N). If
  DecommitFinalized arrives before the network echo returns, it bumps the
  version to N+1, causing the stale ReqSn(ver=N) echo to be rejected with
  ReqSvNumberInvalid. Since nothing re-triggers a fresh request, the head
  gets permanently stuck in RequestedSnapshot.

Signed-off-by: Sasha Bogicevic <[email protected]>