{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE EmptyDataDeriving #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# 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.Mempool (
  DijkstraMEMPOOL,
  DijkstraMempoolPredFailure (..),
  DijkstraMempoolEvent (..),
) where

import Cardano.Ledger.Alonzo.Plutus.Context (EraPlutusContext)
import Cardano.Ledger.BaseTypes (ShelleyBase)
import Cardano.Ledger.Binary (DecCBOR (..), EncCBOR (..))
import Cardano.Ledger.Binary.Coders (
  Decode (..),
  Encode (..),
  decode,
  encode,
  (!>),
  (<!),
 )
import Cardano.Ledger.Conway.Governance (
  ConwayEraGov,
  ConwayGovState,
  Proposals,
 )
import Cardano.Ledger.Conway.Rules (
  CertsEnv,
  ConwayDelegPredFailure,
  ConwayGovCertPredFailure,
  ConwayGovEvent,
  ConwayGovPredFailure,
  ConwayLedgerPredFailure (ConwayMempoolFailure),
  GovEnv,
  GovSignal,
 )
import Cardano.Ledger.Dijkstra.Core
import Cardano.Ledger.Dijkstra.Era (
  DijkstraEra,
  DijkstraLEDGER,
  DijkstraMEMPOOL,
  DijkstraSUBCERT,
  DijkstraSUBCERTS,
  DijkstraSUBDELEG,
  DijkstraSUBGOV,
  DijkstraSUBGOVCERT,
  DijkstraSUBLEDGER,
  DijkstraSUBLEDGERS,
  DijkstraSUBPOOL,
  DijkstraSUBUTXO,
  DijkstraSUBUTXOS,
  DijkstraSUBUTXOW,
 )
import Cardano.Ledger.Dijkstra.Rules.Ledger (
  DijkstraLedgerPredFailure (..),
  conwayToDijkstraLedgerPredFailure,
 )
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.SubLedgers (DijkstraSubLedgersPredFailure (..))
import Cardano.Ledger.Dijkstra.Rules.SubPool (DijkstraSubPoolEvent, DijkstraSubPoolPredFailure)
import Cardano.Ledger.Dijkstra.Rules.Utxo (DijkstraUtxoPredFailure)
import Cardano.Ledger.Dijkstra.State
import Cardano.Ledger.Dijkstra.TxBody (DijkstraEraTxBody)
import Cardano.Ledger.Dijkstra.TxCert
import Cardano.Ledger.Shelley.LedgerState
import Cardano.Ledger.Shelley.Rules (
  LedgerEnv (..),
  PoolEvent,
  ShelleyLedgerPredFailure,
  ShelleyPoolPredFailure,
  UtxoEnv,
 )
import Control.DeepSeq (NFData)
import Control.State.Transition (
  BaseM,
  Environment,
  Event,
  PredicateFailure,
  STS (..),
  Signal,
  State,
  TRC (TRC),
  TransitionRule,
  judgmentContext,
  transitionRules,
  whenFailureFreeDefault,
  (?!),
 )
import Control.State.Transition.Extended (Embed (..), trans)
import qualified Data.Map.Strict as Map
import Data.Sequence (Seq)
import Data.Text (Text)
import GHC.Generics (Generic (..))
import Lens.Micro ((^.))

