{-# LANGUAGE DataKinds #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NumericUnderscores #-} {-# LANGUAGE OverloadedLists #-} {-# LANGUAGE OverloadedStrings #-} {-# 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 (..), ) import Cardano.Ledger.Alonzo.Rules (AlonzoUtxosPredFailure (CollectErrors)) import Cardano.Ledger.Alonzo.Scripts (eraLanguages) 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 ( ByronTxOutInContext, 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 "Scripts with bootstrap addresses fail" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ [Language] -> (Language -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) forall (t :: * -> *) (m :: * -> *) a b. (Foldable t, Monad m) => t a -> (a -> m b) -> m () forM_ (forall era. AlonzoEraScript era => [Language] eraLanguages @era) ((Language -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era))) -> (Language -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ \Language lang -> Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) forall a. Language -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> a) -> a withSLanguage Language lang ((forall (l :: Language). PlutusLanguage l => SLanguage l -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era))) -> (forall (l :: Language). PlutusLanguage l => SLanguage l -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ \SLanguage l slang -> String -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it (Language -> String forall a. Show a => a -> String show Language lang) (ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ()))) -> ImpM (LedgerSpec era) () -> SpecWith (Arg (ImpM (LedgerSpec era) ())) forall a b. (a -> b) -> a -> b $ do tx <- SLanguage l -> ImpTestM era (Tx TopTx era) forall era (l :: Language). (AlonzoEraImp era, PlutusLanguage l) => SLanguage l -> ImpTestM era (Tx TopTx era) mkTxWithPlutusAndBootstrapAddress SLanguage l slang submitFailingTx tx [ injectFailure $ CollectErrors [ BadTranslation . inject $ ByronTxOutInContext @era (TxOutFromOutput (TxIx 0)) ] ] 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))]