{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Alonzo.Genesis (
  AlonzoGenesis (
    AlonzoGenesisWrapper,
    unAlonzoGenesisWrapper,
    extraConfig,
    AlonzoGenesis,
    agCoinsPerUTxOWord,
    agPlutusV1CostModel,
    agPrices,
    agMaxTxExUnits,
    agMaxBlockExUnits,
    agMaxValSize,
    agCollateralPercentage,
    agMaxCollateralInputs,
    agExtraConfig
  ),
  AlonzoExtraConfig (..),
) where

import Cardano.Ledger.Alonzo.Era (AlonzoEra)
import Cardano.Ledger.Alonzo.PParams (
  CoinPerWord,
  UpgradeAlonzoPParams (..),
 )
import Cardano.Ledger.Alonzo.Scripts (
  CostModel,
  CostModels,
  ExUnits (..),
  Prices (..),
  costModelsValid,
  decodeCostModel,
  decodeCostModelsLenient,
  encodeCostModel,
  flattenCostModels,
  mkCostModels,
 )
import Cardano.Ledger.BaseTypes (KeyValuePairs (..), ToKeyValuePairs (..))
import Cardano.Ledger.Binary (
  DecCBOR (..),
  EncCBOR (..),
  FromCBOR (..),
  ToCBOR (..),
  decodeNullMaybe,
  encodeNullMaybe,
 )
import Cardano.Ledger.Binary.Coders
import Cardano.Ledger.Core
import Cardano.Ledger.Genesis (EraGenesis (..))
import Cardano.Ledger.Plutus (Language (PlutusV1))
import Cardano.Ledger.Plutus.CostModels (parseCostModels)
import Control.DeepSeq (NFData)
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=))
import qualified Data.Aeson as Aeson
import Data.Functor.Identity (Identity)
import qualified Data.List as List
import qualified Data.Map.Strict as Map
import GHC.Generics (Generic)
import NoThunks.Class (NoThunks)
import Numeric.Natural (Natural)

-- | All configuration that is necessary to bootstrap AlonzoEra from ShelleyGenesis
data AlonzoGenesis = AlonzoGenesisWrapper
  { AlonzoGenesis -> UpgradeAlonzoPParams Identity
unAlonzoGenesisWrapper :: UpgradeAlonzoPParams Identity
  , AlonzoGenesis -> Maybe AlonzoExtraConfig
extraConfig :: Maybe AlonzoExtraConfig
  }
  deriving stock (AlonzoGenesis -> AlonzoGenesis -> Bool
(AlonzoGenesis -> AlonzoGenesis -> Bool)
-> (AlonzoGenesis -> AlonzoGenesis -> Bool) -> Eq AlonzoGenesis
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AlonzoGenesis -> AlonzoGenesis -> Bool
== :: AlonzoGenesis -> AlonzoGenesis -> Bool
$c/= :: AlonzoGenesis -> AlonzoGenesis -> Bool
/= :: AlonzoGenesis -> AlonzoGenesis -> Bool
Eq, Int -> AlonzoGenesis -> ShowS
[AlonzoGenesis] -> ShowS
AlonzoGenesis -> String
(Int -> AlonzoGenesis -> ShowS)
-> (AlonzoGenesis -> String)
-> ([AlonzoGenesis] -> ShowS)
-> Show AlonzoGenesis
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AlonzoGenesis -> ShowS
showsPrec :: Int -> AlonzoGenesis -> ShowS
$cshow :: AlonzoGenesis -> String
show :: AlonzoGenesis -> String
$cshowList :: [AlonzoGenesis] -> ShowS
showList :: [AlonzoGenesis] -> ShowS
Show, (forall x. AlonzoGenesis -> Rep AlonzoGenesis x)
-> (forall x. Rep AlonzoGenesis x -> AlonzoGenesis)
-> Generic AlonzoGenesis
forall x. Rep AlonzoGenesis x -> AlonzoGenesis
forall x. AlonzoGenesis -> Rep AlonzoGenesis x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AlonzoGenesis -> Rep AlonzoGenesis x
from :: forall x. AlonzoGenesis -> Rep AlonzoGenesis x
$cto :: forall x. Rep AlonzoGenesis x -> AlonzoGenesis
to :: forall x. Rep AlonzoGenesis x -> AlonzoGenesis
Generic)
  deriving ([AlonzoGenesis] -> Value
[AlonzoGenesis] -> Encoding
AlonzoGenesis -> Bool
AlonzoGenesis -> Value
AlonzoGenesis -> Encoding
(AlonzoGenesis -> Value)
-> (AlonzoGenesis -> Encoding)
-> ([AlonzoGenesis] -> Value)
-> ([AlonzoGenesis] -> Encoding)
-> (AlonzoGenesis -> Bool)
-> ToJSON AlonzoGenesis
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: AlonzoGenesis -> Value
toJSON :: AlonzoGenesis -> Value
$ctoEncoding :: AlonzoGenesis -> Encoding
toEncoding :: AlonzoGenesis -> Encoding
$ctoJSONList :: [AlonzoGenesis] -> Value
toJSONList :: [AlonzoGenesis] -> Value
$ctoEncodingList :: [AlonzoGenesis] -> Encoding
toEncodingList :: [AlonzoGenesis] -> Encoding
$comitField :: AlonzoGenesis -> Bool
omitField :: AlonzoGenesis -> Bool
ToJSON) via KeyValuePairs AlonzoGenesis

