diff --git a/CLAUDE.md b/CLAUDE.md index ab7fbdc..48c232a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -77,10 +77,12 @@ Scripts support multiple Plutus Ledger versions (V1, V2, V3) and Plutus Core lan **Module Naming Pattern:** `V{LedgerVersion}_{CoreCompact}.hs` Where `CoreCompact` is Plutus Core version with digits compacted (no separators): + - 1.0.0 → 100 - 1.1.0 → 110 **Examples:** + - `V1_100.hs` = PlutusV1 + Plutus Core 1.0.0 - `V2_110.hs` = PlutusV2 + Plutus Core 1.1.0 - `V3_100.hs` = PlutusV3 + Plutus Core 1.0.0 @@ -112,11 +114,13 @@ import PlutusScripts.Batch6.DropList.V3_110 qualified as DropList_V3_110 **Rationale:** This convention provides clear separation of concerns: + - **Underscore** separates distinct version concepts (Plutus Ledger vs Core) - **No separator** within Core version digits (compacted for clarity) - Removes ambiguity about which separator indicates what **Benefits:** + - Visual clarity: `V3_110` vs verbose `V3_1_1_0` - Less verbose: 6 characters vs 8 characters - Clear hierarchy: version concepts (separated) vs version digits (compact) @@ -174,6 +178,7 @@ mapM_ writeScriptGroup Bitwise_V3_110.failingBitwiseScriptGroups_V3_110 ``` This pattern: + - ✅ Encapsulates parameter iteration in the library - ✅ Keeps executable unaware of Params types - ✅ Generates numbered script files automatically @@ -292,6 +297,7 @@ cabal run envelopes Output: Multiple `.plutus` files in `serialised-plutus-scripts/` (git-ignored) **Generated Scripts**: + - PlutusV2 scripts (bytestring/integer conversions) - Basic PlutusV3 scripts (always succeed/fail, token names, time ranges, redeemers) - SECP256k1 scripts (Schnorr and ECDSA signature verification) @@ -317,12 +323,14 @@ To add a simple script: For parameterized tests (e.g., failing tests with multiple edge cases): 1. Define test parameters in the `Common` module: + ```haskell data Params = Params { input :: ByteString, expected :: Bool } testParams :: [Params] ``` 2. Create a `ScriptGroup` in the versioned module: + ```haskell myScriptGroup :: [ScriptGroup DefaultUni DefaultFun (BuiltinData -> BuiltinUnit)] myScriptGroup = [ScriptGroup @@ -332,7 +340,7 @@ For parameterized tests (e.g., failing tests with multiple edge cases): ``` 3. Use `mapM_ writeScriptGroup` in `app/Main.hs` -4. Run `cabal run envelopes` - generates numbered files (myTestScript_1.plutus, _2.plutus, ...) +4. Run `cabal run envelopes` - generates numbered files (myTestScript_1.plutus, \_2.plutus, ...) ## Nix Binary Cache diff --git a/README.md b/README.md index cedfacf..e9bb6fa 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Originally based on the [Antaeus repository](https://github.com/IntersectMBO/ant This repository provides serialized Plutus scripts compiled for **Plutus Core 1.0.0 and 1.1.0** targeting **PlutusV2** and **PlutusV3** ledger APIs. The scripts are generated as `.plutus` envelope files consumed by the [cardano-node-tests](https://github.com/IntersectMBO/cardano-node-tests) E2E test suite. **Key Features:** + - Comprehensive script library covering basic validators, bitwise operations, cryptography, and governance - Plutus Core 1.0.0 and 1.1.0 support with PlutusV2 and PlutusV3 targeting - Modular architecture with Common/Versioned module pattern @@ -40,6 +41,7 @@ cabal run envelopes The generated `.plutus` files are JSON envelopes containing the serialized Plutus scripts, ready for use in cardano-node-tests. **Generated Scripts**: + - PlutusV2 scripts (bytestring/integer conversions) - Basic PlutusV3 scripts (always succeed/fail, token names, time ranges, redeemers) - SECP256k1 scripts (Schnorr and ECDSA signature verification) @@ -87,12 +89,14 @@ Core testing scripts for fundamental blockchain operations: Scripts demonstrating Plutus bitwise primitives (Plutus Core 1.1.0+): **Succeeding Tests**: + - Logical operations: `andByteString`, `orByteString`, `xorByteString`, `complementByteString` - Shifts and rotates: `shiftByteString`, `rotateByteString` - Bit manipulation: `readBit`, `writeBits`, `countSetBits`, `findFirstSetBit` - Byte operations: `replicateByte`, conversions between integers and bytestrings **Failing Tests**: + - ReadBit edge cases: empty bytestring, negative indices, out of bounds, Int64 limits - WriteBits edge cases: empty bytestring, negative indices, out of bounds - ReplicateByte edge cases: negative count, invalid byte values, size limits @@ -145,17 +149,20 @@ alwaysSucceedPolicyCompiled = $$(PlutusTx.compile [||mkAlwaysSucceedPolicyV3||]) Scripts are compiled for both **Plutus Core 1.0.0** (PlutusV2) and **Plutus Core 1.1.0** (PlutusV3): **Plutus Core 1.0.0 scripts:** + ```haskell {-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.0.0 #-} ``` **Plutus Core 1.1.0 scripts:** + ```haskell {-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:conservative-optimisation #-} {-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.1.0 #-} ``` PlutusV3 (1.1.0) validators receive enhanced `ScriptContext` with governance support: + - Committee actions and voting - Proposal transactions - Constitutional committee hot key operations @@ -292,6 +299,7 @@ Example envelope structure: 5. **Validation**: Cardano node validates scripts during E2E tests The scripts enable comprehensive testing of: + - Plutus V2 and V3 features (including governance) - Bitwise operations introduced in Plutus Core 1.1.0 - Cryptographic primitives (BLS, SECP256k1) @@ -302,18 +310,21 @@ The scripts enable comprehensive testing of: ### Adding New Scripts 1. **Create validator logic** in `PlutusScripts//Common.hs`: + ```haskell {-# INLINEABLE myValidator #-} myValidator :: BuiltinData -> BuiltinData -> BuiltinData -> () ``` 2. **Add versioned module** `PlutusScripts//V_1_1.hs`: + ```haskell myValidatorCompiled :: CompiledCode (BuiltinData -> BuiltinData -> BuiltinData -> ()) myValidatorCompiled = $$(PlutusTx.compile [||myValidator||]) ``` 3. **Update envelopes executable** in `app/Main.hs`: + ```haskell writeEnvelopeV3 "myValidatorScript" MyCategory.myValidatorCompiled ``` diff --git a/plutus-scripts/Helpers/ScriptUtils.hs b/plutus-scripts/Helpers/ScriptUtils.hs index 17c4018..26f5e14 100644 --- a/plutus-scripts/Helpers/ScriptUtils.hs +++ b/plutus-scripts/Helpers/ScriptUtils.hs @@ -38,9 +38,9 @@ The executable can iterate over 'sgScripts' and generate files named -} data ScriptGroup uni fun a = ScriptGroup { sgBaseName :: String - -- ^ Base name for the script group (e.g., "failingReadBitPolicyScriptV3") + -- ^ Base name for the script group (e.g., "failingReadBitPolicyScriptV3") , sgScripts :: [CompiledCodeIn uni fun a] - -- ^ List of compiled scripts, will be numbered from 1 + -- ^ List of compiled scripts, will be numbered from 1 } {-# INLINEABLE tracedUnsafeFrom #-} diff --git a/plutus-scripts/PlutusScripts/Batch6/DropList.hs b/plutus-scripts/PlutusScripts/Batch6/DropList.hs new file mode 100644 index 0000000..951aaae --- /dev/null +++ b/plutus-scripts/PlutusScripts/Batch6/DropList.hs @@ -0,0 +1,32 @@ +module PlutusScripts.Batch6.DropList ( + allDropListScripts, + allDropListScriptGroups, +) +where + +import Helpers.Envelopes ( + VersionedScript (VersionedScript), + VersionedScriptGroup (VersionedScriptGroup), + plc110, + ) +import PlutusLedgerApi.Common.Versions (PlutusLedgerLanguage (PlutusV3)) +import PlutusScripts.Batch6.DropList.V3_110 qualified as V3_110 +import PlutusTx.Prelude qualified as P + +allDropListScripts :: [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] +allDropListScripts = + [ VersionedScript + PlutusV3 + plc110 + "succeedingDropListPolicyScript" + V3_110.succeedingDropListPolicy + ] + +allDropListScriptGroups :: [VersionedScriptGroup (P.BuiltinData -> P.BuiltinUnit)] +allDropListScriptGroups = + [ VersionedScriptGroup + PlutusV3 + plc110 + "expensiveDropListPolicyScript" + V3_110.expensiveDropListScriptGroup + ] diff --git a/plutus-scripts/PlutusScripts/Batch6/DropList/Common.hs b/plutus-scripts/PlutusScripts/Batch6/DropList/Common.hs new file mode 100644 index 0000000..4083262 --- /dev/null +++ b/plutus-scripts/PlutusScripts/Batch6/DropList/Common.hs @@ -0,0 +1,399 @@ +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE ViewPatterns #-} + +{- | Simple end-to-end tests for the Plutus Core `dropList` builtin. These are +adapted from the `plutus-conformance` tests. +-} +module PlutusScripts.Batch6.DropList.Common (mkDropListPolicy, succeedingDropListParams, expensiveDropListParams) +where + +import PlutusTx qualified +import PlutusTx.Builtins qualified as BI +import PlutusTx.Builtins.Internal qualified as BI (unitval) +import PlutusTx.Prelude qualified as P + +data Params = Params + { count :: Integer + , input :: [Integer] + , output :: [Integer] + } +PlutusTx.unstableMakeIsData ''Params +PlutusTx.makeLift ''Params + +{-# INLINEABLE eqIntList #-} +eqIntList :: P.BuiltinList Integer -> P.BuiltinList Integer -> Bool +eqIntList as bs = + if BI.null as && BI.null bs + then True + else (BI.head as P.== BI.head bs) && eqIntList (BI.tail as) (BI.tail bs) + +{-# INLINEABLE mkDropListPolicy #-} +mkDropListPolicy :: [Params] -> P.BuiltinData -> P.BuiltinUnit +mkDropListPolicy l _ctx = go l + where + go [] = BI.unitval + go (Params{..} : rest) = + if BI.drop count (P.toOpaque input) `eqIntList` (P.toOpaque output) + then go rest + else P.traceError "mkCountSetBitsPolicy" + +-- Succeeding inputs for lists of UPLC integers; `dropList` can only fail for cost reasons. +succeedingDropListParams :: [Params] +succeedingDropListParams = + [ Params -- Dropping zero elements has no effect. + { count = 0 + , input = [11, 22, 33, 44, 55, 66, 77, 88, 99] + , output = [11, 22, 33, 44, 55, 66, 77, 88, 99] + } + , Params -- A typical case where you really drop some elements. + { count = 7 + , input = [11, 22, 33, 44, 55, 66, 77, 88, 99] + , output = [88, 99] + } + , Params -- Dropping more elements than the length of the list succeeds and returns the empty list. + { count = 17 + , input = [11, 22, 33, 44, 55, 66, 77, 88, 99] + , output = [] + } + , Params -- Dropping a negative number of elements succeeds and returns the list unchanged. + { count = 07 + , input = [11, 22, 33, 44, 55, 66, 77, 88, 99] + , output = [11, 22, 33, 44, 55, 66, 77, 88, 99] + } + , -- Dropping any number of elements from an empty list always succeeds (and + -- returns the empty list). + Params + { count = -1234 + , input = [] + , output = [] + } + , -- Dropping any number of elements from an empty list always succeeds (and + -- returns the empty list). + Params + { count = 0 + , input = [] + , output = [] + } + , -- Dropping any number of elements from an empty list always succeeds (and + -- returns the empty list). + Params + { count = 1234 + , input = [] + , output = [] + } + ] + +-- Failing inputs for lists of UPLC integers. +---These should return the empty list. However, if run in restricting mode they +-- will (probably, depending on the cost model) attempt to consume the maxmimum +-- budget and fail because the cost depends on the absolute value of the `count` +-- argument, irrespective of the size of the list. +expensiveDropListParams :: [Params] +expensiveDropListParams = + [ Params + { count = 10000000000000000000 + , input = [11, 22, 33, 44, 55, 66, 77, 88, 99] + , output = [] + } + , Params + { count = -12345678901234567890 + , input = [11, 22, 33, 44, 55, 66, 77, 88, 99] + , output = [] + } + , Params -- Drop (maxBound::Int)-1 elements + { count = 9223372036854775806 + , input = + [ 20 + , 21 + , 22 + , 23 + , 24 + , 25 + , 26 + , 27 + , 28 + , 29 + , 30 + , 31 + , 32 + , 33 + , 34 + , 35 + , 36 + , 37 + , 38 + , 39 + , 40 + , 41 + , 42 + , 43 + , 44 + , 45 + , 46 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 58 + , 59 + , 60 + , 61 + , 62 + , 63 + , 64 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , 91 + , 92 + , 93 + , 94 + , 95 + , 96 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + ] + , output = [] + } + , Params -- Drop (maxBound::Int) elements + { count = 9223372036854775807 + , input = + [ 20 + , 21 + , 22 + , 23 + , 24 + , 25 + , 26 + , 27 + , 28 + , 29 + , 30 + , 31 + , 32 + , 33 + , 34 + , 35 + , 36 + , 37 + , 38 + , 39 + , 40 + , 41 + , 42 + , 43 + , 44 + , 45 + , 46 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 58 + , 59 + , 60 + , 61 + , 62 + , 63 + , 64 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , 91 + , 92 + , 93 + , 94 + , 95 + , 96 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + ] + , output = [] + } + , Params -- Drop (maxBound::Int)+1 elements + { count = 9223372036854775808 + , input = + [ 20 + , 21 + , 22 + , 23 + , 24 + , 25 + , 26 + , 27 + , 28 + , 29 + , 30 + , 31 + , 32 + , 33 + , 34 + , 35 + , 36 + , 37 + , 38 + , 39 + , 40 + , 41 + , 42 + , 43 + , 44 + , 45 + , 46 + , 47 + , 48 + , 49 + , 50 + , 51 + , 52 + , 53 + , 54 + , 55 + , 56 + , 57 + , 58 + , 59 + , 60 + , 61 + , 62 + , 63 + , 64 + , 65 + , 66 + , 67 + , 68 + , 69 + , 70 + , 71 + , 72 + , 73 + , 74 + , 75 + , 76 + , 77 + , 78 + , 79 + , 80 + , 81 + , 82 + , 83 + , 84 + , 85 + , 86 + , 87 + , 88 + , 89 + , 90 + , 91 + , 92 + , 93 + , 94 + , 95 + , 96 + , 97 + , 98 + , 99 + , 100 + , 101 + , 102 + , 103 + , 104 + , 105 + , 106 + , 107 + , 108 + , 109 + , 110 + , 111 + ] + , output = [] + } + ] diff --git a/plutus-scripts/PlutusScripts/Batch6/DropList/V3_100.hs b/plutus-scripts/PlutusScripts/Batch6/DropList/V3_100.hs new file mode 100644 index 0000000..6b10f5b --- /dev/null +++ b/plutus-scripts/PlutusScripts/Batch6/DropList/V3_100.hs @@ -0,0 +1,35 @@ +{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.0.0 #-} + +module PlutusScripts.Batch6.DropList.V3_100 where + +import Helpers.ScriptUtils (ScriptGroup (ScriptGroup, sgBaseName, sgScripts)) +import PlutusCore.Default (DefaultFun, DefaultUni) +import PlutusCore.Version (plcVersion100) +import PlutusScripts.Batch6.DropList.Common qualified as DropList +import PlutusTx (compile, liftCode, unsafeApplyCode) +import PlutusTx.Code (CompiledCodeIn) +import PlutusTx.Prelude qualified as P + +-- Tests for `dropList` with PlutusV2 and Plutus 1.0.0 + +-- FIXME: these are currently unused until we work out how to deal with the fact +-- that SoPs and all builtins will be enabled in PlutusV1 and PlutusV2 at PV11. + +-- Compiled code values with parameters already applied for succeeding tests +succeedingDropListPolicy + :: CompiledCodeIn DefaultUni DefaultFun (P.BuiltinData -> P.BuiltinUnit) +succeedingDropListPolicy = + $$(compile [||DropList.mkDropListPolicy||]) + `unsafeApplyCode` liftCode plcVersion100 DropList.succeedingDropListParams + +-- These should fail due to exceeding the budget. +expensiveDropListScriptGroup :: ScriptGroup DefaultUni DefaultFun (P.BuiltinData -> P.BuiltinUnit) +expensiveDropListScriptGroup = + ScriptGroup + { sgBaseName = "expensiveDropListPolicyScript_V2_100" + , sgScripts = map compileDropList DropList.expensiveDropListParams + } + where + compileDropList param = + $$(compile [||DropList.mkDropListPolicy||]) + `unsafeApplyCode` liftCode plcVersion100 [param] diff --git a/plutus-scripts/PlutusScripts/Batch6/DropList/V3_110.hs b/plutus-scripts/PlutusScripts/Batch6/DropList/V3_110.hs new file mode 100644 index 0000000..122f1b6 --- /dev/null +++ b/plutus-scripts/PlutusScripts/Batch6/DropList/V3_110.hs @@ -0,0 +1,29 @@ +{-# OPTIONS_GHC -fplugin-opt PlutusTx.Plugin:target-version=1.1.0 #-} + +module PlutusScripts.Batch6.DropList.V3_110 where + +import Helpers.ScriptUtils (ScriptGroup (ScriptGroup, sgBaseName, sgScripts)) +import PlutusCore.Default (DefaultFun, DefaultUni) +import PlutusCore.Version (plcVersion110) +import PlutusScripts.Batch6.DropList.Common qualified as DropList +import PlutusTx (compile, liftCode, unsafeApplyCode) +import PlutusTx.Code (CompiledCodeIn) +import PlutusTx.Prelude qualified as P + +-- Compiled code values with parameters already applied for succeeding tests +succeedingDropListPolicy :: CompiledCodeIn DefaultUni DefaultFun (P.BuiltinData -> P.BuiltinUnit) +succeedingDropListPolicy = + $$(compile [||DropList.mkDropListPolicy||]) + `unsafeApplyCode` liftCode plcVersion110 DropList.succeedingDropListParams + +-- These should fail due to exceeding the budget. +expensiveDropListScriptGroup :: ScriptGroup DefaultUni DefaultFun (P.BuiltinData -> P.BuiltinUnit) +expensiveDropListScriptGroup = + ScriptGroup + { sgBaseName = "expensiveDropListPolicyScript_V3_110" + , sgScripts = map compileDropList DropList.expensiveDropListParams + } + where + compileDropList param = + $$(compile [||DropList.mkDropListPolicy||]) + `unsafeApplyCode` liftCode plcVersion110 [param] diff --git a/plutus-scripts/PlutusScripts/Bitwise/V_1_1.hs b/plutus-scripts/PlutusScripts/Bitwise/V_1_1.hs index 97ed1fd..bebeef4 100644 --- a/plutus-scripts/PlutusScripts/Bitwise/V_1_1.hs +++ b/plutus-scripts/PlutusScripts/Bitwise/V_1_1.hs @@ -2,7 +2,10 @@ module PlutusScripts.Bitwise.V_1_1 where -import Helpers.ScriptUtils (IsScriptContext (mkUntypedMintingPolicy), ScriptGroup (ScriptGroup, sgBaseName, sgScripts)) +import Helpers.ScriptUtils ( + IsScriptContext (mkUntypedMintingPolicy), + ScriptGroup (ScriptGroup, sgBaseName, sgScripts), + ) import PlutusCore.Default (DefaultFun, DefaultUni) import PlutusCore.Version (plcVersion110) import PlutusLedgerApi.V3 qualified as V3 @@ -155,8 +158,9 @@ succeedingReplicateBytePolicyCompiledV3 = -------------------------------------------------------------------------------- -- Failing Tests --------------------------------------------------------------- --- | All failing bitwise test script groups --- Each group generates numbered scripts (e.g., failingReadBit_1.plutus, failingReadBit_2.plutus) +{- | All failing bitwise test script groups +Each group generates numbered scripts (e.g., failingReadBit_1.plutus, failingReadBit_2.plutus) +-} failingBitwiseScriptGroupsV3 :: [ScriptGroup DefaultUni DefaultFun (P.BuiltinData -> P.BuiltinUnit)] failingBitwiseScriptGroupsV3 = [ -- ReadBit failing tests diff --git a/plutus-scripts/app/Main.hs b/plutus-scripts/app/Main.hs index 81ffa23..1089afe 100644 --- a/plutus-scripts/app/Main.hs +++ b/plutus-scripts/app/Main.hs @@ -4,6 +4,7 @@ import Control.Monad (zipWithM_) import Data.Text qualified as T import Helpers.Envelopes ( VersionedScript (VersionedScript), + VersionedScriptGroup (VersionedScriptGroup), formatCoreVersion, formatPlutusVersion, ) @@ -13,6 +14,7 @@ import PlutusCore.Default (DefaultFun, DefaultUni) import PlutusLedgerApi.Common.Versions (PlutusLedgerLanguage (PlutusV2, PlutusV3)) import PlutusLedgerApi.Envelope qualified as Envelope import PlutusScripts.Basic.V_1_1 qualified as Basic +import PlutusScripts.Batch6.DropList qualified as DropList import PlutusScripts.Batch6.Array qualified as Array import PlutusScripts.Bitwise.V_1_0 qualified as BitwiseV0 import PlutusScripts.Bitwise.V_1_1 qualified as BitwiseV1 @@ -21,7 +23,6 @@ import PlutusScripts.SECP256k1.V_1_1 qualified as SECP import PlutusTx.Code (CompiledCode) import System.Directory (createDirectoryIfMissing) - -------------------------------------------------------------------------------- -- Main ------------------------------------------------------------------------ @@ -46,9 +47,6 @@ main = withUtf8 do -- Hashing scripts (PlutusV3) writeEnvelopeV3 "succeedingRipemd_160Policy" Hashing.succeedingRipemd_160PolicyCompiled - -- Array builtin scripts (18 scripts via VersionedScript list) - mapM_ writeVersionedScript Array.allArrayScripts - -- Bitwise V1.1 scripts (PlutusV3) writeEnvelopeV3 "succeedingAndByteStringPolicyScriptV3" @@ -87,6 +85,15 @@ main = withUtf8 do -- Failing Bitwise Tests (ReadBit, WriteBits, ReplicateByte variants) mapM_ writeScriptGroup BitwiseV1.failingBitwiseScriptGroupsV3 + -- Batch6 (PV11) builtins + -- `dropList` + mapM_ writeVersionedScript DropList.allDropListScripts + mapM_ writeVersionedScriptGroup DropList.allDropListScriptGroups + + -- Array builtin scripts (18 scripts via VersionedScript list) + mapM_ writeVersionedScript Array.allArrayScripts + + -------------------------------------------------------------------------------- -- IO helpers ------------------------------------------------------------------ @@ -126,3 +133,10 @@ writeScriptGroup ScriptGroup{..} = writeNumbered n = writeEnvelopeV3 (sgBaseName ++ "_" ++ show n) -- | Write versioned script group with automatic base name generation +writeVersionedScriptGroup :: VersionedScriptGroup a -> IO () +writeVersionedScriptGroup (VersionedScriptGroup lang coreVer baseName scriptGroup) = do + let versionSuffix = formatPlutusVersion lang <> "_" <> formatCoreVersion coreVer + let baseWithVersion = T.unpack (baseName <> "_" <> versionSuffix) + zipWithM_ (writeNumbered lang baseWithVersion) [1 :: Integer ..] (sgScripts scriptGroup) + where + writeNumbered l base n = writeEnvelope l (base ++ "_" ++ show n) diff --git a/plutus-scripts/plutus-scripts.cabal b/plutus-scripts/plutus-scripts.cabal index 09729c7..6c33e22 100644 --- a/plutus-scripts/plutus-scripts.cabal +++ b/plutus-scripts/plutus-scripts.cabal @@ -88,6 +88,10 @@ library scripts PlutusScripts.Basic.Common PlutusScripts.Basic.V_1_0 PlutusScripts.Basic.V_1_1 + PlutusScripts.Batch6.DropList + PlutusScripts.Batch6.DropList.Common + PlutusScripts.Batch6.DropList.V3_100 + PlutusScripts.Batch6.DropList.V3_110 PlutusScripts.Bitwise.Complement PlutusScripts.Bitwise.Conversions PlutusScripts.Bitwise.CountFindFirstSet