Artifacts generated from d4619a4ba4350e28146408a54736a351df12f78e
Home /
Input Output /
formal-ledger-specifications
May 01, 11-12 PM (0)
May 01, 12-1 PM (0)
May 01, 1-2 PM (0)
May 01, 2-3 PM (0)
May 01, 3-4 PM (0)
May 01, 4-5 PM (0)
May 01, 5-6 PM (0)
May 01, 6-7 PM (0)
May 01, 7-8 PM (0)
May 01, 8-9 PM (0)
May 01, 9-10 PM (0)
May 01, 10-11 PM (0)
May 01, 11-12 AM (0)
May 02, 12-1 AM (0)
May 02, 1-2 AM (0)
May 02, 2-3 AM (0)
May 02, 3-4 AM (0)
May 02, 4-5 AM (0)
May 02, 5-6 AM (0)
May 02, 6-7 AM (0)
May 02, 7-8 AM (0)
May 02, 8-9 AM (0)
May 02, 9-10 AM (0)
May 02, 10-11 AM (0)
May 02, 11-12 PM (0)
May 02, 12-1 PM (0)
May 02, 1-2 PM (0)
May 02, 2-3 PM (0)
May 02, 3-4 PM (0)
May 02, 4-5 PM (0)
May 02, 5-6 PM (0)
May 02, 6-7 PM (0)
May 02, 7-8 PM (0)
May 02, 8-9 PM (0)
May 02, 9-10 PM (0)
May 02, 10-11 PM (0)
May 02, 11-12 AM (0)
May 03, 12-1 AM (0)
May 03, 1-2 AM (0)
May 03, 2-3 AM (0)
May 03, 3-4 AM (0)
May 03, 4-5 AM (0)
May 03, 5-6 AM (0)
May 03, 6-7 AM (0)
May 03, 7-8 AM (0)
May 03, 8-9 AM (0)
May 03, 9-10 AM (0)
May 03, 10-11 AM (0)
May 03, 11-12 PM (0)
May 03, 12-1 PM (0)
May 03, 1-2 PM (0)
May 03, 2-3 PM (0)
May 03, 3-4 PM (0)
May 03, 4-5 PM (0)
May 03, 5-6 PM (0)
May 03, 6-7 PM (0)
May 03, 7-8 PM (0)
May 03, 8-9 PM (0)
May 03, 9-10 PM (0)
May 03, 10-11 PM (0)
May 03, 11-12 AM (0)
May 04, 12-1 AM (0)
May 04, 1-2 AM (0)
May 04, 2-3 AM (0)
May 04, 3-4 AM (0)
May 04, 4-5 AM (0)
May 04, 5-6 AM (0)
May 04, 6-7 AM (0)
May 04, 7-8 AM (0)
May 04, 8-9 AM (2)
May 04, 9-10 AM (2)
May 04, 10-11 AM (0)
May 04, 11-12 PM (0)
May 04, 12-1 PM (0)
May 04, 1-2 PM (0)
May 04, 2-3 PM (0)
May 04, 3-4 PM (0)
May 04, 4-5 PM (0)
May 04, 5-6 PM (0)
May 04, 6-7 PM (0)
May 04, 7-8 PM (0)
May 04, 8-9 PM (0)
May 04, 9-10 PM (0)
May 04, 10-11 PM (0)
May 04, 11-12 AM (0)
May 05, 12-1 AM (0)
May 05, 1-2 AM (0)
May 05, 2-3 AM (0)
May 05, 3-4 AM (3)
May 05, 4-5 AM (1)
May 05, 5-6 AM (0)
May 05, 6-7 AM (0)
May 05, 7-8 AM (0)
May 05, 8-9 AM (0)
May 05, 9-10 AM (0)
May 05, 10-11 AM (0)
May 05, 11-12 PM (0)
May 05, 12-1 PM (0)
May 05, 1-2 PM (0)
May 05, 2-3 PM (2)
May 05, 3-4 PM (0)
May 05, 4-5 PM (0)
May 05, 5-6 PM (0)
May 05, 6-7 PM (0)
May 05, 7-8 PM (0)
May 05, 8-9 PM (0)
May 05, 9-10 PM (0)
May 05, 10-11 PM (0)
May 05, 11-12 AM (0)
May 06, 12-1 AM (0)
May 06, 1-2 AM (0)
May 06, 2-3 AM (1)
May 06, 3-4 AM (11)
May 06, 4-5 AM (0)
May 06, 5-6 AM (0)
May 06, 6-7 AM (0)
May 06, 7-8 AM (0)
May 06, 8-9 AM (0)
May 06, 9-10 AM (0)
May 06, 10-11 AM (0)
May 06, 11-12 PM (0)
May 06, 12-1 PM (0)
May 06, 1-2 PM (0)
May 06, 2-3 PM (0)
May 06, 3-4 PM (0)
May 06, 4-5 PM (0)
May 06, 5-6 PM (0)
May 06, 6-7 PM (0)
May 06, 7-8 PM (0)
May 06, 8-9 PM (0)
May 06, 9-10 PM (0)
May 06, 10-11 PM (0)
May 06, 11-12 AM (0)
May 07, 12-1 AM (0)
May 07, 1-2 AM (0)
May 07, 2-3 AM (0)
May 07, 3-4 AM (0)
May 07, 4-5 AM (0)
May 07, 5-6 AM (0)
May 07, 6-7 AM (1)
May 07, 7-8 AM (0)
May 07, 8-9 AM (0)
May 07, 9-10 AM (0)
May 07, 10-11 AM (0)
May 07, 11-12 PM (0)
May 07, 12-1 PM (0)
May 07, 1-2 PM (0)
May 07, 2-3 PM (0)
May 07, 3-4 PM (0)
May 07, 4-5 PM (0)
May 07, 5-6 PM (0)
May 07, 6-7 PM (3)
May 07, 7-8 PM (8)
May 07, 8-9 PM (1)
May 07, 9-10 PM (0)
May 07, 10-11 PM (0)
May 07, 11-12 AM (3)
May 08, 12-1 AM (1)
May 08, 1-2 AM (0)
May 08, 2-3 AM (0)
May 08, 3-4 AM (0)
May 08, 4-5 AM (0)
May 08, 5-6 AM (0)
May 08, 6-7 AM (1)
May 08, 7-8 AM (3)
May 08, 8-9 AM (5)
May 08, 9-10 AM (0)
May 08, 10-11 AM (0)
May 08, 11-12 PM (0)
48 commits this week
May 01, 2026
-
May 08, 2026
Run agda with RTS options (to improve tc time)
Move hs-build step to nightly; run conformance tests after build
Improve tc time for Computational instance UTXO
Add missing premises
Remove cardano-ledger-executable-spec from CI
Add status badge to README
Remove html from pr+master CI
Add utxo0 binding in UTXOW
For consistency with SUBUTXOW
Artifacts generated from 6f4f3f0bf197e079807fd3c0765b7a10e91fc032
[Dijkstra] CIP-159-11c: Prove LEDGER preservation of value (#1187)
[Dijkstra] CIP-159-11b: Prove UTxO and UTxOW preservation of value (#1186)
Update Certs PoV proofs for direct-deposit application in POST-CERT (CIP-159)
After direct-deposit application moved from LEDGER-V/SUBLEDGER-V into the
POST-CERT rule, the Certs preservation-of-value proofs needed to account for
the `getCoin (DirectDepositsOf Γ)` increase that POST-CERT now produces via
`rewards ∪⁺ directDeposits`.
Statement changes:
- POST-CERT-pov: getCoin s ≡ getCoin s'
→ getCoin s + getCoin (DirectDepositsOf Γ) ≡ getCoin s'
- sts-pov: gains a `+ getCoin (DirectDepositsOf Γ)` term on the LHS
- CERTS-pov: becomes the symmetric "consumed = produced" form
getCoin s₁ + getCoin (DirectDepositsOf Γ)
≡ getCoin sₙ + getCoin (WithdrawalsOf Γ)
Structural changes:
- POST-CERT-pov and sts-pov move into the parameterized `Certs-Pov-lemmas`
sub-module (alongside PRE-CERT-pov), since they now require a fourth
module parameter:
indexedSumᵛ'-∪⁺ : ∀ (m m' : Rewards) → getCoin (m ∪⁺ m') ≡ getCoin m + getCoin m'
This is the natural ∪⁺ analogue of the existing `indexedSumᵛ'-∪` lemma for
`∪ˡ` on disjoint domains, but unconditional because `∪⁺` adds (rather than
drops) values at shared keys. TODO: upstream to agda-sets.
- `Certs-PoV` (in PoV.lagda.md) gains the same parameter and forwards it.
CERT-pov and PRE-CERT-pov are unchanged: the CERT and PRE-CERT rules did
not change in this refactor.
Closes part of #1185.
Artifacts generated from c984cccf9f26b8084474316ce0f58027223ac332
[Dijkstra] CIP-159-11c: Prove LEDGER preservation of value (#1187)
[Dijkstra] CIP-159-11b: Prove UTxO and UTxOW preservation of value (#1186)
[Dijkstra] CIP-159-11a: Prove Certs preservation of value (#1185)
[Dijkstra] CIP-159-10: Apply direct deposits in POST-CERT (#1122)
Per @carlostome's review of #1161, move CIP-159 direct-deposit application out of the LEDGER/SUBLEDGER orchestration rules and into the POST-CERT sub-rule of CERTS, alongside the existing voteDelegs filtering. CertEnv gains a sixth field, directDeposits, populated by LEDGER-V (DirectDepositsOf tx) and SUBLEDGER-V (DirectDepositsOf stx) when constructing each CERTS invocation's environment. POST-CERT (CERT-post) gains a premise dom directDeposits ⊆ dom rewards and updates its post-state's rewards to rewards ∪⁺ directDeposits. SUBLEDGER-V and LEDGER-V revert to threading-only: certStateWithDDeps, the certStateFinal let-binding, and the dom-check premises are removed. Computational instances are updated correspondingly. Per-transaction semantics are preserved (POST-CERT runs at the end of each transaction's CERTS invocation). Phantom-asset prevention via NoPhantomWithdrawals is unaffected (accountBalances is fixed at the pre-batch snapshot). depositsChange remains orthogonal (applyDirectDeposits touches rewards only; calculateDepositsChange reads deposits only). Direct-deposit documentation moves from Ledger.lagda.md to the POST-CERT section of Certs.lagda.md.
add justification for batch processing of direct deposits
LEDGER-V: forbid direct deposits to credentials deregistered in same batch
`applyDirectDeposits` uses `∪⁺` (union-with-addition) on the `rewards`
map, so a credential not present in `RewardsOf certState₂` is added as a
new entry rather than rejected. The pre-existing SUBUTXO/UTXO premise
`dom (DirectDepositsOf tx) ⊆ dom (AccountBalancesOf Γ)` only checks
against the pre-batch balances `RewardsOf certState₀`, so it does not
catch the case where a credential is registered pre-batch, deregistered
during `CERTS`, and direct-deposited to in the same batch. Without the
new premise, the resulting `certStateFinal` is internally inconsistent:
the credential has a positive `rewards` entry but no corresponding
`voteDelegs`, `stakeDelegs`, or `deposits` entry — effectively re-
registering the credential without a key deposit.
Add the phase-1 premise
dom (allDirectDeposits tx) ⊆ dom (RewardsOf certState₂)
to `LEDGER-V` to rule this out. Filtering `allDirectDeposits tx` by
`dom (RewardsOf certState₂)` would be an alternative, but it would
silently destroy user funds when a deposit and a deregistration race in
the same batch. The premise is symmetric to (and complements) the
existing pre-batch SUBUTXO/UTXO check.
Update `Ledger/Properties/Computational.lagda.md` for the new premise,
and pass `UTxOStateOf s₁` explicitly to `computeUtxow` in the LEDGER
valid branch (the previous `_` resolved by chained unification through
the LEDGER-V constructor, which was fragile and obscured intent).
TODO: fix `Ledger/Properties/Computational.lagda.md`; it's choking on
the new premise.
[Dijkstra] CIP-159-10: Apply batch-wide direct deposits in LEDGER rule (#1122)
After all sub-rule transitions (`SUBLEDGERS`, `CERTS`, `GOVS`, `UTXOW`), apply batch-wide direct deposits to the final CertState via `applyDirectDeposits` and `allDirectDeposits`. `Ledger.lagda.md`: + Update `LEDGER-V` output: compute `certStateFinal` by applying `allDirectDeposits` to `certState₂`, use `certStateFinal` in the output `LedgerState` and in `rmOrphanDRepVotes`; + `LEDGER-I` unchanged (invalid batches don't apply deposits); + Document direct deposit application ordering and phantom asset prevention rationale. `Ledger/Properties/Computational.lagda.md`: + Update `computeProof` valid branch to compute `certStateFinal` and use it in the output `LedgerState`. + Clean up redundant code.
Apply CIP-159 direct deposits per-transaction, not batch-wide
Each transaction's `txDirectDeposits` are now applied to the threaded
`CertState` immediately after that transaction's `CERTS` step, replacing
the batch-wide application introduced earlier on this branch.
* `SUBLEDGER-V` applies `DirectDepositsOf stx` to `certState₁` after
`CERTS` and emits the result.
* `LEDGER-V` still applies the top-level transaction's deposits to
`certState₂` after the top-level `CERTS`, but the premise now bounds
`dom (DirectDepositsOf tx)` rather than the batch aggregate
`dom (allDirectDeposits tx)`.
* `certStateWithDDeps` is generalised to
`∀ {ℓ} → Tx ℓ → CertState → CertState` so both rules can invoke it
with the local `DirectDepositsOf`.
The original draft of this branch argued that batch-wide application
made CIP-159's phantom-asset prohibition manifest in the rule
structure. Per-transaction application is equally safe: the prohibition
is enforced separately by `NoPhantomWithdrawals` in the `Utxo` module,
which bounds batch-wide withdrawal totals against the `accountBalances`
field of `UTxOEnv`/`SubUTxOEnv` — fixed at the pre-batch snapshot
`RewardsOf certState₀` regardless of when (or how) deposits are applied
to the threaded `CertState`. Per-transaction application also mirrors
the Haskell ledger executor's sequential per-transaction processing,
which simplifies the conformance proof and avoids a structural gap
between the spec and the implementation.
A direct-deposit registration premise is added to each rule to prevent
`applyDirectDeposits` from silently re-introducing a credential into
`rewards` after deregistration earlier in the same transaction:
* `SUBLEDGER-V` requires
`dom (DirectDepositsOf stx) ⊆ dom (RewardsOf certState₁)`.
* `LEDGER-V` requires
`dom (DirectDepositsOf tx) ⊆ dom (RewardsOf certState₂)`.
The check is local to each transaction's post-`CERTS` state, so a
sub-transaction whose deposit targets a credential deregistered by an
earlier sub-transaction in the same batch will fail the premise.
`Computational-SUBLEDGER` and `Computational-LEDGER` are updated to
dispatch on these decidable premises in `computeProof` and
`completeness`. `depositsChange` is unaffected: it reads only the
protocol-deposit fields of `DState`/`PState`/`GState`, which
`applyDirectDeposits` does not touch.
Refs: #1122
[Dijkstra] CIP-159-11a: Prove Certs preservation of value (#1185)
[Dijkstra] CIP-159-11a: Prove Certs preservation of value (#1185)
[Dijkstra] CIP-159-10: Apply direct deposits in POST-CERT (#1122)
Per @carlostome's review of #1161, move CIP-159 direct-deposit application out of the LEDGER/SUBLEDGER orchestration rules and into the POST-CERT sub-rule of CERTS, alongside the existing voteDelegs filtering. CertEnv gains a sixth field, directDeposits, populated by LEDGER-V (DirectDepositsOf tx) and SUBLEDGER-V (DirectDepositsOf stx) when constructing each CERTS invocation's environment. POST-CERT (CERT-post) gains a premise dom directDeposits ⊆ dom rewards and updates its post-state's rewards to rewards ∪⁺ directDeposits. SUBLEDGER-V and LEDGER-V revert to threading-only: certStateWithDDeps, the certStateFinal let-binding, and the dom-check premises are removed. Computational instances are updated correspondingly. Per-transaction semantics are preserved (POST-CERT runs at the end of each transaction's CERTS invocation). Phantom-asset prevention via NoPhantomWithdrawals is unaffected (accountBalances is fixed at the pre-batch snapshot). depositsChange remains orthogonal (applyDirectDeposits touches rewards only; calculateDepositsChange reads deposits only). Direct-deposit documentation moves from Ledger.lagda.md to the POST-CERT section of Certs.lagda.md.