{-# 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.Crypto (KES, VRF)
import           Cardano.Ledger.Keys (KeyRole (BlockIssuer), VKey)
import qualified Cardano.Ledger.Shelley.API as SL
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
  { -- | Hash of the previous block
    forall crypto. HeaderView crypto -> PrevHash crypto
hvPrevHash  :: !(PrevHash crypto),
    -- | verification key of block issuer
    forall crypto. HeaderView crypto -> VKey 'BlockIssuer crypto
hvVK        :: !(VKey 'BlockIssuer crypto),
    -- | VRF verification key for block issuer
    forall crypto. HeaderView crypto -> VerKeyVRF (VRF crypto)
hvVrfVK     :: !(VerKeyVRF (VRF crypto)),
    -- | VRF result
    forall crypto.
HeaderView crypto -> CertifiedVRF (VRF crypto) InputVRF
hvVrfRes    :: !(CertifiedVRF (VRF crypto) InputVRF),
    -- | operational certificate
    forall crypto. HeaderView crypto -> OCert crypto
hvOCert     :: !(OCert crypto),
    -- | Slot
    forall crypto. HeaderView crypto -> SlotNo
hvSlotNo    :: !SlotNo,
    -- | Header which must be signed
    forall crypto. HeaderView crypto -> HeaderBody crypto
hvSigned    :: !(HeaderBody crypto),
    -- | KES Signature of the header
    forall crypto.
HeaderView crypto -> SignedKES (KES crypto) (HeaderBody crypto)
hvSignature :: !(SignedKES (KES crypto) (HeaderBody crypto))
  }

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