{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}
module Cardano.Ledger.Babbage.Rules.Utxos (
BabbageUTXOS,
utxosTransition,
expectScriptsToPass,
babbageEvalScriptsTxInvalid,
) where
import Cardano.Ledger.Alonzo.Plutus.Context (EraPlutusContext)
import Cardano.Ledger.Alonzo.Plutus.Evaluate (
collectPlutusScriptsWithContext,
evalPlutusScripts,
)
import Cardano.Ledger.Alonzo.Rules (
AlonzoUtxosEvent (..),
AlonzoUtxosPredFailure (..),
TagMismatchDescription (..),
invalidBegin,
invalidEnd,
scriptFailureToFailureDescription,
validBegin,
validEnd,
when2Phase,
)
import Cardano.Ledger.Alonzo.UTxO (
AlonzoEraUTxO (..),
AlonzoScriptsNeeded,
)
import Cardano.Ledger.Babbage.Collateral (
collAdaBalance,
collOuts,
)
import Cardano.Ledger.Babbage.Core
import Cardano.Ledger.Babbage.Era (BabbageEra, BabbageUTXOS)
import Cardano.Ledger.Babbage.Rules.Ppup ()
import Cardano.Ledger.Babbage.State
import Cardano.Ledger.BaseTypes (
ShelleyBase,
StrictMaybe,
epochInfo,
systemStart,
)
import Cardano.Ledger.Binary (EncCBOR (..))
import Cardano.Ledger.Coin (Coin (..), DeltaCoin (..))
import Cardano.Ledger.Plutus.Evaluate (
ScriptFailure (..),
ScriptResult (..),
)
import Cardano.Ledger.Shelley.LedgerState (UTxOState (..))
import Cardano.Ledger.Shelley.PParams (Update)
import Cardano.Ledger.Shelley.Rules (
PpupEnv (..),
PpupEvent,
ShelleyPPUP,
ShelleyPpupPredFailure,
UtxoEnv (..),
updateUTxOState,
)
import Control.Monad.Trans.Reader (asks)
import Control.State.Transition.Extended
import Data.List.NonEmpty (nonEmpty)
import qualified Data.Map.Strict as Map
import Data.MapExtras (extractKeys)
import qualified Debug.Trace as Debug
import Lens.Micro
type instance EraRuleFailure "UTXOS" BabbageEra = AlonzoUtxosPredFailure BabbageEra
type instance EraRuleEvent "UTXOS" BabbageEra = AlonzoUtxosEvent BabbageEra
instance InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure BabbageEra
instance InjectRuleEvent "UTXOS" AlonzoUtxosEvent BabbageEra
instance InjectRuleFailure "UTXOS" ShelleyPpupPredFailure BabbageEra where
injectFailure :: ShelleyPpupPredFailure BabbageEra
-> EraRuleFailure "UTXOS" BabbageEra
injectFailure = EraRuleFailure "PPUP" BabbageEra
-> AlonzoUtxosPredFailure BabbageEra
ShelleyPpupPredFailure BabbageEra
-> EraRuleFailure "UTXOS" BabbageEra
forall era. EraRuleFailure "PPUP" era -> AlonzoUtxosPredFailure era
UpdateFailure
instance
( AlonzoEraTx era
, AlonzoEraPParams era
, ShelleyEraTxBody era
, BabbageEraTxBody era
, AlonzoEraUTxO era
, EraPlutusContext era
, EraStake era
, EraCertState era
, ScriptsNeeded era ~ AlonzoScriptsNeeded era
, EraGov era
, GovState era ~ ShelleyGovState era
, Embed (EraRule "PPUP" era) (BabbageUTXOS era)
, Environment (EraRule "PPUP" era) ~ PpupEnv era
, Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era)
, State (EraRule "PPUP" era) ~ ShelleyGovState era
, Signal (BabbageUTXOS era) ~ Tx TopTx era
, EncCBOR (EraRuleFailure "PPUP" era)
, Eq (EraRuleFailure "PPUP" era)
, Show (EraRuleFailure "PPUP" era)
, InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era
, InjectRuleEvent "UTXOS" AlonzoUtxosEvent era
, EraRule "UTXOS" era ~ BabbageUTXOS era
) =>
STS (BabbageUTXOS era)
where
type BaseM (BabbageUTXOS era) = ShelleyBase
type Environment (BabbageUTXOS era) = UtxoEnv era
type State (BabbageUTXOS era) = UTxOState era
type Signal (BabbageUTXOS era) = Tx TopTx era
type PredicateFailure (BabbageUTXOS era) = AlonzoUtxosPredFailure era
type Event (BabbageUTXOS era) = AlonzoUtxosEvent era
transitionRules :: [TransitionRule (BabbageUTXOS era)]
transitionRules = [TransitionRule (BabbageUTXOS era)
forall era.
(AlonzoEraTx era, ShelleyEraTxBody era, BabbageEraTxBody era,
AlonzoEraUTxO era, ScriptsNeeded era ~ AlonzoScriptsNeeded era,
EraCertState era, EraStake era, EraGov era,
GovState era ~ ShelleyGovState era,
Environment (EraRule "PPUP" era) ~ PpupEnv era,
Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era),
Embed (EraRule "PPUP" era) (BabbageUTXOS era),
State (EraRule "PPUP" era) ~ ShelleyGovState era,
EncCBOR (EraRuleFailure "PPUP" era),
Eq (EraRuleFailure "PPUP" era), Show (EraRuleFailure "PPUP" era),
EraPlutusContext era, EraRule "UTXOS" era ~ BabbageUTXOS era,
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
TransitionRule (BabbageUTXOS era)
utxosTransition]
instance
( Era era
, STS (ShelleyPPUP era)
, EraRuleFailure "PPUP" era ~ ShelleyPpupPredFailure era
, EraRuleEvent "PPUP" era ~ PpupEvent era
) =>
Embed (ShelleyPPUP era) (BabbageUTXOS era)
where
wrapFailed :: PredicateFailure (ShelleyPPUP era)
-> PredicateFailure (BabbageUTXOS era)
wrapFailed = EraRuleFailure "PPUP" era -> AlonzoUtxosPredFailure era
PredicateFailure (ShelleyPPUP era)
-> PredicateFailure (BabbageUTXOS era)
forall era. EraRuleFailure "PPUP" era -> AlonzoUtxosPredFailure era
UpdateFailure
wrapEvent :: Event (ShelleyPPUP era) -> Event (BabbageUTXOS era)
wrapEvent = EraRuleEvent "PPUP" era -> AlonzoUtxosEvent era
Event (ShelleyPPUP era) -> Event (BabbageUTXOS era)
forall era. EraRuleEvent "PPUP" era -> AlonzoUtxosEvent era
AlonzoPpupToUtxosEvent
utxosTransition ::
forall era.
( AlonzoEraTx era
, ShelleyEraTxBody era
, BabbageEraTxBody era
, AlonzoEraUTxO era
, ScriptsNeeded era ~ AlonzoScriptsNeeded era
, EraCertState era
, EraStake era
, EraGov era
, GovState era ~ ShelleyGovState era
, Environment (EraRule "PPUP" era) ~ PpupEnv era
, Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era)
, Embed (EraRule "PPUP" era) (BabbageUTXOS era)
, State (EraRule "PPUP" era) ~ ShelleyGovState era
, EncCBOR (EraRuleFailure "PPUP" era)
, Eq (EraRuleFailure "PPUP" era)
, Show (EraRuleFailure "PPUP" era)
, EraPlutusContext era
, EraRule "UTXOS" era ~ BabbageUTXOS era
, InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era
, InjectRuleEvent "UTXOS" AlonzoUtxosEvent era
) =>
TransitionRule (BabbageUTXOS era)
utxosTransition :: forall era.
(AlonzoEraTx era, ShelleyEraTxBody era, BabbageEraTxBody era,
AlonzoEraUTxO era, ScriptsNeeded era ~ AlonzoScriptsNeeded era,
EraCertState era, EraStake era, EraGov era,
GovState era ~ ShelleyGovState era,
Environment (EraRule "PPUP" era) ~ PpupEnv era,
Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era),
Embed (EraRule "PPUP" era) (BabbageUTXOS era),
State (EraRule "PPUP" era) ~ ShelleyGovState era,
EncCBOR (EraRuleFailure "PPUP" era),
Eq (EraRuleFailure "PPUP" era), Show (EraRuleFailure "PPUP" era),
EraPlutusContext era, EraRule "UTXOS" era ~ BabbageUTXOS era,
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
TransitionRule (BabbageUTXOS era)
utxosTransition =
Rule
(BabbageUTXOS era)
'Transition
(RuleContext 'Transition (BabbageUTXOS era))
F (Clause (BabbageUTXOS era) 'Transition) (TRC (BabbageUTXOS era))
forall sts (rtype :: RuleType).
Rule sts rtype (RuleContext rtype sts)
judgmentContext F (Clause (BabbageUTXOS era) 'Transition) (TRC (BabbageUTXOS era))
-> (TRC (BabbageUTXOS era)
-> F (Clause (BabbageUTXOS era) 'Transition) (UTxOState era))
-> F (Clause (BabbageUTXOS era) 'Transition) (UTxOState era)
forall a b.
F (Clause (BabbageUTXOS era) 'Transition) a
-> (a -> F (Clause (BabbageUTXOS era) 'Transition) b)
-> F (Clause (BabbageUTXOS era) 'Transition) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \(TRC (Environment (BabbageUTXOS era)
_, State (BabbageUTXOS era)
_, Signal (BabbageUTXOS era)
tx)) -> do
case Tx TopTx era
Signal (BabbageUTXOS era)
tx Tx TopTx era -> Getting IsValid (Tx TopTx era) IsValid -> IsValid
forall s a. s -> Getting a s a -> a
^. Getting IsValid (Tx TopTx era) IsValid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsValid
Lens' (Tx TopTx era) IsValid
isValidTxL of
IsValid Bool
True -> F (Clause (BabbageUTXOS era) 'Transition)
(State (BabbageUTXOS era))
F (Clause (BabbageUTXOS era) 'Transition) (UTxOState era)
forall era.
(AlonzoEraTx era, AlonzoEraUTxO era, ShelleyEraTxBody era,
EraStake era, EraCertState era,
ScriptsNeeded era ~ AlonzoScriptsNeeded era,
STS (BabbageUTXOS era),
Environment (EraRule "PPUP" era) ~ PpupEnv era,
Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era),
Embed (EraRule "PPUP" era) (BabbageUTXOS era),
GovState era ~ ShelleyGovState era,
State (EraRule "PPUP" era) ~ ShelleyGovState era,
EraPlutusContext era,
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
EraRule "UTXOS" era ~ BabbageUTXOS era,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
TransitionRule (BabbageUTXOS era)
babbageEvalScriptsTxValid
IsValid Bool
False -> TransitionRule (EraRule "UTXOS" era)
F (Clause (BabbageUTXOS era) 'Transition) (UTxOState era)
forall era.
(EraStake era, AlonzoEraTx era, BabbageEraTxBody era,
EraPlutusContext era, AlonzoEraUTxO era,
ScriptsNeeded era ~ AlonzoScriptsNeeded era,
STS (EraRule "UTXOS" era),
Environment (EraRule "UTXOS" era) ~ UtxoEnv era,
Signal (EraRule "UTXOS" era) ~ Tx TopTx era,
State (EraRule "UTXOS" era) ~ UTxOState era,
BaseM (EraRule "UTXOS" era) ~ ShelleyBase,
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
TransitionRule (EraRule "UTXOS" era)
babbageEvalScriptsTxInvalid
expectScriptsToPass ::
forall era.
( AlonzoEraTx era
, EraPlutusContext era
, AlonzoEraUTxO era
, ScriptsNeeded era ~ AlonzoScriptsNeeded era
, STS (EraRule "UTXOS" era)
, InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era
, BaseM (EraRule "UTXOS" era) ~ ShelleyBase
, InjectRuleEvent "UTXOS" AlonzoUtxosEvent era
) =>
PParams era ->
Tx TopTx era ->
UTxO era ->
Rule (EraRule "UTXOS" era) 'Transition ()
expectScriptsToPass :: forall era.
(AlonzoEraTx era, EraPlutusContext era, AlonzoEraUTxO era,
ScriptsNeeded era ~ AlonzoScriptsNeeded era,
STS (EraRule "UTXOS" era),
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
BaseM (EraRule "UTXOS" era) ~ ShelleyBase,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
PParams era
-> Tx TopTx era
-> UTxO era
-> Rule (EraRule "UTXOS" era) 'Transition ()
expectScriptsToPass PParams era
pp Tx TopTx era
tx UTxO era
utxo = do
sysSt <- BaseM (EraRule "UTXOS" era) SystemStart
-> Rule (EraRule "UTXOS" era) 'Transition SystemStart
forall sts a (ctx :: RuleType).
STS sts =>
BaseM sts a -> Rule sts ctx a
liftSTS (BaseM (EraRule "UTXOS" era) SystemStart
-> Rule (EraRule "UTXOS" era) 'Transition SystemStart)
-> BaseM (EraRule "UTXOS" era) SystemStart
-> Rule (EraRule "UTXOS" era) 'Transition SystemStart
forall a b. (a -> b) -> a -> b
$ (Globals -> SystemStart) -> ReaderT Globals Identity SystemStart
forall (m :: * -> *) r a. Monad m => (r -> a) -> ReaderT r m a
asks Globals -> SystemStart
systemStart
ei <- liftSTS $ asks epochInfo
case collectPlutusScriptsWithContext ei sysSt pp tx utxo of
Right [PlutusWithContext]
sLst -> do
F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (rtype :: RuleType).
Rule sts rtype () -> Rule sts rtype ()
whenFailureFree (F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$
F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (rtype :: RuleType).
Rule sts rtype () -> Rule sts rtype ()
when2Phase (F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$ case [PlutusWithContext] -> ScriptResult
evalPlutusScripts [PlutusWithContext]
sLst of
Fails [PlutusWithContext]
_ NonEmpty ScriptFailure
fs ->
PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType).
PredicateFailure sts -> Rule sts ctx ()
failBecause (PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$
AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure (AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era)
-> AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall a b. (a -> b) -> a -> b
$
IsValid -> TagMismatchDescription -> AlonzoUtxosPredFailure era
forall era.
IsValid -> TagMismatchDescription -> AlonzoUtxosPredFailure era
ValidationTagMismatch
(Tx TopTx era
tx Tx TopTx era -> Getting IsValid (Tx TopTx era) IsValid -> IsValid
forall s a. s -> Getting a s a -> a
^. Getting IsValid (Tx TopTx era) IsValid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsValid
Lens' (Tx TopTx era) IsValid
isValidTxL)
(NonEmpty FailureDescription -> TagMismatchDescription
FailedUnexpectedly (ScriptFailure -> FailureDescription
scriptFailureToFailureDescription (ScriptFailure -> FailureDescription)
-> NonEmpty ScriptFailure -> NonEmpty FailureDescription
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty ScriptFailure
fs))
Passes [PlutusWithContext]
ps -> (NonEmpty PlutusWithContext
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> Maybe (NonEmpty PlutusWithContext)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (EraRuleEvent "UTXOS" era
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
Event (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType). Event sts -> Rule sts ctx ()
tellEvent (EraRuleEvent "UTXOS" era
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> (NonEmpty PlutusWithContext -> EraRuleEvent "UTXOS" era)
-> NonEmpty PlutusWithContext
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. AlonzoUtxosEvent era -> EraRuleEvent "UTXOS" era
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleEvent rule t era =>
t era -> EraRuleEvent rule era
injectEvent (AlonzoUtxosEvent era -> EraRuleEvent "UTXOS" era)
-> (NonEmpty PlutusWithContext -> AlonzoUtxosEvent era)
-> NonEmpty PlutusWithContext
-> EraRuleEvent "UTXOS" era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonEmpty PlutusWithContext -> AlonzoUtxosEvent era
forall era. NonEmpty PlutusWithContext -> AlonzoUtxosEvent era
SuccessfulPlutusScriptsEvent) ([PlutusWithContext] -> Maybe (NonEmpty PlutusWithContext)
forall a. [a] -> Maybe (NonEmpty a)
nonEmpty [PlutusWithContext]
ps)
Left [CollectError era]
info -> PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType).
PredicateFailure sts -> Rule sts ctx ()
failBecause (AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure (AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era)
-> AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall a b. (a -> b) -> a -> b
$ [CollectError era] -> AlonzoUtxosPredFailure era
forall era. [CollectError era] -> AlonzoUtxosPredFailure era
CollectErrors [CollectError era]
info)
babbageEvalScriptsTxValid ::
forall era.
( AlonzoEraTx era
, AlonzoEraUTxO era
, ShelleyEraTxBody era
, EraStake era
, EraCertState era
, ScriptsNeeded era ~ AlonzoScriptsNeeded era
, STS (BabbageUTXOS era)
, Environment (EraRule "PPUP" era) ~ PpupEnv era
, Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era)
, Embed (EraRule "PPUP" era) (BabbageUTXOS era)
, GovState era ~ ShelleyGovState era
, State (EraRule "PPUP" era) ~ ShelleyGovState era
, EraPlutusContext era
, InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era
, EraRule "UTXOS" era ~ BabbageUTXOS era
, InjectRuleEvent "UTXOS" AlonzoUtxosEvent era
) =>
TransitionRule (BabbageUTXOS era)
babbageEvalScriptsTxValid :: forall era.
(AlonzoEraTx era, AlonzoEraUTxO era, ShelleyEraTxBody era,
EraStake era, EraCertState era,
ScriptsNeeded era ~ AlonzoScriptsNeeded era,
STS (BabbageUTXOS era),
Environment (EraRule "PPUP" era) ~ PpupEnv era,
Signal (EraRule "PPUP" era) ~ StrictMaybe (Update era),
Embed (EraRule "PPUP" era) (BabbageUTXOS era),
GovState era ~ ShelleyGovState era,
State (EraRule "PPUP" era) ~ ShelleyGovState era,
EraPlutusContext era,
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
EraRule "UTXOS" era ~ BabbageUTXOS era,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
TransitionRule (BabbageUTXOS era)
babbageEvalScriptsTxValid = do
TRC (UtxoEnv slot pp certState, utxos@(UTxOState utxo _ _ pup _ _), tx) <-
Rule
(BabbageUTXOS era)
'Transition
(RuleContext 'Transition (BabbageUTXOS era))
F (Clause (BabbageUTXOS era) 'Transition) (TRC (BabbageUTXOS era))
forall sts (rtype :: RuleType).
Rule sts rtype (RuleContext rtype sts)
judgmentContext
let txBody = Tx TopTx era
Signal (BabbageUTXOS era)
tx Tx TopTx era
-> Getting (TxBody TopTx era) (Tx TopTx era) (TxBody TopTx era)
-> TxBody TopTx era
forall s a. s -> Getting a s a -> a
^. Getting (TxBody TopTx era) (Tx TopTx era) (TxBody 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
genDelegs = CertState era
certState CertState era
-> Getting GenDelegs (CertState era) GenDelegs -> GenDelegs
forall s a. s -> Getting a s a -> a
^. (DState era -> Const GenDelegs (DState era))
-> CertState era -> Const GenDelegs (CertState era)
forall era. EraCertState era => Lens' (CertState era) (DState era)
Lens' (CertState era) (DState era)
certDStateL ((DState era -> Const GenDelegs (DState era))
-> CertState era -> Const GenDelegs (CertState era))
-> ((GenDelegs -> Const GenDelegs GenDelegs)
-> DState era -> Const GenDelegs (DState era))
-> Getting GenDelegs (CertState era) GenDelegs
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenDelegs -> Const GenDelegs GenDelegs)
-> DState era -> Const GenDelegs (DState era)
forall era (f :: * -> *).
Functor f =>
(GenDelegs -> f GenDelegs) -> DState era -> f (DState era)
dsGenDelegsL
ppup' <-
trans @(EraRule "PPUP" era) $
TRC (PPUPEnv slot pp genDelegs, pup, txBody ^. updateTxBodyL)
() <- pure $! Debug.traceEvent validBegin ()
expectScriptsToPass pp tx utxo
() <- pure $! Debug.traceEvent validEnd ()
updateUTxOState
pp
utxos
txBody
certState
ppup'
(tellEvent . TotalDeposits (hashAnnotated txBody))
(\UTxO era
a UTxO era
b -> Event (BabbageUTXOS era)
-> F (Clause (BabbageUTXOS era) 'Transition) ()
forall sts (ctx :: RuleType). Event sts -> Rule sts ctx ()
tellEvent (Event (BabbageUTXOS era)
-> F (Clause (BabbageUTXOS era) 'Transition) ())
-> Event (BabbageUTXOS era)
-> F (Clause (BabbageUTXOS era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$ UTxO era -> UTxO era -> AlonzoUtxosEvent era
forall era. UTxO era -> UTxO era -> AlonzoUtxosEvent era
TxUTxODiff UTxO era
a UTxO era
b)
babbageEvalScriptsTxInvalid ::
forall era.
( EraStake era
, AlonzoEraTx era
, BabbageEraTxBody era
, EraPlutusContext era
, AlonzoEraUTxO era
, ScriptsNeeded era ~ AlonzoScriptsNeeded era
, STS (EraRule "UTXOS" era)
, Environment (EraRule "UTXOS" era) ~ UtxoEnv era
, Signal (EraRule "UTXOS" era) ~ Tx TopTx era
, State (EraRule "UTXOS" era) ~ UTxOState era
, BaseM (EraRule "UTXOS" era) ~ ShelleyBase
, InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era
, InjectRuleEvent "UTXOS" AlonzoUtxosEvent era
) =>
TransitionRule (EraRule "UTXOS" era)
babbageEvalScriptsTxInvalid :: forall era.
(EraStake era, AlonzoEraTx era, BabbageEraTxBody era,
EraPlutusContext era, AlonzoEraUTxO era,
ScriptsNeeded era ~ AlonzoScriptsNeeded era,
STS (EraRule "UTXOS" era),
Environment (EraRule "UTXOS" era) ~ UtxoEnv era,
Signal (EraRule "UTXOS" era) ~ Tx TopTx era,
State (EraRule "UTXOS" era) ~ UTxOState era,
BaseM (EraRule "UTXOS" era) ~ ShelleyBase,
InjectRuleFailure "UTXOS" AlonzoUtxosPredFailure era,
InjectRuleEvent "UTXOS" AlonzoUtxosEvent era) =>
TransitionRule (EraRule "UTXOS" era)
babbageEvalScriptsTxInvalid = do
TRC (UtxoEnv _ pp _, utxos@(UTxOState utxo _ fees _ _ _), tx) <- Rule
(EraRule "UTXOS" era)
'Transition
(RuleContext 'Transition (EraRule "UTXOS" era))
F (Clause (EraRule "UTXOS" era) 'Transition)
(TRC (EraRule "UTXOS" era))
forall sts (rtype :: RuleType).
Rule sts rtype (RuleContext rtype sts)
judgmentContext
let txBody = Tx TopTx era
Signal (EraRule "UTXOS" era)
tx Tx TopTx era
-> Getting (TxBody TopTx era) (Tx TopTx era) (TxBody TopTx era)
-> TxBody TopTx era
forall s a. s -> Getting a s a -> a
^. Getting (TxBody TopTx era) (Tx TopTx era) (TxBody 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
sysSt <- liftSTS $ asks systemStart
ei <- liftSTS $ asks epochInfo
() <- pure $! Debug.traceEvent invalidBegin ()
case collectPlutusScriptsWithContext ei sysSt pp tx utxo of
Right [PlutusWithContext]
sLst ->
F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (rtype :: RuleType).
Rule sts rtype () -> Rule sts rtype ()
whenFailureFree (F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$
F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (rtype :: RuleType).
Rule sts rtype () -> Rule sts rtype ()
when2Phase (F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$ case [PlutusWithContext] -> ScriptResult
evalPlutusScripts [PlutusWithContext]
sLst of
Passes [PlutusWithContext]
_ ->
PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType).
PredicateFailure sts -> Rule sts ctx ()
failBecause (PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall a b. (a -> b) -> a -> b
$
AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure (AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era)
-> AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall a b. (a -> b) -> a -> b
$
IsValid -> TagMismatchDescription -> AlonzoUtxosPredFailure era
forall era.
IsValid -> TagMismatchDescription -> AlonzoUtxosPredFailure era
ValidationTagMismatch (Tx TopTx era
Signal (EraRule "UTXOS" era)
tx Tx TopTx era -> Getting IsValid (Tx TopTx era) IsValid -> IsValid
forall s a. s -> Getting a s a -> a
^. Getting IsValid (Tx TopTx era) IsValid
forall era. AlonzoEraTx era => Lens' (Tx TopTx era) IsValid
Lens' (Tx TopTx era) IsValid
isValidTxL) TagMismatchDescription
PassedUnexpectedly
Fails [PlutusWithContext]
ps NonEmpty ScriptFailure
fs -> do
(NonEmpty PlutusWithContext
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> Maybe (NonEmpty PlutusWithContext)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (EraRuleEvent "UTXOS" era
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
Event (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType). Event sts -> Rule sts ctx ()
tellEvent (EraRuleEvent "UTXOS" era
-> F (Clause (EraRule "UTXOS" era) 'Transition) ())
-> (NonEmpty PlutusWithContext -> EraRuleEvent "UTXOS" era)
-> NonEmpty PlutusWithContext
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleEvent rule t era =>
t era -> EraRuleEvent rule era
injectEvent @"UTXOS" (AlonzoUtxosEvent era -> EraRuleEvent "UTXOS" era)
-> (NonEmpty PlutusWithContext -> AlonzoUtxosEvent era)
-> NonEmpty PlutusWithContext
-> EraRuleEvent "UTXOS" era
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era. NonEmpty PlutusWithContext -> AlonzoUtxosEvent era
SuccessfulPlutusScriptsEvent @era) ([PlutusWithContext] -> Maybe (NonEmpty PlutusWithContext)
forall a. [a] -> Maybe (NonEmpty a)
nonEmpty [PlutusWithContext]
ps)
Event (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType). Event sts -> Rule sts ctx ()
tellEvent (AlonzoUtxosEvent era -> EraRuleEvent "UTXOS" era
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleEvent rule t era =>
t era -> EraRuleEvent rule era
injectEvent (AlonzoUtxosEvent era -> EraRuleEvent "UTXOS" era)
-> AlonzoUtxosEvent era -> EraRuleEvent "UTXOS" era
forall a b. (a -> b) -> a -> b
$ NonEmpty PlutusWithContext -> AlonzoUtxosEvent era
forall era. NonEmpty PlutusWithContext -> AlonzoUtxosEvent era
FailedPlutusScriptsEvent (ScriptFailure -> PlutusWithContext
scriptFailurePlutus (ScriptFailure -> PlutusWithContext)
-> NonEmpty ScriptFailure -> NonEmpty PlutusWithContext
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> NonEmpty ScriptFailure
fs))
Left [CollectError era]
info -> PredicateFailure (EraRule "UTXOS" era)
-> F (Clause (EraRule "UTXOS" era) 'Transition) ()
forall sts (ctx :: RuleType).
PredicateFailure sts -> Rule sts ctx ()
failBecause (AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall (rule :: Symbol) (t :: * -> *) era.
InjectRuleFailure rule t era =>
t era -> EraRuleFailure rule era
injectFailure (AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era)
-> AlonzoUtxosPredFailure era -> EraRuleFailure "UTXOS" era
forall a b. (a -> b) -> a -> b
$ [CollectError era] -> AlonzoUtxosPredFailure era
forall era. [CollectError era] -> AlonzoUtxosPredFailure era
CollectErrors [CollectError era]
info)
() <- pure $! Debug.traceEvent invalidEnd ()
let !(utxoKeep, utxoDel) = extractKeys (unUTxO utxo) (txBody ^. collateralInputsTxBodyL)
UTxO collouts = collOuts txBody
DeltaCoin collateralFees = collAdaBalance txBody utxoDel
pure $!
utxos
{ utxosUtxo = UTxO (Map.union utxoKeep collouts)
, utxosFees = fees <> Coin collateralFees
, utxosInstantStake =
deleteInstantStake (UTxO utxoDel) (addInstantStake (UTxO collouts) (utxos ^. instantStakeL))
}