Jun 01, 11-12 PM (27)
Jun 01, 12-1 PM (49)
Jun 01, 1-2 PM (40)
Jun 01, 2-3 PM (44)
Jun 01, 3-4 PM (34)
Jun 01, 4-5 PM (54)
Jun 01, 5-6 PM (5)
Jun 01, 6-7 PM (32)
Jun 01, 7-8 PM (37)
Jun 01, 8-9 PM (9)
Jun 01, 9-10 PM (12)
Jun 01, 10-11 PM (30)
Jun 01, 11-12 AM (22)
Jun 02, 12-1 AM (13)
Jun 02, 1-2 AM (8)
Jun 02, 2-3 AM (5)
Jun 02, 3-4 AM (14)
Jun 02, 4-5 AM (10)
Jun 02, 5-6 AM (43)
Jun 02, 6-7 AM (32)
Jun 02, 7-8 AM (58)
Jun 02, 8-9 AM (65)
Jun 02, 9-10 AM (28)
Jun 02, 10-11 AM (19)
Jun 02, 11-12 PM (15)
Jun 02, 12-1 PM (47)
Jun 02, 1-2 PM (66)
Jun 02, 2-3 PM (97)
Jun 02, 3-4 PM (23)
Jun 02, 4-5 PM (17)
Jun 02, 5-6 PM (27)
Jun 02, 6-7 PM (29)
Jun 02, 7-8 PM (18)
Jun 02, 8-9 PM (9)
Jun 02, 9-10 PM (19)
Jun 02, 10-11 PM (33)
Jun 02, 11-12 AM (22)
Jun 03, 12-1 AM (13)
Jun 03, 1-2 AM (31)
Jun 03, 2-3 AM (16)
Jun 03, 3-4 AM (0)
Jun 03, 4-5 AM (7)
Jun 03, 5-6 AM (12)
Jun 03, 6-7 AM (80)
Jun 03, 7-8 AM (16)
Jun 03, 8-9 AM (24)
Jun 03, 9-10 AM (22)
Jun 03, 10-11 AM (39)
Jun 03, 11-12 PM (76)
Jun 03, 12-1 PM (93)
Jun 03, 1-2 PM (28)
Jun 03, 2-3 PM (62)
Jun 03, 3-4 PM (26)
Jun 03, 4-5 PM (24)
Jun 03, 5-6 PM (23)
Jun 03, 6-7 PM (15)
Jun 03, 7-8 PM (17)
Jun 03, 8-9 PM (19)
Jun 03, 9-10 PM (9)
Jun 03, 10-11 PM (31)
Jun 03, 11-12 AM (14)
Jun 04, 12-1 AM (12)
Jun 04, 1-2 AM (4)
Jun 04, 2-3 AM (1)
Jun 04, 3-4 AM (5)
Jun 04, 4-5 AM (1)
Jun 04, 5-6 AM (0)
Jun 04, 6-7 AM (14)
Jun 04, 7-8 AM (10)
Jun 04, 8-9 AM (11)
Jun 04, 9-10 AM (19)
Jun 04, 10-11 AM (11)
Jun 04, 11-12 PM (14)
Jun 04, 12-1 PM (53)
Jun 04, 1-2 PM (39)
Jun 04, 2-3 PM (60)
Jun 04, 3-4 PM (12)
Jun 04, 4-5 PM (4)
Jun 04, 5-6 PM (7)
Jun 04, 6-7 PM (46)
Jun 04, 7-8 PM (27)
Jun 04, 8-9 PM (4)
Jun 04, 9-10 PM (2)
Jun 04, 10-11 PM (24)
Jun 04, 11-12 AM (7)
Jun 05, 12-1 AM (6)
Jun 05, 1-2 AM (8)
Jun 05, 2-3 AM (1)
Jun 05, 3-4 AM (1)
Jun 05, 4-5 AM (1)
Jun 05, 5-6 AM (5)
Jun 05, 6-7 AM (9)
Jun 05, 7-8 AM (9)
Jun 05, 8-9 AM (8)
Jun 05, 9-10 AM (11)
Jun 05, 10-11 AM (12)
Jun 05, 11-12 PM (8)
Jun 05, 12-1 PM (52)
Jun 05, 1-2 PM (61)
Jun 05, 2-3 PM (26)
Jun 05, 3-4 PM (24)
Jun 05, 4-5 PM (17)
Jun 05, 5-6 PM (7)
Jun 05, 6-7 PM (14)
Jun 05, 7-8 PM (10)
Jun 05, 8-9 PM (6)
Jun 05, 9-10 PM (2)
Jun 05, 10-11 PM (20)
Jun 05, 11-12 AM (9)
Jun 06, 12-1 AM (6)
Jun 06, 1-2 AM (0)
Jun 06, 2-3 AM (3)
Jun 06, 3-4 AM (4)
Jun 06, 4-5 AM (0)
Jun 06, 5-6 AM (24)
Jun 06, 6-7 AM (1)
Jun 06, 7-8 AM (2)
Jun 06, 8-9 AM (3)
Jun 06, 9-10 AM (0)
Jun 06, 10-11 AM (3)
Jun 06, 11-12 PM (6)
Jun 06, 12-1 PM (2)
Jun 06, 1-2 PM (2)
Jun 06, 2-3 PM (2)
Jun 06, 3-4 PM (18)
Jun 06, 4-5 PM (1)
Jun 06, 5-6 PM (6)
Jun 06, 6-7 PM (0)
Jun 06, 7-8 PM (6)
Jun 06, 8-9 PM (0)
Jun 06, 9-10 PM (1)
Jun 06, 10-11 PM (27)
Jun 06, 11-12 AM (9)
Jun 07, 12-1 AM (14)
Jun 07, 1-2 AM (2)
Jun 07, 2-3 AM (0)
Jun 07, 3-4 AM (0)
Jun 07, 4-5 AM (1)
Jun 07, 5-6 AM (1)
Jun 07, 6-7 AM (3)
Jun 07, 7-8 AM (0)
Jun 07, 8-9 AM (0)
Jun 07, 9-10 AM (1)
Jun 07, 10-11 AM (2)
Jun 07, 11-12 PM (2)
Jun 07, 12-1 PM (5)
Jun 07, 1-2 PM (35)
Jun 07, 2-3 PM (2)
Jun 07, 3-4 PM (4)
Jun 07, 4-5 PM (2)
Jun 07, 5-6 PM (4)
Jun 07, 6-7 PM (0)
Jun 07, 7-8 PM (0)
Jun 07, 8-9 PM (17)
Jun 07, 9-10 PM (1)
Jun 07, 10-11 PM (21)
Jun 07, 11-12 AM (9)
Jun 08, 12-1 AM (9)
Jun 08, 1-2 AM (5)
Jun 08, 2-3 AM (3)
Jun 08, 3-4 AM (4)
Jun 08, 4-5 AM (2)
Jun 08, 5-6 AM (9)
Jun 08, 6-7 AM (5)
Jun 08, 7-8 AM (25)
Jun 08, 8-9 AM (35)
Jun 08, 9-10 AM (37)
Jun 08, 10-11 AM (14)
Jun 08, 11-12 PM (3)
2,918 commits this week Jun 01, 2026 - Jun 08, 2026
testnet(amaru): bump bootstrap-producer image to fba902da
Pin cardano_amaru to the producer image published from amaru-bootstrap main
(lambdasistemi/amaru-bootstrap@fba902da), which bundles amaru
feat/testnet-bootstrap: create-snapshots offline mode + bootstrap migration,
runtime era-history/global-parameters, testnet tvar era-history sidecar fix,
and the short-epoch ledger/consensus fixes.
db-analyser: replay up to --analyse-from before analysing
Previously, when starting an analysis from a ledger state, openLedgerDB
loaded the newest snapshot at or before --analyse-from but used an empty
stream, so no blocks were replayed. If no snapshot existed exactly at the
requested slot, the analysis silently started at the older snapshot's tip
instead of at --analyse-from.

