May 20, 12-1 PM (50)
May 20, 1-2 PM (92)
May 20, 2-3 PM (21)
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 (16)
May 21, 1-2 AM (9)
May 21, 2-3 AM (11)
May 21, 3-4 AM (7)
May 21, 4-5 AM (4)
May 21, 5-6 AM (27)
May 21, 6-7 AM (14)
May 21, 7-8 AM (22)
May 21, 8-9 AM (34)
May 21, 9-10 AM (45)
May 21, 10-11 AM (37)
May 21, 11-12 PM (27)
May 21, 12-1 PM (63)
May 21, 1-2 PM (68)
May 21, 2-3 PM (60)
May 21, 3-4 PM (53)
May 21, 4-5 PM (20)
May 21, 5-6 PM (27)
May 21, 6-7 PM (27)
May 21, 7-8 PM (25)
May 21, 8-9 PM (23)
May 21, 9-10 PM (3)
May 21, 10-11 PM (29)
May 21, 11-12 AM (10)
May 22, 12-1 AM (16)
May 22, 1-2 AM (6)
May 22, 2-3 AM (8)
May 22, 3-4 AM (4)
May 22, 4-5 AM (11)
May 22, 5-6 AM (10)
May 22, 6-7 AM (21)
May 22, 7-8 AM (13)
May 22, 8-9 AM (38)
May 22, 9-10 AM (12)
May 22, 10-11 AM (18)
May 22, 11-12 PM (25)
May 22, 12-1 PM (24)
May 22, 1-2 PM (34)
May 22, 2-3 PM (56)
May 22, 3-4 PM (13)
May 22, 4-5 PM (29)
May 22, 5-6 PM (13)
May 22, 6-7 PM (19)
May 22, 7-8 PM (20)
May 22, 8-9 PM (12)
May 22, 9-10 PM (12)
May 22, 10-11 PM (41)
May 22, 11-12 AM (12)
May 23, 12-1 AM (9)
May 23, 1-2 AM (0)
May 23, 2-3 AM (3)
May 23, 3-4 AM (1)
May 23, 4-5 AM (1)
May 23, 5-6 AM (4)
May 23, 6-7 AM (12)
May 23, 7-8 AM (1)
May 23, 8-9 AM (3)
May 23, 9-10 AM (1)
May 23, 10-11 AM (1)
May 23, 11-12 PM (5)
May 23, 12-1 PM (1)
May 23, 1-2 PM (6)
May 23, 2-3 PM (5)
May 23, 3-4 PM (5)
May 23, 4-5 PM (4)
May 23, 5-6 PM (0)
May 23, 6-7 PM (3)
May 23, 7-8 PM (23)
May 23, 8-9 PM (1)
May 23, 9-10 PM (9)
May 23, 10-11 PM (21)
May 23, 11-12 AM (27)
May 24, 12-1 AM (9)
May 24, 1-2 AM (0)
May 24, 2-3 AM (1)
May 24, 3-4 AM (1)
May 24, 4-5 AM (0)
May 24, 5-6 AM (3)
May 24, 6-7 AM (1)
May 24, 7-8 AM (2)
May 24, 8-9 AM (2)
May 24, 9-10 AM (4)
May 24, 10-11 AM (4)
May 24, 11-12 PM (1)
May 24, 12-1 PM (7)
May 24, 1-2 PM (46)
May 24, 2-3 PM (5)
May 24, 3-4 PM (3)
May 24, 4-5 PM (18)
May 24, 5-6 PM (2)
May 24, 6-7 PM (4)
May 24, 7-8 PM (13)
May 24, 8-9 PM (10)
May 24, 9-10 PM (15)
May 24, 10-11 PM (33)
May 24, 11-12 AM (42)
May 25, 12-1 AM (9)
May 25, 1-2 AM (4)
May 25, 2-3 AM (6)
May 25, 3-4 AM (1)
May 25, 4-5 AM (6)
May 25, 5-6 AM (14)
May 25, 6-7 AM (17)
May 25, 7-8 AM (17)
May 25, 8-9 AM (32)
May 25, 9-10 AM (43)
May 25, 10-11 AM (64)
May 25, 11-12 PM (33)
May 25, 12-1 PM (43)
May 25, 1-2 PM (40)
May 25, 2-3 PM (20)
May 25, 3-4 PM (27)
May 25, 4-5 PM (16)
May 25, 5-6 PM (6)
May 25, 6-7 PM (7)
May 25, 7-8 PM (11)
May 25, 8-9 PM (12)
May 25, 9-10 PM (16)
May 25, 10-11 PM (43)
May 25, 11-12 AM (25)
May 26, 12-1 AM (11)
May 26, 1-2 AM (11)
May 26, 2-3 AM (8)
May 26, 3-4 AM (11)
May 26, 4-5 AM (6)
May 26, 5-6 AM (9)
May 26, 6-7 AM (26)
May 26, 7-8 AM (43)
May 26, 8-9 AM (39)
May 26, 9-10 AM (42)
May 26, 10-11 AM (45)
May 26, 11-12 PM (59)
May 26, 12-1 PM (34)
May 26, 1-2 PM (50)
May 26, 2-3 PM (50)
May 26, 3-4 PM (17)
May 26, 4-5 PM (20)
May 26, 5-6 PM (13)
May 26, 6-7 PM (20)
May 26, 7-8 PM (12)
May 26, 8-9 PM (15)
May 26, 9-10 PM (15)
May 26, 10-11 PM (35)
May 26, 11-12 AM (29)
May 27, 12-1 AM (16)
May 27, 1-2 AM (8)
May 27, 2-3 AM (9)
May 27, 3-4 AM (5)
May 27, 4-5 AM (32)
May 27, 5-6 AM (9)
May 27, 6-7 AM (49)
May 27, 7-8 AM (63)
May 27, 8-9 AM (37)
May 27, 9-10 AM (71)
May 27, 10-11 AM (83)
May 27, 11-12 PM (30)
May 27, 12-1 PM (28)
3,675 commits this week May 20, 2026 - May 27, 2026
Add ToJSON/FromJSON instances for EraTxAuxData
* Add ToJSON/FromJSON and NFData as EraTxAuxData superclass constraints
* Add ToJSON/FromJSON for Metadatum
* Add ToJSON/FromJSON for Data era and PlutusBinary
* Add FromJSON for PoolCert, ConwayGovCert, DijkstraDelegCert, DijkstraTxCert era
* Add ToJSON/FromJSON for ShelleyTxAuxData, AllegraTxAuxData, AlonzoTxAuxData
* Add round-trip JSON property test for TxAuxData era
Add ToJSON/FromJSON instances for EraScript
* Add ToJSON/FromJSON as superclass constraints to EraScript
* Add ToJSON/FromJSON instances for MultiSig, Timelock and DijkstraNativeScript
* Add structured JSON serialisation for native scripts across all eras (Shelley, Allegra, Dijkstra)
* Add ToJSON/FromJSON instances for AlonzoScript with structured JSON format
* Rename kindObject (returning Value) to kindObjectValue; add new kindObject returning Aeson.Object
* Fix shelleyBasedEraNativeScriptToJSON and sizedNativeScriptGens to accept a child continuation to correctly handle nested scripts across eras
* Add round-trip JSON property tests for NativeScript and Script to the shared era spec
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
sim-rs: tighten quorum threshold rounding
Two paired fixes flagged in PR review:

