Mar 29, 12-1 PM (13)
Mar 29, 1-2 PM (2)
Mar 29, 2-3 PM (2)
Mar 29, 3-4 PM (4)
Mar 29, 4-5 PM (6)
Mar 29, 5-6 PM (8)
Mar 29, 6-7 PM (9)
Mar 29, 7-8 PM (6)
Mar 29, 8-9 PM (4)
Mar 29, 9-10 PM (10)
Mar 29, 10-11 PM (24)
Mar 29, 11-12 AM (17)
Mar 30, 12-1 AM (5)
Mar 30, 1-2 AM (5)
Mar 30, 2-3 AM (7)
Mar 30, 3-4 AM (7)
Mar 30, 4-5 AM (3)
Mar 30, 5-6 AM (12)
Mar 30, 6-7 AM (3)
Mar 30, 7-8 AM (36)
Mar 30, 8-9 AM (27)
Mar 30, 9-10 AM (20)
Mar 30, 10-11 AM (67)
Mar 30, 11-12 PM (48)
Mar 30, 12-1 PM (30)
Mar 30, 1-2 PM (42)
Mar 30, 2-3 PM (63)
Mar 30, 3-4 PM (33)
Mar 30, 4-5 PM (24)
Mar 30, 5-6 PM (41)
Mar 30, 6-7 PM (17)
Mar 30, 7-8 PM (18)
Mar 30, 8-9 PM (13)
Mar 30, 9-10 PM (28)
Mar 30, 10-11 PM (44)
Mar 30, 11-12 AM (28)
Mar 31, 12-1 AM (16)
Mar 31, 1-2 AM (5)
Mar 31, 2-3 AM (15)
Mar 31, 3-4 AM (6)
Mar 31, 4-5 AM (4)
Mar 31, 5-6 AM (7)
Mar 31, 6-7 AM (12)
Mar 31, 7-8 AM (43)
Mar 31, 8-9 AM (47)
Mar 31, 9-10 AM (30)
Mar 31, 10-11 AM (37)
Mar 31, 11-12 PM (29)
Mar 31, 12-1 PM (38)
Mar 31, 1-2 PM (34)
Mar 31, 2-3 PM (52)
Mar 31, 3-4 PM (42)
Mar 31, 4-5 PM (48)
Mar 31, 5-6 PM (42)
Mar 31, 6-7 PM (36)
Mar 31, 7-8 PM (16)
Mar 31, 8-9 PM (13)
Mar 31, 9-10 PM (9)
Mar 31, 10-11 PM (24)
Mar 31, 11-12 AM (15)
Apr 01, 12-1 AM (1)
Apr 01, 1-2 AM (2)
Apr 01, 2-3 AM (8)
Apr 01, 3-4 AM (5)
Apr 01, 4-5 AM (8)
Apr 01, 5-6 AM (10)
Apr 01, 6-7 AM (3)
Apr 01, 7-8 AM (81)
Apr 01, 8-9 AM (41)
Apr 01, 9-10 AM (28)
Apr 01, 10-11 AM (29)
Apr 01, 11-12 PM (34)
Apr 01, 12-1 PM (29)
Apr 01, 1-2 PM (29)
Apr 01, 2-3 PM (41)
Apr 01, 3-4 PM (31)
Apr 01, 4-5 PM (9)
Apr 01, 5-6 PM (11)
Apr 01, 6-7 PM (31)
Apr 01, 7-8 PM (19)
Apr 01, 8-9 PM (9)
Apr 01, 9-10 PM (36)
Apr 01, 10-11 PM (34)
Apr 01, 11-12 AM (14)
Apr 02, 12-1 AM (24)
Apr 02, 1-2 AM (5)
Apr 02, 2-3 AM (10)
Apr 02, 3-4 AM (6)
Apr 02, 4-5 AM (1)
Apr 02, 5-6 AM (7)
Apr 02, 6-7 AM (45)
Apr 02, 7-8 AM (13)
Apr 02, 8-9 AM (44)
Apr 02, 9-10 AM (37)
Apr 02, 10-11 AM (35)
Apr 02, 11-12 PM (38)
Apr 02, 12-1 PM (46)
Apr 02, 1-2 PM (56)
Apr 02, 2-3 PM (45)
Apr 02, 3-4 PM (46)
Apr 02, 4-5 PM (38)
Apr 02, 5-6 PM (34)
Apr 02, 6-7 PM (25)
Apr 02, 7-8 PM (23)
Apr 02, 8-9 PM (31)
Apr 02, 9-10 PM (17)
Apr 02, 10-11 PM (27)
Apr 02, 11-12 AM (47)
Apr 03, 12-1 AM (8)
Apr 03, 1-2 AM (9)
Apr 03, 2-3 AM (13)
Apr 03, 3-4 AM (0)
Apr 03, 4-5 AM (2)
Apr 03, 5-6 AM (6)
Apr 03, 6-7 AM (6)
Apr 03, 7-8 AM (50)
Apr 03, 8-9 AM (35)
Apr 03, 9-10 AM (6)
Apr 03, 10-11 AM (10)
Apr 03, 11-12 PM (14)
Apr 03, 12-1 PM (50)
Apr 03, 1-2 PM (38)
Apr 03, 2-3 PM (60)
Apr 03, 3-4 PM (15)
Apr 03, 4-5 PM (10)
Apr 03, 5-6 PM (5)
Apr 03, 6-7 PM (14)
Apr 03, 7-8 PM (19)
Apr 03, 8-9 PM (6)
Apr 03, 9-10 PM (15)
Apr 03, 10-11 PM (20)
Apr 03, 11-12 AM (17)
Apr 04, 12-1 AM (6)
Apr 04, 1-2 AM (1)
Apr 04, 2-3 AM (4)
Apr 04, 3-4 AM (1)
Apr 04, 4-5 AM (1)
Apr 04, 5-6 AM (5)
Apr 04, 6-7 AM (10)
Apr 04, 7-8 AM (3)
Apr 04, 8-9 AM (3)
Apr 04, 9-10 AM (5)
Apr 04, 10-11 AM (35)
Apr 04, 11-12 PM (9)
Apr 04, 12-1 PM (24)
Apr 04, 1-2 PM (11)
Apr 04, 2-3 PM (8)
Apr 04, 3-4 PM (12)
Apr 04, 4-5 PM (3)
Apr 04, 5-6 PM (9)
Apr 04, 6-7 PM (2)
Apr 04, 7-8 PM (3)
Apr 04, 8-9 PM (5)
Apr 04, 9-10 PM (17)
Apr 04, 10-11 PM (21)
Apr 04, 11-12 AM (23)
Apr 05, 12-1 AM (2)
Apr 05, 1-2 AM (0)
Apr 05, 2-3 AM (2)
Apr 05, 3-4 AM (1)
Apr 05, 4-5 AM (1)
Apr 05, 5-6 AM (8)
Apr 05, 6-7 AM (13)
Apr 05, 7-8 AM (4)
Apr 05, 8-9 AM (1)
Apr 05, 9-10 AM (0)
Apr 05, 10-11 AM (7)
Apr 05, 11-12 PM (7)
Apr 05, 12-1 PM (0)
3,284 commits this week Mar 29, 2026 - Apr 05, 2026
feat: add Dijkstra CBOR round-trip golden tests
Dijkstra deserializes Conway CBOR identically (backwards compatible).
Reuse the existing 152 Conway golden files for Dijkstra round-trips.

