(RM) Forcing PR diff view on GH
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 (25)
3,674 commits this week
May 20, 2026
-
May 27, 2026
Warm up KZG trusted setup before opening API server socket
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
Add ToJSON/FromJSON instances for EraTxOut
* Add FromJSON (TxOut era) as EraTxOut superclass constraint * Add FromJSON t as Val t superclass constraint * Add ToJSON/FromJSON for Datum era * Add FromJSON for ShelleyTxOut, AlonzoTxOut, BabbageTxOut * Add FromJSON for MaryValue; fix FromJSON/FromJSONKey for AssetName to hex-decode * Add round-trip JSON property test for TxOut 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]>
Merge pull request #905 from input-output-hk/prc/con-allow-eb-and-inline
shared-consensus: let RB body and EB announcement coexist on overflow
Add custom validator and generator for sets
improve verification result handling
Add subtransactions custom generator
Add custom generator to constr
Scale down tests to make test suites run faster
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]>
shared-consensus: let RB body and EB announcement coexist on overflow
CIP-0164 §Step 1: "EBs should only be announced if a transaction
cannot be included in the base RB." The spec's intent is to fill
the RB body first and announce an EB for what doesn't fit; only
cert + inline body is mutually exclusive (§Step 5 rule 1).
shared-consensus had been treating the overflow case as XOR — when
mempool > rb_body_max_bytes the body went empty and the manifest
went to a new EB — so a lazy-voter quorum miss left the next RB with
no inline txs and no Praos liveness.
Reshape `BodyPath` from a 3-variant enum (Empty | Inline | Eb) into
a single struct `{ inline: Vec<PendingTx>, manifest: Vec<TxId> }`.
The four legal CIP-0164 combinations all encode directly via which
fields are empty. The overflow branch of `decide` drains
rb_body_max_bytes into `inline` (skipped when a cert ships, per
cert-XOR-inline-body) and then collects the FIFO residual into
`manifest`. When a single oversize tx exhausts the mempool, the
manifest falls out empty and no EB is announced — the struct shape
expresses that without a defensive branch.
Consumers updated:
- net-node mempool wrapper mirrors the struct shape; production
emits the EB iff manifest_hashes is non-empty.
- sim-rs shared_consensus adapter does the same.
Verified end-to-end with a 30-node cluster + lazy-voter behaviour
(fraction 0.5, quorum threshold 75%): every produced RB shows
tx_count=7-9 has_eb=true, matching the inline-body-fills-cap +
EB-carries-residual shape. Quorum never reaches, EB certs never
form, but Praos liveness via inline body is preserved.
Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
Add Spec.Data.Value.Budget — non-builtin valueOf evidence
Adds `Spec.Data.Value.Budget` with the lookup matrix for `valueOf` across S1 / S3 / S8 / S100 value shapes at ada / middle / last / miss positions, plus the standalone `unsafeDataAsValue` baseline per shape. Generated 96 golden files (eval / pir / uplc per bundle, 32 bundles total) capture CPU and Memory cost evidence. Companion to the merge PR for `valueOf` rewrite. This branch is kept separate so the goldens — which only regenerate on upstream plugin or cost-model changes, not on actual regressions — don't bloat the main PR's diff or CI. For IntersectMBO/plutus-private#2242.
Optimal non-builtin valueOf in plutus-ledger-api Data.Value
Rewrites `PlutusLedgerApi.V1.Data.Value.valueOf` so the non-builtin lookup path walks the underlying `BuiltinList` directly via `unsafeDataAsMap` / `unsafeDataAsB` / `unsafeDataAsI`, compares keys with `equalsByteString`, and short-circuits on the first match. No `Maybe` is materialised: the "absent" answer is `0`, returned in-place by the `nilCase` of each traversal. Avoids `withCurrencySymbol`'s continuation + `Map.lookup`'s `Maybe`-wrapping, and bypasses the `ToData k`/`UnsafeFromData a` dictionary work that `AssocMap.lookup` does per element. Semantics preserved. Adds `Spec.Data.Value.test_valueOf`: a QuickCheck property that compiles `valueOf` via TH, evaluates it on the CEK machine, and compares the result against the host-Haskell `valueOf` for the same inputs. Differential test against the Plinth compiler — any divergence is a compilation bug, not a semantics bug. Budget evidence (lookup matrix, `unsafeDataAsValue` baseline) lives on the companion experimental branch `yura/issue-2242-valueof-evidence`, kept out of this PR to avoid carrying ~96 golden files that would only ever regenerate on upstream plugin/cost-model changes. For IntersectMBO/plutus-private#2242.