{-# 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.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,
  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.SubLedgers (DijkstraSubLedgersPredFailure (..))
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 (..), ShelleyLedgerPredFailure, 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
  , 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
  , 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