{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE EmptyDataDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Dijkstra.Rules.SubLedger (
  DijkstraSUBLEDGER,
  DijkstraSubLedgerPredFailure (..),
  DijkstraSubLedgerEvent (..),
  SubLedgerEnv (..),
) where

import Cardano.Ledger.Alonzo.Plutus.Context (EraPlutusContext)
import Cardano.Ledger.Alonzo.Rules (AlonzoUtxowPredFailure)
import Cardano.Ledger.Alonzo.UTxO (AlonzoEraUTxO, AlonzoScriptsNeeded)
import Cardano.Ledger.Babbage.Rules (BabbageUtxowPredFailure)
import Cardano.Ledger.BaseTypes
import Cardano.Ledger.Binary (
  DecCBOR (..),
  EncCBOR (..),
 )
import Cardano.Ledger.Binary.Coders
import Cardano.Ledger.Coin (Coin)
import Cardano.Ledger.Conway.Core
import Cardano.Ledger.Conway.Governance
import Cardano.Ledger.Conway.Rules (
  ConwayCertsPredFailure,
  ConwayDelegPredFailure,
  ConwayGovCertPredFailure,
  ConwayGovEvent,
  ConwayGovPredFailure,
  ConwayLedgerPredFailure (..),
  GovEnv (..),
  GovSignal (..),
  gsCertificates,
  gsProposalProcedures,
  gsVotingProcedures,
  validateTreasuryValue,
  validateWithdrawalsDelegated,
 )
import Cardano.Ledger.Conway.State
import Cardano.Ledger.Dijkstra.Era (
  DijkstraEra,
  DijkstraSUBCERT,
  DijkstraSUBCERTS,
  DijkstraSUBDELEG,
  DijkstraSUBGOV,
  DijkstraSUBGOVCERT,
  DijkstraSUBLEDGER,
  DijkstraSUBPOOL,
  DijkstraSUBUTXO,
  DijkstraSUBUTXOW,
 )
import Cardano.Ledger.Dijkstra.Rules.Gov (DijkstraGovPredFailure (..))
import Cardano.Ledger.Dijkstra.Rules.SubCerts (DijkstraSubCertsPredFailure (..), SubCertsEnv (..))
import Cardano.Ledger.Dijkstra.Rules.SubDeleg (DijkstraSubDelegPredFailure)
import Cardano.Ledger.Dijkstra.Rules.SubGov (DijkstraSubGovEvent, DijkstraSubGovPredFailure (..))
import Cardano.Ledger.Dijkstra.Rules.SubGovCert (DijkstraSubGovCertPredFailure)
import Cardano.Ledger.Dijkstra.Rules.SubPool (DijkstraSubPoolEvent, DijkstraSubPoolPredFailure)
import Cardano.Ledger.Dijkstra.Rules.SubUtxow (DijkstraSubUtxowPredFailure (..), SubUtxowEnv (..))
import Cardano.Ledger.Dijkstra.Rules.Utxow (DijkstraUtxowPredFailure (..))
import Cardano.Ledger.Dijkstra.TxCert
import Cardano.Ledger.Rules.ValidationMode (runTest)
import Cardano.Ledger.Shelley.LedgerState
import Cardano.Ledger.Shelley.Rules (
  PoolEvent,
  ShelleyPoolPredFailure,
  ShelleyUtxowPredFailure,
  epochFromSlot,
 )
import Control.DeepSeq (NFData)
import Control.State.Transition.Extended (
  BaseM,
  Embed (..),
  Environment,
  Event,
  PredicateFailure,
  STS,
  Signal,
  State,
  TRC (TRC),
  TransitionRule,
  judgmentContext,
  liftSTS,
  trans,
  transitionRules,
 )
import Data.List.NonEmpty (NonEmpty)
import qualified Data.Sequence.Strict as StrictSeq
import GHC.Generics (Generic)
import Lens.Micro
import NoThunks.Class (NoThunks (..))

data SubLedgerEnv era = SubLedgerEnv
  { forall era. SubLedgerEnv era -> SlotNo
sleSlotNo :: SlotNo
  , forall era. SubLedgerEnv era -> Maybe EpochNo
sleEpochNo :: Maybe EpochNo
  , forall era. SubLedgerEnv era -> TxIx
sleTxIx :: TxIx
  , forall era. SubLedgerEnv era -> PParams era
slePParams :: PParams era
  , forall era. SubLedgerEnv era -> ChainAccountState
sleAccount :: ChainAccountState
  , forall era. SubLedgerEnv era -> ScriptsProvided era
sleScriptsProvided :: ScriptsProvided era
  }

data DijkstraSubLedgerPredFailure era
  = SubUtxowFailure (PredicateFailure (EraRule "SUBUTXOW" era))
  | SubCertsFailure (PredicateFailure (EraRule "SUBCERTS" era))
  | SubGovFailure (PredicateFailure (EraRule "SUBGOV" era))
  | SubWdrlNotDelegatedToDRep (NonEmpty (KeyHash Staking))
  | SubTreasuryValueMismatch (Mismatch RelEQ Coin)
  deriving ((forall x.
 DijkstraSubLedgerPredFailure era
 -> Rep (DijkstraSubLedgerPredFailure era) x)
-> (forall x.
    Rep (DijkstraSubLedgerPredFailure era) x
    -> DijkstraSubLedgerPredFailure era)
-> Generic (DijkstraSubLedgerPredFailure era)
forall x.
Rep (DijkstraSubLedgerPredFailure era) x
-> DijkstraSubLedgerPredFailure era
forall x.
DijkstraSubLedgerPredFailure era
-> Rep (DijkstraSubLedgerPredFailure era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x.
Rep (DijkstraSubLedgerPredFailure era) x
-> DijkstraSubLedgerPredFailure era
forall era x.
DijkstraSubLedgerPredFailure era
-> Rep (DijkstraSubLedgerPredFailure era) x
$cfrom :: forall era x.
DijkstraSubLedgerPredFailure era
-> Rep (DijkstraSubLedgerPredFailure era) x
from :: forall x.
DijkstraSubLedgerPredFailure era
-> Rep (DijkstraSubLedgerPredFailure era) x
$cto :: forall era x.
Rep (DijkstraSubLedgerPredFailure era) x
-> DijkstraSubLedgerPredFailure era
to :: forall x.
Rep (DijkstraSubLedgerPredFailure era) x
-> DijkstraSubLedgerPredFailure era
Generic)

deriving stock instance
  ( Eq (PredicateFailure (EraRule "SUBGOV" era))
  , Eq (PredicateFailure (EraRule "SUBCERTS" era))
  , Eq (PredicateFailure (EraRule "SUBUTXOW" era))
  ) =>
  Eq (DijkstraSubLedgerPredFailure era)

deriving stock instance
  ( Show (PredicateFailure (EraRule "SUBGOV" era))
  , Show (PredicateFailure (EraRule "SUBCERTS" era))
  , Show (PredicateFailure (EraRule "SUBUTXOW" era))
  ) =>
  Show (DijkstraSubLedgerPredFailure era)

instance
  ( NoThunks (PredicateFailure (EraRule "SUBGOV" era))
  , NoThunks (PredicateFailure (EraRule "SUBCERTS" era))
  , NoThunks (PredicateFailure (EraRule "SUBUTXOW" era))
  ) =>
  NoThunks (DijkstraSubLedgerPredFailure era)

instance
  ( NFData (PredicateFailure (EraRule "SUBGOV" era))
  , NFData (PredicateFailure (EraRule "SUBCERTS" era))
  , NFData (PredicateFailure (EraRule "SUBUTXOW" era))
  ) =>
  NFData (DijkstraSubLedgerPredFailure era)

type instance EraRuleFailure "SUBLEDGER" DijkstraEra = DijkstraSubLedgerPredFailure DijkstraEra

type instance EraRuleEvent "SUBLEDGER" DijkstraEra = DijkstraSubLedgerEvent DijkstraEra

instance InjectRuleFailure "SUBLEDGER" DijkstraSubLedgerPredFailure DijkstraEra

instance InjectRuleFailure "SUBLEDGER" DijkstraSubGovPredFailure DijkstraEra where
  injectFailure :: DijkstraSubGovPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
injectFailure = PredicateFailure (EraRule "SUBGOV" DijkstraEra)
-> DijkstraSubLedgerPredFailure DijkstraEra
DijkstraSubGovPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
forall era.
PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
SubGovFailure

instance InjectRuleFailure "SUBLEDGER" DijkstraSubUtxowPredFailure DijkstraEra where
  injectFailure :: DijkstraSubUtxowPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
injectFailure = PredicateFailure (EraRule "SUBUTXOW" DijkstraEra)
-> DijkstraSubLedgerPredFailure DijkstraEra
DijkstraSubUtxowPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
forall era.
PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
SubUtxowFailure

instance InjectRuleFailure "SUBLEDGER" DijkstraSubCertsPredFailure DijkstraEra where
  injectFailure :: DijkstraSubCertsPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
injectFailure = PredicateFailure (EraRule "SUBCERTS" DijkstraEra)
-> DijkstraSubLedgerPredFailure DijkstraEra
DijkstraSubCertsPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
forall era.
PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
SubCertsFailure

instance InjectRuleFailure "SUBLEDGER" ConwayLedgerPredFailure DijkstraEra where
  injectFailure :: ConwayLedgerPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
injectFailure = ConwayLedgerPredFailure DijkstraEra
-> EraRuleFailure "SUBLEDGER" DijkstraEra
ConwayLedgerPredFailure DijkstraEra
-> DijkstraSubLedgerPredFailure DijkstraEra
forall era.
(InjectRuleFailure "SUBUTXOW" DijkstraUtxowPredFailure era,
 PredicateFailure (EraRule "UTXOW" era)
 ~ DijkstraUtxowPredFailure era,
 InjectRuleFailure "SUBCERTS" ConwayCertsPredFailure era,
 PredicateFailure (EraRule "CERTS" era)
 ~ ConwayCertsPredFailure era,
 InjectRuleFailure "SUBGOV" DijkstraGovPredFailure era,
 PredicateFailure (EraRule "GOV" era)
 ~ DijkstraGovPredFailure era) =>
ConwayLedgerPredFailure era -> DijkstraSubLedgerPredFailure era
conwayToDijkstraSubLedgerPredFailure

data DijkstraSubLedgerEvent era
  = SubCertsEvent (Event (EraRule "SUBCERTS" era))
  | SubGovEvent (Event (EraRule "SUBGOV" era))
  | SubUtxowEvent (Event (EraRule "SUBUTXOW" era))
  deriving ((forall x.
 DijkstraSubLedgerEvent era -> Rep (DijkstraSubLedgerEvent era) x)
-> (forall x.
    Rep (DijkstraSubLedgerEvent era) x -> DijkstraSubLedgerEvent era)
-> Generic (DijkstraSubLedgerEvent era)
forall x.
Rep (DijkstraSubLedgerEvent era) x -> DijkstraSubLedgerEvent era
forall x.
DijkstraSubLedgerEvent era -> Rep (DijkstraSubLedgerEvent era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x.
Rep (DijkstraSubLedgerEvent era) x -> DijkstraSubLedgerEvent era
forall era x.
DijkstraSubLedgerEvent era -> Rep (DijkstraSubLedgerEvent era) x
$cfrom :: forall era x.
DijkstraSubLedgerEvent era -> Rep (DijkstraSubLedgerEvent era) x
from :: forall x.
DijkstraSubLedgerEvent era -> Rep (DijkstraSubLedgerEvent era) x
$cto :: forall era x.
Rep (DijkstraSubLedgerEvent era) x -> DijkstraSubLedgerEvent era
to :: forall x.
Rep (DijkstraSubLedgerEvent era) x -> DijkstraSubLedgerEvent era
Generic)

deriving instance
  ( Eq (Event (EraRule "SUBCERTS" era))
  , Eq (Event (EraRule "SUBGOV" era))
  , Eq (Event (EraRule "SUBUTXOW" era))
  ) =>
  Eq (DijkstraSubLedgerEvent era)

instance
  ( NFData (Event (EraRule "SUBCERTS" era))
  , NFData (Event (EraRule "SUBGOV" era))
  , NFData (Event (EraRule "SUBUTXOW" era))
  ) =>
  NFData (DijkstraSubLedgerEvent era)

instance InjectRuleEvent "SUBLEDGER" DijkstraSubLedgerEvent DijkstraEra

instance
  ( EraTx era
  , ConwayEraTxBody era
  , ConwayEraGov era
  , ConwayEraCertState era
  , EraRule "SUBLEDGER" era ~ DijkstraSUBLEDGER era
  , EraRule "SUBGOV" era ~ DijkstraSUBGOV era
  , EraRule "SUBUTXO" era ~ DijkstraSUBUTXO era
  , EraRule "SUBUTXOW" era ~ DijkstraSUBUTXOW era
  , EraRule "SUBCERTS" era ~ DijkstraSUBCERTS era
  , EraRule "SUBCERT" era ~ DijkstraSUBCERT era
  , EraRule "SUBDELEG" era ~ DijkstraSUBDELEG era
  , EraRule "SUBPOOL" era ~ DijkstraSUBPOOL era
  , EraRule "SUBGOVCERT" era ~ DijkstraSUBGOVCERT era
  , Embed (EraRule "SUBGOV" era) (DijkstraSUBLEDGER era)
  , Embed (EraRule "SUBUTXOW" era) (DijkstraSUBLEDGER era)
  , Embed (EraRule "SUBCERTS" era) (DijkstraSUBCERTS era)
  , InjectRuleEvent "SUBPOOL" PoolEvent era
  , InjectRuleEvent "SUBPOOL" DijkstraSubPoolEvent era
  , InjectRuleFailure "SUBPOOL" ShelleyPoolPredFailure era
  , InjectRuleFailure "SUBPOOL" DijkstraSubPoolPredFailure era
  , InjectRuleFailure "SUBGOVCERT" DijkstraSubGovCertPredFailure era
  , InjectRuleFailure "SUBGOVCERT" ConwayGovCertPredFailure era
  , InjectRuleFailure "SUBDELEG" ConwayDelegPredFailure era
  , InjectRuleFailure "SUBDELEG" DijkstraSubDelegPredFailure era
  , InjectRuleFailure "SUBLEDGER" ConwayLedgerPredFailure era
  , InjectRuleFailure "SUBUTXOW" AlonzoUtxowPredFailure era
  , TxCert era ~ DijkstraTxCert era
  ) =>
  STS (DijkstraSUBLEDGER era)
  where
  type State (DijkstraSUBLEDGER era) = LedgerState era
  type Signal (DijkstraSUBLEDGER era) = Tx SubTx era
  type Environment (DijkstraSUBLEDGER era) = SubLedgerEnv era
  type BaseM (DijkstraSUBLEDGER era) = ShelleyBase
  type PredicateFailure (DijkstraSUBLEDGER era) = DijkstraSubLedgerPredFailure era
  type Event (DijkstraSUBLEDGER era) = DijkstraSubLedgerEvent era

  transitionRules :: [TransitionRule (DijkstraSUBLEDGER era)]
transitionRules = [forall era.
(EraTx era, ConwayEraTxBody era, ConwayEraGov era,
 ConwayEraCertState era,
 EraRule "SUBLEDGER" era ~ DijkstraSUBLEDGER era,
 EraRule "SUBGOV" era ~ DijkstraSUBGOV era,
 EraRule "SUBUTXOW" era ~ DijkstraSUBUTXOW era,
 EraRule "SUBCERTS" era ~ DijkstraSUBCERTS era,
 EraRule "SUBCERT" era ~ DijkstraSUBCERT era,
 EraRule "SUBDELEG" era ~ DijkstraSUBDELEG era,
 EraRule "SUBPOOL" era ~ DijkstraSUBPOOL era,
 EraRule "SUBGOVCERT" era ~ DijkstraSUBGOVCERT era,
 Embed (EraRule "SUBGOV" era) (DijkstraSUBLEDGER era),
 Embed (EraRule "SUBUTXOW" era) (DijkstraSUBLEDGER era),
 InjectRuleFailure "SUBLEDGER" ConwayLedgerPredFailure era,
 InjectRuleEvent "SUBPOOL" PoolEvent era,
 InjectRuleEvent "SUBPOOL" DijkstraSubPoolEvent era,
 InjectRuleFailure "SUBPOOL" ShelleyPoolPredFailure era,
 InjectRuleFailure "SUBPOOL" DijkstraSubPoolPredFailure era,
 InjectRuleFailure "SUBGOVCERT" DijkstraSubGovCertPredFailure era,
 InjectRuleFailure "SUBGOVCERT" ConwayGovCertPredFailure era,
 InjectRuleFailure "SUBDELEG" ConwayDelegPredFailure era,
 InjectRuleFailure "SUBDELEG" DijkstraSubDelegPredFailure era,
 STS (EraRule "SUBLEDGER" era), TxCert era ~ DijkstraTxCert era) =>
TransitionRule (EraRule "SUBLEDGER" era)
dijkstraSubLedgersTransition @era]

dijkstraSubLedgersTransition ::
  forall era.
  ( EraTx era
  , ConwayEraTxBody era
  , ConwayEraGov era
  , ConwayEraCertState era
  , EraRule "SUBLEDGER" era ~ DijkstraSUBLEDGER era
  , EraRule "SUBGOV" era ~ DijkstraSUBGOV era
  , EraRule "SUBUTXOW" era ~ DijkstraSUBUTXOW era
  , EraRule "SUBCERTS" era ~ DijkstraSUBCERTS era
  , EraRule "SUBCERT" era ~ DijkstraSUBCERT era
  , EraRule "SUBDELEG" era ~ DijkstraSUBDELEG era
  , EraRule "SUBPOOL" era ~ DijkstraSUBPOOL era
  , EraRule "SUBGOVCERT" era ~ DijkstraSUBGOVCERT era
  , Embed (EraRule "SUBGOV" era) (DijkstraSUBLEDGER era)
  , Embed (EraRule "SUBUTXOW" era) (DijkstraSUBLEDGER era)
  , InjectRuleFailure "SUBLEDGER" ConwayLedgerPredFailure era
  , InjectRuleEvent "SUBPOOL" PoolEvent era
  , InjectRuleEvent "SUBPOOL" DijkstraSubPoolEvent era
  , InjectRuleFailure "SUBPOOL" ShelleyPoolPredFailure era
  , InjectRuleFailure "SUBPOOL" DijkstraSubPoolPredFailure era
  , InjectRuleFailure "SUBGOVCERT" DijkstraSubGovCertPredFailure era
  , InjectRuleFailure "SUBGOVCERT" ConwayGovCertPredFailure era
  , InjectRuleFailure "SUBDELEG" ConwayDelegPredFailure era
  , InjectRuleFailure "SUBDELEG" DijkstraSubDelegPredFailure era
  , STS (EraRule "SUBLEDGER" era)
  , TxCert era ~ DijkstraTxCert era
  ) =>
  TransitionRule (EraRule "SUBLEDGER" era)
dijkstraSubLedgersTransition :: forall era.
(EraTx era, ConwayEraTxBody era, ConwayEraGov era,
 ConwayEraCertState era,
 EraRule "SUBLEDGER" era ~ DijkstraSUBLEDGER era,
 EraRule "SUBGOV" era ~ DijkstraSUBGOV era,
 EraRule "SUBUTXOW" era ~ DijkstraSUBUTXOW era,
 EraRule "SUBCERTS" era ~ DijkstraSUBCERTS era,
 EraRule "SUBCERT" era ~ DijkstraSUBCERT era,
 EraRule "SUBDELEG" era ~ DijkstraSUBDELEG era,
 EraRule "SUBPOOL" era ~ DijkstraSUBPOOL era,
 EraRule "SUBGOVCERT" era ~ DijkstraSUBGOVCERT era,
 Embed (EraRule "SUBGOV" era) (DijkstraSUBLEDGER era),
 Embed (EraRule "SUBUTXOW" era) (DijkstraSUBLEDGER era),
 InjectRuleFailure "SUBLEDGER" ConwayLedgerPredFailure era,
 InjectRuleEvent "SUBPOOL" PoolEvent era,
 InjectRuleEvent "SUBPOOL" DijkstraSubPoolEvent era,
 InjectRuleFailure "SUBPOOL" ShelleyPoolPredFailure era,
 InjectRuleFailure "SUBPOOL" DijkstraSubPoolPredFailure era,
 InjectRuleFailure "SUBGOVCERT" DijkstraSubGovCertPredFailure era,
 InjectRuleFailure "SUBGOVCERT" ConwayGovCertPredFailure era,
 InjectRuleFailure "SUBDELEG" ConwayDelegPredFailure era,
 InjectRuleFailure "SUBDELEG" DijkstraSubDelegPredFailure era,
 STS (EraRule "SUBLEDGER" era), TxCert era ~ DijkstraTxCert era) =>
TransitionRule (EraRule "SUBLEDGER" era)
dijkstraSubLedgersTransition = do
  TRC
    ( SubLedgerEnv slot mbCurEpochNo _ pp chainAccountState scriptsProvided
      , ledgerState@(LedgerState utxoState certState)
      , tx
      ) <-
    Rule
  (DijkstraSUBLEDGER era)
  'Transition
  (RuleContext 'Transition (DijkstraSUBLEDGER era))
F (Clause (DijkstraSUBLEDGER era) 'Transition)
  (TRC (DijkstraSUBLEDGER era))
forall sts (rtype :: RuleType).
Rule sts rtype (RuleContext rtype sts)
judgmentContext

  curEpochNo <- maybe (liftSTS $ epochFromSlot slot) pure mbCurEpochNo
  let txBody = Tx SubTx era
Signal (DijkstraSUBLEDGER era)
tx Tx SubTx era
-> Getting (TxBody SubTx era) (Tx SubTx era) (TxBody SubTx era)
-> TxBody SubTx era
forall s a. s -> Getting a s a -> a
^. Getting (TxBody SubTx era) (Tx SubTx era) (TxBody SubTx era)
forall era (l :: TxLevel).
EraTx era =>
Lens' (Tx l era) (TxBody l era)
forall (l :: TxLevel). Lens' (Tx l era) (TxBody l era)
bodyTxL
  let govState = UTxOState era
utxoState UTxOState era
-> Getting (GovState era) (UTxOState era) (GovState era)
-> GovState era
forall s a. s -> Getting a s a -> a
^. Getting (GovState era) (UTxOState era) (GovState era)
forall era (f :: * -> *).
Functor f =>
(GovState era -> f (GovState era))
-> UTxOState era -> f (UTxOState era)
utxosGovStateL
  let committee = GovState era
govState GovState era
-> Getting
     (StrictMaybe (Committee era))
     (GovState era)
     (StrictMaybe (Committee era))
-> StrictMaybe (Committee era)
forall s a. s -> Getting a s a -> a
^. Getting
  (StrictMaybe (Committee era))
  (GovState era)
  (StrictMaybe (Committee era))
forall era.
ConwayEraGov era =>
Lens' (GovState era) (StrictMaybe (Committee era))
Lens' (GovState era) (StrictMaybe (Committee era))
committeeGovStateL
  let proposals = GovState era
govState GovState era
-> Getting (Proposals era) (GovState era) (Proposals era)
-> Proposals era
forall s a. s -> Getting a s a -> a
^. Getting (Proposals era) (GovState era) (Proposals era)
forall era.
ConwayEraGov era =>
Lens' (GovState era) (Proposals era)
Lens' (GovState era) (Proposals era)
proposalsGovStateL
      accounts = CertState era
certState CertState era
-> Getting (Accounts era) (CertState era) (Accounts era)
-> Accounts era
forall s a. s -> Getting a s a -> a
^. (DState era -> Const (Accounts era) (DState era))
-> CertState era -> Const (Accounts era) (CertState era)
forall era. EraCertState era => Lens' (CertState era) (DState era)
Lens' (CertState era) (DState era)
certDStateL ((DState era -> Const (Accounts era) (DState era))
 -> CertState era -> Const (Accounts era) (CertState era))
-> ((Accounts era -> Const (Accounts era) (Accounts era))
    -> DState era -> Const (Accounts era) (DState era))
-> Getting (Accounts era) (CertState era) (Accounts era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Accounts era -> Const (Accounts era) (Accounts era))
-> DState era -> Const (Accounts era) (DState era)
forall era. Lens' (DState era) (Accounts era)
forall (t :: * -> *) era.
CanSetAccounts t =>
Lens' (t era) (Accounts era)
accountsL

  runTest $ validateTreasuryValue txBody (chainAccountState ^. casTreasuryL)

  runTest $ validateWithdrawalsDelegated accounts tx

  certStateAfterSubCerts <-
    trans @(EraRule "SUBCERTS" era) $
      TRC
        ( SubCertsEnv tx pp curEpochNo committee (proposalsWithPurpose grCommitteeL proposals)
        , certState
        , StrictSeq.fromStrict $ txBody ^. certsTxBodyL
        )
  let govEnv =
        TxId
-> EpochNo
-> PParams era
-> StrictMaybe ScriptHash
-> CertState era
-> StrictMaybe (Committee era)
-> GovEnv era
forall era.
TxId
-> EpochNo
-> PParams era
-> StrictMaybe ScriptHash
-> CertState era
-> StrictMaybe (Committee era)
-> GovEnv era
GovEnv
          (TxBody SubTx era -> TxId
forall era (l :: TxLevel). EraTxBody era => TxBody l era -> TxId
txIdTxBody TxBody SubTx era
txBody)
          EpochNo
curEpochNo
          PParams era
pp
          (GovState era
govState GovState era
-> Getting
     (StrictMaybe ScriptHash) (GovState era) (StrictMaybe ScriptHash)
-> StrictMaybe ScriptHash
forall s a. s -> Getting a s a -> a
^. (Constitution era
 -> Const (StrictMaybe ScriptHash) (Constitution era))
-> GovState era -> Const (StrictMaybe ScriptHash) (GovState era)
forall era.
ConwayEraGov era =>
Lens' (GovState era) (Constitution era)
Lens' (GovState era) (Constitution era)
constitutionGovStateL ((Constitution era
  -> Const (StrictMaybe ScriptHash) (Constitution era))
 -> GovState era -> Const (StrictMaybe ScriptHash) (GovState era))
-> ((StrictMaybe ScriptHash
     -> Const (StrictMaybe ScriptHash) (StrictMaybe ScriptHash))
    -> Constitution era
    -> Const (StrictMaybe ScriptHash) (Constitution era))
-> Getting
     (StrictMaybe ScriptHash) (GovState era) (StrictMaybe ScriptHash)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (StrictMaybe ScriptHash
 -> Const (StrictMaybe ScriptHash) (StrictMaybe ScriptHash))
-> Constitution era
-> Const (StrictMaybe ScriptHash) (Constitution era)
forall era (f :: * -> *).
Functor f =>
(StrictMaybe ScriptHash -> f (StrictMaybe ScriptHash))
-> Constitution era -> f (Constitution era)
constitutionGuardrailsScriptHashL)
          CertState era
certStateAfterSubCerts
          StrictMaybe (Committee era)
committee
  let govSignal =
        GovSignal
          { gsVotingProcedures :: VotingProcedures era
gsVotingProcedures = TxBody SubTx era
txBody TxBody SubTx era
-> Getting
     (VotingProcedures era) (TxBody SubTx era) (VotingProcedures era)
-> VotingProcedures era
forall s a. s -> Getting a s a -> a
^. Getting
  (VotingProcedures era) (TxBody SubTx era) (VotingProcedures era)
forall era (l :: TxLevel).
ConwayEraTxBody era =>
Lens' (TxBody l era) (VotingProcedures era)
forall (l :: TxLevel). Lens' (TxBody l era) (VotingProcedures era)
votingProceduresTxBodyL
          , gsProposalProcedures :: OSet (ProposalProcedure era)
gsProposalProcedures = TxBody SubTx era
txBody TxBody SubTx era
-> Getting
     (OSet (ProposalProcedure era))
     (TxBody SubTx era)
     (OSet (ProposalProcedure era))
-> OSet (ProposalProcedure era)
forall s a. s -> Getting a s a -> a
^. Getting
  (OSet (ProposalProcedure era))
  (TxBody SubTx era)
  (OSet (ProposalProcedure era))
forall era (l :: TxLevel).
ConwayEraTxBody era =>
Lens' (TxBody l era) (OSet (ProposalProcedure era))
forall (l :: TxLevel).
Lens' (TxBody l era) (OSet (ProposalProcedure era))
proposalProceduresTxBodyL
          , gsCertificates :: StrictSeq (TxCert era)
gsCertificates = TxBody SubTx era
txBody TxBody SubTx era
-> Getting
     (StrictSeq (DijkstraTxCert era))
     (TxBody SubTx era)
     (StrictSeq (DijkstraTxCert era))
-> StrictSeq (DijkstraTxCert era)
forall s a. s -> Getting a s a -> a
^. (StrictSeq (TxCert era)
 -> Const (StrictSeq (DijkstraTxCert era)) (StrictSeq (TxCert era)))
-> TxBody SubTx era
-> Const (StrictSeq (DijkstraTxCert era)) (TxBody SubTx era)
Getting
  (StrictSeq (DijkstraTxCert era))
  (TxBody SubTx era)
  (StrictSeq (DijkstraTxCert era))
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (StrictSeq (TxCert era))
forall (l :: TxLevel).
Lens' (TxBody l era) (StrictSeq (TxCert era))
certsTxBodyL
          }
  proposalsState <-
    trans @(EraRule "SUBGOV" era) $
      TRC
        ( govEnv
        , proposals
        , govSignal
        )

  utxoStateAfterSubUtxow <-
    trans @(EraRule "SUBUTXOW" era) $
      TRC
        ( SubUtxowEnv slot pp certState scriptsProvided
        , utxoState
        , tx
        )
  pure $
    ledgerState
      & lsUTxOStateL .~ utxoStateAfterSubUtxow
      & lsUTxOStateL . utxosGovStateL . proposalsGovStateL .~ proposalsState
      & lsCertStateL .~ certStateAfterSubCerts

instance
  ( ConwayEraGov era
  , ConwayEraCertState era
  , ConwayEraPParams era
  , ConwayEraTxCert era
  , EraRule "SUBGOV" era ~ DijkstraSUBGOV era
  , InjectRuleEvent "SUBGOV" DijkstraSubGovEvent era
  , InjectRuleEvent "SUBGOV" ConwayGovEvent era
  , InjectRuleFailure "SUBGOV" DijkstraSubGovPredFailure era
  , InjectRuleFailure "SUBGOV" ConwayGovPredFailure era
  ) =>
  Embed (DijkstraSUBGOV era) (DijkstraSUBLEDGER era)
  where
  wrapFailed :: PredicateFailure (DijkstraSUBGOV era)
-> PredicateFailure (DijkstraSUBLEDGER era)
wrapFailed = PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
PredicateFailure (DijkstraSUBGOV era)
-> PredicateFailure (DijkstraSUBLEDGER era)
forall era.
PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
SubGovFailure
  wrapEvent :: Event (DijkstraSUBGOV era) -> Event (DijkstraSUBLEDGER era)
wrapEvent = Event (EraRule "SUBGOV" era) -> DijkstraSubLedgerEvent era
Event (DijkstraSUBGOV era) -> Event (DijkstraSUBLEDGER era)
forall era.
Event (EraRule "SUBGOV" era) -> DijkstraSubLedgerEvent era
SubGovEvent

instance
  ( AlonzoEraTx era
  , AlonzoEraUTxO era
  , ConwayEraGov era
  , ConwayEraCertState era
  , ConwayEraTxBody era
  , EraPlutusContext era
  , EraRule "SUBUTXO" era ~ DijkstraSUBUTXO era
  , EraRule "SUBUTXOW" era ~ DijkstraSUBUTXOW era
  , InjectRuleFailure "SUBUTXOW" AlonzoUtxowPredFailure era
  , InjectRuleFailure "SUBUTXOW" ShelleyUtxowPredFailure era
  , InjectRuleFailure "SUBUTXOW" BabbageUtxowPredFailure era
  , ScriptsNeeded era ~ AlonzoScriptsNeeded era
  ) =>
  Embed (DijkstraSUBUTXOW era) (DijkstraSUBLEDGER era)
  where
  wrapFailed :: PredicateFailure (DijkstraSUBUTXOW era)
-> PredicateFailure (DijkstraSUBLEDGER era)
wrapFailed = PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
PredicateFailure (DijkstraSUBUTXOW era)
-> PredicateFailure (DijkstraSUBLEDGER era)
forall era.
PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
SubUtxowFailure
  wrapEvent :: Event (DijkstraSUBUTXOW era) -> Event (DijkstraSUBLEDGER era)
wrapEvent = Event (EraRule "SUBUTXOW" era) -> DijkstraSubLedgerEvent era
Event (DijkstraSUBUTXOW era) -> Event (DijkstraSUBLEDGER era)
forall era.
Event (EraRule "SUBUTXOW" era) -> DijkstraSubLedgerEvent era
SubUtxowEvent

instance
  ( ConwayEraGov era
  , ConwayEraPParams era
  , ConwayEraCertState era
  , EraRule "SUBCERTS" era ~ DijkstraSUBCERTS era
  , EraRule "SUBCERT" era ~ DijkstraSUBCERT era
  , EraRule "SUBDELEG" era ~ DijkstraSUBDELEG era
  , EraRule "SUBPOOL" era ~ DijkstraSUBPOOL era
  , EraRule "SUBGOVCERT" era ~ DijkstraSUBGOVCERT era
  , InjectRuleEvent "SUBPOOL" DijkstraSubPoolEvent era
  , InjectRuleEvent "SUBPOOL" PoolEvent era
  , InjectRuleFailure "SUBPOOL" DijkstraSubPoolPredFailure era
  , InjectRuleFailure "SUBPOOL" ShelleyPoolPredFailure era
  , InjectRuleFailure "SUBGOVCERT" DijkstraSubGovCertPredFailure era
  , InjectRuleFailure "SUBGOVCERT" ConwayGovCertPredFailure era
  , InjectRuleFailure "SUBDELEG" ConwayDelegPredFailure era
  , InjectRuleFailure "SUBDELEG" DijkstraSubDelegPredFailure era
  , TxCert era ~ DijkstraTxCert era
  ) =>
  Embed (DijkstraSUBCERTS era) (DijkstraSUBLEDGER era)
  where
  wrapFailed :: PredicateFailure (DijkstraSUBCERTS era)
-> PredicateFailure (DijkstraSUBLEDGER era)
wrapFailed = PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
PredicateFailure (DijkstraSUBCERTS era)
-> PredicateFailure (DijkstraSUBLEDGER era)
forall era.
PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
SubCertsFailure
  wrapEvent :: Event (DijkstraSUBCERTS era) -> Event (DijkstraSUBLEDGER era)
wrapEvent = Event (EraRule "SUBCERTS" era) -> DijkstraSubLedgerEvent era
Event (DijkstraSUBCERTS era) -> Event (DijkstraSUBLEDGER era)
forall era.
Event (EraRule "SUBCERTS" era) -> DijkstraSubLedgerEvent era
SubCertsEvent

instance
  ( Era era
  , EncCBOR (PredicateFailure (EraRule "SUBUTXOW" era))
  , EncCBOR (PredicateFailure (EraRule "SUBCERTS" era))
  , EncCBOR (PredicateFailure (EraRule "SUBGOV" era))
  ) =>
  EncCBOR (DijkstraSubLedgerPredFailure era)
  where
  encCBOR :: DijkstraSubLedgerPredFailure era -> Encoding
encCBOR =
    Encode Open (DijkstraSubLedgerPredFailure era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode Open (DijkstraSubLedgerPredFailure era) -> Encoding)
-> (DijkstraSubLedgerPredFailure era
    -> Encode Open (DijkstraSubLedgerPredFailure era))
-> DijkstraSubLedgerPredFailure era
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
      SubUtxowFailure PredicateFailure (EraRule "SUBUTXOW" era)
x -> (PredicateFailure (EraRule "SUBUTXOW" era)
 -> DijkstraSubLedgerPredFailure era)
-> Word
-> Encode
     Open
     (PredicateFailure (EraRule "SUBUTXOW" era)
      -> DijkstraSubLedgerPredFailure era)
forall t. t -> Word -> Encode Open t
Sum (forall era.
PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
SubUtxowFailure @era) Word
1 Encode
  Open
  (PredicateFailure (EraRule "SUBUTXOW" era)
   -> DijkstraSubLedgerPredFailure era)
-> Encode
     (Closed Dense) (PredicateFailure (EraRule "SUBUTXOW" era))
-> Encode Open (DijkstraSubLedgerPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> PredicateFailure (EraRule "SUBUTXOW" era)
-> Encode
     (Closed Dense) (PredicateFailure (EraRule "SUBUTXOW" era))
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To PredicateFailure (EraRule "SUBUTXOW" era)
x
      SubCertsFailure PredicateFailure (EraRule "SUBCERTS" era)
x -> (PredicateFailure (EraRule "SUBCERTS" era)
 -> DijkstraSubLedgerPredFailure era)
-> Word
-> Encode
     Open
     (PredicateFailure (EraRule "SUBCERTS" era)
      -> DijkstraSubLedgerPredFailure era)
forall t. t -> Word -> Encode Open t
Sum (forall era.
PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
SubCertsFailure @era) Word
2 Encode
  Open
  (PredicateFailure (EraRule "SUBCERTS" era)
   -> DijkstraSubLedgerPredFailure era)
-> Encode
     (Closed Dense) (PredicateFailure (EraRule "SUBCERTS" era))
-> Encode Open (DijkstraSubLedgerPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> PredicateFailure (EraRule "SUBCERTS" era)
-> Encode
     (Closed Dense) (PredicateFailure (EraRule "SUBCERTS" era))
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To PredicateFailure (EraRule "SUBCERTS" era)
x
      SubGovFailure PredicateFailure (EraRule "SUBGOV" era)
x -> (PredicateFailure (EraRule "SUBGOV" era)
 -> DijkstraSubLedgerPredFailure era)
-> Word
-> Encode
     Open
     (PredicateFailure (EraRule "SUBGOV" era)
      -> DijkstraSubLedgerPredFailure era)
forall t. t -> Word -> Encode Open t
Sum (forall era.
PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
SubGovFailure @era) Word
3 Encode
  Open
  (PredicateFailure (EraRule "SUBGOV" era)
   -> DijkstraSubLedgerPredFailure era)
-> Encode (Closed Dense) (PredicateFailure (EraRule "SUBGOV" era))
-> Encode Open (DijkstraSubLedgerPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> PredicateFailure (EraRule "SUBGOV" era)
-> Encode (Closed Dense) (PredicateFailure (EraRule "SUBGOV" era))
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To PredicateFailure (EraRule "SUBGOV" era)
x
      SubWdrlNotDelegatedToDRep NonEmpty (KeyHash Staking)
x -> (NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era)
-> Word
-> Encode
     Open
     (NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era)
forall t. t -> Word -> Encode Open t
Sum (forall era.
NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era
SubWdrlNotDelegatedToDRep @era) Word
4 Encode
  Open
  (NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era)
-> Encode (Closed Dense) (NonEmpty (KeyHash Staking))
-> Encode Open (DijkstraSubLedgerPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> NonEmpty (KeyHash Staking)
-> Encode (Closed Dense) (NonEmpty (KeyHash Staking))
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To NonEmpty (KeyHash Staking)
x
      SubTreasuryValueMismatch Mismatch RelEQ Coin
mm -> (Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era)
-> Word
-> Encode
     Open (Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era)
forall t. t -> Word -> Encode Open t
Sum (forall era. Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era
SubTreasuryValueMismatch @era) Word
5 Encode
  Open (Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era)
-> Encode (Closed Dense) (Mismatch RelEQ Coin)
-> Encode Open (DijkstraSubLedgerPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Mismatch RelEQ Coin -> Encode (Closed Dense) (Mismatch RelEQ Coin)
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Mismatch RelEQ Coin
mm

instance
  ( Era era
  , DecCBOR (PredicateFailure (EraRule "SUBUTXOW" era))
  , DecCBOR (PredicateFailure (EraRule "SUBCERTS" era))
  , DecCBOR (PredicateFailure (EraRule "SUBGOV" era))
  ) =>
  DecCBOR (DijkstraSubLedgerPredFailure era)
  where
  decCBOR :: forall s. Decoder s (DijkstraSubLedgerPredFailure era)
decCBOR = Decode (Closed Dense) (DijkstraSubLedgerPredFailure era)
-> Decoder s (DijkstraSubLedgerPredFailure era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode (Closed Dense) (DijkstraSubLedgerPredFailure era)
 -> Decoder s (DijkstraSubLedgerPredFailure era))
-> ((Word -> Decode Open (DijkstraSubLedgerPredFailure era))
    -> Decode (Closed Dense) (DijkstraSubLedgerPredFailure era))
-> (Word -> Decode Open (DijkstraSubLedgerPredFailure era))
-> Decoder s (DijkstraSubLedgerPredFailure era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text
-> (Word -> Decode Open (DijkstraSubLedgerPredFailure era))
-> Decode (Closed Dense) (DijkstraSubLedgerPredFailure era)
forall t.
Text -> (Word -> Decode Open t) -> Decode (Closed Dense) t
Summands Text
"DijkstraSubLedgerPredFailure" ((Word -> Decode Open (DijkstraSubLedgerPredFailure era))
 -> Decoder s (DijkstraSubLedgerPredFailure era))
-> (Word -> Decode Open (DijkstraSubLedgerPredFailure era))
-> Decoder s (DijkstraSubLedgerPredFailure era)
forall a b. (a -> b) -> a -> b
$ \case
    Word
1 -> (PredicateFailure (EraRule "SUBUTXOW" era)
 -> DijkstraSubLedgerPredFailure era)
-> Decode
     Open
     (PredicateFailure (EraRule "SUBUTXOW" era)
      -> DijkstraSubLedgerPredFailure era)
forall t. t -> Decode Open t
SumD PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
forall era.
PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
SubUtxowFailure Decode
  Open
  (PredicateFailure (EraRule "SUBUTXOW" era)
   -> DijkstraSubLedgerPredFailure era)
-> Decode
     (Closed (ZonkAny 0)) (PredicateFailure (EraRule "SUBUTXOW" era))
-> Decode Open (DijkstraSubLedgerPredFailure era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode
  (Closed (ZonkAny 0)) (PredicateFailure (EraRule "SUBUTXOW" era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
2 -> (PredicateFailure (EraRule "SUBCERTS" era)
 -> DijkstraSubLedgerPredFailure era)
-> Decode
     Open
     (PredicateFailure (EraRule "SUBCERTS" era)
      -> DijkstraSubLedgerPredFailure era)
forall t. t -> Decode Open t
SumD PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
forall era.
PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
SubCertsFailure Decode
  Open
  (PredicateFailure (EraRule "SUBCERTS" era)
   -> DijkstraSubLedgerPredFailure era)
-> Decode
     (Closed (ZonkAny 1)) (PredicateFailure (EraRule "SUBCERTS" era))
-> Decode Open (DijkstraSubLedgerPredFailure era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode
  (Closed (ZonkAny 1)) (PredicateFailure (EraRule "SUBCERTS" era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
3 -> (PredicateFailure (EraRule "SUBGOV" era)
 -> DijkstraSubLedgerPredFailure era)
-> Decode
     Open
     (PredicateFailure (EraRule "SUBGOV" era)
      -> DijkstraSubLedgerPredFailure era)
forall t. t -> Decode Open t
SumD PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
forall era.
PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
SubGovFailure Decode
  Open
  (PredicateFailure (EraRule "SUBGOV" era)
   -> DijkstraSubLedgerPredFailure era)
-> Decode
     (Closed (ZonkAny 2)) (PredicateFailure (EraRule "SUBGOV" era))
-> Decode Open (DijkstraSubLedgerPredFailure era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode
  (Closed (ZonkAny 2)) (PredicateFailure (EraRule "SUBGOV" era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
4 -> (NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era)
-> Decode
     Open
     (NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era)
forall t. t -> Decode Open t
SumD NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era
forall era.
NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era
SubWdrlNotDelegatedToDRep Decode
  Open
  (NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era)
-> Decode (Closed (ZonkAny 3)) (NonEmpty (KeyHash Staking))
-> Decode Open (DijkstraSubLedgerPredFailure era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 3)) (NonEmpty (KeyHash Staking))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
5 -> (Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era)
-> Decode
     Open (Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era)
forall t. t -> Decode Open t
SumD Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era
forall era. Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era
SubTreasuryValueMismatch Decode
  Open (Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era)
-> Decode (Closed (ZonkAny 4)) (Mismatch RelEQ Coin)
-> Decode Open (DijkstraSubLedgerPredFailure era)
forall a (w1 :: Wrapped) t (w :: Density).
Typeable a =>
Decode w1 (a -> t) -> Decode (Closed w) a -> Decode w1 t
<! Decode (Closed (ZonkAny 4)) (Mismatch RelEQ Coin)
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
n -> Word -> Decode Open (DijkstraSubLedgerPredFailure era)
forall (w :: Wrapped) t. Word -> Decode w t
Invalid Word
n

conwayToDijkstraSubLedgerPredFailure ::
  forall era.
  ( InjectRuleFailure "SUBUTXOW" DijkstraUtxowPredFailure era
  , PredicateFailure (EraRule "UTXOW" era) ~ DijkstraUtxowPredFailure era
  , InjectRuleFailure "SUBCERTS" ConwayCertsPredFailure era
  , PredicateFailure (EraRule "CERTS" era) ~ ConwayCertsPredFailure era
  , InjectRuleFailure "SUBGOV" DijkstraGovPredFailure era
  , PredicateFailure (EraRule "GOV" era) ~ DijkstraGovPredFailure era
  ) =>
  ConwayLedgerPredFailure era ->
  DijkstraSubLedgerPredFailure era
conwayToDijkstraSubLedgerPredFailure :: forall era.
(InjectRuleFailure "SUBUTXOW" DijkstraUtxowPredFailure era,
 PredicateFailure (EraRule "UTXOW" era)
 ~ DijkstraUtxowPredFailure era,
 InjectRuleFailure "SUBCERTS" ConwayCertsPredFailure era,
 PredicateFailure (EraRule "CERTS" era)
 ~ ConwayCertsPredFailure era,
 InjectRuleFailure "SUBGOV" DijkstraGovPredFailure era,
 PredicateFailure (EraRule "GOV" era)
 ~ DijkstraGovPredFailure era) =>
ConwayLedgerPredFailure era -> DijkstraSubLedgerPredFailure era
conwayToDijkstraSubLedgerPredFailure = \case
  ConwayUtxowFailure PredicateFailure (EraRule "UTXOW" era)
f -> PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
forall era.
PredicateFailure (EraRule "SUBUTXOW" era)
-> DijkstraSubLedgerPredFailure era
SubUtxowFailure (forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure @"SUBUTXOW" PredicateFailure (EraRule "UTXOW" era)
DijkstraUtxowPredFailure era
f)
  ConwayCertsFailure PredicateFailure (EraRule "CERTS" era)
f -> PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
forall era.
PredicateFailure (EraRule "SUBCERTS" era)
-> DijkstraSubLedgerPredFailure era
SubCertsFailure (forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure @"SUBCERTS" PredicateFailure (EraRule "CERTS" era)
ConwayCertsPredFailure era
f)
  ConwayGovFailure PredicateFailure (EraRule "GOV" era)
f -> PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
forall era.
PredicateFailure (EraRule "SUBGOV" era)
-> DijkstraSubLedgerPredFailure era
SubGovFailure (forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure @"SUBGOV" PredicateFailure (EraRule "GOV" era)
DijkstraGovPredFailure era
f)
  ConwayWdrlNotDelegatedToDRep NonEmpty (KeyHash Staking)
x -> NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era
forall era.
NonEmpty (KeyHash Staking) -> DijkstraSubLedgerPredFailure era
SubWdrlNotDelegatedToDRep NonEmpty (KeyHash Staking)
x
  ConwayTreasuryValueMismatch Mismatch RelEQ Coin
x -> Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era
forall era. Mismatch RelEQ Coin -> DijkstraSubLedgerPredFailure era
SubTreasuryValueMismatch Mismatch RelEQ Coin
x
  ConwayTxRefScriptsSizeTooBig Mismatch RelLTEQ Int
_ -> String -> DijkstraSubLedgerPredFailure era
forall a. HasCallStack => String -> a
error String
"Impossible: `ConwayTxRefScriptsSizeTooBig` for SUBLEDGER"
  ConwayMempoolFailure Text
_ -> String -> DijkstraSubLedgerPredFailure era
forall a. HasCallStack => String -> a
error String
"Impossible: `ConwayMempoolFailure` for SUBLEDGER"
  ConwayWithdrawalsMissingAccounts Withdrawals
_ -> String -> DijkstraSubLedgerPredFailure era
forall a. HasCallStack => String -> a
error String
"Impossible: `ConwayWithdrawalsMissingAccounts` for SUBLEDGER"
  ConwayIncompleteWithdrawals NonEmptyMap AccountAddress (Mismatch RelEQ Coin)
_ -> String -> DijkstraSubLedgerPredFailure era
forall a. HasCallStack => String -> a
error String
"Impossible: `ConwayIncompleteWithdrawals` for SUBLEDGER"