data DijkstraMempoolPredFailure era
  = LedgerFailure (PredicateFailure (EraRule "LEDGER" era))
  | MempoolFailure Text
  | AllInputsAreSpent
  deriving ((forall x.
 DijkstraMempoolPredFailure era
 -> Rep (DijkstraMempoolPredFailure era) x)
-> (forall x.
    Rep (DijkstraMempoolPredFailure era) x
    -> DijkstraMempoolPredFailure era)
-> Generic (DijkstraMempoolPredFailure era)
forall x.
Rep (DijkstraMempoolPredFailure era) x
-> DijkstraMempoolPredFailure era
forall x.
DijkstraMempoolPredFailure era
-> Rep (DijkstraMempoolPredFailure era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x.
Rep (DijkstraMempoolPredFailure era) x
-> DijkstraMempoolPredFailure era
forall era x.
DijkstraMempoolPredFailure era
-> Rep (DijkstraMempoolPredFailure era) x
$cfrom :: forall era x.
DijkstraMempoolPredFailure era
-> Rep (DijkstraMempoolPredFailure era) x
from :: forall x.
DijkstraMempoolPredFailure era
-> Rep (DijkstraMempoolPredFailure era) x
$cto :: forall era x.
Rep (DijkstraMempoolPredFailure era) x
-> DijkstraMempoolPredFailure era
to :: forall x.
Rep (DijkstraMempoolPredFailure era) x
-> DijkstraMempoolPredFailure era
Generic)

type instance EraRuleFailure "MEMPOOL" DijkstraEra = DijkstraMempoolPredFailure DijkstraEra

type instance EraRuleEvent "MEMPOOL" DijkstraEra = DijkstraMempoolEvent DijkstraEra

instance InjectRuleFailure "MEMPOOL" DijkstraMempoolPredFailure DijkstraEra

instance InjectRuleFailure "MEMPOOL" ConwayLedgerPredFailure DijkstraEra where
  injectFailure :: ConwayLedgerPredFailure DijkstraEra
-> EraRuleFailure "MEMPOOL" DijkstraEra
injectFailure = \case
    ConwayMempoolFailure Text
"All inputs are spent. Transaction has probably already been included" -> EraRuleFailure "MEMPOOL" DijkstraEra
DijkstraMempoolPredFailure DijkstraEra
forall era. DijkstraMempoolPredFailure era
AllInputsAreSpent
    ConwayMempoolFailure Text
predFailureMessage -> Text -> DijkstraMempoolPredFailure DijkstraEra
forall era. Text -> DijkstraMempoolPredFailure era
MempoolFailure Text
predFailureMessage
    ConwayLedgerPredFailure DijkstraEra
otherLedgerFailure -> PredicateFailure (EraRule "LEDGER" DijkstraEra)
-> DijkstraMempoolPredFailure DijkstraEra
forall era.
PredicateFailure (EraRule "LEDGER" era)
-> DijkstraMempoolPredFailure era
LedgerFailure (PredicateFailure (EraRule "LEDGER" DijkstraEra)
 -> DijkstraMempoolPredFailure DijkstraEra)
-> PredicateFailure (EraRule "LEDGER" DijkstraEra)
-> DijkstraMempoolPredFailure DijkstraEra
forall a b. (a -> b) -> a -> b
$ ConwayLedgerPredFailure DijkstraEra
-> DijkstraLedgerPredFailure DijkstraEra
forall era.
ConwayLedgerPredFailure era -> DijkstraLedgerPredFailure era
conwayToDijkstraLedgerPredFailure ConwayLedgerPredFailure DijkstraEra
otherLedgerFailure

instance InjectRuleFailure "MEMPOOL" DijkstraUtxoPredFailure DijkstraEra where
  injectFailure :: DijkstraUtxoPredFailure DijkstraEra
-> EraRuleFailure "MEMPOOL" DijkstraEra
injectFailure = PredicateFailure (EraRule "LEDGER" DijkstraEra)
-> DijkstraMempoolPredFailure DijkstraEra
DijkstraLedgerPredFailure DijkstraEra
-> DijkstraMempoolPredFailure DijkstraEra
forall era.
PredicateFailure (EraRule "LEDGER" era)
-> DijkstraMempoolPredFailure era
LedgerFailure (DijkstraLedgerPredFailure DijkstraEra
 -> DijkstraMempoolPredFailure DijkstraEra)
-> (DijkstraUtxoPredFailure DijkstraEra
    -> DijkstraLedgerPredFailure DijkstraEra)
-> DijkstraUtxoPredFailure DijkstraEra
-> DijkstraMempoolPredFailure DijkstraEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DijkstraUtxoPredFailure DijkstraEra
-> EraRuleFailure "LEDGER" DijkstraEra
DijkstraUtxoPredFailure DijkstraEra
-> DijkstraLedgerPredFailure DijkstraEra
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure

deriving instance
  Eq (PredicateFailure (EraRule "LEDGER" era)) =>
  Eq (DijkstraMempoolPredFailure era)

deriving instance
  Show (PredicateFailure (EraRule "LEDGER" era)) =>
  Show (DijkstraMempoolPredFailure era)

instance
  ( Era era
  , EncCBOR (PredicateFailure (EraRule "LEDGER" era))
  ) =>
  EncCBOR (DijkstraMempoolPredFailure era)
  where
  encCBOR :: DijkstraMempoolPredFailure era -> Encoding
encCBOR =
    Encode Open (DijkstraMempoolPredFailure era) -> Encoding
forall (w :: Wrapped) t. Encode w t -> Encoding
encode (Encode Open (DijkstraMempoolPredFailure era) -> Encoding)
-> (DijkstraMempoolPredFailure era
    -> Encode Open (DijkstraMempoolPredFailure era))
-> DijkstraMempoolPredFailure era
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. \case
      LedgerFailure PredicateFailure (EraRule "LEDGER" era)
x -> (PredicateFailure (EraRule "LEDGER" era)
 -> DijkstraMempoolPredFailure era)
-> Word
-> Encode
     Open
     (PredicateFailure (EraRule "LEDGER" era)
      -> DijkstraMempoolPredFailure era)
forall t. t -> Word -> Encode Open t
Sum (forall era.
PredicateFailure (EraRule "LEDGER" era)
-> DijkstraMempoolPredFailure era
LedgerFailure @era) Word
1 Encode
  Open
  (PredicateFailure (EraRule "LEDGER" era)
   -> DijkstraMempoolPredFailure era)
-> Encode (Closed Dense) (PredicateFailure (EraRule "LEDGER" era))
-> Encode Open (DijkstraMempoolPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> PredicateFailure (EraRule "LEDGER" era)
-> Encode (Closed Dense) (PredicateFailure (EraRule "LEDGER" era))
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To PredicateFailure (EraRule "LEDGER" era)
x
      MempoolFailure Text
t -> (Text -> DijkstraMempoolPredFailure era)
-> Word -> Encode Open (Text -> DijkstraMempoolPredFailure era)
forall t. t -> Word -> Encode Open t
Sum Text -> DijkstraMempoolPredFailure era
forall era. Text -> DijkstraMempoolPredFailure era
MempoolFailure Word
2 Encode Open (Text -> DijkstraMempoolPredFailure era)
-> Encode (Closed Dense) Text
-> Encode Open (DijkstraMempoolPredFailure era)
forall (w :: Wrapped) a t (r :: Density).
Encode w (a -> t) -> Encode (Closed r) a -> Encode w t
!> Text -> Encode (Closed Dense) Text
forall t. EncCBOR t => t -> Encode (Closed Dense) t
To Text
t
      DijkstraMempoolPredFailure era
AllInputsAreSpent -> DijkstraMempoolPredFailure era
-> Word -> Encode Open (DijkstraMempoolPredFailure era)
forall t. t -> Word -> Encode Open t
Sum DijkstraMempoolPredFailure era
forall era. DijkstraMempoolPredFailure era
AllInputsAreSpent Word
3

instance
  ( Era era
  , DecCBOR (PredicateFailure (EraRule "LEDGER" era))
  ) =>
  DecCBOR (DijkstraMempoolPredFailure era)
  where
  decCBOR :: forall s. Decoder s (DijkstraMempoolPredFailure era)
decCBOR = Decode (Closed Dense) (DijkstraMempoolPredFailure era)
-> Decoder s (DijkstraMempoolPredFailure era)
forall t (w :: Wrapped) s. Typeable t => Decode w t -> Decoder s t
decode (Decode (Closed Dense) (DijkstraMempoolPredFailure era)
 -> Decoder s (DijkstraMempoolPredFailure era))
-> ((Word -> Decode Open (DijkstraMempoolPredFailure era))
    -> Decode (Closed Dense) (DijkstraMempoolPredFailure era))
-> (Word -> Decode Open (DijkstraMempoolPredFailure era))
-> Decoder s (DijkstraMempoolPredFailure era)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text
-> (Word -> Decode Open (DijkstraMempoolPredFailure era))
-> Decode (Closed Dense) (DijkstraMempoolPredFailure era)
forall t.
Text -> (Word -> Decode Open t) -> Decode (Closed Dense) t
Summands Text
"DijkstraMempoolPredFailure" ((Word -> Decode Open (DijkstraMempoolPredFailure era))
 -> Decoder s (DijkstraMempoolPredFailure era))
-> (Word -> Decode Open (DijkstraMempoolPredFailure era))
-> Decoder s (DijkstraMempoolPredFailure era)
forall a b. (a -> b) -> a -> b
$ \case
    Word
1 -> (PredicateFailure (EraRule "LEDGER" era)
 -> DijkstraMempoolPredFailure era)
-> Decode
     Open
     (PredicateFailure (EraRule "LEDGER" era)
      -> DijkstraMempoolPredFailure era)
forall t. t -> Decode Open t
SumD (forall era.
PredicateFailure (EraRule "LEDGER" era)
-> DijkstraMempoolPredFailure era
LedgerFailure @era) Decode
  Open
  (PredicateFailure (EraRule "LEDGER" era)
   -> DijkstraMempoolPredFailure era)
-> Decode
     (Closed (ZonkAny 0)) (PredicateFailure (EraRule "LEDGER" era))
-> Decode Open (DijkstraMempoolPredFailure 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 "LEDGER" era))
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
2 -> (Text -> DijkstraMempoolPredFailure era)
-> Decode Open (Text -> DijkstraMempoolPredFailure era)
forall t. t -> Decode Open t
SumD Text -> DijkstraMempoolPredFailure era
forall era. Text -> DijkstraMempoolPredFailure era
MempoolFailure Decode Open (Text -> DijkstraMempoolPredFailure era)
-> Decode (Closed (ZonkAny 1)) Text
-> Decode Open (DijkstraMempoolPredFailure 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)) Text
forall t (w :: Wrapped). DecCBOR t => Decode w t
From
    Word
