From 091d8f452d21d5f006002b3ae1100be65f1533d4 Mon Sep 17 00:00:00 2001 From: Yura Lazarev Date: Mon, 9 Nov 2026 12:35:39 +0100 Subject: [PATCH 1/2] feat: add PLC 1.2.0 multiIndexArray policies Generate the existing twelve scenarios for PlutusV3 and PlutusV4 at PLC 1.2.0, reusing the shared validators and scenario parameters. Keep the PLC 1.1.0 policies byte-identical. --- .../PlutusScripts/Batch7/MultiIndexArray.hs | 7 ++- .../Batch7/MultiIndexArray/V120.hs | 57 +++++++++++++++++++ plutus-scripts/plutus-scripts.cabal | 1 + 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V120.hs diff --git a/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs index b546d09..d5be1cb 100644 --- a/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs +++ b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs @@ -1,6 +1,6 @@ {-# OPTIONS_GHC -fplugin-opt Plinth.Plugin:target-version=1.1.0 #-} --- | PlutusV3 and PlutusV4 / PLC 1.1.0 policies for multiIndexArray (batch 7). +-- | PlutusV3 and PlutusV4 / PLC 1.1.0 and 1.2.0 multiIndexArray policies. module PlutusScripts.Batch7.MultiIndexArray (allMultiIndexArrayScripts) where import Data.Text (Text) @@ -16,12 +16,15 @@ import PlutusScripts.Batch7.MultiIndexArray.Common ( mkRepeatedPolicy, repeatedSelections, ) +import PlutusScripts.Batch7.MultiIndexArray.V120 qualified as V120 import PlutusTx (CompiledCode, compile, liftCode, unsafeApplyCode) import PlutusTx.Prelude qualified as P -- | The policies do not read the script context, so every ledger language gets the same code. allMultiIndexArrayScripts :: [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] -allMultiIndexArrayScripts = concatMap multiIndexArrayScripts [PlutusV3, PlutusV4] +allMultiIndexArrayScripts = + concatMap multiIndexArrayScripts [PlutusV3, PlutusV4] + <> V120.allMultiIndexArrayScripts multiIndexArrayScripts :: PlutusLedgerLanguage -> [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] multiIndexArrayScripts ll = diff --git a/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V120.hs b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V120.hs new file mode 100644 index 0000000..fb3285e --- /dev/null +++ b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V120.hs @@ -0,0 +1,57 @@ +{-# OPTIONS_GHC -fplugin-opt Plinth.Plugin:target-version=1.2.0 #-} + +-- | PlutusV3 and PlutusV4 / PLC 1.2.0 multiIndexArray policies. +module PlutusScripts.Batch7.MultiIndexArray.V120 ( + allMultiIndexArrayScripts, +) where + +import Data.Text (Text) +import Helpers.Envelopes (VersionedScript (VersionedScript), plc120) +import PlutusCore.Version (plcVersion120) +import PlutusLedgerApi.Common.Versions ( + PlutusLedgerLanguage (PlutusV3, PlutusV4), + ) +import PlutusScripts.Batch7.MultiIndexArray.Common ( + failingLookups, + mkDataPolicy, + mkFailingPolicy, + mkIntegerPolicy, + mkOverLimitPolicy, + mkRepeatedPolicy, + repeatedSelections, + ) +import PlutusTx (CompiledCode, compile, liftCode, unsafeApplyCode) +import PlutusTx.Prelude qualified as P + +-- | Context-independent policies share compiled code across ledger languages. +allMultiIndexArrayScripts :: [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] +allMultiIndexArrayScripts = concatMap multiIndexArrayScripts [PlutusV3, PlutusV4] + +multiIndexArrayScripts + :: PlutusLedgerLanguage + -> [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] +multiIndexArrayScripts ll = + map (uncurry (VersionedScript ll plc120)) policies + +-- | Reuse the PLC 1.1.0 scenarios, compiling and lifting at PLC 1.2.0. +policies :: [(Text, CompiledCode (P.BuiltinData -> P.BuiltinUnit))] +policies = + [ ("succeedingMultiIndexArrayPolicyScript", $$(compile [||mkIntegerPolicy||])) + , ("succeedingMultiIndexArrayDataPolicyScript", $$(compile [||mkDataPolicy||])) + ] + <> [(name, repeated count) | (name, count) <- repeatedSelections] + <> [(name, failing elements indices) | (name, elements, indices) <- failingLookups] + <> [("failingMultiIndexArrayOverLimitPolicyScript", $$(compile [||mkOverLimitPolicy||]))] + where + repeated :: Integer -> CompiledCode (P.BuiltinData -> P.BuiltinUnit) + repeated count = + $$(compile [||mkRepeatedPolicy||]) + `unsafeApplyCode` liftCode plcVersion120 count + failing + :: [Integer] + -> [Integer] + -> CompiledCode (P.BuiltinData -> P.BuiltinUnit) + failing elements indices = + $$(compile [||mkFailingPolicy||]) + `unsafeApplyCode` liftCode plcVersion120 elements + `unsafeApplyCode` liftCode plcVersion120 indices diff --git a/plutus-scripts/plutus-scripts.cabal b/plutus-scripts/plutus-scripts.cabal index bff877f..ad2a9fc 100644 --- a/plutus-scripts/plutus-scripts.cabal +++ b/plutus-scripts/plutus-scripts.cabal @@ -115,6 +115,7 @@ library scripts PlutusScripts.Batch6.Value.V3_110 PlutusScripts.Batch7.MultiIndexArray PlutusScripts.Batch7.MultiIndexArray.Common + PlutusScripts.Batch7.MultiIndexArray.V120 PlutusScripts.Bitwise.Complement PlutusScripts.Bitwise.Conversions PlutusScripts.Bitwise.CountFindFirstSet From 2bb93c76c96f1d75f56c90b46875970608ed353f Mon Sep 17 00:00:00 2001 From: Yura Lazarev Date: Mon, 9 Nov 2026 12:58:33 +0100 Subject: [PATCH 2/2] refactor: align multiIndexArray version modules Move the PLC 1.1.0 compile site into V110 alongside V120. Keep MultiIndexArray as a symmetric aggregator of both versions. All 277 regenerated envelopes remain byte-identical, preserving the existing fixture and E2E budget evidence. --- .../PlutusScripts/Batch7/MultiIndexArray.hs | 49 ++-------------- .../Batch7/MultiIndexArray/V110.hs | 57 +++++++++++++++++++ plutus-scripts/plutus-scripts.cabal | 1 + 3 files changed, 63 insertions(+), 44 deletions(-) create mode 100644 plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V110.hs diff --git a/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs index d5be1cb..1a2bc26 100644 --- a/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs +++ b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray.hs @@ -1,51 +1,12 @@ -{-# OPTIONS_GHC -fplugin-opt Plinth.Plugin:target-version=1.1.0 #-} - --- | PlutusV3 and PlutusV4 / PLC 1.1.0 and 1.2.0 multiIndexArray policies. +-- | Versioned multiIndexArray policies for PlutusV3 and PlutusV4. module PlutusScripts.Batch7.MultiIndexArray (allMultiIndexArrayScripts) where -import Data.Text (Text) -import Helpers.Envelopes (VersionedScript (VersionedScript), plc110) -import PlutusCore.Version (plcVersion110) -import PlutusLedgerApi.Common.Versions (PlutusLedgerLanguage (PlutusV3, PlutusV4)) -import PlutusScripts.Batch7.MultiIndexArray.Common ( - failingLookups, - mkDataPolicy, - mkFailingPolicy, - mkIntegerPolicy, - mkOverLimitPolicy, - mkRepeatedPolicy, - repeatedSelections, - ) +import Helpers.Envelopes (VersionedScript) +import PlutusScripts.Batch7.MultiIndexArray.V110 qualified as V110 import PlutusScripts.Batch7.MultiIndexArray.V120 qualified as V120 -import PlutusTx (CompiledCode, compile, liftCode, unsafeApplyCode) import PlutusTx.Prelude qualified as P --- | The policies do not read the script context, so every ledger language gets the same code. +-- | Combine both Plutus Core versions, each covering both ledger languages. allMultiIndexArrayScripts :: [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] allMultiIndexArrayScripts = - concatMap multiIndexArrayScripts [PlutusV3, PlutusV4] - <> V120.allMultiIndexArrayScripts - -multiIndexArrayScripts :: PlutusLedgerLanguage -> [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] -multiIndexArrayScripts ll = - map (uncurry (VersionedScript ll plc110)) policies - --- | Named policies; each failing policy isolates one observable failure. -policies :: [(Text, CompiledCode (P.BuiltinData -> P.BuiltinUnit))] -policies = - [ ("succeedingMultiIndexArrayPolicyScript", $$(compile [||mkIntegerPolicy||])) - , ("succeedingMultiIndexArrayDataPolicyScript", $$(compile [||mkDataPolicy||])) - ] - <> [(name, repeated count) | (name, count) <- repeatedSelections] - <> [(name, failing elements indices) | (name, elements, indices) <- failingLookups] - <> [("failingMultiIndexArrayOverLimitPolicyScript", $$(compile [||mkOverLimitPolicy||]))] - where - repeated :: Integer -> CompiledCode (P.BuiltinData -> P.BuiltinUnit) - repeated count = - $$(compile [||mkRepeatedPolicy||]) - `unsafeApplyCode` liftCode plcVersion110 count - failing :: [Integer] -> [Integer] -> CompiledCode (P.BuiltinData -> P.BuiltinUnit) - failing elements indices = - $$(compile [||mkFailingPolicy||]) - `unsafeApplyCode` liftCode plcVersion110 elements - `unsafeApplyCode` liftCode plcVersion110 indices + V110.allMultiIndexArrayScripts <> V120.allMultiIndexArrayScripts diff --git a/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V110.hs b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V110.hs new file mode 100644 index 0000000..0eb6994 --- /dev/null +++ b/plutus-scripts/PlutusScripts/Batch7/MultiIndexArray/V110.hs @@ -0,0 +1,57 @@ +{-# OPTIONS_GHC -fplugin-opt Plinth.Plugin:target-version=1.1.0 #-} + +-- | PlutusV3 and PlutusV4 / PLC 1.1.0 multiIndexArray policies. +module PlutusScripts.Batch7.MultiIndexArray.V110 ( + allMultiIndexArrayScripts, +) where + +import Data.Text (Text) +import Helpers.Envelopes (VersionedScript (VersionedScript), plc110) +import PlutusCore.Version (plcVersion110) +import PlutusLedgerApi.Common.Versions ( + PlutusLedgerLanguage (PlutusV3, PlutusV4), + ) +import PlutusScripts.Batch7.MultiIndexArray.Common ( + failingLookups, + mkDataPolicy, + mkFailingPolicy, + mkIntegerPolicy, + mkOverLimitPolicy, + mkRepeatedPolicy, + repeatedSelections, + ) +import PlutusTx (CompiledCode, compile, liftCode, unsafeApplyCode) +import PlutusTx.Prelude qualified as P + +-- | Context-independent policies share compiled code across ledger languages. +allMultiIndexArrayScripts :: [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] +allMultiIndexArrayScripts = concatMap multiIndexArrayScripts [PlutusV3, PlutusV4] + +multiIndexArrayScripts + :: PlutusLedgerLanguage + -> [VersionedScript (P.BuiltinData -> P.BuiltinUnit)] +multiIndexArrayScripts ll = + map (uncurry (VersionedScript ll plc110)) policies + +-- | Named policies, compiled and lifted at PLC 1.1.0. +policies :: [(Text, CompiledCode (P.BuiltinData -> P.BuiltinUnit))] +policies = + [ ("succeedingMultiIndexArrayPolicyScript", $$(compile [||mkIntegerPolicy||])) + , ("succeedingMultiIndexArrayDataPolicyScript", $$(compile [||mkDataPolicy||])) + ] + <> [(name, repeated count) | (name, count) <- repeatedSelections] + <> [(name, failing elements indices) | (name, elements, indices) <- failingLookups] + <> [("failingMultiIndexArrayOverLimitPolicyScript", $$(compile [||mkOverLimitPolicy||]))] + where + repeated :: Integer -> CompiledCode (P.BuiltinData -> P.BuiltinUnit) + repeated count = + $$(compile [||mkRepeatedPolicy||]) + `unsafeApplyCode` liftCode plcVersion110 count + failing + :: [Integer] + -> [Integer] + -> CompiledCode (P.BuiltinData -> P.BuiltinUnit) + failing elements indices = + $$(compile [||mkFailingPolicy||]) + `unsafeApplyCode` liftCode plcVersion110 elements + `unsafeApplyCode` liftCode plcVersion110 indices diff --git a/plutus-scripts/plutus-scripts.cabal b/plutus-scripts/plutus-scripts.cabal index ad2a9fc..b91451f 100644 --- a/plutus-scripts/plutus-scripts.cabal +++ b/plutus-scripts/plutus-scripts.cabal @@ -115,6 +115,7 @@ library scripts PlutusScripts.Batch6.Value.V3_110 PlutusScripts.Batch7.MultiIndexArray PlutusScripts.Batch7.MultiIndexArray.Common + PlutusScripts.Batch7.MultiIndexArray.V110 PlutusScripts.Batch7.MultiIndexArray.V120 PlutusScripts.Bitwise.Complement PlutusScripts.Bitwise.Conversions