{-# OPTIONS --safe #-} open import Prelude open import Hash open import Jolteon.Assumptions module Jolteon.Properties.State.TC (⋯ : _) (open Assumptions ⋯) where open import Jolteon ⋯ open import Jolteon.Decidability.Core ⋯ open import Jolteon.Properties.Core ⋯ open import Jolteon.Properties.State.Messages ⋯ open import Jolteon.Properties.State.Invariants ⋯ qc-tc-last : ∀ {s} → ⦃ _ : Honest p ⦄ → Reachable s → let ls = s @ p in Any (λ tc → qc ∈₁ qcs⁺ tc) (ls .tc-last) ──────────────────────────────────────── qc ∙∈ s .history qc-tc-last {p} (_ , refl , (_ ∎)) qc∈ rewrite pLookup-replicate p initLocalState = contradict qc∈ qc-tc-last (_ , s-init , (s' ⟨ WaitUntil _ _ _ ∣ s ⟩←— tr)) qc∈ = qc-tc-last (_ , s-init , tr) qc∈ qc-tc-last (_ , s-init , (s' ⟨ Deliver {tpm} _ ∣ s ⟩←— tr)) qc∈ = qc-tc-last (_ , s-init , tr) $ subst (Any _) (receiveMsg-tcLast (honestTPMessage tpm)) qc∈ qc-tc-last (_ , s-init , (s' ⟨ DishonestLocalStep _ _ ∣ s ⟩←— tr)) qc∈ = qc∈-monotonic (qc-tc-last (_ , s-init , tr) qc∈) qc-tc-last {p}{qc} ⦃ hp ⦄ (s₀ , s-init , (s' ⟨ LocalStep {p = p′} {menv = menv} {ls′ = ls′} st ∣ s ⟩←— tr)) qc∈ with Rs ← _ , s-init , tr with IH ← qc-tc-last {p}{qc} Rs with p ≟ p′ ... | no p≢ rewrite pLookup∘updateAt′ p p′ {const ls′} (p≢ ∘ ↑-injective) (s .stateMap) = qc∈-++⁺ʳ $ IH qc∈ ... | yes refl rewrite pLookup∘updateAt p ⦃ hp ⦄ {const ls′} (s .stateMap) with st ... | InitTC _ _ = qc∈-monotonic $ IH qc∈ ... | InitNoTC _ _ = IH qc∈ ... | ProposeBlock _ _ = qc∈-monotonic $ IH qc∈ ... | ProposeBlockNoOp _ _ = IH qc∈ ... | RegisterProposal _ _ _ _ _ = IH qc∈ ... | EnoughTimeouts _ _ _ _ = qc∈-monotonic $ IH qc∈ ... | RegisterTimeout _ _ _ _ = IH qc∈ ... | RegisterTC _ _ _ _ = IH qc∈ ... | TimerExpired _ _ = qc∈-monotonic $ IH qc∈ ... | RegisterVote _ _ _ _ _ _ = IH qc∈ ... | AdvanceRoundQC _ _ _ = ⊥-elim $ contradict qc∈ ... | AdvanceRoundNoOp _ _ _ = IH qc∈ ... | Lock _ _ = IH qc∈ ... | CommitNoOp _ _ = IH qc∈ ... | VoteBlock _ _ _ = qc∈-monotonic $ IH qc∈ ... | VoteBlockNoOp _ _ = IH qc∈ ... | Commit _ _ = IH qc∈ ... | AdvanceRoundTC _ tc∈ _ = L.All.lookup (tc∈⇒qc∈ (tc-db⊆history ⦃ hp ⦄ Rs tc∈)) (M.Any.drop-just qc∈) tc-last⇒qc∈ : ∀ {s} → ⦃ _ : Honest p ⦄ → Reachable s → let ls = s @ p in ls .tc-last ≡ just tc ───────────────────────────── All (_∙∈ s .history) (qcs tc) tc-last⇒qc∈ {p}{tc}{s = s} Rs tc≡ = L.All.tabulate λ qc∈ → qc-tc-last Rs (mqc qc∈) where mqc : qc ∈ qcs tc → Any (λ tc → qc ∈₁ qcs⁺ tc) ((s @ p) .tc-last) mqc qc∈ rewrite tc≡ = just qc∈