instance NoThunks AlonzoGenesis

instance NFData AlonzoGenesis

newtype AlonzoExtraConfig = AlonzoExtraConfig
  { AlonzoExtraConfig -> Maybe CostModels
aecCostModels :: Maybe CostModels
  }
  deriving (AlonzoExtraConfig -> AlonzoExtraConfig -> Bool
(AlonzoExtraConfig -> AlonzoExtraConfig -> Bool)
-> (AlonzoExtraConfig -> AlonzoExtraConfig -> Bool)
-> Eq AlonzoExtraConfig
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AlonzoExtraConfig -> AlonzoExtraConfig -> Bool
== :: AlonzoExtraConfig -> AlonzoExtraConfig -> Bool
$c/= :: AlonzoExtraConfig -> AlonzoExtraConfig -> Bool
/= :: AlonzoExtraConfig -> AlonzoExtraConfig -> Bool
Eq)
  deriving newtype (AlonzoExtraConfig -> ()
(AlonzoExtraConfig -> ()) -> NFData AlonzoExtraConfig
forall a. (a -> ()) -> NFData a
$crnf :: AlonzoExtraConfig -> ()
rnf :: AlonzoExtraConfig -> ()
NFData, Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo)
Proxy AlonzoExtraConfig -> String
(Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo))
-> (Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo))
-> (Proxy AlonzoExtraConfig -> String)
-> NoThunks AlonzoExtraConfig
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo)
noThunks :: Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> AlonzoExtraConfig -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy AlonzoExtraConfig -> String
showTypeOf :: Proxy AlonzoExtraConfig -> String
NoThunks, Int -> AlonzoExtraConfig -> ShowS
[AlonzoExtraConfig] -> ShowS
AlonzoExtraConfig -> String
(Int -> AlonzoExtraConfig -> ShowS)
-> (AlonzoExtraConfig -> String)
-> ([AlonzoExtraConfig] -> ShowS)
-> Show AlonzoExtraConfig
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AlonzoExtraConfig -> ShowS
showsPrec :: Int -> AlonzoExtraConfig -> ShowS
$cshow :: AlonzoExtraConfig -> String
show :: AlonzoExtraConfig -> String
$cshowList :: [AlonzoExtraConfig] -> ShowS
showList :: [AlonzoExtraConfig] -> ShowS
Show)

instance DecCBOR AlonzoExtraConfig

instance EncCBOR AlonzoExtraConfig

instance FromCBOR AlonzoExtraConfig where
  fromCBOR :: forall s. Decoder s AlonzoExtraConfig
fromCBOR =
    forall era t s. Era era => Decoder s t -> Decoder s t