Hand openLedgerDB the ImmutableDB and replay blocks on top of the chosen
snapshot up to the replay goal (the --analyse-from point), so the ledger
state is exactly there before the analysis begins. The stream stops at the
first block past the goal, mirroring the StartFromPoint behaviour where
the analyse-from block is the anchor and processing starts after it.

Emit a warning when no snapshot exists exactly at the requested slot, since
the replay from an older snapshot up to the goal can be slow.
fix(ledger): forecast testnet stake distribution lookups
Port of lambdasistemi 36ea009c onto upstream/main's rewritten state.rs.

Generated private testnets (db-synthesizer / amaru-bootstrap) can serve
block headers from the next leader schedule before the stable ledger
has materialized that epoch's snapshot. Add an opt-in forecast on
StakeDistributionObserver::get_pool that falls back to the latest
cached distribution when the requested epoch is strictly newer; only
enabled for NetworkName::Testnet(_).

Public networks (mainnet/preprod/preview) keep the existing strict
lookup behaviour.

Signed-off-by: paolino <[email protected]>
fix(bootstrap): honor era-history sidecar when importing testnet tvar snapshots
The node-snapshot (tvar) import path derived the current era's epoch size
from the network default (86400), ignoring custom-testnet genesis. Load the
history.<slot>.<hash>.json sidecar (as the .cbor path already does via
make_era_history) and use it to interpret the snapshot, but only for
Testnet(_); public networks keep the snapshot-derived history unchanged.

Signed-off-by: paolino <[email protected]>
fix(ledger): saturate epoch subtraction in stake distribution lookups
Two sites in amaru-ledger/src/state.rs were doing unchecked Epoch
subtraction on a u64-backed Epoch, producing u64::MAX-1 (or panicking,
depending on overflow checks) when the latest snapshot or the
slot-derived current epoch was below the rewards/leader-schedule
horizon (epoch < 2):

- StakeDistributionObserver::get_pool: `current_epoch - 2` becomes
  saturating_sub(2). Headers validated very early in the chain (or
  with a custom era history that maps slots to low epoch numbers)
  no longer surface a misleading
  "no stake distribution available for pool access 18446744073709551614"
  — the error now correctly says "pool access 0" and points at a
  real missing snapshot.

- initial_stake_distributions: `latest_epoch - Epoch::from(2)` and
  `- Epoch::from(1)` become saturating_sub(2) / saturating_sub(1).
  Bundles produced by amaru-bootstrap from cold-start short-epoch
  testnets (e.g. lambdasistemi/amaru-bootstrap#34's antithesis
  reproducer) where the most_recent_snapshot is epoch 0 or 1 no
  longer hit a u64 underflow on Ledger::new; for_epoch(0) is
  exercised normally and surfaces a sensible StoreError if the
  snapshot is genuinely absent.

This is a defensive correctness improvement only — it does not change
behaviour for any chain past epoch 2. Surfaced by the new live
amaru-run consumer test in lambdasistemi/amaru-bootstrap#35.

Signed-off-by: Paolo Veronelli <[email protected]>
Signed-off-by: paolino <[email protected]>