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 (41)
May 20, 11-12 PM (28)
May 20, 12-1 PM (50)
May 20, 1-2 PM (92)
May 20, 2-3 PM (20)
May 20, 3-4 PM (326)
May 20, 4-5 PM (23)
May 20, 5-6 PM (23)
May 20, 6-7 PM (17)
May 20, 7-8 PM (23)
May 20, 8-9 PM (15)
May 20, 9-10 PM (5)
May 20, 10-11 PM (34)
May 20, 11-12 AM (16)
May 21, 12-1 AM (14)
May 21, 1-2 AM (8)
May 21, 2-3 AM (10)
May 21, 3-4 AM (7)
May 21, 4-5 AM (4)
May 21, 5-6 AM (26)
May 21, 6-7 AM (14)
May 21, 7-8 AM (22)
May 21, 8-9 AM (31)
May 21, 9-10 AM (42)
May 21, 10-11 AM (32)
May 21, 11-12 PM (22)
May 21, 12-1 PM (12)
4,099 commits this week May 14, 2026 - May 21, 2026
net-core: stop dispatch-loop stall from disconnecting healthy peers
A 25-node smoke cluster at p=0.1 RB generation accumulated 62
"peer command channel full" disconnects over ~16 minutes, with
lagging nodes ~100s behind the leaders.  Tip distribution fragmented
into 8 chains spanning 9 blocks even though all nodes shared
ancestry — not a partition, just receive-side starvation.

Root cause: each peer task has small sub-channels feeding the
client protocol sub-tasks (fetch=16, peer_share=4, tx_submit=16,
cs_reintersect=4, leios_fetch=16).  The shared command-dispatch
loop uses `.send().await` on each, so when any sub-channel fills,
the dispatch loop blocks.  While blocked, no commands move from
the per-peer `commands` channel (cap 4096) — which then fills under
high `ProvideTxs` traffic and trips the coordinator's "command
channel full" disconnect via try_send.  Healthy peers were being
torn down for downstream slowness.

The `ProvideTxs { txs: Vec<…> }` path unspools one tx per
`.send().await`, so a single 30-tx batch already consumed nearly
twice tx_submit's capacity.

Fix:

- Bump sub-channel caps to match expected burst sizes: fetch and
  leios_fetch to 256, tx_submit to 1024, the small signal channels
  (peer_share, cs_reintersect) to 16.  Applied symmetrically in
  peer_task.rs and duplex_task.rs.
- Switch `tx_submit` from `.send().await` to `try_send` with a
  drop-and-warn on Full.  Tx propagation is best-effort gossip —
  another peer will re-broadcast — so dropping is preferable to
  stalling the dispatch loop and tearing down the connection.
  Fetches (FetchBlocks, FetchLeios*) keep `.send().await` since
  those are correctness-critical.

Verified live: rebuilt cluster at p=0.1 holds a single tip across
all 25 nodes with zero "command channel full" disconnects through
block 30 of the new run.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
shared-consensus: cert targets parent RB's EB only, drop sticky-cert API
CIP-0164 Linear Leios specifies that the cert in an RB endorses the EB
announced by the immediately preceding RB.  sim-rs's `linear_leios.rs`
implements it that way: `latest_rb_id()` → `ebs_by_rb.get(rb_id)` →
quorum + pipeline-timing check → `Some(Endorsement)` or `None`.

shared-consensus instead exposed `has_certified_eb()` /
`certified_eb_slot()` — global queries across the elections map that
returned whichever quorum-reached EB happened to be in CertEligible
right now.  Under high RB generation rates this produced ~100%
endorsement: every RB found *some* older EB in the 10-slot CertEligible
window and attached its cert, regardless of whether that EB belonged
to the parent RB.

Fix:

- New `ChainTree::announced_eb_hash_by(rb_hash)`.  Already stored on
  every `ChainNode`; just needed an accessor.
- New `Elections::eb_certifiable_slot(eb_hash) -> Option<u64>` —
  returns the announced slot iff *that specific* election is at
  quorum and in CertEligible.  Replaces both `has_certified_eb()`
  and `certified_eb_slot()`, which are gone.
- New `LeiosState::eb_certifiable_slot(eb_hash)` delegate.
- New `Consensus::cert_for_parent()` on the net-node facade:
  composes `praos.adopted_tip_announced_eb()` and
  `leios.eb_certifiable_slot()` so the producer can ask, "is the
  parent RB's EB certifiable?" in one call.
- `main.rs` producer uses `cert_for_parent()` instead of the two
  retired methods.

Verified live: at rb_generation_probability=0.25 (mean gap ≈4 slots,
well below the 13-slot CertEligible floor), the rebuilt cluster
produces zero certs — correct under this rule, parent's EB never
matures in time.  At p=0.1 (mean gap ≈10 slots), certs appear when
the inter-RB gap exceeds 13 and not otherwise — observed live as
gaps 1→2 and 3→4 (long) producing certs, gap 2→3 (short) not.

Tests updated: `eb_certifiable_slot_targets_specific_hash` in
net-node's leios facade exercises a per-hash lookup with two
elections at different stages; the elections.rs unit test asserts
the new accessor on a single hash and that unrelated hashes return
None.  Old `certified_eb_slot_returns_latest_quorum_election`
deleted (it asserted the wrong protocol semantics).

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Address review comments from @palas
- Restore datum field in friendly TxOut output (was inadvertently dropped
  in the Exp.TxOut migration); render via ledger datumTxOutL.
- Drop redundant shelleyBasedEraConstraints wraps where pattern-matching
  on IncompleteTxBody already brings the constraint into scope.
- Hoist liftIO out of the do-block in runTransactionSubmitCmd's success
  branch.
- Use mapAndUnzipM in runCompatibleTransactionCmd for clarity.
- Add blank lines between typed let-binding pairs in the min-fee
  calculator for readability.

The IsShelleyBasedEra -> ShelleyBasedEra constraint simplification on
IncompleteTxBody is intentionally not applied; removing the typeclass
forces shelleyBasedEraConstraints wrapping at every call site, which is
the convenience trade-off palas himself flagged.
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
feat: enhance proxy transaction handling with blocked UTxO management
- Integrated functions to extract and filter blocked UTxOs from pending transactions, improving the robustness of proxy transaction processing.
- Updated `MeshProxyContract` to utilize blocked UTxO references when selecting UTxOs for spending, ensuring only available UTxOs are used.
- Enhanced `ProxyControl` component to manage blocked UTxOs and ensure proper handling of available UTxOs for transactions.
- Refactored UTxO selection logic to improve clarity and maintainability in the proxy transaction workflow.