3 -> DijkstraMempoolPredFailure era
-> Decode Open (DijkstraMempoolPredFailure era)
forall t. t -> Decode Open t
SumD DijkstraMempoolPredFailure era
forall era. DijkstraMempoolPredFailure era
AllInputsAreSpent
    Word
n -> Word -> Decode Open (DijkstraMempoolPredFailure era)
forall (w :: Wrapped) t. Word -> Decode w t
Invalid Word
n

newtype DijkstraMempoolEvent era
  = LedgerEvent (Event (EraRule "LEDGER" era))
  deriving ((forall x.
 DijkstraMempoolEvent era -> Rep (DijkstraMempoolEvent era) x)
-> (forall x.
    Rep (DijkstraMempoolEvent era) x -> DijkstraMempoolEvent era)
-> Generic (DijkstraMempoolEvent era)
forall x.
Rep (DijkstraMempoolEvent era) x -> DijkstraMempoolEvent era
forall x.
DijkstraMempoolEvent era -> Rep (DijkstraMempoolEvent era) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall era x.
Rep (DijkstraMempoolEvent era) x -> DijkstraMempoolEvent era
forall era x.
DijkstraMempoolEvent era -> Rep (DijkstraMempoolEvent era) x
$cfrom :: forall era x.
DijkstraMempoolEvent era -> Rep (DijkstraMempoolEvent era) x
from :: forall x.
DijkstraMempoolEvent era -> Rep (DijkstraMempoolEvent era) x
$cto :: forall era x.
Rep (DijkstraMempoolEvent era) x -> DijkstraMempoolEvent era
to :: forall x.
Rep (DijkstraMempoolEvent era) x -> DijkstraMempoolEvent era
Generic)

