Skip to content

Commit 754b432

Browse files
committed
feat(Dijkstra/Ledger/PoV): prove SUBLEDGERS-utxo-coin
Proves by induction on the SUBLEDGERS transition that the UTxO-state coin total at the start of a sub-tx batch plus all outs + donations equals the UTxO coin total at the end plus all consumed spend inputs (compared against the batch-start snapshot `utxo₀`): ```agda getCoin (UTxOStateOf s₀) + Σ (cbalance (outs stx) + DonationsOf stx) ≡ getCoin (UTxOStateOf s₁) + Σ cbalance (utxo₀ ∣ SpendInputsOf stx) ``` Base case (`BS-base Id-nop`): both sides reduce to `x + 0`, so `refl`. Inductive case: `SUBLEDGER-I` is impossible under `isTopLevelValid ≡ true`; `SUBLEDGER-V` combines the per-step SUBUTXOW balance with the IH via an eight-step +-commutative-monoid rearrangement. Introduces `subutxow-step-coin` as a new module parameter: ```agda getCoin s₀ + cbalance (outs stx) + DonationsOf stx ≡ getCoin s₁ + cbalance (UTxOOf Γ ∣ SpendInputsOf stx) ``` + Rationale for keeping this as a parameter at the SUBLEDGERS level: proving it locally requires, beyond `balance-∪` and `split-balance`, two batch-wide invariants: 1. the running UTxO agrees with `utxo₀` on every sub-tx's spend inputs, and 2. freshness of each sub-tx's TxId relative to the running UTxO neither of which is a local SUBUTXO premise; both follow from batch-wide disjointness exposed by the outer UTXO rule and will be discharged in a follow-up PR dedicated to general Dijkstra PoV infrastructure. Statement parallels the existing `SUBLEDGERS-certs-pov`, uses `SubLedgerEnv.utxo₀ Γ` uniformly on the RHS (matching the shape of `batch-balance-coin`), and is the key lemma needed to derive `batch-utxo-accounting` internally in the next step of this PR.
1 parent 08a09e5 commit 754b432

4 files changed

Lines changed: 110 additions & 107 deletions

File tree

