{-# LANGUAGE DataKinds #-}

module Ouroboros.Consensus.Protocol.Praos.Views
  ( HeaderView (..)
  , LedgerView (..)
  ) where

import Cardano.Crypto.KES (SignedKES)
import Cardano.Crypto.VRF (CertifiedVRF, VRFAlgorithm (VerKeyVRF))
import Cardano.Ledger.BaseTypes (ProtVer)
import Cardano.Ledger.Keys (KeyRole (BlockIssuer), VKey)
import qualified Cardano.Ledger.Shelley.API as SL
import Cardano.Protocol.Crypto (KES, VRF)
import Cardano.Protocol.TPraos.BHeader (PrevHash)
import Cardano.Protocol.TPraos.OCert (OCert)
import Cardano.Slotting.Slot (SlotNo)
import Data.Word (Word16, Word32)
import Ouroboros.Consensus.Protocol.Praos.Header (HeaderBody)
import Ouroboros.Consensus.Protocol.Praos.VRF (InputVRF)

-- | View of the block header required by the Praos protocol.
data HeaderView crypto = HeaderView
  { forall crypto. HeaderView crypto -> PrevHash
hvPrevHash :: !PrevHash
  -- ^ Hash of the previous block
  , forall crypto. HeaderView crypto -> VKey 'BlockIssuer
hvVK :: !(VKey 'BlockIssuer)
  -- ^ verification key of block issuer
  , forall crypto. HeaderView crypto -> VerKeyVRF (VRF crypto)
hvVrfVK :: !(VerKeyVRF (VRF crypto))
  -- ^ VRF verification key for block issuer
  , forall crypto.
HeaderView crypto -> CertifiedVRF (VRF crypto) InputVRF
hvVrfRes :: !(CertifiedVRF (VRF crypto) InputVRF)
  -- ^ VRF result
  , forall crypto. HeaderView crypto -> OCert crypto
hvOCert :: !(OCert crypto)
  -- ^ operational certificate
  , forall crypto. HeaderView crypto -> SlotNo
hvSlotNo :: !SlotNo
  -- ^ Slot
  , forall crypto. HeaderView crypto -> HeaderBody crypto
hvSigned :: !(HeaderBody crypto)
  -- ^ Header which must be signed
  , forall crypto.
HeaderView crypto -> SignedKES (KES crypto) (HeaderBody crypto)
hvSignature :: !(SignedKES (KES crypto) (HeaderBody crypto))
  -- ^ KES Signature of the header
  }

data LedgerView = LedgerView
  { LedgerView -> PoolDistr
lvPoolDistr :: SL.PoolDistr
  -- ^ Stake distribution
  , LedgerView -> Word16
lvMaxHeaderSize :: !Word16
  -- ^ Maximum header size
  , LedgerView -> Word32
lvMaxBodySize :: !Word32
  -- ^ Maximum block body size
  , LedgerView -> ProtVer
lvProtocolVersion :: !ProtVer
  -- ^ Current protocol version
  }
  deriving Int -> LedgerView -> ShowS
[LedgerView] -> ShowS
LedgerView -> String
(Int -> LedgerView -> ShowS)
-> (LedgerView -> String)
-> ([LedgerView] -> ShowS)
-> Show LedgerView
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> LedgerView -> ShowS
showsPrec :: Int -> LedgerView -> ShowS
$cshow :: LedgerView -> String
show :: LedgerView -> String
$cshowList :: [LedgerView] -> ShowS
showList :: [LedgerView] -> ShowS
Show