{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Alonzo.Transition (
  TransitionConfig (..),
  alonzoInjectCostModels,
) where

import Cardano.Ledger.Alonzo.Core (AlonzoEraPParams, ppCostModelsL)
import Cardano.Ledger.Alonzo.Era
import Cardano.Ledger.Alonzo.Genesis
import Cardano.Ledger.Alonzo.Translation ()
import Cardano.Ledger.Mary
import Cardano.Ledger.Mary.Transition (TransitionConfig (MaryTransitionConfig))
import Cardano.Ledger.Plutus.CostModels (CostModels, updateCostModels)
import Cardano.Ledger.Shelley.LedgerState
import Cardano.Ledger.Shelley.Transition
import GHC.Generics
import Lens.Micro
import NoThunks.Class (NoThunks (..))

instance EraTransition AlonzoEra where
  data TransitionConfig AlonzoEra = AlonzoTransitionConfig
    { TransitionConfig AlonzoEra -> AlonzoGenesis
atcAlonzoGenesis :: !AlonzoGenesis
    , TransitionConfig AlonzoEra -> TransitionConfig MaryEra
atcMaryTransitionConfig :: !(TransitionConfig MaryEra)
    }
    deriving (Int -> TransitionConfig AlonzoEra -> ShowS
[TransitionConfig AlonzoEra] -> ShowS
TransitionConfig AlonzoEra -> String
(Int -> TransitionConfig AlonzoEra -> ShowS)
-> (TransitionConfig AlonzoEra -> String)
-> ([TransitionConfig AlonzoEra] -> ShowS)
-> Show (TransitionConfig AlonzoEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransitionConfig AlonzoEra -> ShowS
showsPrec :: Int -> TransitionConfig AlonzoEra -> ShowS
$cshow :: TransitionConfig AlonzoEra -> String
show :: TransitionConfig AlonzoEra -> String
$cshowList :: [TransitionConfig AlonzoEra] -> ShowS
showList :: [TransitionConfig AlonzoEra] -> ShowS
Show, TransitionConfig AlonzoEra -> TransitionConfig AlonzoEra -> Bool
(TransitionConfig AlonzoEra -> TransitionConfig AlonzoEra -> Bool)
-> (TransitionConfig AlonzoEra
    -> TransitionConfig AlonzoEra -> Bool)
-> Eq (TransitionConfig AlonzoEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TransitionConfig AlonzoEra -> TransitionConfig AlonzoEra -> Bool
== :: TransitionConfig AlonzoEra -> TransitionConfig AlonzoEra -> Bool
$c/= :: TransitionConfig AlonzoEra -> TransitionConfig AlonzoEra -> Bool
/= :: TransitionConfig AlonzoEra -> TransitionConfig AlonzoEra -> Bool
Eq, (forall x.
 TransitionConfig AlonzoEra -> Rep (TransitionConfig AlonzoEra) x)
-> (forall x.
    Rep (TransitionConfig AlonzoEra) x -> TransitionConfig AlonzoEra)
-> Generic (TransitionConfig AlonzoEra)
forall x.
Rep (TransitionConfig AlonzoEra) x -> TransitionConfig AlonzoEra
forall x.
TransitionConfig AlonzoEra -> Rep (TransitionConfig AlonzoEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
TransitionConfig AlonzoEra -> Rep (TransitionConfig AlonzoEra) x
from :: forall x.
TransitionConfig AlonzoEra -> Rep (TransitionConfig AlonzoEra) x
$cto :: forall x.
Rep (TransitionConfig AlonzoEra) x -> TransitionConfig AlonzoEra
to :: forall x.
Rep (TransitionConfig AlonzoEra) x -> TransitionConfig AlonzoEra
Generic)

  mkTransitionConfig :: TranslationContext AlonzoEra
-> TransitionConfig (PreviousEra AlonzoEra)
-> TransitionConfig AlonzoEra
mkTransitionConfig = TranslationContext AlonzoEra
-> TransitionConfig (PreviousEra AlonzoEra)
-> TransitionConfig AlonzoEra
AlonzoGenesis
-> TransitionConfig MaryEra -> TransitionConfig AlonzoEra
AlonzoTransitionConfig

  injectIntoTestState :: TransitionConfig AlonzoEra
-> NewEpochState AlonzoEra -> NewEpochState AlonzoEra
injectIntoTestState TransitionConfig AlonzoEra
cfg =
    TransitionConfig AlonzoEra
-> NewEpochState AlonzoEra -> NewEpochState AlonzoEra
forall era.
(EraTransition era, ShelleyEraAccounts era) =>
TransitionConfig era -> NewEpochState era -> NewEpochState era
shelleyRegisterInitialFundsThenStaking TransitionConfig AlonzoEra
cfg (NewEpochState AlonzoEra -> NewEpochState AlonzoEra)
-> (NewEpochState AlonzoEra -> NewEpochState AlonzoEra)
-> NewEpochState AlonzoEra
-> NewEpochState AlonzoEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransitionConfig AlonzoEra
-> NewEpochState AlonzoEra -> NewEpochState AlonzoEra
forall era.
(EraTransition era, AlonzoEraPParams era) =>
TransitionConfig AlonzoEra
-> NewEpochState era -> NewEpochState era
alonzoInjectCostModels TransitionConfig AlonzoEra
cfg

  tcPreviousEraConfigL :: EraTransition (PreviousEra AlonzoEra) =>
Lens'
  (TransitionConfig AlonzoEra)
  (TransitionConfig (PreviousEra AlonzoEra))
tcPreviousEraConfigL =
    (TransitionConfig AlonzoEra -> TransitionConfig MaryEra)
-> (TransitionConfig AlonzoEra
    -> TransitionConfig MaryEra -> TransitionConfig AlonzoEra)
-> Lens
     (TransitionConfig AlonzoEra)
     (TransitionConfig AlonzoEra)
     (TransitionConfig MaryEra)
     (TransitionConfig MaryEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens TransitionConfig AlonzoEra -> TransitionConfig MaryEra
atcMaryTransitionConfig (\TransitionConfig AlonzoEra
atc TransitionConfig MaryEra
pc -> TransitionConfig AlonzoEra
atc {atcMaryTransitionConfig = pc})

  tcTranslationContextL :: Lens' (TransitionConfig AlonzoEra) (TranslationContext AlonzoEra)
tcTranslationContextL =
    (TransitionConfig AlonzoEra -> AlonzoGenesis)
-> (TransitionConfig AlonzoEra
    -> AlonzoGenesis -> TransitionConfig AlonzoEra)
-> Lens
     (TransitionConfig AlonzoEra)
     (TransitionConfig AlonzoEra)
     AlonzoGenesis
     AlonzoGenesis
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens TransitionConfig AlonzoEra -> AlonzoGenesis
atcAlonzoGenesis (\TransitionConfig AlonzoEra
atc AlonzoGenesis
ag -> TransitionConfig AlonzoEra
atc {atcAlonzoGenesis = ag})

instance NoThunks (TransitionConfig AlonzoEra)

alonzoInjectCostModels ::
  (EraTransition era, AlonzoEraPParams era) =>
  TransitionConfig AlonzoEra -> NewEpochState era -> NewEpochState era
alonzoInjectCostModels :: forall era.
(EraTransition era, AlonzoEraPParams era) =>
TransitionConfig AlonzoEra
-> NewEpochState era -> NewEpochState era
alonzoInjectCostModels TransitionConfig AlonzoEra
cfg =
  case AlonzoGenesis -> Maybe AlonzoExtraConfig
agExtraConfig (AlonzoGenesis -> Maybe AlonzoExtraConfig)
-> AlonzoGenesis -> Maybe AlonzoExtraConfig
forall a b. (a -> b) -> a -> b
$ TransitionConfig AlonzoEra
cfg TransitionConfig AlonzoEra
-> Getting AlonzoGenesis (TransitionConfig AlonzoEra) AlonzoGenesis
-> AlonzoGenesis
forall s a. s -> Getting a s a -> a
^. (TranslationContext AlonzoEra
 -> Const AlonzoGenesis (TranslationContext AlonzoEra))
-> TransitionConfig AlonzoEra
-> Const AlonzoGenesis (TransitionConfig AlonzoEra)
Getting AlonzoGenesis (TransitionConfig AlonzoEra) AlonzoGenesis
forall era.
EraTransition era =>
Lens' (TransitionConfig era) (TranslationContext era)
Lens' (TransitionConfig AlonzoEra) (TranslationContext AlonzoEra)
tcTranslationContextL of
    Maybe AlonzoExtraConfig
Nothing -> NewEpochState era -> NewEpochState era
forall a. a -> a
id
    Just AlonzoExtraConfig
aec -> Maybe CostModels -> NewEpochState era -> NewEpochState era
forall era.
(EraTransition era, AlonzoEraPParams era) =>
Maybe CostModels -> NewEpochState era -> NewEpochState era
overrideCostModels (AlonzoExtraConfig -> Maybe CostModels
aecCostModels AlonzoExtraConfig
aec)

overrideCostModels ::
  (EraTransition era, AlonzoEraPParams era) =>
  Maybe CostModels ->
  NewEpochState era ->
  NewEpochState era
overrideCostModels :: forall era.
(EraTransition era, AlonzoEraPParams era) =>
Maybe CostModels -> NewEpochState era -> NewEpochState era
overrideCostModels = \case
  Maybe CostModels
Nothing -> NewEpochState era -> NewEpochState era
forall a. a -> a
id
  Just CostModels
cms -> (EpochState era -> Identity (EpochState era))
-> NewEpochState era -> Identity (NewEpochState era)
forall era (f :: * -> *).
Functor f =>
(EpochState era -> f (EpochState era))
-> NewEpochState era -> f (NewEpochState era)
nesEsL ((EpochState era -> Identity (EpochState era))
 -> NewEpochState era -> Identity (NewEpochState era))
-> ((CostModels -> Identity CostModels)
    -> EpochState era -> Identity (EpochState era))
-> (CostModels -> Identity CostModels)
-> NewEpochState era
-> Identity (NewEpochState era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (PParams era -> Identity (PParams era))
-> EpochState era -> Identity (EpochState era)
forall era. EraGov era => Lens' (EpochState era) (PParams era)
Lens' (EpochState era) (PParams era)
curPParamsEpochStateL ((PParams era -> Identity (PParams era))
 -> EpochState era -> Identity (EpochState era))
-> ((CostModels -> Identity CostModels)
    -> PParams era -> Identity (PParams era))
-> (CostModels -> Identity CostModels)
-> EpochState era
-> Identity (EpochState era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CostModels -> Identity CostModels)
-> PParams era -> Identity (PParams era)
forall era. AlonzoEraPParams era => Lens' (PParams era) CostModels
Lens' (PParams era) CostModels
ppCostModelsL ((CostModels -> Identity CostModels)
 -> NewEpochState era -> Identity (NewEpochState era))
-> (CostModels -> CostModels)
-> NewEpochState era
-> NewEpochState era
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ CostModels -> CostModels -> CostModels
updateCostModels CostModels
cms