src/Ledger/Dijkstra/Specification/Ledger/Properties/PoV.lagda.md

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,20 @@ module _
206206
207207
( setToList-Unique : ∀ (m : Withdrawals) → Unique (map (stake ∘ proj₁) (setToList (m ˢ))) )
208208
209+
( balance-∪ : ∀ {u u' : UTxO} → disjoint (dom u) (dom u') → cbalance (u ∪ˡ u') ≡ cbalance u + cbalance u' )
210+
211+
( split-balance : ∀ (u : UTxO) (keys : ℙ TxIn) → cbalance u ≡ cbalance (u ∣ keys ᶜ) + cbalance (u ∣ keys) )
212+
213+
-- Per-step SUBUTXOW coin equation. Assumed for now; a local proof
214+
-- would require, in addition to `balance-∪` and `split-balance`, a
215+
-- batch-wide "spend inputs preserved" invariant (the running UTxO
216+
-- agrees with the snapshot on every sub-tx's spend inputs) and
217+
-- freshness of each sub-tx's TxId relative to the running UTxO.
218+
-- See the follow-up PR plan.
219+
( subutxow-step-coin : ∀ {Γ : SubUTxOEnv} {s₀ s₁ : UTxOState} {stx : SubLevelTx}
220+
→ IsTopLevelValidFlagOf Γ ≡ true → Γ ⊢ s₀ ⇀⦇ stx ,SUBUTXOW⦈ s₁
221+
→ getCoin s₀ + cbalance (outs stx) + DonationsOf stx ≡ getCoin s₁ + cbalance (UTxOOf Γ ∣ SpendInputsOf stx) )
222+
209223
-- Sub-lemmas (assumptions for now) --
210224
211225
-- CIP-159–specific assumption: ∪⁺ adds getCoin values
@@ -228,9 +242,59 @@ module _
228242
open Certs-PoV ∪ˡ-res-lookup-preserve sum-map-proj₂≡getCoin setToList-Unique
229243
open ≡-Reasoning
230244
231-
232-
SUBLEDGERS-certs-pov :
233-
∀ {Γ : SubLedgerEnv} {s₀ s₁ : LedgerState} {stxs : List SubLevelTx}
245+
SUBLEDGERS-utxo-coin : ∀ {Γ : SubLedgerEnv} {s₀ s₁ : LedgerState} {stxs : List SubLevelTx}
246+
→ SubLedgerEnv.isTopLevelValid Γ ≡ true
247+
→ Γ ⊢ s₀ ⇀⦇ stxs ,SUBLEDGERS⦈ s₁
248+
→ getCoin (UTxOStateOf s₀) + sum (map (λ stx → cbalance (outs stx) + DonationsOf stx) stxs)
249+
≡ getCoin (UTxOStateOf s₁) + sum (map (λ stx → cbalance (SubLedgerEnv.utxo₀ Γ ∣ SpendInputsOf stx)) stxs)
250+
251+
-- Base case: empty list. `Id-nop` unifies s₀ ≡ s₁, and
252+
-- `sum (map _ []) = 0` on both sides, giving `refl`.
253+
SUBLEDGERS-utxo-coin isV (BS-base Id-nop) = refl
254+
-- Inductive step: one SUBLEDGER step + rest.
255+
-- SUBLEDGER-I is ruled out by `isV : isTopLevelValid ≡ true`.
256+
-- In the SUBLEDGER-V case, combine the per-step SUBUTXOW balance
257+
-- (via `subutxow-step-coin`) with the IH using a small +-monoid shuffle.
258+
SUBLEDGERS-utxo-coin {Γ} isV
259+
(BS-ind {s = s₀} {s' = s₁} {sigs} {s'' = sₙ} step rest) with step
260+
... | SUBLEDGER-I (isI , _) =
261+
⊥-elim (case trans (sym isV) isI of λ ())
262+
... | SUBLEDGER-V {stx = stx} (isV' , subutxowStep , _ , _) =
263+
begin
264+
U₀ + (p-stx + p-sum) ≡⟨ sym (+-assoc U₀ p-stx p-sum) ⟩
265+
(U₀ + p-stx) + p-sum ≡⟨ cong (_+ p-sum) step-P-C ⟩
266+
(U₁ + c-stx) + p-sum ≡⟨ +-assoc U₁ c-stx p-sum ⟩
267+
U₁ + (c-stx + p-sum) ≡⟨ cong (U₁ +_) (+-comm c-stx p-sum) ⟩
268+
U₁ + (p-sum + c-stx) ≡⟨ sym (+-assoc U₁ p-sum c-stx) ⟩
269+
(U₁ + p-sum) + c-stx ≡⟨ cong (_+ c-stx) ih ⟩
270+
(Uₙ + c-sum) + c-stx ≡⟨ +-assoc Uₙ c-sum c-stx ⟩
271+
Uₙ + (c-sum + c-stx) ≡⟨ cong (Uₙ +_) (+-comm c-sum c-stx) ⟩
272+
Uₙ + (c-stx + c-sum) ∎
273+
where
274+
-- Abbreviations for the three utxo-state coin totals.
275+
U₀ = getCoin (UTxOStateOf s₀)
276+
U₁ = getCoin (UTxOStateOf s₁)
277+
Uₙ = getCoin (UTxOStateOf sₙ)
278+
-- Per-element summands, split into "head" (stx) and "tail" (sigs).
279+
p-stx = cbalance (outs stx) + DonationsOf stx
280+
c-stx = cbalance (SubLedgerEnv.utxo₀ Γ ∣ SpendInputsOf stx)
281+
p-sum = sum (map (λ stx → cbalance (outs stx) + DonationsOf stx) sigs)
282+
c-sum = sum (map (λ stx → cbalance (SubLedgerEnv.utxo₀ Γ ∣ SpendInputsOf stx)) sigs)
283+
-- Single-step coin equation from the SUBUTXOW step assumption.
284+
-- (Left-associated: `U₀ + cbalance outs + donations`.)
285+
step-eq : U₀ + cbalance (outs stx) + DonationsOf stx
286+
≡ U₁ + c-stx
287+
step-eq = subutxow-step-coin isV' subutxowStep
288+
-- Re-associate so the (cbalance outs + donations) summand is a
289+
-- single term on the LHS, matching the shape of the goal.
290+
step-P-C : U₀ + p-stx ≡ U₁ + c-stx
291+
step-P-C = trans (sym (+-assoc U₀ (cbalance (outs stx)) (DonationsOf stx)))
292+
step-eq
293+
-- Inductive hypothesis for the tail `sigs`.
294+
ih : U₁ + p-sum ≡ Uₙ + c-sum
295+
ih = SUBLEDGERS-utxo-coin isV rest
296+
297+
SUBLEDGERS-certs-pov : ∀ {Γ : SubLedgerEnv} {s₀ s₁ : LedgerState} {stxs : List SubLevelTx}
234298
→ SubLedgerEnv.isTopLevelValid Γ ≡ true
235299
→ Γ ⊢ s₀ ⇀⦇ stxs ,SUBLEDGERS⦈ s₁
236300
→ getCoin (CertStateOf s₀)

src/Ledger/Dijkstra/Specification/Utxo.lagda.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,12 @@ instance
232232
HasDepositsChangeSub-DepositsChange : HasDepositsChangeSub DepositsChange
233233
HasDepositsChangeSub-DepositsChange .DepositsChangeSubOf = DepositsChange.depositsChangeSub
234234
235+
HasDepositsChangeTop-UTxOEnv : HasDepositsChangeTop UTxOEnv
236+
HasDepositsChangeTop-UTxOEnv .DepositsChangeTopOf = DepositsChangeTopOf ∘ DepositsChangeOf
237+
238+
HasDepositsChangeSub-UTxOEnv : HasDepositsChangeSub UTxOEnv
239+
HasDepositsChangeSub-UTxOEnv .DepositsChangeSubOf = DepositsChangeSubOf ∘ DepositsChangeOf
240+
235241
unquoteDecl HasCast-DepositsChange
236242
HasCast-UTxOEnv
237243
HasCast-SubUTxOEnv

src/Ledger/Dijkstra/Specification/Utxo/Properties/PoV.lagda.md

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ coin-of-producedBatch tx dc = begin
403403
swap-right a b c = trans (+-assoc a b c) (trans (cong (a +_) (+-comm b c)) (sym (+-assoc a c b)))
404404
405405
406-
module _
406+
module UTxO-PoV
407407
(tx : TopLevelTx) (let open Tx tx; open TxBody txBody)
408408
409409
-- ASSUMPTIONS --
@@ -528,25 +528,25 @@ proof actually consumes. We expose it as a separate lemma here.
528528
```agda
529529
batch-balance-coin : (Γ , legacyMode) ⊢ s₀ ⇀⦇ tx ,UTXO⦈ s₁
530530
→ cbalance (UTxOOf Γ ∣ SpendInputsOf tx) + getCoin (WithdrawalsOf tx)
531-
+ negPart (DepositsChangeTopOf (DepositsChangeOf Γ))
531+
+ negPart (DepositsChangeTopOf Γ)
532532
+ sum ( map (λ stx → cbalance (UTxOOf Γ ∣ SpendInputsOf stx) + getCoin (WithdrawalsOf stx))
533533
(SubTransactionsOf tx) )
534-
+ negPart (DepositsChangeSubOf (DepositsChangeOf Γ))
534+
+ negPart (DepositsChangeSubOf Γ)
535535
≡ cbalance (outs tx) + TxFeesOf tx + DonationsOf tx + getCoin (DirectDepositsOf tx)
536-
+ posPart (DepositsChangeTopOf (DepositsChangeOf Γ))
536+
+ posPart (DepositsChangeTopOf Γ)
537537
+ sum ( map (λ stx → cbalance (outs stx) + DonationsOf stx + getCoin (DirectDepositsOf stx))
538538
(SubTransactionsOf tx))
539-
+ posPart (DepositsChangeSubOf (DepositsChangeOf Γ))
539+
+ posPart (DepositsChangeSubOf Γ)
540540
541541
batch-balance-coin {Γ = Γ} (UTXO-⋯ _ _ _ _ _ _ _ batchBal _ _ _ _ _ _ _ _ _ _ _ _ _ _ _) =
542542
begin
543-
cbalance (UTxOOf Γ ∣ SpendInputsOf tx) + getCoin (WithdrawalsOf tx) + negPart (DepositsChangeTopOf (DepositsChangeOf Γ)) + _ + _
543+
cbalance (UTxOOf Γ ∣ SpendInputsOf tx) + getCoin (WithdrawalsOf tx) + negPart (DepositsChangeTopOf Γ) + _ + _
544544
≡˘⟨ coin-of-consumedBatch tx (DepositsChangeOf Γ) (UTxOOf Γ) noMintTx noMintSubTx ⟩
545545
coin (consumedBatch (DepositsChangeOf Γ) tx (UTxOOf Γ))
546546
≡⟨ cong coin batchBal ⟩
547547
coin (producedBatch (DepositsChangeOf Γ) tx)
548548
≡⟨ coin-of-producedBatch tx (DepositsChangeOf Γ) ⟩
549-
cbalance (outs tx) + TxFeesOf tx + DonationsOf tx + getCoin (DirectDepositsOf tx) + posPart (DepositsChangeTopOf (DepositsChangeOf Γ)) + _ + _
549+
cbalance (outs tx) + TxFeesOf tx + DonationsOf tx + getCoin (DirectDepositsOf tx) + posPart (DepositsChangeTopOf Γ) + _ + _
550550
551551
```
552552

@@ -574,8 +574,7 @@ when combined with the `SUBLEDGERS-pov`{.AgdaFunction} lemma.
574574

575575
```agda
576576
{--
577-
UTXO-pov :
578-
∀ {Γ : UTxOEnv} {legacyMode : Bool} {s₀ s₁ : UTxOState}
577+
UTXO-pov : ∀ {Γ : UTxOEnv} {legacyMode : Bool} {s₀ s₁ : UTxOState}
579578
→ TxIdOf tx ∉ mapˢ proj₁ (dom (UTxOOf s₀))
580579
→ (Γ , legacyMode) ⊢ s₀ ⇀⦇ tx ,UTXO⦈ s₁
581580
→ getCoin s₀

src/Ledger/Dijkstra/Specification/Utxow/Properties/PoV.lagda.md

Lines changed: 29 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,9 @@ and `UTXOW-legacy`{.AgdaInductiveConstructor} embed a `UTXO`{.AgdaDatatype}
4848
derivation as their final premise. We factor out an extractor:
4949

5050
```agda
51-
UTXOW⇒UTXO :
52-
∀ {Γ : UTxOEnv} {s s' : UTxOState} {tx : TopLevelTx}
53-
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s'
54-
→ ∃[ legacyMode ] ((Γ , legacyMode) ⊢ s ⇀⦇ tx ,UTXO⦈ s')
51+
UTXOW⇒UTXO : ∀ {Γ : UTxOEnv} {s s' : UTxOState} {tx : TopLevelTx}
52+
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s' → ∃[ legacyMode ] ((Γ , legacyMode) ⊢ s ⇀⦇ tx ,UTXO⦈ s')
53+
5554
UTXOW⇒UTXO (UTXOW-normal-⋯ _ _ _ _ _ _ _ _ _ _ utxo) = false , utxo
5655
UTXOW⇒UTXO (UTXOW-legacy-⋯ _ _ _ _ _ _ _ _ _ _ _ _ _ utxo) = true , utxo
5756
```
@@ -66,113 +65,51 @@ counted in `getCoin`{.AgdaField}):
6665
module _ (tx : TopLevelTx) (let open Tx tx; open TxBody txBody)
6766
6867
-- Same assumptions as the UTXO-pov module.
69-
( balance-∪ : ∀ {u u' : UTxO} → disjoint (dom u) (dom u')
70-
→ cbalance (u ∪ˡ u') ≡ cbalance u + cbalance u' )
71-
72-
( split-balance : ∀ (u : UTxO) (keys : ℙ TxIn)
73-
→ cbalance u ≡ cbalance (u ∣ keys ᶜ) + cbalance (u ∣ keys) )
68+
( balance-∪ : ∀ {u u' : UTxO} → disjoint (dom u) (dom u') → cbalance (u ∪ˡ u') ≡ cbalance u + cbalance u' )
7469
75-
( outs-disjoint : ∀ {u : UTxO}
76-
→ TxIdOf tx ∉ mapˢ proj₁ (dom u)
77-
→ disjoint (dom (u ∣ SpendInputsOf tx ᶜ)) (dom (outs tx)) )
70+
( split-balance : ∀ (u : UTxO) (keys : ℙ TxIn) → cbalance u ≡ cbalance (u ∣ keys ᶜ) + cbalance (u ∣ keys) )
7871
79-
( coin-of-consumedBatch :
80-
∀ (dc : DepositsChange) (utxo₀ : UTxO)
81-
→ let open DepositsChange dc in
82-
coin (consumedBatch dc tx utxo₀) ≡ _ )
72+
( noMintTx : coin (MintedValueOf tx) ≡ 0 )
8373
84-
( coin-of-producedBatch :
85-
∀ (dc : DepositsChange)
86-
→ let open DepositsChange dc in
87-
coin (producedBatch dc tx) ≡ _ )
74+
( noMintSubTx : noMintingSubTxs tx )
8875
76+
( outs-disjoint : ∀ {u : UTxO} → TxIdOf tx ∉ mapˢ proj₁ (dom u) → disjoint (dom (u ∣ SpendInputsOf tx ᶜ)) (dom (outs tx)) )
8977
where
78+
-- Instantiate the inner `module UTxO-PoV` of `Utxo.Properties.PoV`.
79+
open UTxO-PoV tx balance-∪ split-balance noMintTx noMintSubTx
9080
91-
-- Instantiate the inner `module _` of `Utxo.Properties.PoV`.
92-
private
93-
module U =
94-
Ledger.Dijkstra.Specification.Utxo.Properties.PoV
95-
txs abs
96-
-- `utxo-pov-mod` refers to the parameterized inner module of `U`
97-
-- (the one that takes `tx` and the arithmetic assumptions).
98-
```
99-
100-
```agda
101-
UTXOW-I-getCoin :
102-
∀ {Γ : UTxOEnv} {s s' : UTxOState}
103-
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s'
104-
→ IsValidFlagOf tx ≡ false
105-
→ getCoin s ≡ getCoin s'
106-
UTXOW-I-getCoin utxow invalid =
107-
let (_ , utxo) = UTXOW⇒UTXO utxow
108-
in U-pov.UTXO-I-getCoin utxo invalid
109-
where
110-
-- Re-instantiate the inner module with our assumption lemmas.
111-
module U-pov =
112-
U tx balance-∪ split-balance outs-disjoint
113-
coin-of-consumedBatch coin-of-producedBatch
81+
UTXOW-I-getCoin : ∀ {Γ : UTxOEnv} {s s' : UTxOState}
82+
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s' → IsValidFlagOf tx ≡ false → getCoin s ≡ getCoin s'
83+
UTXOW-I-getCoin {Γ} utxow invalid = UTXO-I-getCoin (proj₂ (UTXOW⇒UTXO utxow)) invalid
11484
```
11585

116-
(The inner module instantiation is a bit boilerplate-heavy; in practice this
117-
should be simplified once the final module structure of `Utxo.Properties.PoV`
118-
is settled.)
119-
12086
## `UTXOW-V-mechanical`: mechanical rearrangement
12187

12288
The valid case simply reuses the UTXO-level mechanical rearrangement:
12389

12490
```agda
125-
UTXOW-V-mechanical :
126-
∀ {Γ : UTxOEnv} {s s' : UTxOState}
127-
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s'
128-
→ IsValidFlagOf tx ≡ true
129-
→ TxIdOf tx ∉ mapˢ proj₁ (dom (UTxOOf s))
91+
UTXOW-V-mechanical : ∀ {Γ : UTxOEnv} {s s' : UTxOState}
92+
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s' → IsValidFlagOf tx ≡ true → TxIdOf tx ∉ mapˢ proj₁ (dom (UTxOOf s))
13093
→ getCoin s + cbalance (outs tx) + TxFeesOf tx + DonationsOf tx
13194
≡ getCoin s' + cbalance (UTxOOf s ∣ SpendInputsOf tx)
132-
UTXOW-V-mechanical utxow valid fresh =
133-
let (_ , utxo) = UTXOW⇒UTXO utxow
134-
in U-pov.UTXO-V-mechanical utxo valid fresh
135-
where
136-
module U-pov =
137-
U tx balance-∪ split-balance outs-disjoint
138-
coin-of-consumedBatch coin-of-producedBatch
95+
96+
UTXOW-V-mechanical utxow valid fresh = UTXO-V-mechanical (proj₂ (UTXOW⇒UTXO utxow)) valid fresh
13997
```
14098

14199
## `UTXOW-batch-balance-coin`
142100

143101
```agda
144-
UTXOW-batch-balance-coin :
145-
∀ {Γ : UTxOEnv} {s s' : UTxOState}
102+
UTXOW-batch-balance-coin : ∀ {Γ : UTxOEnv} {s s' : UTxOState}
146103
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s'
147-
→ let dc = DepositsChangeOf Γ
148-
utxo₀ = UTxOOf Γ
149-
open DepositsChange dc
150-
in cbalance (utxo₀ ∣ SpendInputsOf tx)
151-
+ getCoin (WithdrawalsOf tx)
152-
+ negPart depositsChangeTop
153-
+ sum (map (λ (stx : SubLevelTx) →
154-
cbalance (utxo₀ ∣ SpendInputsOf stx)
155-
+ getCoin (WithdrawalsOf stx))
156-
(SubTransactionsOf tx))
157-
+ negPart depositsChangeSub
158-
≡ cbalance (outs tx)
159-
+ TxFeesOf tx
160-
+ DonationsOf tx
161-
+ getCoin (DirectDepositsOf tx)
162-
+ posPart depositsChangeTop
163-
+ sum (map (λ (stx : SubLevelTx) →
164-
cbalance (outs stx)
165-
+ DonationsOf stx
166-
+ getCoin (DirectDepositsOf stx))
167-
(SubTransactionsOf tx))
168-
+ posPart depositsChangeSub
169-
UTXOW-batch-balance-coin utxow =
170-
let (_ , utxo) = UTXOW⇒UTXO utxow
171-
in U-pov.batch-balance-coin utxo
172-
where
173-
module U-pov =
174-
U tx balance-∪ split-balance outs-disjoint
175-
coin-of-consumedBatch coin-of-producedBatch
104+
→ cbalance (UTxOOf Γ ∣ SpendInputsOf tx) + getCoin (WithdrawalsOf tx)
105+
+ negPart (DepositsChangeTopOf Γ)
106+
+ sum (map (λ stx → cbalance (UTxOOf Γ ∣ SpendInputsOf stx) + getCoin (WithdrawalsOf stx)) (SubTransactionsOf tx))
107+
+ negPart (DepositsChangeSubOf Γ)
108+
≡ cbalance (outs tx) + TxFeesOf tx + DonationsOf tx + getCoin (DirectDepositsOf tx)
109+
+ posPart (DepositsChangeTopOf Γ)
110+
+ sum ( map (λ (stx : SubLevelTx) → cbalance (outs stx) + DonationsOf stx + getCoin (DirectDepositsOf stx)) (SubTransactionsOf tx) )
111+
+ posPart (DepositsChangeSubOf Γ)
112+
UTXOW-batch-balance-coin utxow = batch-balance-coin (proj₂ (UTXOW⇒UTXO utxow))
176113
```
177114

178115
## `utxow-pov-invalid` for use in `LEDGER-pov`
@@ -182,11 +119,8 @@ The following is the *specific* form needed by `Ledger.Properties.PoV`
182119
identical to `UTXOW-I-getCoin`{.AgdaFunction} above, retagged for clarity:
183120

184121
```agda
185-
utxow-pov-invalid :
186-
∀ {Γ : UTxOEnv} {s s' : UTxOState}
187-
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s'
188-
→ IsValidFlagOf tx ≡ false
189-
→ getCoin s ≡ getCoin s'
122+
utxow-pov-invalid : ∀ {Γ : UTxOEnv} {s s' : UTxOState}
123+
→ Γ ⊢ s ⇀⦇ tx ,UTXOW⦈ s' → IsValidFlagOf tx ≡ false → getCoin s ≡ getCoin s'
190124
utxow-pov-invalid = UTXOW-I-getCoin
191125
```
192126

0 commit comments

Comments
 (0)