{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

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

import Cardano.Ledger.Alonzo.Era
import Cardano.Ledger.Alonzo.Genesis (AlonzoGenesis, toAlonzoGenesisPairs)
import Cardano.Ledger.Alonzo.Translation ()
import Cardano.Ledger.Mary
import Cardano.Ledger.Mary.Transition (TransitionConfig (MaryTransitionConfig))
import Cardano.Ledger.Shelley.Transition
import Data.Aeson (
  FromJSON (..),
  KeyValue (..),
  ToJSON (..),
  Value (..),
  object,
  pairs,
  withObject,
  (.:),
 )
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
-> NewEpochState AlonzoEra -> NewEpochState AlonzoEra
forall era.
EraTransition era =>
TransitionConfig era -> NewEpochState era -> NewEpochState era
registerInitialFundsThenStaking

  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)

instance ToJSON (TransitionConfig AlonzoEra) where
  toJSON :: TransitionConfig AlonzoEra -> Value
toJSON = [Pair] -> Value
object ([Pair] -> Value)
-> (TransitionConfig AlonzoEra -> [Pair])
-> TransitionConfig AlonzoEra
-> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransitionConfig AlonzoEra -> [Pair]
forall e a. KeyValue e a => TransitionConfig AlonzoEra -> [a]
toAlonzoTransitionConfigPairs
  toEncoding :: TransitionConfig AlonzoEra -> Encoding
toEncoding = Series -> Encoding
pairs (Series -> Encoding)
-> (TransitionConfig AlonzoEra -> Series)
-> TransitionConfig AlonzoEra
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Series] -> Series
forall a. Monoid a => [a] -> a
mconcat ([Series] -> Series)
-> (TransitionConfig AlonzoEra -> [Series])
-> TransitionConfig AlonzoEra
-> Series
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransitionConfig AlonzoEra -> [Series]
forall e a. KeyValue e a => TransitionConfig AlonzoEra -> [a]
toAlonzoTransitionConfigPairs

toAlonzoTransitionConfigPairs :: KeyValue e a => TransitionConfig AlonzoEra -> [a]
toAlonzoTransitionConfigPairs :: forall e a. KeyValue e a => TransitionConfig AlonzoEra -> [a]
toAlonzoTransitionConfigPairs TransitionConfig AlonzoEra
alonzoConfig =
  TransitionConfig ShelleyEra -> [a]