eraDecoder @AlonzoEra (Decoder s AlonzoExtraConfig -> Decoder s AlonzoExtraConfig)
-> Decoder s AlonzoExtraConfig -> Decoder s AlonzoExtraConfig
forall a b. (a -> b) -> a -> b
$
      Decode (Closed Dense) AlonzoExtraConfig
-> Decoder s AlonzoExtraConfig
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode (Closed Dense) AlonzoExtraConfig
 -> Decoder s AlonzoExtraConfig)
-> Decode (Closed Dense) AlonzoExtraConfig
-> Decoder s AlonzoExtraConfig
forall a b. (a -> b) -> a -> b
$
        (Maybe CostModels -> AlonzoExtraConfig)
-> Decode (Closed Dense) (Maybe CostModels -> AlonzoExtraConfig)
forall t. t -> Decode (Closed Dense) t
RecD Maybe CostModels -> AlonzoExtraConfig
AlonzoExtraConfig
          Decode (Closed Dense) (Maybe CostModels -> AlonzoExtraConfig)
-> Decode (Closed Dense) (Maybe CostModels)
-> Decode (Closed Dense) AlonzoExtraConfig
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! (forall s. Decoder s (Maybe CostModels))
-> Decode (Closed Dense) (Maybe CostModels)
forall t. (forall s. Decoder s t) -> Decode (Closed Dense) t
D (Decoder s CostModels -> Decoder s (Maybe CostModels)
forall s a. Decoder s a -> Decoder s (Maybe a)
decodeNullMaybe Decoder s CostModels
forall s. Decoder s CostModels
decodeCostModelsLenient)

instance ToCBOR AlonzoExtraConfig where
  toCBOR :: AlonzoExtraConfig -> Encoding
toCBOR x :: AlonzoExtraConfig
x@(AlonzoExtraConfig Maybe CostModels
_) =
    let AlonzoExtraConfig {Maybe CostModels
aecCostModels :: AlonzoExtraConfig -> Maybe CostModels
aecCostModels :: Maybe CostModels
..} = AlonzoExtraConfig
x
     in forall era t. (Era era, EncCBOR t) => t -> Encoding
toEraCBOR @AlonzoEra (Encoding -> Encoding)
-> (Encode (Closed Dense) AlonzoExtraConfig -> Encoding)
-> Encode (Closed Dense) AlonzoExtraConfig
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Encode (Closed Dense) AlonzoExtraConfig -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode (Closed Dense) AlonzoExtraConfig -> Encoding)
-> Encode (Closed Dense) AlonzoExtraConfig -> Encoding
forall a b. (a -> b) -> a -> b
$
          (Maybe CostModels -> AlonzoExtraConfig)
-> Encode (Closed Dense) (Maybe CostModels -> AlonzoExtraConfig)
forall t. t -> Encode (Closed Dense) t
Rec Maybe CostModels -> AlonzoExtraConfig
AlonzoExtraConfig
            Encode (Closed Dense) (Maybe CostModels -> AlonzoExtraConfig)
-> Encode (Closed Dense) (Maybe CostModels)
-> Encode (Closed Dense) AlonzoExtraConfig
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> (Maybe CostModels -> Encoding)
-> Maybe CostModels -> Encode (Closed Dense) (Maybe CostModels)
forall t. (t -> Encoding) -> t -> Encode (Closed Dense) t
E ((CostModels -> Encoding) -> Maybe CostModels -> Encoding
forall a. (a -> Encoding) -> Maybe a -> Encoding
encodeNullMaybe CostModels -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR) Maybe CostModels
aecCostModels

instance FromJSON AlonzoExtraConfig where
  parseJSON :: Value -> Parser AlonzoExtraConfig
parseJSON = String
-> (Object -> Parser AlonzoExtraConfig)
-> Value
-> Parser AlonzoExtraConfig
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Extra Config" ((Object -> Parser AlonzoExtraConfig)
 -> Value -> Parser AlonzoExtraConfig)
-> (Object -> Parser AlonzoExtraConfig)
-> Value
-> Parser AlonzoExtraConfig
forall a b. (a -> b) -> a -> b
$ \Object
o ->
    Object
