content: {-# 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
       ]
  