{-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeApplications #-} module Test.Cardano.Ledger.Dijkstra.Imp.UtxosSpec (spec) where import Cardano.Ledger.Alonzo.Scripts (eraLanguages) import Cardano.Ledger.Credential (Credential (..)) import Cardano.Ledger.Dijkstra.Core ( DijkstraEraTxBody (..), EraTx (..), EraTxBody (..), ) import Cardano.Ledger.Plutus (Language (..), hashPlutusScript, withSLanguage) import qualified Data.OSet.Strict as OSet import Lens.Micro ((&), (.~)) import Test.Cardano.Ledger.Common (SpecWith, describe, forM_, it) import Test.Cardano.Ledger.Dijkstra.ImpTest ( DijkstraEraImp, ImpInit, LedgerSpec, submitTxAnn_, ) import Test.Cardano.Ledger.Plutus.Examples (purposeIsWellformedNoDatum) spec :: forall era. DijkstraEraImp era => SpecWith (ImpInit (LedgerSpec era)) spec :: forall era. DijkstraEraImp 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" (SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era))) -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a b. (a -> b) -> a -> b $ do [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_ [Language l | Language l <- forall era. AlonzoEraScript era => [Language] eraLanguages @era, Language l Language -> Language -> Bool forall a. Ord a => a -> a -> Bool >= Language PlutusV4] ((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 -> SpecWith (ImpInit (LedgerSpec era)) -> SpecWith (ImpInit (LedgerSpec era)) forall a. HasCallStack => String -> SpecWith a -> SpecWith a describe String "purposeIsWellformedNoDatum" (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 -> ImpTestM era () -> SpecWith (Arg (ImpTestM era ())) forall a. (HasCallStack, Example a) => String -> a -> SpecWith (Arg a) it String "Passes with guarding purpose" (ImpTestM era () -> SpecWith (Arg (ImpTestM era ()))) -> ImpTestM era () -> SpecWith (Arg (ImpTestM era ())) forall a b. (a -> b) -> a -> b $ do let sh :: ScriptHash sh = Plutus l -> ScriptHash forall (l :: Language). PlutusLanguage l => Plutus l -> ScriptHash hashPlutusScript (Plutus l -> ScriptHash) -> Plutus l -> ScriptHash forall a b. (a -> b) -> a -> b $ SLanguage l -> Plutus l forall (l :: Language). SLanguage l -> Plutus l purposeIsWellformedNoDatum SLanguage l slang String -> Tx TopTx era -> ImpTestM era () forall era. (HasCallStack, ShelleyEraImp era) => String -> Tx TopTx era -> ImpTestM era () submitTxAnn_ String "Submit tx with a Plutus guard" (Tx TopTx era -> ImpTestM era ()) -> Tx TopTx era -> ImpTestM 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 forall era (l :: TxLevel). (EraTxBody era, Typeable l) => TxBody l era forall (l :: TxLevel). Typeable l => TxBody l era mkBasicTxBody Tx TopTx era -> (Tx TopTx era -> Tx TopTx era) -> Tx TopTx era forall a b. a -> (a -> b) -> b & (TxBody TopTx era -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (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 -> Identity (TxBody TopTx era)) -> Tx TopTx era -> Identity (Tx TopTx era)) -> ((OSet (Credential Guard) -> Identity (OSet (Credential Guard))) -> TxBody TopTx era -> Identity (TxBody TopTx era)) -> (OSet (Credential Guard) -> Identity (OSet (Credential Guard))) -> Tx TopTx era -> Identity (Tx TopTx era) forall b c a. (b -> c) -> (a -> b) -> a -> c . (OSet (Credential Guard) -> Identity (OSet (Credential Guard))) -> TxBody TopTx era -> Identity (TxBody TopTx era) forall era (l :: TxLevel). DijkstraEraTxBody era => Lens' (TxBody l era) (OSet (Credential Guard)) forall (l :: TxLevel). Lens' (TxBody l era) (OSet (Credential Guard)) guardsTxBodyL ((OSet (Credential Guard) -> Identity (OSet (Credential Guard))) -> Tx TopTx era -> Identity (Tx TopTx era)) -> OSet (Credential Guard) -> Tx TopTx era -> Tx TopTx era forall s t a b. ASetter s t a b -> b -> s -> t .~ Credential Guard -> OSet (Credential Guard) forall a. a -> OSet a OSet.singleton (ScriptHash -> Credential Guard forall (kr :: KeyRole). ScriptHash -> Credential kr ScriptHashObj ScriptHash sh)