o Object -> Key -> Parser (Maybe Value)
forall a. FromJSON a => Object -> Key -> Parser (Maybe a)
.:? Key
"costModels" Parser (Maybe Value)
-> (Maybe Value -> Parser AlonzoExtraConfig)
-> Parser AlonzoExtraConfig
forall a b. Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Maybe Value
Nothing -> AlonzoExtraConfig -> Parser AlonzoExtraConfig
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AlonzoExtraConfig -> Parser AlonzoExtraConfig)
-> AlonzoExtraConfig -> Parser AlonzoExtraConfig
forall a b. (a -> b) -> a -> b
$ Maybe CostModels -> AlonzoExtraConfig
AlonzoExtraConfig Maybe CostModels
forall a. Maybe a
Nothing
      Just Value
val -> Maybe CostModels -> AlonzoExtraConfig
AlonzoExtraConfig (Maybe CostModels -> AlonzoExtraConfig)
-> (CostModels -> Maybe CostModels)
-> CostModels
-> AlonzoExtraConfig
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CostModels -> Maybe CostModels
forall a. a -> Maybe a
Just (CostModels -> AlonzoExtraConfig)
-> Parser CostModels -> Parser AlonzoExtraConfig
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool -> [Language] -> Value -> Parser CostModels
parseCostModels Bool
True [] Value
val

instance ToJSON AlonzoExtraConfig where
  toJSON :: AlonzoExtraConfig -> Value
toJSON (AlonzoExtraConfig Maybe CostModels
cms) = [Pair] -> Value
Aeson.object [Key
"costModels" Key -> Maybe CostModels -> Pair
forall v. ToJSON v => Key -> v -> Pair
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Maybe CostModels
cms]

pattern AlonzoGenesis ::
  CoinPerWord ->
  CostModel ->
  Prices ->
  ExUnits ->
  ExUnits ->
  Natural ->
  Natural ->
  Natural ->
  Maybe AlonzoExtraConfig ->
  AlonzoGenesis
pattern $mAlonzoGenesis :: forall {r}.
AlonzoGenesis
-> (CoinPerWord
    -> CostModel
    -> Prices
    -> ExUnits
    -> ExUnits
    -> Natural
    -> Natural
    -> Natural
    -> Maybe AlonzoExtraConfig
    -> r)
