{-# LANGUAGE DataKinds #-}

module Ouroboros.Consensus.Cardano (
    -- * The block type of the Cardano block chain
    CardanoBlock
    -- * Supported protocols
  , ProtocolByron
  , ProtocolCardano
  , ProtocolShelley
    -- * Abstract over the various protocols
  , CardanoHardForkTrigger (..)
  , CardanoHardForkTriggers (..)
  , module X
  ) where

import           Ouroboros.Consensus.Byron.Ledger
import           Ouroboros.Consensus.Byron.Node as X
import           Ouroboros.Consensus.Cardano.Block
import           Ouroboros.Consensus.Cardano.Node
import           Ouroboros.Consensus.HardFork.Combinator
import           Ouroboros.Consensus.Protocol.Praos (Praos)
import           Ouroboros.Consensus.Protocol.TPraos (TPraos)
import           Ouroboros.Consensus.Shelley.Ledger
import           Ouroboros.Consensus.Shelley.Node as X
import           Ouroboros.Consensus.Shelley.ShelleyHFC

{-------------------------------------------------------------------------------
  Supported protocols

  We list these as explicit definitions here (rather than derived through
  'BlockProtocol'), and then /verify/ in 'verifyProtocol' that these definitions
  match. This provides an additional sanity check that we are not accidentally
  breaking any assumptions made in @cardano-node@.
-------------------------------------------------------------------------------}

type ProtocolByron   = HardForkProtocol '[ ByronBlock ]
type ProtocolCardano = HardForkProtocol '[ ByronBlock
                                         , ShelleyBlock (TPraos StandardCrypto) ShelleyEra
                                         , ShelleyBlock (TPraos StandardCrypto) AllegraEra
                                         , ShelleyBlock (TPraos StandardCrypto) MaryEra
                                         , ShelleyBlock (TPraos StandardCrypto) AlonzoEra
                                         , ShelleyBlock (Praos StandardCrypto)  BabbageEra
                                         , ShelleyBlock (Praos StandardCrypto)  ConwayEra
                                         ]