Certs

module Ledger.Conway.Foreign.Certs where

open import Foreign.Convertible
open import Foreign.Convertible.Deriving
open import Foreign.HaskellTypes.Deriving

open import Ledger.Prelude
open import Ledger.Prelude.Foreign.HSTypes

open import Ledger.Core.Foreign.Address
open import Ledger.Conway.Foreign.HSStructures renaming (⟦_,_,_⟧ᵈ to ⟦_,_,_⟧ᵈ'; DState to DState'
                                                              ; ⟦_,_⟧ᵛ to ⟦_,_⟧ᵛ'; GState to GState') hiding (CertEnv)
open import Ledger.Conway.Foreign.Gov.Core
open import Ledger.Conway.Foreign.PParams
open import Ledger.Conway.Conformance.Certs govStructure using (⟦_,_,_,_⟧ᵈ; ⟦_,_,_⟧ᵛ; DState; GState; CertEnv)
open import Ledger.Conway.Specification.Certs.Properties.Computational govStructure
  using (Computational-POOL)
open import Ledger.Conway.Conformance.Certs.Properties govStructure
  using ( Computational-DELEG
        ; Computational-GOVCERT
        )

open Computational

instance
  HsTy-StakePoolParams = autoHsType StakePoolParams
  Conv-StakePoolParams = autoConvert StakePoolParams

  HsTy-DepositPurpose = autoHsType DepositPurpose
  Conv-DepositPurpose = autoConvert DepositPurpose

  HsTy-DelegEnv = autoHsType DelegEnv
     withConstructor "MkDelegEnv"
     fieldPrefix "de"
     withName "DelegEnv"
  Conv-DelegEnv = autoConvert DelegEnv

  HsTy-PState = autoHsType PState
     withConstructor "MkPState"
     fieldPrefix "ps"
  Conv-PState = autoConvert PState

record CertEnv' : Type where
  field
    epoch     : Epoch
    pp        : PParams
    votes     : List GovVote'
    wdrls     : RewardAddress  Coin
    coldCreds :  Credential

instance
  HsTy-CertEnv' = autoHsType CertEnv'
     withConstructor "MkCertEnv"
     withName "CertEnv"
     fieldPrefix "ce"
  Conv-CertEnv' = autoConvert CertEnv'

  mkCertEnv' : Convertible CertEnv CertEnv'
  mkCertEnv' = λ where
    .to   ce  let module ce = CertEnv ce in record { epoch = ce.epoch ; pp = ce.pp ; votes = to ce.votes ; wdrls = ce.wdrls ; coldCreds = ce.coldCreds }
    .from ce  let module ce = CertEnv' ce in record { epoch = ce.epoch ; pp = ce.pp ; votes = from ce.votes ; wdrls = ce.wdrls ; coldCreds = ce.coldCreds }

  HsTy-CertEnv = MkHsType CertEnv (HsType CertEnv')
  Conv-CertEnv = mkCertEnv'  Conv-CertEnv'

instance
  HsTy-DState = autoHsType DState
     withConstructor "MkDState"
     withName "DState"
     fieldPrefix "ds"
  Conv-DState = autoConvert DState

  HsTy-DCert = autoHsType DCert
  Conv-DCert = autoConvert DCert

  HsTy-GState = autoHsType GState
     withConstructor "MkGState"
     fieldPrefix "gs"
  Conv-GState = autoConvert GState

  Conv-DState-DState' : Convertible DState DState'
  Conv-DState-DState' .to $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#2809}{\htmlId{2809}{\htmlClass{Bound}{\text{voteDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2822}{\htmlId{2822}{\htmlClass{Bound}{\text{stakeDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2836}{\htmlId{2836}{\htmlClass{Bound}{\text{rewards}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2846}{\htmlId{2846}{\htmlClass{Bound}{\text{deposits}}}}\, \end{pmatrix}$ = $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#2809}{\htmlId{2862}{\htmlClass{Bound}{\text{voteDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2822}{\htmlId{2875}{\htmlClass{Bound}{\text{stakeDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2822}{\htmlId{2889}{\htmlClass{Bound}{\text{stakeDelegs}}}}\, \end{pmatrix}$
  Conv-DState-DState' .from $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#2935}{\htmlId{2935}{\htmlClass{Bound}{\text{voteDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2948}{\htmlId{2948}{\htmlClass{Bound}{\text{stakeDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2962}{\htmlId{2962}{\htmlClass{Bound}{\text{rewards}}}}\, \end{pmatrix}$         = $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#2935}{\htmlId{2986}{\htmlClass{Bound}{\text{voteDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2948}{\htmlId{2999}{\htmlClass{Bound}{\text{stakeDelegs}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#2948}{\htmlId{3013}{\htmlClass{Bound}{\text{stakeDelegs}}}}\, \\ \,\href{Class.HasEmptySet.html#287}{\htmlId{3027}{\htmlClass{Field}{\text{∅}}}}\, \end{pmatrix}$

  Conv-GState-GState' : Convertible GState GState'
  Conv-GState-GState' .to $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#3112}{\htmlId{3112}{\htmlClass{Bound}{\text{dreps}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#3120}{\htmlId{3120}{\htmlClass{Bound}{\text{ccHotKeys}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#3132}{\htmlId{3132}{\htmlClass{Bound}{\text{deposits}}}}\, \end{pmatrix}$ = $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#3112}{\htmlId{3148}{\htmlClass{Bound}{\text{dreps}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#3120}{\htmlId{3156}{\htmlClass{Bound}{\text{ccHotKeys}}}}\, \end{pmatrix}$
  Conv-GState-GState' .from $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#3200}{\htmlId{3200}{\htmlClass{Bound}{\text{dreps}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#3208}{\htmlId{3208}{\htmlClass{Bound}{\text{ccHotKeys}}}}\, \end{pmatrix}$         = $\begin{pmatrix} \,\href{Ledger.Conway.Foreign.Certs.html#3200}{\htmlId{3234}{\htmlClass{Bound}{\text{dreps}}}}\, \\ \,\href{Ledger.Conway.Foreign.Certs.html#3208}{\htmlId{3242}{\htmlClass{Bound}{\text{ccHotKeys}}}}\, \\ \,\href{Class.HasEmptySet.html#287}{\htmlId{3254}{\htmlClass{Field}{\text{∅}}}}\, \end{pmatrix}$

deleg-step : HsType (DelegEnv  DState  DCert  ComputationResult String DState)
deleg-step = to (compute Computational-DELEG)

{-# COMPILE GHC deleg-step as delegStep #-}

pool-step : HsType (PParams  PState  DCert  ComputationResult String PState)
pool-step = to (compute Computational-POOL)

{-# COMPILE GHC pool-step as poolStep #-}

govcert-step : HsType (CertEnv  GState  DCert  ComputationResult String GState)
govcert-step = to (compute Computational-GOVCERT)

{-# COMPILE GHC govcert-step as govCertStep #-}