-> ((# #) -> r)
-> r
$bAlonzoGenesis :: CoinPerWord
-> CostModel
-> Prices
-> ExUnits
-> ExUnits
-> Natural
-> Natural
-> Natural
-> Maybe AlonzoExtraConfig
-> AlonzoGenesis
AlonzoGenesis
  { AlonzoGenesis -> CoinPerWord
agCoinsPerUTxOWord
  , AlonzoGenesis -> CostModel
agPlutusV1CostModel
  , AlonzoGenesis -> Prices
agPrices
  , AlonzoGenesis -> ExUnits
agMaxTxExUnits
  , AlonzoGenesis -> ExUnits
agMaxBlockExUnits
  , AlonzoGenesis -> Natural
agMaxValSize
  , AlonzoGenesis -> Natural
agCollateralPercentage
  , AlonzoGenesis -> Natural
agMaxCollateralInputs
  , AlonzoGenesis -> Maybe AlonzoExtraConfig
agExtraConfig
  } <-
  AlonzoGenesisWrapper
    { unAlonzoGenesisWrapper =
      UpgradeAlonzoPParams
        { uappCoinsPerUTxOWord = agCoinsPerUTxOWord
        , uappPlutusV1CostModel = agPlutusV1CostModel
        , uappPrices = agPrices
        , uappMaxTxExUnits = agMaxTxExUnits
        , uappMaxBlockExUnits = agMaxBlockExUnits
        , uappMaxValSize = agMaxValSize
        , uappCollateralPercentage = agCollateralPercentage
        , uappMaxCollateralInputs = agMaxCollateralInputs
        }
    , extraConfig = agExtraConfig
    }
  where
    AlonzoGenesis
      CoinPerWord
coinsPerUTxOWord_
      CostModel
costModels_
      Prices
prices_
      ExUnits
maxTxExUnits_
      ExUnits
maxBlockExUnits_
      Natural
maxValSize_
      Natural
collateralPercentage_
      Natural
maxCollateralInputs_
      Maybe AlonzoExtraConfig
extraConfig_ =
        UpgradeAlonzoPParams Identity
-> Maybe AlonzoExtraConfig -> AlonzoGenesis
AlonzoGenesisWrapper
          ( UpgradeAlonzoPParams
              { uappCoinsPerUTxOWord :: HKD Identity CoinPerWord
uappCoinsPerUTxOWord = HKD Identity CoinPerWord
CoinPerWord
coinsPerUTxOWord_
              , uappPlutusV1CostModel :: HKD Identity CostModel
uappPlutusV1CostModel = HKD Identity CostModel
CostModel
costModels_
              , uappPrices :: HKD Identity Prices
uappPrices = HKD Identity Prices
Prices
prices_
              , uappMaxTxExUnits :: HKD Identity ExUnits
uappMaxTxExUnits = HKD Identity ExUnits
ExUnits
maxTxExUnits_
              , uappMaxBlockExUnits :: HKD Identity ExUnits
uappMaxBlockExUnits = HKD Identity ExUnits
ExUnits
maxBlockExUnits_
              , uappMaxValSize :: HKD Identity Natural
uappMaxValSize = Natural
HKD Identity Natural
maxValSize_
              , uappCollateralPercentage :: HKD Identity Natural
uappCollateralPercentage = Natural
HKD Identity Natural
collateralPercentage_
              , uappMaxCollateralInputs :: HKD Identity Natural
uappMaxCollateralInputs = Natural
HKD Identity Natural
maxCollateralInputs_
              }
          )
          Maybe AlonzoExtraConfig
extraConfig_

{-# COMPLETE AlonzoGenesis #-}

instance EraGenesis AlonzoEra where
  type Genesis AlonzoEra = AlonzoGenesis

-- | Genesis types are always encoded with the version of era they are defined in.
instance DecCBOR AlonzoGenesis

instance EncCBOR AlonzoGenesis

instance FromCBOR AlonzoGenesis where
  fromCBOR :: forall s. Decoder s AlonzoGenesis
fromCBOR =
    forall era t s. Era era => Decoder s t -> Decoder s t
eraDecoder @AlonzoEra (Decoder s AlonzoGenesis -> Decoder s AlonzoGenesis)
-> Decoder s AlonzoGenesis -> Decoder s AlonzoGenesis
forall a b. (a -> b) -> a -> b
$
      Decode (Closed Dense) AlonzoGenesis -> Decoder s AlonzoGenesis
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode (Closed Dense) AlonzoGenesis -> Decoder s AlonzoGenesis)
-> Decode (Closed Dense) AlonzoGenesis -> Decoder s AlonzoGenesis
forall a b. (a -> b) -> a -> b
$
        (CoinPerWord
 -> CostModel
 -> Prices
 -> ExUnits
 -> ExUnits
 -> Natural
 -> Natural
 -> Natural
 -> Maybe AlonzoExtraConfig
 -> AlonzoGenesis)
-> Decode
     (Closed Dense)
     (CoinPerWord
      -> CostModel
      -> Prices
      -> ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall t. t -> Decode (Closed Dense) t
RecD CoinPerWord
-> CostModel
-> Prices
-> ExUnits
-> ExUnits
-> Natural
-> Natural
-> Natural
-> Maybe AlonzoExtraConfig
-> AlonzoGenesis
AlonzoGenesis
          Decode
  (Closed Dense)
  (CoinPerWord
   -> CostModel
   -> Prices
   -> ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 7)) CoinPerWord
-> Decode
     (Closed Dense)
     (CostModel
      -> Prices
      -> ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 7)) CoinPerWord
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode
  (Closed Dense)
  (CostModel
   -> Prices
   -> ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Decode (Closed Dense) CostModel
-> Decode
     (Closed Dense)
     (Prices
      -> ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! (forall s. Decoder s CostModel) -> Decode (Closed Dense) CostModel
forall t. (forall s. Decoder s t) -> Decode (Closed Dense) t
D (Language -> Decoder s CostModel
forall s. Language -> Decoder s CostModel
decodeCostModel Language
PlutusV1)
          Decode
  (Closed Dense)
  (Prices
   -> ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 6)) Prices
-> Decode
     (Closed Dense)
     (ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 6)) Prices
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode
  (Closed Dense)
  (ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 5)) ExUnits