One file (42.cbor) is skipped: it contains a certificate without
deposits, which Conway accepts but Dijkstra rejects
("Certificates without deposits are no longer supported").

151 new Dijkstra serialization tests, 420 total (up from 268).
fix(node): extend stall detection thresholds during catch-up
During catch-up, connection recycling from stall detection causes
pipeline resets, TIME_WAIT socket exhaustion on the source port,
and dropped rollbacks that slow sync far more than the stall itself.

Extend grace period, plateau detection, and recycle cooldown by 5x
when the node is not at tip. Once the node reaches tip, thresholds
return to normal for responsive stall recovery.

Signed-off-by: wcatz <[email protected]>
Signed-off-by: wcatz <[email protected]>
refactor!: remove cardano-api from test dependencies
Delete orphaned Cardano.Api.Gen module (2056 lines) and remove
cardano-api from test build-depends. Also remove 10 transitive
test deps that were only needed by Gen.hs.

Verified:
- Zero Cardano.Api imports in lib/ and test/
- cardano-api absent from cabal dependency plan
- 234/234 tests pass, 0 assertions modified
- 152 CBOR golden round-trips byte-identical
fix(connmanager): skip source port binding during catch-up
When the node is behind tip, outbound connections bind to the listen
port (3001) for peer sharing. Connection churn during catch-up creates
TIME_WAIT sockets that block reconnection to the same peer for 60s,
causing a death spiral where the node can't reach peers and falls
further behind.

Add IsAtTipFunc to ConnectionManagerConfig. When provided and returning
false, outbound connections use ephemeral ports instead of binding to
the listen port. Peer sharing is not useful during catch-up anyway.

Also extend stall detection thresholds 5x during catch-up to reduce
connection recycling that triggers the TIME_WAIT exhaustion.

Signed-off-by: wcatz <[email protected]>
Signed-off-by: wcatz <[email protected]>
refactor: replace cardano-api generators with ledger-native equivalents
Rewrite all QuickCheck generators in BalanceSpec.hs to use
cardano-ledger types directly, removing the last cardano-api
usage from the test infrastructure.

Generator population comparison (1000 samples each):

