diff --git a/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_1.plutus b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_1.plutus new file mode 100644 index 000000000..5eb9408bc --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_1.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "expensiveDropListPolicyScriptV3_1", + "cborHex": "58d10101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c005208080c09e91c191c79502c00d2016c00d202cc00d2042c00d2058c00d206ec00d208401c00d209a01c00d20b001c00d20c601c00001800300001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_2.plutus b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_2.plutus new file mode 100644 index 000000000..604eb0c17 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_2.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "expensiveDropListPolicyScriptV3_2", + "cborHex": "58d10101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c00520a3abf8b19de3d4d4d602c00d2016c00d202cc00d2042c00d2058c00d206ec00d208401c00d209a01c00d20b001c00d20c601c00001800300001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_3.plutus b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_3.plutus new file mode 100644 index 000000000..27062eadc --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_3.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "expensiveDropListPolicyScriptV3_3", + "cborHex": "5902530101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c00520fcffffffffffffffff01c00d2028c00d202ac00d202cc00d202ec00d2030c00d2032c00d2034c00d2036c00d2038c00d203ac00d203cc00d203ec00d2040c00d2042c00d2044c00d2046c00d2048c00d204ac00d204cc00d204ec00d2050c00d2052c00d2054c00d2056c00d2058c00d205ac00d205cc00d205ec00d2060c00d2062c00d2064c00d2066c00d2068c00d206ac00d206cc00d206ec00d2070c00d2072c00d2074c00d2076c00d2078c00d207ac00d207cc00d207ec00d208001c00d208201c00d208401c00d208601c00d208801c00d208a01c00d208c01c00d208e01c00d209001c00d209201c00d209401c00d209601c00d209801c00d209a01c00d209c01c00d209e01c00d20a001c00d20a201c00d20a401c00d20a601c00d20a801c00d20aa01c00d20ac01c00d20ae01c00d20b001c00d20b201c00d20b401c00d20b601c00d20b801c00d20ba01c00d20bc01c00d20be01c00d20c001c00d20c201c00d20c401c00d20c601c00d20c801c00d20ca01c00d20cc01c00d20ce01c00d20d001c00d20d201c00d20d401c00d20d601c00d20d801c00d20da01c00d20dc01c00d20de01c0000000000000000000000000300060001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_4.plutus b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_4.plutus new file mode 100644 index 000000000..f2a110867 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_4.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "expensiveDropListPolicyScriptV3_4", + "cborHex": "5902530101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c00520feffffffffffffffff01c00d2028c00d202ac00d202cc00d202ec00d2030c00d2032c00d2034c00d2036c00d2038c00d203ac00d203cc00d203ec00d2040c00d2042c00d2044c00d2046c00d2048c00d204ac00d204cc00d204ec00d2050c00d2052c00d2054c00d2056c00d2058c00d205ac00d205cc00d205ec00d2060c00d2062c00d2064c00d2066c00d2068c00d206ac00d206cc00d206ec00d2070c00d2072c00d2074c00d2076c00d2078c00d207ac00d207cc00d207ec00d208001c00d208201c00d208401c00d208601c00d208801c00d208a01c00d208c01c00d208e01c00d209001c00d209201c00d209401c00d209601c00d209801c00d209a01c00d209c01c00d209e01c00d20a001c00d20a201c00d20a401c00d20a601c00d20a801c00d20aa01c00d20ac01c00d20ae01c00d20b001c00d20b201c00d20b401c00d20b601c00d20b801c00d20ba01c00d20bc01c00d20be01c00d20c001c00d20c201c00d20c401c00d20c601c00d20c801c00d20ca01c00d20cc01c00d20ce01c00d20d001c00d20d201c00d20d401c00d20d601c00d20d801c00d20da01c00d20dc01c00d20de01c0000000000000000000000000300060001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_5.plutus b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_5.plutus new file mode 100644 index 000000000..99ab8c0dc --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/expensiveDropListPolicyScriptV3_5.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "expensiveDropListPolicyScriptV3_5", + "cborHex": "5902530101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c0052080808080808080808002c00d2028c00d202ac00d202cc00d202ec00d2030c00d2032c00d2034c00d2036c00d2038c00d203ac00d203cc00d203ec00d2040c00d2042c00d2044c00d2046c00d2048c00d204ac00d204cc00d204ec00d2050c00d2052c00d2054c00d2056c00d2058c00d205ac00d205cc00d205ec00d2060c00d2062c00d2064c00d2066c00d2068c00d206ac00d206cc00d206ec00d2070c00d2072c00d2074c00d2076c00d2078c00d207ac00d207cc00d207ec00d208001c00d208201c00d208401c00d208601c00d208801c00d208a01c00d208c01c00d208e01c00d209001c00d209201c00d209401c00d209601c00d209801c00d209a01c00d209c01c00d209e01c00d20a001c00d20a201c00d20a401c00d20a601c00d20a801c00d20aa01c00d20ac01c00d20ae01c00d20b001c00d20b201c00d20b401c00d20b601c00d20b801c00d20ba01c00d20bc01c00d20be01c00d20c001c00d20c201c00d20c401c00d20c601c00d20c801c00d20ca01c00d20cc01c00d20ce01c00d20d001c00d20d201c00d20d401c00d20d601c00d20d801c00d20da01c00d20dc01c00d20de01c0000000000000000000000000300060001" +} diff --git a/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/succeedingDropListPolicyScriptV3.plutus b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/succeedingDropListPolicyScriptV3.plutus new file mode 100644 index 000000000..06f93c117 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v3/batch6/1.1.0/succeedingDropListPolicyScriptV3.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV3", + "description": "succeedingDropListPolicyScriptV3", + "cborHex": "5901060101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f58122335740004660080080023232801c0052000800c005801c005200e800c009801c0052022800e000c00e00290074006002c00e002905189e0018003003800a40018006000c00e002905209e0018003000010034805b003480b30034810b00348163003481bb0034821007003482680600202006905800e006906300e0001" +} diff --git a/cardano_node_tests/tests/plutus_common.py b/cardano_node_tests/tests/plutus_common.py index 810d50c93..4f4c455d0 100644 --- a/cardano_node_tests/tests/plutus_common.py +++ b/cardano_node_tests/tests/plutus_common.py @@ -16,6 +16,8 @@ SCRIPTS_V1_DIR = PLUTUS_DIR / "v1" SCRIPTS_V2_DIR = PLUTUS_DIR / "v2" SCRIPTS_V3_DIR = PLUTUS_DIR / "v3" +SCRIPTS_V3_BATCH6_110_DIR = SCRIPTS_V3_DIR / "batch6" / "1.1.0" + SEPC256K1_ECDSA_DIR = PLUTUS_DIR / "sepc256k1_ecdsa" SEPC256K1_SCHNORR_DIR = PLUTUS_DIR / "sepc256k1_schnorr" @@ -285,7 +287,18 @@ class PlutusScriptData: # ----- Succeeding bitwise tests ----- # +# These are used to fill in the execution costs of scripts where we don't yet +# know what the cost is. We're not currently checking the costs (and it seems +# to be difficult when the script fails anyway), so the values here don't really +# matter. + +UNKNOWN_PER_TIME = 1_000_000 +UNKNOWN_PER_SPACE = 100_000 UNKNOWN_FIXED_COST = 777_777 +UNDETERMINED_COST = ExecutionCost( + per_time=UNKNOWN_PER_TIME, per_space=UNKNOWN_PER_SPACE, fixed_cost=UNKNOWN_FIXED_COST +) + MINTING_ANDBYTESTRING_PLUTUS_V3 = SCRIPTS_V3_DIR / "succeedingAndByteStringPolicyScriptV3.plutus" MINTING_ANDBYTESTRING_V3 = PlutusScriptData( @@ -441,10 +454,6 @@ class PlutusScriptData: "failingWriteBitsPolicyScriptV3_19.plutus", ) -# We're not currently checking the costs (and it seems to be difficult when the -# script fails anyway), so the values here don't really matter. -UNDETERMINED_COST = ExecutionCost(per_time=1_000_000, per_space=100_000, fixed_cost=1234) - FAILING_MINTING_BITWISE_SCRIPTS_V3 = tuple( PlutusScriptData( @@ -464,6 +473,34 @@ class PlutusScriptData: SUCCEEDING_MINTING_RIPEMD_160_SCRIPTS_V3 = (MINTING_RIPEMD_160_V3,) +# ------ Batch 6 builtins (Plutus V3 only) ------ # + +MINTING_DROPLIST_PLUTUS_V3 = SCRIPTS_V3_BATCH6_110_DIR / "succeedingDropListPolicyScriptV3.plutus" +MINTING_DROPLIST_V3 = PlutusScriptData( + script_file=MINTING_DROPLIST_PLUTUS_V3, + script_type=clusterlib.ScriptTypes.PLUTUS_V3, + execution_cost=UNDETERMINED_COST, +) + +SUCCEEDING_MINTING_BATCH6_SCRIPTS_V3 = (MINTING_DROPLIST_V3,) + +FAILING_BATCH6_SCRIPT_FILES_V3 = ( + "expensiveDropListPolicyScriptV3_1.plutus", + "expensiveDropListPolicyScriptV3_2.plutus", + "expensiveDropListPolicyScriptV3_3.plutus", + "expensiveDropListPolicyScriptV3_4.plutus", + "expensiveDropListPolicyScriptV3_5.plutus", +) + +FAILING_MINTING_BATCH6_SCRIPTS_V3 = tuple( + PlutusScriptData( + script_file=SCRIPTS_V3_BATCH6_110_DIR / n, + script_type=clusterlib.ScriptTypes.PLUTUS_V3, + execution_cost=UNDETERMINED_COST, + ) + for n in FAILING_BATCH6_SCRIPT_FILES_V3 +) + @dataclasses.dataclass(frozen=True, order=True) class PlutusOp: diff --git a/cardano_node_tests/tests/tests_plutus_v3/test_mint_build.py b/cardano_node_tests/tests/tests_plutus_v3/test_mint_build.py index aeee0a374..b765a9c95 100644 --- a/cardano_node_tests/tests/tests_plutus_v3/test_mint_build.py +++ b/cardano_node_tests/tests/tests_plutus_v3/test_mint_build.py @@ -212,3 +212,143 @@ def test_plutusv3_builtins( plutus_v_record=script, success_expected=False, ) + + +# Just a slightly modified copy of TestPlutusBatch5V3Builtins +class TestPlutusBatch6V3Builtins: + """Tests for batch6 of Plutus Core built-in functions.""" + + success_scripts = plutus_common.SUCCEEDING_MINTING_BATCH6_SCRIPTS_V3 + + fail_scripts = plutus_common.FAILING_MINTING_BATCH6_SCRIPTS_V3 + + @pytest.fixture + def payment_addrs( + self, + update_cost_model: None, # noqa: ARG002 + cluster_manager: cluster_management.ClusterManager, + cluster: clusterlib.ClusterLib, + ) -> list[clusterlib.AddressRecord]: + """Create new payment address.""" + addrs = common.get_payment_addrs( + name_template=common.get_test_id(cluster), + cluster_manager=cluster_manager, + cluster_obj=cluster, + num=2, + fund_idx=[0], + amount=700_000_000, + ) + return addrs + + def run_scenario( + self, + cluster_obj: clusterlib.ClusterLib, + payment_addrs: list[clusterlib.AddressRecord], + plutus_v_record: plutus_common.PlutusScriptData, + success_expected: bool, + ): + """Run an e2e test for a Plutus builtin.""" + temp_template = common.get_test_id(cluster_obj) + + payment_addr = payment_addrs[0] + issuer_addr = payment_addrs[1] + + lovelace_amount = 2_000_000 + token_amount = 5 + script_fund = 10_000_000 + + minting_cost = plutus_common.compute_cost( + execution_cost=plutus_v_record.execution_cost, + protocol_params=cluster_obj.g_query.get_protocol_params(), + ) + + # Step 1: fund the token issuer and create UTXO for collaterals + + mint_utxos, collateral_utxos, _tx_output_step1 = mint_build._fund_issuer( + cluster_obj=cluster_obj, + temp_template=temp_template, + payment_addr=payment_addr, + issuer_addr=issuer_addr, + minting_cost=minting_cost, + amount=script_fund, + ) + + # Step 2: mint the "qacoin" + + policyid = cluster_obj.g_transaction.get_policyid(plutus_v_record.script_file) + asset_name = f"qacoin{clusterlib.get_rand_str(4)}".encode().hex() + token = f"{policyid}.{asset_name}" + mint_txouts = [ + clusterlib.TxOut(address=issuer_addr.address, amount=token_amount, coin=token) + ] + + plutus_mint_data = [ + clusterlib.Mint( + txouts=mint_txouts, + script_file=plutus_v_record.script_file, + collaterals=collateral_utxos, + redeemer_file=plutus_common.REDEEMER_42, + ) + ] + + tx_files_step2 = clusterlib.TxFiles( + signing_key_files=[issuer_addr.skey_file], + ) + txouts_step2 = [ + clusterlib.TxOut(address=issuer_addr.address, amount=lovelace_amount), + *mint_txouts, + ] + + try: + tx_output_step2 = clusterlib_utils.build_and_submit_tx( + cluster_obj=cluster_obj, + name_template=f"{temp_template}_step2", + src_address=payment_addr.address, + build_method=clusterlib_utils.BuildMethods.BUILD, + tx_files=tx_files_step2, + txins=mint_utxos, + txouts=txouts_step2, + mint=plutus_mint_data, + ) + except clusterlib.CLIError as excp: + if success_expected: + raise + if "The machine terminated because of an error" in str(excp): + return + raise + + out_utxos = cluster_obj.g_query.get_utxo(tx_raw_output=tx_output_step2) + token_utxo = clusterlib.filter_utxos( + utxos=out_utxos, address=issuer_addr.address, coin=token + ) + assert token_utxo and token_utxo[0].amount == token_amount, "The token was not minted" + + @allure.link(helpers.get_vcs_link()) + @pytest.mark.long + @pytest.mark.team_plutus + @pytest.mark.upgrade_step3 + def test_plutusv3_batch6_builtins( + self, + update_cost_model: None, # noqa: ARG002 + cluster: clusterlib.ClusterLib, + payment_addrs: list[clusterlib.AddressRecord], + subtests: pytest_subtests.SubTests, + ): + """Test minting with the batch6 of Plutus Core built-in functions.""" + for script in self.success_scripts: + with subtests.test(script=script.script_file.stem): + self.run_scenario( + cluster_obj=cluster, + payment_addrs=payment_addrs, + plutus_v_record=script, + success_expected=True, + ) + + for script in self.fail_scripts: + with subtests.test(script=script.script_file.stem): + self.run_scenario( + cluster_obj=cluster, + payment_addrs=payment_addrs, + plutus_v_record=script, + success_expected=False, + )