deriving instance
  Eq (Event (EraRule "LEDGER" era)) =>
  Eq (DijkstraMempoolEvent era)

instance
  NFData (Event (EraRule "LEDGER" era)) =>
  NFData (DijkstraMempoolEvent era)

instance
  ( EraTx era
  , ConwayEraTxBody era
  , ConwayEraGov era
  , ConwayEraCertState era
  , EraStake era
  , EraCertState era
  , Embed (EraRule "LEDGER" era) (DijkstraMEMPOOL era)
  , State (EraRule "LEDGER" era) ~ LedgerState era
  , Eq (PredicateFailure (EraRule "CERTS" era))
  , Eq (PredicateFailure (EraRule "GOV" era))
  , Eq (PredicateFailure (EraRule "UTXOW" era))
  , Eq (PredicateFailure (EraRule "SUBLEDGERS" era))
  , Show (PredicateFailure (EraRule "CERTS" era))
  , Show (PredicateFailure (EraRule "GOV" era))
  , Show (PredicateFailure (EraRule "UTXOW" era))
  , Show (PredicateFailure (EraRule "SUBLEDGERS" era))
  , Environment (EraRule "LEDGER" era) ~ LedgerEnv era
  , Tx TopTx era ~ Signal (EraRule "LEDGER" era)
  , EraRuleFailure "SUBLEDGERS" era ~ DijkstraSubLedgersPredFailure era
  ) =>
  STS (DijkstraMEMPOOL era)
  where
  type State (DijkstraMEMPOOL era) = LedgerState era
  type Signal (DijkstraMEMPOOL era) = Tx TopTx era
  type Environment (DijkstraMEMPOOL era) = LedgerEnv era
  type BaseM (DijkstraMEMPOOL era) = ShelleyBase
  type PredicateFailure (DijkstraMEMPOOL era) = DijkstraMempoolPredFailure era
  type Event (DijkstraMEMPOOL era) = DijkstraMempoolEvent era

  transitionRules :: [TransitionRule (DijkstraMEMPOOL era)]