- `vote_threshold()`: `(τ × expected_total_weight) as u64` truncated,
  so a non-exact product like 2.25 became 2 and a τ = 75% quorum
  accepted 2/3 = 67% of weight.  Switched to `.ceil() as u64`; with
  integer weights, the strict-less `voted_weight < threshold` check
  now enforces `Σ weight ≥ τ × total` exactly.  Mirrors the same fix
  in shared-consensus aggregation.

- `expected_total_weight` for `WfaLs`: built from `(persistent_voters
  + non_persistent_voters) as u64`, which truncated f64 sums.  A
  configured 600.7 quietly became 600, and any fractional sub-1
  configuration zeroed the denominator and trivialised the threshold.
  Switched to `.round() as u64` — closest integer matches the
  "expected committee size" semantic.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
shared-consensus: ceil() the quorum threshold to enforce the doc
`record_vote`'s doc says `Σ weight ≥ τ × expected_total_weight`,
but the integer threshold was computed via `as u64` truncation,
which accepts quorum at less than τ when the product isn't an exact
integer (e.g. total=3, τ=0.75 → 2.25 truncates to 2, so 2/3 = 67%
passes a 75% quorum).

Switch to `.ceil() as u64`. With integer weights and the strict-less
`voted_weight < threshold` check this enforces the documented
inequality exactly.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
sim-rs: replace vote-threshold with quorum-weight-fraction (CIP-164 PR #1196)
The YAML knob `vote-threshold: u64` (absolute count, mode-dependent
in meaning) is replaced by `quorum-weight-fraction: f64` (always a
fraction). The absolute threshold is derived at config build from
`quorum_weight_fraction × expected_total_weight`, with the
denominator per mode: PV+NPV seats (WfaLs), node count (Everyone),
total active stake (TopStakeFraction).

Default kept at 0.6 (legacy 300/500) in config.default.yaml to
preserve existing-experiment numerics; code default 0.75 (CIP-0164).

For TopStakeFraction, `try_vote_for_endorser_block` emits the
voter's own stake as the per-EB weight (rather than 1). The quorum
check is unchanged in form — `Σ weight ≥ vote_threshold()` — because
the threshold method now returns stake-denominated values.

`SimConfiguration::build` enforces σ_c > τ for TopStakeFraction and
bails with a clear error referencing the PR. Two new tests:
`top_stake_fraction_uses_stake_weighted_quorum` (per-voter weight =
stake, low-stake majority does NOT certify) and
`sim_config_rejects_top_stake_fraction_when_sigma_c_le_tau`.

`shared_consensus.rs` adapter: `derive_quorum_fraction` collapses to
a passthrough; expected_total_weight uses the new helper.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
shared-consensus: stake-weighted quorum for StakeCentile (CIP-164 PR #1196)
Quorum is now `Σ voter_stake ≥ τ × total_active_stake` under
StakeCentile committee selection. WfaLs and EveryoneVotes keep their
head-count semantics. The aggregator's per-voter weight unit is now
mode-polymorphic — seats for WfaLs, 1 for Everyone, voter stake for
StakeCentile — and the denominator returned by
`committee::expected_total_weight` matches.

`wfa.rs` is renamed to `committee.rs` since wFA^LS is one of three
schemes now, not the only one. `voter_weights` and the `weight`
parameter widen from u32 to u64 so stake values fit; quorum
comparisons follow.

`ElectionsConfig::validate()` enforces σ_c > τ at startup for
StakeCentile (PR #1196 §"Quorum as a stake threshold"); both the
sim-rs adapter and net-rs net-node panic on a misconfigured set.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
net-node/production: update try_produce_block doc to match BodyPath
The function-level doc still described the pre-BodyPath behaviour
("the RB body is empty" on overflow).  Under shared-consensus's
`production::BodyPath::decide` the RB body and a fresh EB
announcement can coexist: inline txs fill the RB body up to its
cap and the residual is announced via the EB.  Rewrite the doc
to cover the three actual outcomes (pure-RB, overflow split,
empty-for-safety).

Also drop the stale "(RB path only)" parenthetical on
`ProducedRb::included_tx_count` — the field counts inline txs in
both the pure-RB and overflow-split cases.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>