-> Decode
     (Closed Dense)
     (ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 5)) ExUnits
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode
  (Closed Dense)
  (ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 4)) ExUnits
-> Decode
     (Closed Dense)
     (Natural
      -> Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 4)) ExUnits
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode
  (Closed Dense)
  (Natural
   -> Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 3)) Natural
-> Decode
     (Closed Dense)
     (Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 3)) Natural
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode
  (Closed Dense)
  (Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 2)) Natural
-> Decode
     (Closed Dense)
     (Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 2)) Natural
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode
  (Closed Dense)
  (Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 1)) Natural
-> Decode (Closed Dense) (Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 1)) Natural
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
          Decode (Closed Dense) (Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Decode (Closed (ZonkAny 0)) (Maybe AlonzoExtraConfig)
-> Decode (Closed Dense) AlonzoGenesis
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 0)) (Maybe AlonzoExtraConfig)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From

instance ToCBOR AlonzoGenesis where
  toCBOR :: AlonzoGenesis -> Encoding
toCBOR x :: AlonzoGenesis
x@(AlonzoGenesis CoinPerWord
_ CostModel
_ Prices
_ ExUnits
_ ExUnits
_ Natural
_ Natural
_ Natural
_ Maybe AlonzoExtraConfig
_) =
    let AlonzoGenesis {Natural
Maybe AlonzoExtraConfig
Prices
ExUnits
CostModel
CoinPerWord
agCoinsPerUTxOWord :: AlonzoGenesis -> CoinPerWord
agPlutusV1CostModel :: AlonzoGenesis -> CostModel
agPrices :: AlonzoGenesis -> Prices
agMaxTxExUnits :: AlonzoGenesis -> ExUnits
agMaxBlockExUnits :: AlonzoGenesis -> ExUnits
agMaxValSize :: AlonzoGenesis -> Natural
agCollateralPercentage :: AlonzoGenesis -> Natural
agMaxCollateralInputs :: AlonzoGenesis -> Natural
agExtraConfig :: AlonzoGenesis -> Maybe AlonzoExtraConfig
agCoinsPerUTxOWord :: CoinPerWord
agPlutusV1CostModel :: CostModel
agPrices :: Prices
agMaxTxExUnits :: ExUnits
agMaxBlockExUnits :: ExUnits
agMaxValSize :: Natural
agCollateralPercentage :: Natural
agMaxCollateralInputs :: Natural
agExtraConfig :: Maybe AlonzoExtraConfig
..} = AlonzoGenesis
x
     in forall era t. (Era era, EncCBOR t) => t -> Encoding
toEraCBOR @AlonzoEra (Encoding -> Encoding)
-> (Encode (Closed Dense) AlonzoGenesis -> Encoding)
-> Encode (Closed Dense) AlonzoGenesis
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Encode (Closed Dense) AlonzoGenesis -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode (Closed Dense) AlonzoGenesis -> Encoding)
-> Encode (Closed Dense) AlonzoGenesis -> Encoding
forall a b. (a -> b) -> a -> b
$
          (CoinPerWord
 -> CostModel
 -> Prices
 -> ExUnits
 -> ExUnits
 -> Natural
 -> Natural
 -> Natural
 -> Maybe AlonzoExtraConfig
 -> AlonzoGenesis)
