{-# OPTIONS --safe #-}
open import Prelude
open import Hash
open import Jolteon.Assumptions

module Jolteon.Properties.State.Messages ( : _) (open Assumptions ) where

open import Jolteon 
open import Jolteon.Decidability.Core 
open import Jolteon.Properties.Core 

open L.Mem

-- ** lemmas about receiveMsg (i.e. the Deliver rule)

receiveMsg-ls≡ :   _ : Honest p  {s} mhm 
  let s' = receiveMsg s mhm in
  (s' @ᵐ p)  record (s @ᵐ p) {inbox = (s' @ᵐ p) .inbox}
receiveMsg-ls≡ nothing = refl
receiveMsg-ls≡ {p}  hp  {s} (just ((p′  hp′) , m))
  with p  p′
... | yes refl
  rewrite pLookup∘updateAt p {receiveMessage m} s
  = refl
... | no p≢
  rewrite pLookup∘updateAt′ p p′  toRelevant hp′  {receiveMessage m} (p≢  ↑-injective) s
  = refl

module _ {p}  _ : Honest p  {s} mhm (let ls≡ = receiveMsg-ls≡ {p}{s} mhm) where
  receiveMsg-db     = cong db ls≡
  receiveMsg-tcLast = cong tc-last ls≡
  receiveMsg-rCur   = cong r-cur ls≡
  receiveMsg-qcHigh = cong qc-high ls≡
  receiveMsg-phase  = cong phase ls≡
  receiveMsg-roundA = cong roundAdvanced? ls≡
  receiveMsg-final  = cong finalChain ls≡

-- ** lemmas about broadcasts (i.e. the LocalStep rule)

expandBroadcasts-message :
  (t′ , p , m)  expandBroadcasts t env
  ─────────────────────────────────────
  m  env ∙message
expandBroadcasts-message {t = t}{[ _m } tpm∈
  with _ , _ , refl∈-map⁻  p  (t , p , _m)) tpm∈
  = refl
expandBroadcasts-message {env = [ _  _m } (here refl) = refl