transitionRules = [forall era.
(EraTx era, Embed (EraRule "LEDGER" era) (DijkstraMEMPOOL era),
 State (EraRule "LEDGER" era) ~ LedgerState era,
 Environment (EraRule "LEDGER" era) ~ LedgerEnv era,
 Tx TopTx era ~ Signal (EraRule "LEDGER" era)) =>
TransitionRule (DijkstraMEMPOOL era)
mempoolTransition @era]

mempoolTransition ::
  forall era.
  ( EraTx era
  , Embed (EraRule "LEDGER" era) (DijkstraMEMPOOL era)
  , State (EraRule "LEDGER" era) ~ LedgerState era
  , Environment (EraRule "LEDGER" era) ~ LedgerEnv era
  , Tx TopTx era ~ Signal (EraRule "LEDGER" era)
  ) =>
  TransitionRule (DijkstraMEMPOOL era)
mempoolTransition :: forall era.
(EraTx era, Embed (EraRule "LEDGER" era) (DijkstraMEMPOOL era),
 State (EraRule "LEDGER" era) ~ LedgerState era,
 Environment (EraRule "LEDGER" era) ~ LedgerEnv era,
 Tx TopTx era ~ Signal (EraRule "LEDGER" era)) =>
TransitionRule (DijkstraMEMPOOL era)
mempoolTransition = do
  TRC trc@(_ledgerEnv, ledgerState, tx) <-
    Rule
  (DijkstraMEMPOOL era)
  'Transition
  (RuleContext 'Transition (DijkstraMEMPOOL era))
F (Clause (DijkstraMEMPOOL era) 'Transition)
  (TRC (DijkstraMEMPOOL era))
forall sts (rtype :: RuleType).
Rule sts rtype (RuleContext rtype sts)
judgmentContext

  -- This rule only gets invoked on transactions within the mempool.
  -- Add checks here that sanitize undesired transactions.

  -- Detect whether the transaction is probably a duplicate
  let
    inputs = Tx TopTx era
Signal (DijkstraMEMPOOL era)
tx Tx TopTx era
-> Getting (Set TxIn) (Tx TopTx era) (Set TxIn) -> Set TxIn
forall s a. s -> Getting a s a -> a
^. (TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era))
-> Tx TopTx era -> Const (Set TxIn) (Tx TopTx 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 ((TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era))
 -> Tx TopTx era -> Const (Set TxIn) (Tx TopTx era))
-> ((Set TxIn -> Const (Set TxIn) (Set TxIn))
    -> TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era))
