{-# 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.Context (ContextError) 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 (BabbageEraTxBody, referenceInputsTxBodyL) import Cardano.Ledger.Babbage.TxInfo ( BabbageContextError ( ReferenceInputsNotSupported, ReferenceScriptsNotSupported ), ) import Cardano.Ledger.Babbage.TxOut (referenceScriptTxOutL) import Cardano.Ledger.BaseTypes (Inject, StrictMaybe (..), TxIx (..), inject) import Cardano.Ledger.Coin (Coin (..)) import Cardano.Ledger.Core ( InjectRuleFailure, eraProtVerHigh, eraProtVerLow, fromNativeScript, hashScript, injectFailure, inputsTxBodyL, mkBasicTx, mkBasicTxBody, mkCoinTxOut, outputsTxBodyL, ) import Cardano.Ledger.Plutus (Language (..), hashPlutusScript, withSLanguage) import Cardano.Ledger.Shelley.Scripts (pattern RequireAllOf) import Lens.Micro import Test.Cardano.Ledger.Alonzo.ImpTest import Test.Cardano.Ledger.Imp.Common import Test.Cardano.Ledger.Plutus.Examples spec :: forall era. ( AlonzoEraImp era , BabbageEraTxBody era , InjectRuleFailure "LEDGER" AlonzoUtxosPredFailure era , Inject (BabbageContextError era) (ContextError era) ) => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. (AlonzoEraImp era, BabbageEraTxBody era, InjectRuleFailure "LEDGER" AlonzoUtxosPredFailure era, Inject (BabbageContextError era) (ContextError 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 "Plutus V1 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 era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitBabbageFailingTx Tx era tx NonEmpty (PredicateFailure (EraRule "LEDGER" era)) failures = if Bool inBabbage then Tx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () forall era. (HasCallStack, ShelleyEraImp era) => Tx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitFailingTx Tx era tx NonEmpty (PredicateFailure (EraRule "LEDGER" era)) failures else Tx era -> ImpTestM era () forall era. (HasCallStack, ShelleyEraImp era) => Tx era -> ImpTestM era () submitTx_ Tx 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 txIn <- ScriptHash -> ImpTestM era TxIn forall era. (ShelleyEraImp era, HasCallStack) => ScriptHash -> ImpTestM era TxIn produceScript ScriptHash plutusScriptHash Addr addr <- ImpM (LedgerSpec era) Addr forall s (m :: * -> *) g. (HasKeyPairs s, MonadState s m, HasStatefulGen g m, MonadGen m) => m Addr freshKeyAddr_ let txOut :: TxOut era 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 SJust Script era nativeScript tx :: Tx era tx = TxBody era -> Tx era forall era. EraTx era => TxBody era -> Tx era mkBasicTx (TxBody era -> Tx era) -> TxBody era -> Tx era forall a b. (a -> b) -> a -> b $ TxBody era forall era. EraTxBody era => TxBody era mkBasicTxBody TxBody era -> (TxBody era -> TxBody era) -> TxBody era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody era -> Identity (TxBody era) forall era. EraTxBody era => Lens' (TxBody era) (Set TxIn) Lens' (TxBody era) (Set TxIn) inputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> TxBody era -> Identity (TxBody era)) -> Set TxIn -> TxBody era -> TxBody era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn txIn] TxBody era -> (TxBody era -> TxBody era) -> TxBody era forall a b. a -> (a -> b) -> b & (StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody era -> Identity (TxBody era) forall era. EraTxBody era => Lens' (TxBody era) (StrictSeq (TxOut era)) Lens' (TxBody era) (StrictSeq (TxOut era)) outputsTxBodyL ((StrictSeq (TxOut era) -> Identity (StrictSeq (TxOut era))) -> TxBody era -> Identity (TxBody era)) -> StrictSeq (TxOut era) -> TxBody era -> TxBody era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (StrictSeq (TxOut era)) TxOut era txOut] Tx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpM (LedgerSpec era) () forall {era}. (Assert (OrdCond (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False) (TypeError ...), Assert (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False) (TypeError ...), Assert (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False) (TypeError ...), ShelleyEraImp era, Eq (Event (EraRule "TICK" era)), Eq (Event (EraRule "LEDGER" era)), NFData (Event (EraRule "TICK" era)), NFData (Event (EraRule "LEDGER" era)), Typeable (Event (EraRule "TICK" era)), Typeable (Event (EraRule "LEDGER" era)), ToExpr (Event (EraRule "TICK" era)), ToExpr (Event (EraRule "LEDGER" era))) => Tx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitBabbageFailingTx Tx era tx [ AlonzoUtxosPredFailure era -> EraRuleFailure "LEDGER" era forall (rule :: Symbol) (t :: * -> *) era. InjectRuleFailure rule t era => t era -> EraRuleFailure rule era injectFailure (AlonzoUtxosPredFailure era -> EraRuleFailure "LEDGER" era) -> AlonzoUtxosPredFailure era -> EraRuleFailure "LEDGER" era forall a b. (a -> b) -> a -> b $ [CollectError era] -> AlonzoUtxosPredFailure era forall era. [CollectError era] -> AlonzoUtxosPredFailure era CollectErrors [ ContextError era -> Item [CollectError era] ContextError era -> CollectError era forall era. ContextError era -> CollectError era BadTranslation (ContextError era -> Item [CollectError era]) -> (BabbageContextError era -> ContextError era) -> BabbageContextError era -> Item [CollectError era] forall b c a. (b -> c) -> (a -> b) -> a -> c . BabbageContextError era -> ContextError era forall t s. Inject t s => t -> s inject (BabbageContextError era -> Item [CollectError era]) -> BabbageContextError era -> Item [CollectError era] forall a b. (a -> b) -> a -> b $ forall era. TxOutSource -> BabbageContextError era ReferenceScriptsNotSupported @era (TxIx -> TxOutSource TxOutFromOutput (Word16 -> TxIx TxIx Word16 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 txIn <- ScriptHash -> ImpTestM era TxIn forall era. (ShelleyEraImp era, HasCallStack) => ScriptHash -> ImpTestM era TxIn produceScript ScriptHash plutusScriptHash TxIn refIn <- ScriptHash -> ImpTestM era TxIn forall era. (ShelleyEraImp era, HasCallStack) => ScriptHash -> ImpTestM era TxIn produceScript ScriptHash nativeScriptHash let tx :: Tx era tx = TxBody era -> Tx era forall era. EraTx era => TxBody era -> Tx era mkBasicTx (TxBody era -> Tx era) -> TxBody era -> Tx era forall a b. (a -> b) -> a -> b $ TxBody era forall era. EraTxBody era => TxBody era mkBasicTxBody TxBody era -> (TxBody era -> TxBody era) -> TxBody era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody era -> Identity (TxBody era) forall era. EraTxBody era => Lens' (TxBody era) (Set TxIn) Lens' (TxBody era) (Set TxIn) inputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> TxBody era -> Identity (TxBody era)) -> Set TxIn -> TxBody era -> TxBody era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn txIn] TxBody era -> (TxBody era -> TxBody era) -> TxBody era forall a b. a -> (a -> b) -> b & (Set TxIn -> Identity (Set TxIn)) -> TxBody era -> Identity (TxBody era) forall era. BabbageEraTxBody era => Lens' (TxBody era) (Set TxIn) Lens' (TxBody era) (Set TxIn) referenceInputsTxBodyL ((Set TxIn -> Identity (Set TxIn)) -> TxBody era -> Identity (TxBody era)) -> Set TxIn -> TxBody era -> TxBody era forall s t a b. ASetter s t a b -> b -> s -> t .~ [Item (Set TxIn) TxIn refIn] Tx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpM (LedgerSpec era) () forall {era}. (Assert (OrdCond (CmpNat (ProtVerLow era) (ProtVerHigh era)) 'True 'True 'False) (TypeError ...), Assert (OrdCond (CmpNat 0 (ProtVerLow era)) 'True 'True 'False) (TypeError ...), Assert (OrdCond (CmpNat 0 (ProtVerHigh era)) 'True 'True 'False) (TypeError ...), ShelleyEraImp era, Eq (Event (EraRule "TICK" era)), Eq (Event (EraRule "LEDGER" era)), NFData (Event (EraRule "TICK" era)), NFData (Event (EraRule "LEDGER" era)), Typeable (Event (EraRule "TICK" era)), Typeable (Event (EraRule "LEDGER" era)), ToExpr (Event (EraRule "TICK" era)), ToExpr (Event (EraRule "LEDGER" era))) => Tx era -> NonEmpty (PredicateFailure (EraRule "LEDGER" era)) -> ImpTestM era () submitBabbageFailingTx Tx era tx [ AlonzoUtxosPredFailure era -> EraRuleFailure "LEDGER" era forall (rule :: Symbol) (t :: * -> *) era. InjectRuleFailure rule t era => t era -> EraRuleFailure rule era injectFailure (AlonzoUtxosPredFailure era -> EraRuleFailure "LEDGER" era) -> AlonzoUtxosPredFailure era -> EraRuleFailure "LEDGER" era forall a b. (a -> b) -> a -> b $ [CollectError era] -> AlonzoUtxosPredFailure era forall era. [CollectError era] -> AlonzoUtxosPredFailure era CollectErrors [ ContextError era -> Item [CollectError era] ContextError era -> CollectError era forall era. ContextError era -> CollectError era BadTranslation (ContextError era -> Item [CollectError era]) -> (BabbageContextError era -> ContextError era) -> BabbageContextError era -> Item [CollectError era] forall b c a. (b -> c) -> (a -> b) -> a -> c . BabbageContextError era -> ContextError era forall t s. Inject t s => t -> s inject (BabbageContextError era -> Item [CollectError era]) -> BabbageContextError era -> Item [CollectError era] forall a b. (a -> b) -> a -> b $ forall era. Set TxIn -> BabbageContextError era ReferenceInputsNotSupported @era [Item (Set TxIn) TxIn refIn] ] ]