diff --git a/agent_docs/multi_index_array.md b/agent_docs/multi_index_array.md index eb9f776cc..d5fa0466b 100644 --- a/agent_docs/multi_index_array.md +++ b/agent_docs/multi_index_array.md @@ -2,9 +2,10 @@ Issue: [plutus-private#2261](https://github.com/IntersectMBO/plutus-private/issues/2261). The builtin takes the array first, unlike the older signature in the issue. -The tests target PV12 with PlutusV3 and PlutusV4 / PLC 1.1.0. The node and CLI -must both use a Plutus revision that activates batch7 at PV12 in both languages; -a development version number alone does not establish that activation. +The tests target PV12 with PlutusV3 and PlutusV4, each compiled for PLC 1.1.0 and +1.2.0. The node and CLI must both use a Plutus revision that activates batch7 at +PV12 in both languages; a development version number alone does not establish +that activation. ## Established practice @@ -19,16 +20,20 @@ the complete conformance suite or its golden budgets. The test reuses the chunked funding/subtest runner, caches funded addresses, and checks confirmed transaction outputs and optional db-sync records. Its fixture locks governance and Plutus resources and uses the cluster pools. When necessary, it -enacts one cost-model update for every tested language, then marks the cluster for -respin. The update can require three epochs; the fixture skips this setup on -long-epoch testnets before doing any governance work. All PlutusV3 scenarios and -then all PlutusV4 scenarios run as subtests of one test, so both languages share -this setup. Separate parametrized tests would each pay for the update and a respin. +marks the cluster for respin before proposing one cost-model update for every +tested language. The update can require three epochs; the fixture skips this +setup on long-epoch testnets before doing any governance work. All four ledger/Core +combinations run as subtests of one test and share this setup. Each combination +reuses the same scenario runner, budget-growth checks and raw budget tests. +Separate parametrized tests would each pay for the update and a respin. The PlutusV4 policies have the same code as the PlutusV3 ones, because the -policies don't read the script context. Only the envelope `type` differs. The -PlutusV4 scenarios are skipped, without skipping PlutusV3, when the transaction -era is older than Dijkstra or the CLI cannot decode the PlutusV4 policies. +policies don't read the script context. Only the envelope `type` differs between +languages for a given Core version. The scenario definitions are shared between +both Core versions and compiled separately with their respective target versions. +Known batch7 decoding incompatibilities produce skips per combination; both +PlutusV4 variants are skipped when the transaction era is older than Dijkstra. +Other decoder errors, including missing artifacts, fail setup. ## Scenario selection diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayEmptyPolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayEmptyPolicyScript_V3_120.plutus new file mode 100644 index 000000000..ad120cef1 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayEmptyPolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayEmptyPolicyScript_V3_120", + "cborHex": "58b5010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004800400d2000c001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayHugeNegativePolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayHugeNegativePolicyScript_V3_120.plutus new file mode 100644 index 000000000..c69018905 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayHugeNegativePolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayHugeNegativePolicyScript_V3_120", + "cborHex": "58cb010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a41fffffffffffffffffe0780001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayHugePositivePolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayHugePositivePolicyScript_V3_120.plutus new file mode 100644 index 000000000..d4792efd8 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayHugePositivePolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayHugePositivePolicyScript_V3_120", + "cborHex": "58cb010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a410101010101010101000980001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayLateInvalidPolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayLateInvalidPolicyScript_V3_120.plutus new file mode 100644 index 000000000..d98bbfad6 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayLateInvalidPolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayLateInvalidPolicyScript_V3_120", + "cborHex": "58ca010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a4001801a4005801a400d80001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayNegativePolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayNegativePolicyScript_V3_120.plutus new file mode 100644 index 000000000..ae9106f99 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayNegativePolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayNegativePolicyScript_V3_120", + "cborHex": "58ca010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a4001801a4005801a400380001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayOverLimitPolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayOverLimitPolicyScript_V3_120.plutus new file mode 100644 index 000000000..a8be09292 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayOverLimitPolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayOverLimitPolicyScript_V3_120", + "cborHex": "58d60102009800aba0abdaab9cabe548888c8c8c8c8c8c88ca4cdc4a400060106a00866012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c016006902a600030024820840c8cc00400448004884a4006450030029a9980280289000800b00019180080091499b890014800300348002646600600600266e0400520026000323001001229001a5eb02446601400466008008002323001001229001a5eb02446601200466008008002323001001229001a400122337009001198020020009" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayUpperBoundPolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayUpperBoundPolicyScript_V3_120.plutus new file mode 100644 index 000000000..0b6defb27 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/failingMultiIndexArrayUpperBoundPolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "failingMultiIndexArrayUpperBoundPolicyScript_V3_120", + "cborHex": "58c2010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a400d80001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayDataPolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayDataPolicyScript_V3_120.plutus new file mode 100644 index 000000000..edb6de7dc --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayDataPolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "succeedingMultiIndexArrayDataPolicyScript_V3_120", + "cborHex": "5901380102009800aba0abdaab9cabe548888c8c8c8c88c8c8ca660024466ebc008006003801801e00698102182a00c00c00f0034c0108477061796c6f616400c000150054c98cc02924011e6d756c7469496e646578417272617920446174612073656c656374696f6e0049a930c8cc004004cc024008c022006900260069000600690026006900160000452003228018014cc0100100058000c024c01600698102182a00c00d300108477061796c6f616400c00c00700006e9cc00e0069001600690026006900360000c8cc0040044800488488a400b20034a3224a0914801d2848a4cc01c01000a9433001007801c005533009009120010323001001229001a5eb8244660146ea0008cc0100100046460020024520034bd70488cc024008cc0100100046460020024520034bd60488cc020008cc01001000401" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayPolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayPolicyScript_V3_120.plutus new file mode 100644 index 000000000..ddd3c80e9 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayPolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "succeedingMultiIndexArrayPolicyScript_V3_120", + "cborHex": "59015b0102009800aba3aba0abdaab9cabe5488888c8c8c8c8c8c88c8c8c8c8ca6660024466e1c008006005801a40a1801a40290041500752864c044006942602200a4c98cc0392401216d756c7469496e646578417272617920696e74656765722073656c656374696f6e0049a930cc030008c02e00064660020026601800460150034801b00348003003480130034801b000022900191400c00a66008008002c0006018600f00348053003480a2002400d203cc00d2050c00033008300a300380018024000c8cc0040044800488488a400b20034a3224a0914801d2848a4cc01c01000a9433001007801c005533009009120010323001001229001a5eb02446601800466008008002323001001229001a5eb02446601600466008008002323001001229001a5eb02446601400466008008002323001001229001a5eb02446601200466008008002323001001229001a5eb024466010004660080080021" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated1024PolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated1024PolicyScript_V3_120.plutus new file mode 100644 index 000000000..68c448f23 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated1024PolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "succeedingMultiIndexArrayRepeated1024PolicyScript_V3_120", + "cborHex": "59010001020039800aba0abdaab9cabe548888c8c8c8c8c8c888c8c8ca64cdc39805000802d284c02c0053263300d491226d756c7469496e64657841727261792072657065617465642073656c656374696f6e0049a930d4014cc02c004008c030c01e006902a6000300430050023233001001120012212900191400c00a6a6600a00a24002002c0006460020024520034bd60488cc030008cc01001000464600200245266e240052000c00d2000991980180180099b81001480098000c8c0040048a400697ac09119805001198020020008c8c0040048a40069000488cdc02400466008008002323001001229001a5191499b874815000a9426600800800212080101" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated1PolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated1PolicyScript_V3_120.plutus new file mode 100644 index 000000000..296d37338 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated1PolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "succeedingMultiIndexArrayRepeated1PolicyScript_V3_120", + "cborHex": "58ff01020039800aba0abdaab9cabe548888c8c8c8c8c8c888c8c8ca64cdc39805000802d284c02c0053263300d491226d756c7469496e64657841727261792072657065617465642073656c656374696f6e0049a930d4014cc02c004008c030c01e006902a6000300430050023233001001120012212900191400c00a6a6600a00a24002002c0006460020024520034bd60488cc030008cc01001000464600200245266e240052000c00d2000991980180180099b81001480098000c8c0040048a400697ac09119805001198020020008c8c0040048a40069000488cdc02400466008008002323001001229001a5191499b874815000a94266008008002120021" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated64PolicyScript_V3_120.plutus b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated64PolicyScript_V3_120.plutus new file mode 100644 index 000000000..e9627e96d --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch7/1.2.0/succeedingMultiIndexArrayRepeated64PolicyScript_V3_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "succeedingMultiIndexArrayRepeated64PolicyScript_V3_120", + "cborHex": "59010001020039800aba0abdaab9cabe548888c8c8c8c8c8c888c8c8ca64cdc39805000802d284c02c0053263300d491226d756c7469496e64657841727261792072657065617465642073656c656374696f6e0049a930d4014cc02c004008c030c01e006902a6000300430050023233001001120012212900191400c00a6a6600a00a24002002c0006460020024520034bd60488cc030008cc01001000464600200245266e240052000c00d2000991980180180099b81001480098000c8c0040048a400697ac09119805001198020020008c8c0040048a40069000488cdc02400466008008002323001001229001a5191499b874815000a9426600800800212080011" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayEmptyPolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayEmptyPolicyScript_V4_120.plutus new file mode 100644 index 000000000..e7968f842 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayEmptyPolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayEmptyPolicyScript_V4_120", + "cborHex": "58b5010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004800400d2000c001" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayHugeNegativePolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayHugeNegativePolicyScript_V4_120.plutus new file mode 100644 index 000000000..dbc074b98 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayHugeNegativePolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayHugeNegativePolicyScript_V4_120", + "cborHex": "58cb010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a41fffffffffffffffffe0780001" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayHugePositivePolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayHugePositivePolicyScript_V4_120.plutus new file mode 100644 index 000000000..2d4424582 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayHugePositivePolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayHugePositivePolicyScript_V4_120", + "cborHex": "58cb010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a410101010101010101000980001" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayLateInvalidPolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayLateInvalidPolicyScript_V4_120.plutus new file mode 100644 index 000000000..6c8ca524b --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayLateInvalidPolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayLateInvalidPolicyScript_V4_120", + "cborHex": "58ca010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a4001801a4005801a400d80001" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayNegativePolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayNegativePolicyScript_V4_120.plutus new file mode 100644 index 000000000..a164f1f1b --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayNegativePolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayNegativePolicyScript_V4_120", + "cborHex": "58ca010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a4001801a4005801a400380001" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayOverLimitPolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayOverLimitPolicyScript_V4_120.plutus new file mode 100644 index 000000000..26328c4b3 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayOverLimitPolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayOverLimitPolicyScript_V4_120", + "cborHex": "58d60102009800aba0abdaab9cabe548888c8c8c8c8c8c88ca4cdc4a400060106a00866012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c016006902a600030024820840c8cc00400448004884a4006450030029a9980280289000800b00019180080091499b890014800300348002646600600600266e0400520026000323001001229001a5eb02446601400466008008002323001001229001a5eb02446601200466008008002323001001229001a400122337009001198020020009" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayUpperBoundPolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayUpperBoundPolicyScript_V4_120.plutus new file mode 100644 index 000000000..692c8cdc2 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/failingMultiIndexArrayUpperBoundPolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "failingMultiIndexArrayUpperBoundPolicyScript_V4_120", + "cborHex": "58c2010200339800aba0abdaab9cabe548888c8c8c8c8888ca4cdc4a400060106a00a66012002600e0073263300a49011b756e726561636861626c65206e65676174697665206c656e6774680049a930c028c01400cc8cc00400448004884a4006450030029a9980280289000800b000191800800914800d2f581223300a00233004004001191800800914800d2f581223300900233004004001191800800914800d20009119b8048008cc010010004801a4029801a4051801a40798000801a400d80001" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayDataPolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayDataPolicyScript_V4_120.plutus new file mode 100644 index 000000000..fc46ea11d --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayDataPolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "succeedingMultiIndexArrayDataPolicyScript_V4_120", + "cborHex": "5901380102009800aba0abdaab9cabe548888c8c8c8c88c8c8ca660024466ebc008006003801801e00698102182a00c00c00f0034c0108477061796c6f616400c000150054c98cc02924011e6d756c7469496e646578417272617920446174612073656c656374696f6e0049a930c8cc004004cc024008c022006900260069000600690026006900160000452003228018014cc0100100058000c024c01600698102182a00c00d300108477061796c6f616400c00c00700006e9cc00e0069001600690026006900360000c8cc0040044800488488a400b20034a3224a0914801d2848a4cc01c01000a9433001007801c005533009009120010323001001229001a5eb8244660146ea0008cc0100100046460020024520034bd70488cc024008cc0100100046460020024520034bd60488cc020008cc01001000401" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayPolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayPolicyScript_V4_120.plutus new file mode 100644 index 000000000..910bd4791 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayPolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "succeedingMultiIndexArrayPolicyScript_V4_120", + "cborHex": "59015b0102009800aba3aba0abdaab9cabe5488888c8c8c8c8c8c88c8c8c8c8ca6660024466e1c008006005801a40a1801a40290041500752864c044006942602200a4c98cc0392401216d756c7469496e646578417272617920696e74656765722073656c656374696f6e0049a930cc030008c02e00064660020026601800460150034801b00348003003480130034801b000022900191400c00a66008008002c0006018600f00348053003480a2002400d203cc00d2050c00033008300a300380018024000c8cc0040044800488488a400b20034a3224a0914801d2848a4cc01c01000a9433001007801c005533009009120010323001001229001a5eb02446601800466008008002323001001229001a5eb02446601600466008008002323001001229001a5eb02446601400466008008002323001001229001a5eb02446601200466008008002323001001229001a5eb024466010004660080080021" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated1024PolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated1024PolicyScript_V4_120.plutus new file mode 100644 index 000000000..20698d565 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated1024PolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "succeedingMultiIndexArrayRepeated1024PolicyScript_V4_120", + "cborHex": "59010001020039800aba0abdaab9cabe548888c8c8c8c8c8c888c8c8ca64cdc39805000802d284c02c0053263300d491226d756c7469496e64657841727261792072657065617465642073656c656374696f6e0049a930d4014cc02c004008c030c01e006902a6000300430050023233001001120012212900191400c00a6a6600a00a24002002c0006460020024520034bd60488cc030008cc01001000464600200245266e240052000c00d2000991980180180099b81001480098000c8c0040048a400697ac09119805001198020020008c8c0040048a40069000488cdc02400466008008002323001001229001a5191499b874815000a9426600800800212080101" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated1PolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated1PolicyScript_V4_120.plutus new file mode 100644 index 000000000..9805fd1f6 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated1PolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "succeedingMultiIndexArrayRepeated1PolicyScript_V4_120", + "cborHex": "58ff01020039800aba0abdaab9cabe548888c8c8c8c8c8c888c8c8ca64cdc39805000802d284c02c0053263300d491226d756c7469496e64657841727261792072657065617465642073656c656374696f6e0049a930d4014cc02c004008c030c01e006902a6000300430050023233001001120012212900191400c00a6a6600a00a24002002c0006460020024520034bd60488cc030008cc01001000464600200245266e240052000c00d2000991980180180099b81001480098000c8c0040048a400697ac09119805001198020020008c8c0040048a40069000488cdc02400466008008002323001001229001a5191499b874815000a94266008008002120021" +} diff --git a/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated64PolicyScript_V4_120.plutus b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated64PolicyScript_V4_120.plutus new file mode 100644 index 000000000..ec48802c8 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v4/batch7/1.2.0/succeedingMultiIndexArrayRepeated64PolicyScript_V4_120.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV4", + "description": "succeedingMultiIndexArrayRepeated64PolicyScript_V4_120", + "cborHex": "59010001020039800aba0abdaab9cabe548888c8c8c8c8c8c888c8c8ca64cdc39805000802d284c02c0053263300d491226d756c7469496e64657841727261792072657065617465642073656c656374696f6e0049a930d4014cc02c004008c030c01e006902a6000300430050023233001001120012212900191400c00a6a6600a00a24002002c0006460020024520034bd60488cc030008cc01001000464600200245266e240052000c00d2000991980180180099b81001480098000c8c0040048a400697ac09119805001198020020008c8c0040048a40069000488cdc02400466008008002323001001229001a5191499b874815000a9426600800800212080011" +} diff --git a/cardano_node_tests/tests/plutus_common.py b/cardano_node_tests/tests/plutus_common.py index 9242035fd..0ceff9e98 100644 --- a/cardano_node_tests/tests/plutus_common.py +++ b/cardano_node_tests/tests/plutus_common.py @@ -732,8 +732,14 @@ def _get_script_data_fail(script_name: str) -> PlutusScriptData: # ------ Batch 7: multiIndexArray (PV12) ------ # -SCRIPTS_V3_BATCH7_110_DIR = SCRIPTS_V3_DIR / "batch7" / "1.1.0" -SCRIPTS_V4_BATCH7_110_DIR = SCRIPTS_V4_DIR / "batch7" / "1.1.0" +class MultiIndexArrayScripts(tp.NamedTuple): + """multiIndexArray policies for one ledger language and Plutus Core version.""" + + cost_model: str + succeeding: tuple[PlutusScriptData, ...] + failing: tuple[PlutusScriptData, ...] + + _SUCCEEDING_MULTI_INDEX_ARRAY_NAMES = ( "Policy", "DataPolicy", @@ -750,42 +756,47 @@ def _get_script_data_fail(script_name: str) -> PlutusScriptData: "HugeNegative", "OverLimit", ) -SUCCEEDING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V3 = tuple( - PlutusScriptData( - script_file=SCRIPTS_V3_BATCH7_110_DIR - / f"succeedingMultiIndexArray{name}Script_V3_110.plutus", - script_type=clusterlib.ScriptTypes.PLUTUS_V3, - execution_cost=UNDETERMINED_COST, - ) - for name in _SUCCEEDING_MULTI_INDEX_ARRAY_NAMES -) -FAILING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V3 = tuple( - PlutusScriptData( - script_file=SCRIPTS_V3_BATCH7_110_DIR - / f"failingMultiIndexArray{name}PolicyScript_V3_110.plutus", - script_type=clusterlib.ScriptTypes.PLUTUS_V3, - execution_cost=UNDETERMINED_COST, - ) - for name in _FAILING_MULTI_INDEX_ARRAY_NAMES -) -SUCCEEDING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V4 = tuple( - PlutusScriptData( - script_file=SCRIPTS_V4_BATCH7_110_DIR - / f"succeedingMultiIndexArray{name}Script_V4_110.plutus", - script_type=clusterlib.ScriptTypes.PLUTUS_V4, + + +def _get_multi_index_array_script(name: str, ledger: str, core_version: str) -> PlutusScriptData: + """Locate a multiIndexArray envelope for a ledger and Core version pair.""" + return PlutusScriptData( + script_file=PLUTUS_DIR + / ledger + / "batch7" + / core_version + / f"{name}_{ledger.upper()}_{core_version.replace('.', '')}.plutus", + script_type={ + "v3": clusterlib.ScriptTypes.PLUTUS_V3, + "v4": clusterlib.ScriptTypes.PLUTUS_V4, + }[ledger], execution_cost=UNDETERMINED_COST, ) - for name in _SUCCEEDING_MULTI_INDEX_ARRAY_NAMES -) -FAILING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V4 = tuple( - PlutusScriptData( - script_file=SCRIPTS_V4_BATCH7_110_DIR - / f"failingMultiIndexArray{name}PolicyScript_V4_110.plutus", - script_type=clusterlib.ScriptTypes.PLUTUS_V4, - execution_cost=UNDETERMINED_COST, + + +MULTI_INDEX_ARRAY_SCRIPTS = { + f"{ledger}_{core_version.replace('.', '')}": MultiIndexArrayScripts( + cost_model=f"Plutus{ledger.upper()}", + succeeding=tuple( + _get_multi_index_array_script( + name=f"succeedingMultiIndexArray{name}Script", + ledger=ledger, + core_version=core_version, + ) + for name in _SUCCEEDING_MULTI_INDEX_ARRAY_NAMES + ), + failing=tuple( + _get_multi_index_array_script( + name=f"failingMultiIndexArray{name}PolicyScript", + ledger=ledger, + core_version=core_version, + ) + for name in _FAILING_MULTI_INDEX_ARRAY_NAMES + ), ) - for name in _FAILING_MULTI_INDEX_ARRAY_NAMES -) + for ledger in ("v3", "v4") + for core_version in ("1.1.0", "1.2.0") +} @dataclasses.dataclass(frozen=True, order=True) diff --git a/cardano_node_tests/tests/tests_plutus_v3/test_multi_index_array.py b/cardano_node_tests/tests/tests_plutus_v3/test_multi_index_array.py index c62beb7d4..02b772b17 100644 --- a/cardano_node_tests/tests/tests_plutus_v3/test_multi_index_array.py +++ b/cardano_node_tests/tests/tests_plutus_v3/test_multi_index_array.py @@ -27,27 +27,7 @@ MULTI_INDEX_ARRAY_COST_MODEL_LEN = 355 -class VersionScripts(tp.NamedTuple): - """multiIndexArray policies compiled for one Plutus version.""" - - cost_model: str - succeeding: tuple[plutus_common.PlutusScriptData, ...] - failing: tuple[plutus_common.PlutusScriptData, ...] - - -# The policies don't read the script context, so both versions share the same code -SCRIPTS = { - "v3": VersionScripts( - cost_model="PlutusV3", - succeeding=plutus_common.SUCCEEDING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V3, - failing=plutus_common.FAILING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V3, - ), - "v4": VersionScripts( - cost_model="PlutusV4", - succeeding=plutus_common.SUCCEEDING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V4, - failing=plutus_common.FAILING_MINTING_MULTI_INDEX_ARRAY_SCRIPTS_V4, - ), -} +SCRIPTS = plutus_common.MULTI_INDEX_ARRAY_SCRIPTS pytestmark = [ # Skip before the fixture locks governance and Plutus resources @@ -63,15 +43,15 @@ class VersionScripts(tp.NamedTuple): class MultiIndexArraySetup(tp.NamedTuple): - """Cluster with multiIndexArray costing for all Plutus versions that are tested.""" + """Cluster with multiIndexArray costing for all tested ledger/Core combinations.""" cluster: clusterlib.ClusterLib - # Reasons to skip Plutus versions, keyed like `SCRIPTS` + # Reasons to skip ledger/Core combinations, keyed like `SCRIPTS` skip_reasons: dict[str, str] def _get_decode_skip_reason(cluster_obj: clusterlib.ClusterLib, script_file: pl.Path) -> str: - """Return the reason to skip a Plutus version if the CLI cannot decode its policy.""" + """Return a skip reason for known batch7 decoding incompatibilities.""" try: cluster_obj.g_transaction.get_policyid(script_file) except clusterlib.CLIError as exc: @@ -93,32 +73,35 @@ def multi_index_array_setup( """Enable multiIndexArray costing while locking governance and Plutus resources. Update the PlutusV3 and PlutusV4 cost models in a single governance action, unless - the cost models of all tested Plutus versions already price multiIndexArray. Skip - the whole test when PlutusV3 cannot be tested, and only the PlutusV4 scenarios - when PlutusV4 cannot be tested. + the cost models of all tested languages already price multiIndexArray. Both Core + versions reuse these models. Skip the whole test when the PlutusV3/PLC 1.1.0 + baseline has a known batch7 decoding incompatibility. Check the same decoding + incompatibilities separately for the other ledger/Core combinations. """ cluster = cluster_plutus pparams = cluster.g_query.get_protocol_params() if pparams["protocolVersion"]["major"] < 12: pytest.skip("multiIndexArray requires protocol version 12 or later") - # Fail before governance setup if the CLI cannot decode PV12 scripts + # Check CLI batch7 activation before governance setup skip_reason_v3 = _get_decode_skip_reason( - cluster_obj=cluster, script_file=SCRIPTS["v3"].succeeding[0].script_file + cluster_obj=cluster, script_file=SCRIPTS["v3_110"].succeeding[0].script_file ) if skip_reason_v3: pytest.skip(skip_reason_v3) skip_reasons = {} - if VERSIONS.transaction_era < VERSIONS.DIJKSTRA_FIRST: - skip_reasons["v4"] = "Plutus V4 is available only in Dijkstra+ eras" - else: - skip_reason_v4 = _get_decode_skip_reason( - cluster_obj=cluster, script_file=SCRIPTS["v4"].succeeding[0].script_file + for variant, scripts in SCRIPTS.items(): + if scripts.cost_model == "PlutusV4" and VERSIONS.transaction_era < VERSIONS.DIJKSTRA_FIRST: + skip_reasons[variant] = "Plutus V4 is available only in Dijkstra+ eras" + continue + + skip_reason = _get_decode_skip_reason( + cluster_obj=cluster, script_file=scripts.succeeding[0].script_file ) - if skip_reason_v4: - skip_reasons["v4"] = skip_reason_v4 + if skip_reason: + skip_reasons[variant] = skip_reason - tested_cost_models = [s.cost_model for v, s in SCRIPTS.items() if v not in skip_reasons] + tested_cost_models = {s.cost_model for v, s in SCRIPTS.items() if v not in skip_reasons} def _is_costing_enabled(cost_models: dict) -> bool: return all( @@ -174,10 +157,11 @@ def test_multi_index_array( ): """Mint with valid selections and reject invalid requests while building transactions. - Run all scenarios with the PlutusV3 policies, then with the same policies compiled - for PlutusV4. Both versions reuse a single cost-model setup. Skip the PlutusV4 - scenarios when the transaction era is older than Dijkstra or when the CLI cannot - decode the PlutusV4 policies. + Run the existing scenarios for PlutusV3 and PlutusV4, each compiled for PLC + 1.1.0 and 1.2.0. All four combinations reuse a single cost-model setup and + minting/budget helpers. Skip known batch7 decoding incompatibilities for each + combination and both PlutusV4 variants before the Dijkstra transaction era. + Other decoder errors fail setup. Check ordering, duplicate indices, empty selections, heterogeneous Data, and repeated selections of 1, 64 and 1,024 elements. The Data policy selects @@ -193,32 +177,32 @@ def test_multi_index_array( setup = multi_index_array_setup temp_template = common.get_test_id(setup.cluster) - for plutus_version, scripts in SCRIPTS.items(): - skip_reason = setup.skip_reasons.get(plutus_version) + for variant, scripts in SCRIPTS.items(): + skip_reason = setup.skip_reasons.get(variant) if skip_reason: - with subtests.test(plutus_version=plutus_version): + with subtests.test(variant=variant): pytest.skip(skip_reason) continue - self._check_plutus_version( + self._check_variant( cluster_manager=cluster_manager, cluster_obj=setup.cluster, - temp_template=f"{temp_template}_{plutus_version}", - plutus_version=plutus_version, + temp_template=f"{temp_template}_{variant}", + variant=variant, scripts=scripts, subtests=subtests, ) - def _check_plutus_version( + def _check_variant( self, cluster_manager: cluster_management.ClusterManager, cluster_obj: clusterlib.ClusterLib, temp_template: str, - plutus_version: str, - scripts: VersionScripts, + variant: str, + scripts: plutus_common.MultiIndexArrayScripts, subtests: pytest_subtests.SubTests, ) -> None: - """Run the minting and budget scenarios with the policies of one Plutus version.""" + """Run minting and budget scenarios for one ledger/Core combination.""" cluster = cluster_obj over_limit_stem = next( s.script_file.stem for s in scripts.failing if "OverLimitPolicy" in s.script_file.stem @@ -229,7 +213,7 @@ def _check_plutus_version( cluster_manager=cluster_manager, cluster_obj=cluster, temp_template=temp_template, - variant=f"multi_index_array_{plutus_version}", + variant=f"multi_index_array_{variant}", success_scripts=scripts.succeeding, fail_scripts=scripts.failing, overspend_scripts=(), @@ -265,7 +249,7 @@ def _check_plutus_version( redeemer_records=db_record.redeemers, cost_records=minted.plutus_costs ) - with subtests.test(plutus_version=plutus_version, check="policy_budget_growth"): + with subtests.test(variant=variant, check="policy_budget_growth"): assert len(repeated_costs) == 3, ( "Expected budgets for requests of 1, 64 and 1024 indices" ) @@ -276,12 +260,12 @@ def _check_plutus_version( < repeated_costs["1024"][resource] ), f"Policy execution {resource} did not grow with request size: {repeated_costs}" - with subtests.test(plutus_version=plutus_version, check="execution_budget"): + with subtests.test(variant=variant, check="execution_budget"): self._check_execution_budget( cluster_manager=cluster_manager, cluster_obj=cluster, temp_template=f"{temp_template}_budget", - plutus_version=plutus_version, + variant=variant, script=next( s for s in scripts.succeeding if "Repeated1024Policy" in s.script_file.stem ), @@ -293,7 +277,7 @@ def _check_execution_budget( cluster_manager: cluster_management.ClusterManager, cluster_obj: clusterlib.ClusterLib, temp_template: str, - plutus_version: str, + variant: str, script: plutus_common.PlutusScriptData, subtests: pytest_subtests.SubTests, ) -> None: @@ -314,7 +298,7 @@ def _check_execution_budget( cluster_obj=cluster, num=2, fund_idx=[0], - caching_key=helpers.get_current_line_str(), + caching_key=f"{helpers.get_current_line_str()}_{variant}", amount=1_000_000_000, min_amount=100_000_000, ) @@ -367,7 +351,7 @@ def _check_execution_budget( ("memory", (units["steps"], units["memory"] - 1)), ("sufficient", (units["steps"], units["memory"])), ): - with subtests.test(plutus_version=plutus_version, budget=name): + with subtests.test(variant=variant, budget=name): tx_name = f"{temp_template}_{name}" tx_output = cluster.g_transaction.build_raw_tx( src_address=issuer_addr.address,