-> Getting (Set TxIn) (Tx TopTx era) (Set TxIn)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Set TxIn -> Const (Set TxIn) (Set TxIn))
-> TxBody TopTx era -> Const (Set TxIn) (TxBody TopTx era)
forall era (l :: TxLevel).
EraTxBody era =>
Lens' (TxBody l era) (Set TxIn)
forall (l :: TxLevel). Lens' (TxBody l era) (Set TxIn)
inputsTxBodyL
    UTxO utxo = ledgerState ^. utxoG
    notAllSpent = (TxIn -> Bool) -> Set TxIn -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (TxIn -> Map TxIn (TxOut era) -> Bool
forall k a. Ord k => k -> Map k a -> Bool
`Map.member` Map TxIn (TxOut era)
utxo) Set TxIn
inputs
  notAllSpent
    ?! AllInputsAreSpent

  -- Continue with LEDGER rules if the transaction is not a duplicate,
  whenFailureFreeDefault ledgerState $ do
    trans @(EraRule "LEDGER" era) $ TRC trc

instance
  ( AlonzoEraTx era
  , ConwayEraCertState era
  , DijkstraEraTxBody era
  , ConwayEraGov era
  , EraPlutusContext era
  , GovState era ~ ConwayGovState era
  , Embed (EraRule "CERTS" era) (DijkstraLEDGER era)
  , Embed (EraRule "GOV" era) (DijkstraLEDGER era)
  , Embed (EraRule "UTXOW" era) (DijkstraLEDGER era)
  , Environment (EraRule "CERTS" era) ~ CertsEnv era
  , Environment (EraRule "GOV" era) ~ GovEnv era
  , Environment (EraRule "UTXOW" era) ~ UtxoEnv era
  , State (EraRule "CERTS" era) ~ CertState era
  , State (EraRule "GOV" era) ~ Proposals era
  , State (EraRule "UTXOW" era) ~ UTxOState era
  , Signal (EraRule "CERTS" era) ~ Seq (TxCert era)
  , Signal (EraRule "GOV" era) ~ GovSignal era
  , Signal (EraRule "UTXOW" era) ~ Tx TopTx era
  , EraRule "LEDGER" era ~ DijkstraLEDGER era
  , EraRule "SUBLEDGERS" era ~ DijkstraSUBLEDGERS era
  , EraRule "SUBLEDGER" era ~ DijkstraSUBLEDGER era
  , EraRule "SUBGOV" era ~ DijkstraSUBGOV era
  , EraRule "SUBUTXO" era ~ DijkstraSUBUTXO era
  , EraRule "SUBUTXOS" era ~ DijkstraSUBUTXOS 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
  , InjectRuleFailure "LEDGER" ShelleyLedgerPredFailure era
  , InjectRuleFailure "LEDGER" ConwayLedgerPredFailure era
  , InjectRuleFailure "LEDGER" DijkstraLedgerPredFailure 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 "DELEG" ConwayDelegPredFailure era
  , InjectRuleFailure "SUBDELEG" ConwayDelegPredFailure era
  , InjectRuleFailure "SUBDELEG" DijkstraSubDelegPredFailure era
  , InjectRuleEvent "SUBGOV" DijkstraSubGovEvent era
  , InjectRuleEvent "SUBGOV" ConwayGovEvent era
  , InjectRuleFailure "SUBGOV" DijkstraSubGovPredFailure era
  , InjectRuleFailure "SUBGOV" ConwayGovPredFailure era
  , TxCert era ~ DijkstraTxCert era
  ) =>
  Embed (DijkstraLEDGER era) (DijkstraMEMPOOL era)
  where
  wrapFailed :: PredicateFailure (DijkstraLEDGER era)
-> PredicateFailure (DijkstraMEMPOOL era)
wrapFailed = PredicateFailure (EraRule "LEDGER" era)
-> DijkstraMempoolPredFailure era
PredicateFailure (DijkstraLEDGER era)
-> PredicateFailure (DijkstraMEMPOOL era)
forall era.
PredicateFailure (EraRule "LEDGER" era)
-> DijkstraMempoolPredFailure era
LedgerFailure
  wrapEvent :: Event (DijkstraLEDGER era) -> Event (DijkstraMEMPOOL era)
wrapEvent = Event (EraRule "LEDGER" era) -> DijkstraMempoolEvent era
Event (DijkstraLEDGER era) -> Event (DijkstraMEMPOOL era)
forall era.
Event (EraRule "LEDGER" era) -> DijkstraMempoolEvent era
LedgerEvent