-> Encode
     (Closed Dense)
     (CoinPerWord
      -> CostModel
      -> Prices
      -> ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall t. t -> Encode (Closed Dense) t
Rec CoinPerWord
-> CostModel
-> Prices
-> ExUnits
-> ExUnits
-> Natural
-> Natural
-> Natural
-> Maybe AlonzoExtraConfig
-> AlonzoGenesis
AlonzoGenesis
            Encode
  (Closed Dense)
  (CoinPerWord
   -> CostModel
   -> Prices
   -> ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Encode (Closed Dense) CoinPerWord
-> Encode
     (Closed Dense)
     (CostModel
      -> Prices
      -> ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> CoinPerWord -> Encode (Closed Dense) CoinPerWord
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To CoinPerWord
agCoinsPerUTxOWord
            Encode
  (Closed Dense)
  (CostModel
   -> Prices
   -> ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Encode (Closed Dense) CostModel
-> Encode
     (Closed Dense)
     (Prices
      -> ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> (CostModel -> Encoding)
-> CostModel -> Encode (Closed Dense) CostModel
forall t. (t -> Encoding) -> t -> Encode (Closed Dense) t
E CostModel -> Encoding
encodeCostModel CostModel
agPlutusV1CostModel
            Encode
  (Closed Dense)
  (Prices
   -> ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Encode (Closed Dense) Prices
-> Encode
     (Closed Dense)
     (ExUnits
      -> ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Prices -> Encode (Closed Dense) Prices
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Prices
agPrices
            Encode
  (Closed Dense)
  (ExUnits
   -> ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Encode (Closed Dense) ExUnits
-> Encode
     (Closed Dense)
     (ExUnits
      -> Natural
      -> Natural
      -> Natural
      -> Maybe AlonzoExtraConfig
      -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> ExUnits -> Encode (Closed Dense) ExUnits
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To ExUnits
agMaxTxExUnits
            Encode
  (Closed Dense)
  (ExUnits
   -> Natural
   -> Natural
   -> Natural
   -> Maybe AlonzoExtraConfig
   -> AlonzoGenesis)
-> Encode (Closed Dense) ExUnits
-> Encode
     (Closed Dense)
     (Natural
      -> Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> ExUnits -> Encode (Closed Dense) ExUnits
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To ExUnits
agMaxBlockExUnits
            Encode
  (Closed Dense)
  (Natural
   -> Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Encode (Closed Dense) Natural
-> Encode
     (Closed Dense)
     (Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Natural -> Encode (Closed Dense) Natural
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Natural
agMaxValSize
            Encode
  (Closed Dense)
  (Natural -> Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Encode (Closed Dense) Natural
-> Encode
     (Closed Dense)
     (Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Natural -> Encode (Closed Dense) Natural
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Natural
agCollateralPercentage
            Encode
  (Closed Dense)
  (Natural -> Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Encode (Closed Dense) Natural
-> Encode (Closed Dense) (Maybe AlonzoExtraConfig -> AlonzoGenesis)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Natural -> Encode (Closed Dense) Natural
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Natural
agMaxCollateralInputs
            Encode (Closed Dense) (Maybe AlonzoExtraConfig -> AlonzoGenesis)
-> Encode (Closed Dense) (Maybe AlonzoExtraConfig)
-> Encode (Closed Dense) AlonzoGenesis
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Maybe AlonzoExtraConfig
-> Encode (Closed Dense) (Maybe AlonzoExtraConfig)
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Maybe AlonzoExtraConfig
agExtraConfig

instance FromJSON AlonzoGenesis where
  parseJSON :: Value -> Parser AlonzoGenesis
parseJSON = String
-> (Object -> Parser AlonzoGenesis)
-> Value
-> Parser AlonzoGenesis
forall a. String -> (Object -> Parser a) -> Value -> Parser a
Aeson.withObject String
"Alonzo Genesis" ((Object -> Parser AlonzoGenesis) -> Value -> Parser AlonzoGenesis)
-> (Object -> Parser AlonzoGenesis)
-> Value
-> Parser AlonzoGenesis
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    agCoinsPerUTxOWord <- Object
o Object -> Key -> Parser CoinPerWord
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"lovelacePerUTxOWord"
    cms <- parseCostModels False [PlutusV1] =<< o .: "costModels"
    agPrices <- o .: "executionPrices"
    agMaxTxExUnits <- o .: "maxTxExUnits"
    agMaxBlockExUnits <- o .: "maxBlockExUnits"
    agMaxValSize <- o .: "maxValueSize"
    agCollateralPercentage <- o .: "collateralPercentage"
    agMaxCollateralInputs <- o .: "maxCollateralInputs"
    agExtraConfig <- o .:? "extraConfig"
    agPlutusV1CostModel <-
      case Map.toList (costModelsValid cms) of
        [] -> String -> Parser CostModel
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Expected \"PlutusV1\" cost model to be supplied"
        [(Language
PlutusV1, CostModel
pv1CostModel)] -> CostModel -> Parser CostModel
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CostModel
pv1CostModel
        [(Language, CostModel)]
_ ->
          String -> Parser CostModel
forall a. String -> Parser a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail (String -> Parser CostModel) -> String -> Parser CostModel
forall a b. (a -> b) -> a -> b
$
            String
"Only PlutusV1 CostModel is allowed in the AlonzoGenesis, but "
              String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String -> Context -> String
forall a. [a] -> [[a]] -> [a]
List.intercalate String
", " ((Word8 -> String) -> [Word8] -> Context
forall a b. (a -> b) -> [a] -> [b]
map Word8 -> String
forall a. Show a => a -> String
show ([Word8] -> Context)
-> (Map Word8 [Int64] -> [Word8]) -> Map Word8 [Int64] -> Context
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Word8 [Int64] -> [Word8]
forall k a. Map k a -> [k]
Map.keys (Map Word8 [Int64] -> Context) -> Map Word8 [Int64] -> Context
forall a b. (a -> b) -> a -> b
$ CostModels -> Map Word8 [Int64]
flattenCostModels CostModels
cms)
              String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" were supplied. Use \"extraConfig\" if you need to inject other cost models for testing."
    return AlonzoGenesis {..}

instance ToKeyValuePairs AlonzoGenesis where
  toKeyValuePairs :: forall e kv. KeyValue e kv => AlonzoGenesis -> [kv]
toKeyValuePairs AlonzoGenesis
ag =
    [ Key
"lovelacePerUTxOWord" Key -> CoinPerWord -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> CoinPerWord
agCoinsPerUTxOWord AlonzoGenesis
ag
    , Key
"costModels" Key -> CostModels -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= Map Language CostModel -> CostModels
mkCostModels (Language -> CostModel -> Map Language CostModel
forall k a. k -> a -> Map k a
Map.singleton Language
PlutusV1 (CostModel -> Map Language CostModel)
-> CostModel -> Map Language CostModel
forall a b. (a -> b) -> a -> b
$ AlonzoGenesis -> CostModel
agPlutusV1CostModel AlonzoGenesis
ag)
    , Key
"executionPrices" Key -> Prices -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> Prices
agPrices AlonzoGenesis
ag
    , Key
"maxTxExUnits" Key -> ExUnits -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> ExUnits
agMaxTxExUnits AlonzoGenesis
ag
    , Key
"maxBlockExUnits" Key -> ExUnits -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> ExUnits
agMaxBlockExUnits AlonzoGenesis
ag
    , Key
"maxValueSize" Key -> Natural -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> Natural
agMaxValSize AlonzoGenesis
ag
    , Key
"collateralPercentage" Key -> Natural -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> Natural
agCollateralPercentage AlonzoGenesis
ag
    , Key
"maxCollateralInputs" Key -> Natural -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoGenesis -> Natural
agMaxCollateralInputs AlonzoGenesis
ag
    ]
      [kv] -> [kv] -> [kv]
forall a. [a] -> [a] -> [a]
++ [Key
"extraConfig" Key -> AlonzoExtraConfig -> kv
forall v. ToJSON v => Key -> v -> kv
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= AlonzoExtraConfig
extraConfig | Just AlonzoExtraConfig
extraConfig <- [AlonzoGenesis -> Maybe AlonzoExtraConfig
agExtraConfig AlonzoGenesis
ag]]