{-# OPTIONS --safe #-}
open import Prelude

open import Jolteon.Base
open import Jolteon.Assumptions

module Jolteon.Global.NoForging ( : _) (open Assumptions ) where

open import Jolteon.Block 
open import Jolteon.Message 
open import Jolteon.Global.State 

data 𝕌 : Type where
  BR RQ B : 𝕌

⟦_⟧ : 𝕌  Type
⟦_⟧ = λ where
  BR  BlockId × Round
  RQ  Round × QC
  B   Block

data _-∈-QC-_ : Signed  BR   QC  Type where
  ∈-QC :
    p  qc .shares
    ───────────────────────────────────
    (qc .payload signed-by p) -∈-QC- qc

data _-∈-TE-_ :  {u}  Signed  u   TimeoutEvidence  Type

_∶_-∈-TE-_ :  u  Signed  u   TimeoutEvidence  Type
_∶_-∈-TE-_ u = _-∈-TE-_ {u = u}

data _-∈-TE-_ where
  ∈-TE :
    ────────────
    RQ  te -∈-TE- te

  ∈-TE-QC :  {sa} 
    sa -∈-QC- (te ∙qcTE)
    ────────────────────
    BR  sa -∈-TE- te

private variable u : 𝕌

data _-∈-TC-_ : Signed  u   TC  Type

_∶_-∈-TC-_ :  u  Signed  u   TC  Type
_∶_-∈-TC-_ u = _-∈-TC-_ {u = u}

data _-∈-TC-_ where
  ∈-TC :  {sa : Signed  u } 
    Any (u  sa -∈-TE-_) (tc .tes)
    ──────────────────────────
    sa -∈-TC- tc

data _-∈ᴹ-_ : Signed  u   Message  Type

_∶_-∈ᴹ-_ :  u  Signed  u   Message  Type
_∶_-∈ᴹ-_ u su m = _-∈ᴹ-_ {u = u} su m

data _-∈ᴹ-_ where

  ∈-Propose :
    ─────────────
    sb -∈ᴹ- Propose sb

  ∈-Propose-QC :  {sa} 
    sa -∈-QC- (sb ∙qc)
    ───────────────────────
    BR  sa -∈ᴹ- Propose sb

  ∈-Propose-TC :  {sa : Signed  u } 
    Any (sa -∈-TC-_) (sb ∙tc?)
    ──────────────────────────
    sa -∈ᴹ- Propose sb

  ∈-Vote :  {vs : VoteShare} 
    ────────────────────
    BR  vs -∈ᴹ- Vote vs

  ∈-TCFormed :  {sa : Signed  u } 
    sa -∈-TC- tc
    ───────────────────
    sa -∈ᴹ- TCFormed tc

  ∈-Timeout-TE :  {sa : Signed  u } 
    sa -∈-TE- te
    ──────────────────────────
    sa -∈ᴹ- Timeout (te , mtc)

  ∈-Timeout-TC :  {sa : Signed  u } 
    Any (sa -∈-TC-_) mtc
    ──────────────────────────
    sa -∈ᴹ- Timeout (te , mtc)

NoSignatureForging : Message  GlobalState  Type
NoSignatureForging m s =

   {u} (sa : Signed  u )  sa -∈ᴹ- m 

    Honest (sa ∙pid)
    ───────────────────────────
    Any (sa -∈ᴹ-_) (s .history)