forall e a. KeyValue e a => TransitionConfig ShelleyEra -> [a]
toShelleyTransitionConfigPairs TransitionConfig ShelleyEra
shelleyConfig
    [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [Key
"alonzo" Key -> Value -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object (AlonzoGenesis -> [Pair]
forall e a. KeyValue e a => AlonzoGenesis -> [a]
toAlonzoGenesisPairs (TransitionConfig AlonzoEra
alonzoConfig 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))]
  where
    maryConfig :: TransitionConfig MaryEra
maryConfig = TransitionConfig AlonzoEra
alonzoConfig TransitionConfig AlonzoEra
-> Getting
     (TransitionConfig MaryEra)
     (TransitionConfig AlonzoEra)
     (TransitionConfig MaryEra)
-> TransitionConfig MaryEra
forall s a. s -> Getting a s a -> a
^. (TransitionConfig (PreviousEra AlonzoEra)
 -> Const
      (TransitionConfig MaryEra)
      (TransitionConfig (PreviousEra AlonzoEra)))
-> TransitionConfig AlonzoEra
-> Const (TransitionConfig MaryEra) (TransitionConfig AlonzoEra)
Getting
  (TransitionConfig MaryEra)
  (TransitionConfig AlonzoEra)
  (TransitionConfig MaryEra)
forall era.
(EraTransition era, EraTransition (PreviousEra era)) =>
Lens' (TransitionConfig era) (TransitionConfig (PreviousEra era))
Lens'
  (TransitionConfig AlonzoEra)
  (TransitionConfig (PreviousEra AlonzoEra))
tcPreviousEraConfigL
    allegraConfig :: TransitionConfig AllegraEra
allegraConfig = TransitionConfig MaryEra
maryConfig TransitionConfig MaryEra
-> Getting
     (TransitionConfig AllegraEra)
     (TransitionConfig MaryEra)
     (TransitionConfig AllegraEra)
-> TransitionConfig AllegraEra
forall s a. s -> Getting a s a -> a
^. Getting
  (TransitionConfig AllegraEra)
  (TransitionConfig MaryEra)
  (TransitionConfig AllegraEra)
(TransitionConfig (PreviousEra MaryEra)
 -> Const
      (TransitionConfig AllegraEra)
      (TransitionConfig (PreviousEra MaryEra)))
-> TransitionConfig MaryEra
-> Const (TransitionConfig AllegraEra) (TransitionConfig MaryEra)
forall era.
(EraTransition era, EraTransition (PreviousEra era)) =>
Lens' (TransitionConfig era) (TransitionConfig (PreviousEra era))
Lens'
  (TransitionConfig MaryEra) (TransitionConfig (PreviousEra MaryEra))
tcPreviousEraConfigL
    shelleyConfig :: TransitionConfig ShelleyEra
shelleyConfig = TransitionConfig AllegraEra
allegraConfig TransitionConfig AllegraEra
-> Getting
     (TransitionConfig ShelleyEra)
     (TransitionConfig AllegraEra)
     (TransitionConfig ShelleyEra)
-> TransitionConfig ShelleyEra
forall s a. s -> Getting a s a -> a
^. (TransitionConfig (PreviousEra AllegraEra)
 -> Const
      (TransitionConfig ShelleyEra)
      (TransitionConfig (PreviousEra AllegraEra)))
-> TransitionConfig AllegraEra
-> Const
     (TransitionConfig ShelleyEra) (TransitionConfig AllegraEra)
Getting
  (TransitionConfig ShelleyEra)
  (TransitionConfig AllegraEra)
  (TransitionConfig ShelleyEra)
forall era.
(EraTransition era, EraTransition (PreviousEra era)) =>
Lens' (TransitionConfig era) (TransitionConfig (PreviousEra era))
Lens'
  (TransitionConfig AllegraEra)
  (TransitionConfig (PreviousEra AllegraEra))
tcPreviousEraConfigL

instance FromJSON (TransitionConfig AlonzoEra) where
  parseJSON :: Value -> Parser (TransitionConfig AlonzoEra)
parseJSON = String
-> (Object -> Parser (TransitionConfig AlonzoEra))
-> Value
-> Parser (TransitionConfig AlonzoEra)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"AlonzoTransitionConfig" ((Object -> Parser (TransitionConfig AlonzoEra))
 -> Value -> Parser (TransitionConfig AlonzoEra))
-> (Object -> Parser (TransitionConfig AlonzoEra))
-> Value
-> Parser (TransitionConfig AlonzoEra)
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    AlonzoGenesis
pc <- Value -> Parser AlonzoGenesis
forall a. FromJSON a => Value -> Parser a
parseJSON (Object -> Value
Object Object
o)
    TransitionConfig MaryEra
ag <- Object
o Object -> Key -> Parser (TransitionConfig MaryEra)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"alonzo"
    TransitionConfig AlonzoEra -> Parser (TransitionConfig AlonzoEra)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TransitionConfig AlonzoEra -> Parser (TransitionConfig AlonzoEra))
-> TransitionConfig AlonzoEra
-> Parser (TransitionConfig AlonzoEra)
forall a b. (a -> b) -> a -> b
$ TranslationContext AlonzoEra
-> TransitionConfig (PreviousEra AlonzoEra)
-> TransitionConfig AlonzoEra
forall era.
EraTransition era =>
TranslationContext era
-> TransitionConfig (PreviousEra era) -> TransitionConfig era
mkTransitionConfig TranslationContext AlonzoEra
AlonzoGenesis
pc TransitionConfig (PreviousEra AlonzoEra)
TransitionConfig MaryEra
ag