Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV3",
"description": "expensiveDropListPolicyScriptV3_1",
"cborHex": "58d10101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c005208080c09e91c191c79502c00d2016c00d202cc00d2042c00d2058c00d206ec00d208401c00d209a01c00d20b001c00d20c601c00001800300001"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV3",
"description": "expensiveDropListPolicyScriptV3_2",
"cborHex": "58d10101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c00520a3abf8b19de3d4d4d602c00d2016c00d202cc00d2042c00d2058c00d206ec00d208401c00d209a01c00d20b001c00d20c601c00001800300001"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV3",
"description": "expensiveDropListPolicyScriptV3_3",
"cborHex": "5902530101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c00520fcffffffffffffffff01c00d2028c00d202ac00d202cc00d202ec00d2030c00d2032c00d2034c00d2036c00d2038c00d203ac00d203cc00d203ec00d2040c00d2042c00d2044c00d2046c00d2048c00d204ac00d204cc00d204ec00d2050c00d2052c00d2054c00d2056c00d2058c00d205ac00d205cc00d205ec00d2060c00d2062c00d2064c00d2066c00d2068c00d206ac00d206cc00d206ec00d2070c00d2072c00d2074c00d2076c00d2078c00d207ac00d207cc00d207ec00d208001c00d208201c00d208401c00d208601c00d208801c00d208a01c00d208c01c00d208e01c00d209001c00d209201c00d209401c00d209601c00d209801c00d209a01c00d209c01c00d209e01c00d20a001c00d20a201c00d20a401c00d20a601c00d20a801c00d20aa01c00d20ac01c00d20ae01c00d20b001c00d20b201c00d20b401c00d20b601c00d20b801c00d20ba01c00d20bc01c00d20be01c00d20c001c00d20c201c00d20c401c00d20c601c00d20c801c00d20ca01c00d20cc01c00d20ce01c00d20d001c00d20d201c00d20d401c00d20d601c00d20d801c00d20da01c00d20dc01c00d20de01c0000000000000000000000000300060001"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV3",
"description": "expensiveDropListPolicyScriptV3_4",
"cborHex": "5902530101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c00520feffffffffffffffff01c00d2028c00d202ac00d202cc00d202ec00d2030c00d2032c00d2034c00d2036c00d2038c00d203ac00d203cc00d203ec00d2040c00d2042c00d2044c00d2046c00d2048c00d204ac00d204cc00d204ec00d2050c00d2052c00d2054c00d2056c00d2058c00d205ac00d205cc00d205ec00d2060c00d2062c00d2064c00d2066c00d2068c00d206ac00d206cc00d206ec00d2070c00d2072c00d2074c00d2076c00d2078c00d207ac00d207cc00d207ec00d208001c00d208201c00d208401c00d208601c00d208801c00d208a01c00d208c01c00d208e01c00d209001c00d209201c00d209401c00d209601c00d209801c00d209a01c00d209c01c00d209e01c00d20a001c00d20a201c00d20a401c00d20a601c00d20a801c00d20aa01c00d20ac01c00d20ae01c00d20b001c00d20b201c00d20b401c00d20b601c00d20b801c00d20ba01c00d20bc01c00d20be01c00d20c001c00d20c201c00d20c401c00d20c601c00d20c801c00d20ca01c00d20cc01c00d20ce01c00d20d001c00d20d201c00d20d401c00d20d601c00d20d801c00d20da01c00d20dc01c00d20de01c0000000000000000000000000300060001"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV3",
"description": "expensiveDropListPolicyScriptV3_5",
"cborHex": "5902530101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f5812233574000466008008002801c0052080808080808080808002c00d2028c00d202ac00d202cc00d202ec00d2030c00d2032c00d2034c00d2036c00d2038c00d203ac00d203cc00d203ec00d2040c00d2042c00d2044c00d2046c00d2048c00d204ac00d204cc00d204ec00d2050c00d2052c00d2054c00d2056c00d2058c00d205ac00d205cc00d205ec00d2060c00d2062c00d2064c00d2066c00d2068c00d206ac00d206cc00d206ec00d2070c00d2072c00d2074c00d2076c00d2078c00d207ac00d207cc00d207ec00d208001c00d208201c00d208401c00d208601c00d208801c00d208a01c00d208c01c00d208e01c00d209001c00d209201c00d209401c00d209601c00d209801c00d209a01c00d209c01c00d209e01c00d20a001c00d20a201c00d20a401c00d20a601c00d20a801c00d20aa01c00d20ac01c00d20ae01c00d20b001c00d20b201c00d20b401c00d20b601c00d20b801c00d20ba01c00d20bc01c00d20be01c00d20c001c00d20c201c00d20c401c00d20c601c00d20c801c00d20ca01c00d20cc01c00d20ce01c00d20d001c00d20d201c00d20d401c00d20d601c00d20d801c00d20da01c00d20dc01c00d20de01c0000000000000000000000000300060001"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"type": "PlutusScriptV3",
"description": "succeedingDropListPolicyScriptV3",
"cborHex": "5901060101003323232223003002323001001229001a4d22900291149980419abd80033009002300900199319ab9c491146d6b436f756e7453657442697473506f6c696379008004cc01c01c01019180080091129949aba30038a800c64d5d180154006944193370e6ae84008d5d0800d284cc8cc010010004d5d10011aba2001191800800914800d2f58122335740004660080080023232801c0052000800c005801c005200e800c009801c0052022800e000c00e00290074006002c00e002905189e0018003003800a40018006000c00e002905209e0018003000010034805b003480b30034810b00348163003481bb0034821007003482680600202006905800e006906300e0001"
}
45 changes: 41 additions & 4 deletions cardano_node_tests/tests/plutus_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -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:
Expand Down
140 changes: 140 additions & 0 deletions cardano_node_tests/tests/tests_plutus_v3/test_mint_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
Loading