genTxForBalancing @ConwayEra:
                          OLD         NEW
  has inputs:           100.0%      100.0%
  has certificates:      47.5%       44.5%
  has withdrawals:       54.6%       61.0%
  has collateral in:      0.4%        5.0%
  has totalCollat:        4.4%        6.7%
  has returnCollat:       4.8%        3.9%
  has validity lo:      100.0%      100.0%
  has validity hi:       49.1%       49.0%

genTxOut @ConwayEra:
                          OLD         NEW
  shelley:               51.3%       47.4%
  byron:                 48.7%       52.6%
  mainnet:               48.2%       44.8%
  testnet:                3.1%        2.6%
  key pay cred:          24.3%       24.3%
  script pay cred:       27.0%       23.1%
  has stake ref:         25.9%       23.4%

No test assertions were modified. All 234 tests pass.
refactor!: remove cardano-api from library
Remove CardanoApiEra type family, IsShelleyBasedEra constraint,
toCardanoApiTx/fromCardanoApiTx, and all cardano-api imports from
library modules. IsRecentEra now only requires Typeable and
RecentEraConstraints. Enum AnyRecentEra uses manual numbering.

BREAKING CHANGE: CardanoApiEra, toCardanoApiTx, fromCardanoApiTx,
cardanoEraFromRecentEra, shelleyBasedEraFromRecentEra removed from
public API.
refactor!: remove cardano-api from tests
Delete Cardano/Api/Gen.hs (~2000 lines of cardano-api generators).
Rewrite BalanceSpec.hs to use ledger-native generators:
- genTxForBalancing: mkBasicTx with random outputs
- genTxOut: mkBasicTxOut with proper Shelley addresses
- genLedgerAddr: Addr Testnet with random KeyHash
- Wallet Arbitrary: ledger TxOut generators
- shrinkTx: simplified to const []
- NetworkId: replaced with local TestNetworkId type
- Remove cardano-api from test build-depends

BREAKING CHANGE: Cardano.Api.Gen test module removed.
refactor!: remove cardano-api from tests
Delete Cardano/Api/Gen.hs (~2000 lines of cardano-api generators).
Rewrite BalanceSpec.hs to use ledger-native generators:
- genTxForBalancing: mkBasicTx with random outputs
- genTxOut: mkBasicTxOut with proper Shelley addresses
- genLedgerAddr: Addr Testnet with random KeyHash
- Wallet Arbitrary: ledger TxOut generators
- shrinkTx: simplified to const []
- NetworkId: replaced with local TestNetworkId type
- Remove cardano-api from test build-depends

BREAKING CHANGE: Cardano.Api.Gen test module removed.
refactor!: remove cardano-api from library
Remove CardanoApiEra type family, IsShelleyBasedEra constraint,
toCardanoApiTx/fromCardanoApiTx, and all cardano-api imports from
library modules. IsRecentEra now only requires Typeable and
RecentEraConstraints. Enum AnyRecentEra uses manual numbering.

BREAKING CHANGE: CardanoApiEra, toCardanoApiTx, fromCardanoApiTx,
cardanoEraFromRecentEra, shelleyBasedEraFromRecentEra removed from
public API.
refactor: replace cardano-api serialization in Tx.hs
serializeTx now uses Cardano.Ledger.Binary.serialize' directly.
deserializeTx uses decodeFullAnnotator with era-specific decCBOR.
toRecentEraGADT returns Either String instead of AnyCardanoEra.

toCardanoApiTx/fromCardanoApiTx kept for now (test code still
uses them — will be removed with test generator rewrite).
refactor: replace cardano-api usage in Sign.hs with ledger lenses
Rewrite estimateKeyWitnessCounts to use ledger lenses and types
directly instead of going through CardanoApi.getTxBodyContent:

- Transaction inputs via inputsTxBodyL + collateralInputsTxBodyL
- Required signers via reqSignerHashesTxBodyG (getter, no AtMostEra)
- Withdrawals via withdrawalsTxBodyL, counting by RewardAccount cred
- Certificates via certsTxBodyL with direct TxCert pattern matching
- Removed txUpdateProposal handling (not in Conway/Dijkstra)
- estimateDelegSigningKeys takes Ledger.TxCert directly
refactor: replace cardano-api usage in Sign.hs with ledger lenses
Rewrite estimateKeyWitnessCounts to use ledger lenses and types
directly instead of going through CardanoApi.getTxBodyContent:

- Transaction inputs via inputsTxBodyL + collateralInputsTxBodyL
- Required signers via reqSignerHashesTxBodyG (getter, no AtMostEra)
- Withdrawals via withdrawalsTxBodyL, counting by RewardAccount cred
- Certificates via certsTxBodyL with direct TxCert pattern matching
- Removed txUpdateProposal handling (not in Conway/Dijkstra)
- estimateDelegSigningKeys takes Ledger.TxCert directly