{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Test.Cardano.Ledger.Babbage.Imp.UtxosSpec (spec) where import Cardano.Ledger.Alonzo.Plutus.Evaluate (CollectError (BadTranslation)) import Cardano.Ledger.Alonzo.Plutus.TxInfo ( TxOutSource (TxOutFromOutput), ) import Cardano.Ledger.Alonzo.Rules (AlonzoUtxosPredFailure (CollectErrors)) import Cardano.Ledger.Babbage (BabbageEra) import Cardano.Ledger.Babbage.Core ( collateralInputsTxBodyL, collateralReturnTxBodyL, datumTxOutL, referenceInputsTxBodyL, totalCollateralTxBodyL, ) import Cardano.Ledger.Babbage.Rules (BabbageUtxoPredFailure (..)) import Cardano.Ledger.Babbage.TxInfo ( BabbageContextError ( ReferenceInputsNotSupported, ReferenceScriptsNotSupported ), ) import Cardano.Ledger.Babbage.TxOut (referenceScriptTxOutL) import Cardano.Ledger.BaseTypes (ProtVer (..), TxIx (..), inject, natVersion) import Cardano.Ledger.Coin (Coin (..), DeltaCoin (..)) import Cardano.Ledger.Core ( ProtVerHigh, bodyTxL, eraProtVerHigh, eraProtVerLow, fromNativeScript, hashScript, injectFailure, inputsTxBodyL, mkBasicTx, mkBasicTxBody, mkBasicTxOut, mkCoinTxOut, outputsTxBodyL, ) import Cardano.Ledger.Credential (StakeReference (..)) import Cardano.Ledger.Plutus (Language (..), hashPlutusScript, mkInlineDatum, withSLanguage) import Cardano.Ledger.Shelley.Scripts (pattern RequireAllOf) import Lens.Micro import qualified PlutusLedgerApi.V1 as PV1 import Test.Cardano.Ledger.Alonzo.ImpTest import Test.Cardano.Ledger.Babbage.ImpTest (BabbageEraImp) import Test.Cardano.Ledger.Core.Utils (txInAt) import Test.Cardano.Ledger.Imp.Common import Test.Cardano.Ledger.Plutus.Examples spec :: forall era. BabbageEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. BabbageEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec = String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "UTXOS" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "PlutusV1 with references" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do let inBabbage :: Bool inBabbage = forall era. Era era => Version eraProtVerLow @era Version -> Version -> Bool forall a. Ord a => a -> a -> Bool <= forall era. Era era => Version eraProtVerHigh @BabbageEra behavior :: String behavior = if Bool inBabbage then String "fails" else String "succeeds" submitBabbageFailingTx :: Tx TopTx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitBabbageFailingTx Tx TopTx era tx NonEmpty (PredicateFailure (EraRule "LEDGER" era)) failures = if Bool inBabbage then Tx TopTx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () forall era. (HasCallStack, ShelleyEraImp era) => Tx TopTx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitFailingTx Tx TopTx era tx NonEmpty (PredicateFailure (EraRule "LEDGER" era)) failures else Tx TopTx era -> ImpTestM era () forall era. (HasCallStack, ShelleyEraImp era) => Tx TopTx era -> ImpTestM era () submitTx_ Tx TopTx era tx String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it (String behavior String -> String -> String forall a. Semigroup a => a -> a -> a <> String " with a reference script") (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do let plutusScriptHash :: ScriptHash plutusScriptHash = Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a. Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> a) -> a withSLanguage Language PlutusV1 ((forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash) -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a b. (a -> b) -> a -> b $ Plutus l -> ScriptHash forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash hashPlutusScript (Plutus l -> ScriptHash) -> (SLanguage l -> Plutus l) -> SLanguage l -> ScriptHash forall b c a. (b -> c) -> (a -> b) -> a -> c . SLanguage l -> Plutus l forall (l :: Language). SLanguage l -> Plutus l alwaysSucceedsWithDatum nativeScript :: Script era nativeScript = forall era. EraScript era => NativeScript era -> Script era fromNativeScript @era (NativeScript era -> Script era) -> NativeScript era -> Script era forall a b. (a -> b) -> a -> b $ StrictSeq (NativeScript era) -> NativeScript era forall era. ShelleyEraScript era => StrictSeq (NativeScript era) -> NativeScript era RequireAllOf [] txIn <- ScriptHash -> ImpTestM era TxIn forall era. (ShelleyEraImp era, HasCallStack) => ScriptHash -> ImpTestM era TxIn produceScript ScriptHash plutusScriptHash addr <- freshKeyAddr_ let txOut = Addr -> Coin -> TxOut era forall era. EraTxOut era => Addr -> Coin -> TxOut era mkCoinTxOut Addr addr (Coin -> Coin forall t s. Inject t s => t -> s inject (Coin -> Coin) -> Coin -> Coin forall a b. (a -> b) -> a -> b $ Integer -> Coin Coin Integer 5_000_000) TxOut era -> (TxOut era -> TxOut era) -> TxOut era forall a b. a -> (a -> b) -> b & (StrictMaybe (Script era) -> Identity (StrictMaybe (Script era))) -> TxOut era -> Identity (TxOut era) forall era. BabbageEraTxOut era => Lens' (TxOut era) (StrictMaybe (Script era)) Lens' (TxOut era) (StrictMaybe (Script era)) referenceScriptTxOutL ((StrictMaybe (Script era) -> Identity (StrictMaybe (Script era))) -> TxOut era -> Identity (TxOut era)) -> StrictMaybe (Script era) -> TxOut era -> TxOut era forall s t a b. ASetter s t a b -> b -> s -> t .~ Script era -> StrictMaybe (Script era) forall a. a -> StrictMaybe a forall (f :: * -> *) a. Applicative f => a -> f a pure Script era nativeScript tx = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx (TxBody TopTx era -> Tx TopTx era) -> TxBody TopTx era -> Tx TopTx era forall a b. (a -> b) -> a -> b $ TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (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 ((Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> Set TxIn -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn txIn] TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxOut era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxOut era)) outputsTxBodyL ((StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> StrictSeq (TxOut era) -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (StrictSeq (TxOut era)) TxOut era txOut] submitBabbageFailingTx tx [ injectFailure $ CollectErrors [ BadTranslation . inject $ ReferenceScriptsNotSupported @era (TxOutFromOutput (TxIx 0)) ] ] String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it (String behavior String -> String -> String forall a. Semigroup a => a -> a -> a <> String " with a reference input") (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do let plutusScriptHash :: ScriptHash plutusScriptHash = Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a. Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> a) -> a withSLanguage Language PlutusV1 ((forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash) -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a b. (a -> b) -> a -> b $ Plutus l -> ScriptHash forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash hashPlutusScript (Plutus l -> ScriptHash) -> (SLanguage l -> Plutus l) -> SLanguage l -> ScriptHash forall b c a. (b -> c) -> (a -> b) -> a -> c . SLanguage l -> Plutus l forall (l :: Language). SLanguage l -> Plutus l alwaysSucceedsWithDatum nativeScriptHash :: ScriptHash nativeScriptHash = Script era -> ScriptHash forall era. EraScript era => Script era -> ScriptHash hashScript (Script era -> ScriptHash) -> (NativeScript era -> Script era) -> NativeScript era -> ScriptHash forall b c a. (b -> c) -> (a -> b) -> a -> c . forall era. EraScript era => NativeScript era -> Script era fromNativeScript @era (NativeScript era -> ScriptHash) -> NativeScript era -> ScriptHash forall a b. (a -> b) -> a -> b $ StrictSeq (NativeScript era) -> NativeScript era forall era. ShelleyEraScript era => StrictSeq (NativeScript era) -> NativeScript era RequireAllOf [] txIn <- ScriptHash -> ImpTestM era TxIn forall era. (ShelleyEraImp era, HasCallStack) => ScriptHash -> ImpTestM era TxIn produceScript ScriptHash plutusScriptHash refIn <- produceScript nativeScriptHash let tx = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx (TxBody TopTx era -> Tx TopTx era) -> TxBody TopTx era -> Tx TopTx era forall a b. (a -> b) -> a -> b $ TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (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 ((Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> Set TxIn -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn txIn] TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). BabbageEraTxBody era => Lens' (TxBody l era) (Set TxIn) forall (l :: TxLevel). Lens' (TxBody l era) (Set TxIn) referenceInputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> Set TxIn -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn refIn] submitBabbageFailingTx tx [ injectFailure $ CollectErrors [ BadTranslation . inject $ ReferenceInputsNotSupported @era [refIn] ] ] String -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "PlutusV2 with references" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "succeeds with same txIn in regular inputs and reference inputs" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do let scriptHash :: ScriptHash scriptHash = Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a. Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> a) -> a withSLanguage Language PlutusV2 ((forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash) -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a b. (a -> b) -> a -> b $ Plutus l -> ScriptHash forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash hashPlutusScript (Plutus l -> ScriptHash) -> (SLanguage l -> Plutus l) -> SLanguage l -> ScriptHash forall b c a. (b -> c) -> (a -> b) -> a -> c . SLanguage l -> Plutus l forall (l :: Language). SLanguage l -> Plutus l inputsOverlapsWithRefInputs txOut :: TxOut era txOut = Addr -> Value era -> TxOut era forall era. (EraTxOut era, HasCallStack) => Addr -> Value era -> TxOut era mkBasicTxOut (ScriptHash -> StakeReference -> Addr forall p s. (MakeCredential p Payment, MakeStakeReference s) => p -> s -> Addr mkAddr ScriptHash scriptHash StakeReference StakeRefNull) Value era forall a. Monoid a => a mempty TxOut era -> (TxOut era -> TxOut era) -> TxOut era forall a b. a -> (a -> b) -> b & (Datum era -> Identity (Datum era)) -> TxOut era -> Identity (TxOut era) forall era. BabbageEraTxOut era => Lens' (TxOut era) (Datum era) Lens' (TxOut era) (Datum era) datumTxOutL ((Datum era -> Identity (Datum era)) -> TxOut era -> Identity (TxOut era)) -> Datum era -> TxOut era -> TxOut era forall s t a b. ASetter s t a b -> b -> s -> t .~ Data -> Datum era forall era. Era era => Data -> Datum era mkInlineDatum (Integer -> Data PV1.I Integer 0) tx <- Tx TopTx era -> ImpTestM era (Tx TopTx era) forall era. (HasCallStack, ShelleyEraImp era) => Tx TopTx era -> ImpTestM era (Tx TopTx era) submitTx (Tx TopTx era -> ImpTestM era (Tx TopTx era)) -> Tx TopTx era -> ImpTestM era (Tx TopTx era) forall a b. (a -> b) -> a -> b $ TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx (TxBody TopTx era -> Tx TopTx era) -> TxBody TopTx era -> Tx TopTx era forall a b. (a -> b) -> a -> b $ TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxOut era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxOut era)) outputsTxBodyL ((StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> StrictSeq (TxOut era) -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (StrictSeq (TxOut era)) TxOut era txOut] let txIn = Int -> Tx TopTx era -> TxIn forall era (l :: TxLevel). (HasCallStack, EraTx era) => Int -> Tx l era -> TxIn txInAt Int 0 Tx TopTx era tx majorVer <- pvMajor <$> getProtVer when (majorVer <= natVersion @(ProtVerHigh BabbageEra) || majorVer >= natVersion @11) $ submitTx_ $ mkBasicTx mkBasicTxBody & bodyTxL . inputsTxBodyL .~ [txIn] & bodyTxL . referenceInputsTxBodyL .~ [txIn] String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Incorrect collateral total" (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do let scriptHash :: ScriptHash scriptHash = Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> ScriptHash) -> ScriptHash forall a. Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> a) -> a withSLanguage Language PlutusV2 (Plutus l -> ScriptHash forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash hashPlutusScript (Plutus l -> ScriptHash) -> (SLanguage l -> Plutus l) -> SLanguage l -> ScriptHash forall b c a. (b -> c) -> (a -> b) -> a -> c . SLanguage l -> Plutus l forall (l :: Language). SLanguage l -> Plutus l alwaysSucceedsWithDatum) txOut :: TxOut era txOut = Addr -> Value era -> TxOut era forall era. (EraTxOut era, HasCallStack) => Addr -> Value era -> TxOut era mkBasicTxOut (ScriptHash -> StakeReference -> Addr forall p s. (MakeCredential p Payment, MakeStakeReference s) => p -> s -> Addr mkAddr ScriptHash scriptHash StakeReference StakeRefNull) Value era forall a. Monoid a => a mempty TxOut era -> (TxOut era -> TxOut era) -> TxOut era forall a b. a -> (a -> b) -> b & (Datum era -> Identity (Datum era)) -> TxOut era -> Identity (TxOut era) forall era. BabbageEraTxOut era => Lens' (TxOut era) (Datum era) Lens' (TxOut era) (Datum era) datumTxOutL ((Datum era -> Identity (Datum era)) -> TxOut era -> Identity (TxOut era)) -> Datum era -> TxOut era -> TxOut era forall s t a b. ASetter s t a b -> b -> s -> t .~ Data -> Datum era forall era. Era era => Data -> Datum era mkInlineDatum (Integer -> Data PV1.I Integer 1) tx <- Tx TopTx era -> ImpTestM era (Tx TopTx era) forall era. (HasCallStack, ShelleyEraImp era) => Tx TopTx era -> ImpTestM era (Tx TopTx era) submitTx (Tx TopTx era -> ImpTestM era (Tx TopTx era)) -> Tx TopTx era -> ImpTestM era (Tx TopTx era) forall a b. (a -> b) -> a -> b $ TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx (TxBody TopTx era -> Tx TopTx era) -> TxBody TopTx era -> Tx TopTx era forall a b. (a -> b) -> a -> b $ TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). EraTxBody era => Lens' (TxBody l era) (StrictSeq (TxOut era)) forall (l :: TxLevel). Lens' (TxBody l era) (StrictSeq (TxOut era)) outputsTxBodyL ((StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> StrictSeq (TxOut era) -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (StrictSeq (TxOut era)) TxOut era txOut] let txIn = Int -> Tx TopTx era -> TxIn forall era (l :: TxLevel). (HasCallStack, EraTx era) => Int -> Tx l era -> TxIn txInAt Int 0 Tx TopTx era tx addr <- freshKeyAddrNoPtr_ coll <- sendCoinTo addr $ Coin 5_000_000 let collReturn = Addr -> Value era -> TxOut era forall era. (EraTxOut era, HasCallStack) => Addr -> Value era -> TxOut era mkBasicTxOut Addr addr (Value era -> TxOut era) -> (Coin -> Value era) -> Coin -> TxOut era forall b c a. (b -> c) -> (a -> b) -> a -> c . Coin -> Value era forall t s. Inject t s => t -> s inject (Coin -> TxOut era) -> Coin -> TxOut era forall a b. (a -> b) -> a -> b $ Integer -> Coin Coin Integer 2_000_000 tx2 = TxBody TopTx era -> Tx TopTx era forall era (l :: TxLevel). EraTx era => TxBody l era -> Tx l era forall (l :: TxLevel). TxBody l era -> Tx l era mkBasicTx (TxBody TopTx era -> Tx TopTx era) -> TxBody TopTx era -> Tx TopTx era forall a b. (a -> b) -> a -> b $ TxBody TopTx era forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (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 ((Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> Set TxIn -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn txIn] TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era. AlonzoEraTxBody era => Lens' (TxBody TopTx era) (Set TxIn) Lens' (TxBody TopTx era) (Set TxIn) collateralInputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> Set TxIn -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn coll] TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (StrictMaybe (TxOut era) -> Identity (StrictMaybe (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era. BabbageEraTxBody era => Lens' (TxBody TopTx era) (StrictMaybe (TxOut era)) Lens' (TxBody TopTx era) (StrictMaybe (TxOut era)) collateralReturnTxBodyL ((StrictMaybe (TxOut era) -> Identity (StrictMaybe (TxOut era))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> StrictMaybe (TxOut era) -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ TxOut era -> StrictMaybe (TxOut era) forall a. a -> StrictMaybe a forall (f :: * -> *) a. Applicative f => a -> f a pure TxOut era collReturn TxBody TopTx era -> (TxBody TopTx era -> TxBody TopTx era) -> TxBody TopTx era forall a b. a -> (a -> b) -> b & (StrictMaybe Coin -> Identity (StrictMaybe Coin)) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era. BabbageEraTxBody era => Lens' (TxBody TopTx era) (StrictMaybe Coin) Lens' (TxBody TopTx era) (StrictMaybe Coin) totalCollateralTxBodyL ((StrictMaybe Coin -> Identity (StrictMaybe Coin)) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> StrictMaybe Coin -> TxBody TopTx era -> TxBody TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ Coin -> StrictMaybe Coin forall a. a -> StrictMaybe a forall (f :: * -> *) a. Applicative f => a -> f a pure (Integer -> Coin Coin Integer 1_000_000) submitFailingTx tx2 [injectFailure (IncorrectTotalCollateralField (DeltaCoin 3_000_000) (Coin 1_000_000))]