diff --git a/cardano_node_tests/tests/data/plutus/v2/stake-script.plutus b/cardano_node_tests/tests/data/plutus/v2/stake-script.plutus new file mode 100644 index 000000000..80b516e06 --- /dev/null +++ b/cardano_node_tests/tests/data/plutus/v2/stake-script.plutus @@ -0,0 +1,5 @@ +{ + "type": "PlutusScriptV2", + "description": "", + "cborHex": "5907655907620100003232323232323232323232323232332232323232322232325335320193333573466e1cd55cea80124000466442466002006004646464646464646464646464646666ae68cdc39aab9d500c480008cccccccccccc88888888888848cccccccccccc00403403002c02802402001c01801401000c008cd4050054d5d0a80619a80a00a9aba1500b33501401635742a014666aa030eb9405cd5d0a804999aa80c3ae501735742a01066a02803e6ae85401cccd54060081d69aba150063232323333573466e1cd55cea801240004664424660020060046464646666ae68cdc39aab9d5002480008cc8848cc00400c008cd40a9d69aba15002302b357426ae8940088c98c80b4cd5ce01701681589aab9e5001137540026ae854008c8c8c8cccd5cd19b8735573aa004900011991091980080180119a8153ad35742a00460566ae84d5d1280111931901699ab9c02e02d02b135573ca00226ea8004d5d09aba2500223263202933573805405204e26aae7940044dd50009aba1500533501475c6ae854010ccd540600708004d5d0a801999aa80c3ae200135742a004603c6ae84d5d1280111931901299ab9c026025023135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d5d1280089aba25001135744a00226ae8940044d55cf280089baa00135742a004601c6ae84d5d1280111931900b99ab9c018017015101613263201633573892010350543500016135573ca00226ea800448c88c008dd6000990009aa80a911999aab9f0012500a233500930043574200460066ae880080508c8c8cccd5cd19b8735573aa004900011991091980080180118061aba150023005357426ae8940088c98c8050cd5ce00a80a00909aab9e5001137540024646464646666ae68cdc39aab9d5004480008cccc888848cccc00401401000c008c8c8c8cccd5cd19b8735573aa0049000119910919800801801180a9aba1500233500f014357426ae8940088c98c8064cd5ce00d00c80b89aab9e5001137540026ae854010ccd54021d728039aba150033232323333573466e1d4005200423212223002004357426aae79400c8cccd5cd19b875002480088c84888c004010dd71aba135573ca00846666ae68cdc3a801a400042444006464c6403666ae7007006c06406005c4d55cea80089baa00135742a00466a016eb8d5d09aba2500223263201533573802c02a02626ae8940044d5d1280089aab9e500113754002266aa002eb9d6889119118011bab00132001355012223233335573e0044a010466a00e66442466002006004600c6aae754008c014d55cf280118021aba200301213574200222440042442446600200800624464646666ae68cdc3a800a40004642446004006600a6ae84d55cf280191999ab9a3370ea0049001109100091931900819ab9c01101000e00d135573aa00226ea80048c8c8cccd5cd19b875001480188c848888c010014c01cd5d09aab9e500323333573466e1d400920042321222230020053009357426aae7940108cccd5cd19b875003480088c848888c004014c01cd5d09aab9e500523333573466e1d40112000232122223003005375c6ae84d55cf280311931900819ab9c01101000e00d00c00b135573aa00226ea80048c8c8cccd5cd19b8735573aa004900011991091980080180118029aba15002375a6ae84d5d1280111931900619ab9c00d00c00a135573ca00226ea80048c8cccd5cd19b8735573aa002900011bae357426aae7940088c98c8028cd5ce00580500409baa001232323232323333573466e1d4005200c21222222200323333573466e1d4009200a21222222200423333573466e1d400d2008233221222222233001009008375c6ae854014dd69aba135744a00a46666ae68cdc3a8022400c4664424444444660040120106eb8d5d0a8039bae357426ae89401c8cccd5cd19b875005480108cc8848888888cc018024020c030d5d0a8049bae357426ae8940248cccd5cd19b875006480088c848888888c01c020c034d5d09aab9e500b23333573466e1d401d2000232122222223005008300e357426aae7940308c98c804ccd5ce00a00980880800780700680600589aab9d5004135573ca00626aae7940084d55cf280089baa0012323232323333573466e1d400520022333222122333001005004003375a6ae854010dd69aba15003375a6ae84d5d1280191999ab9a3370ea0049000119091180100198041aba135573ca00c464c6401866ae700340300280244d55cea80189aba25001135573ca00226ea80048c8c8cccd5cd19b875001480088c8488c00400cdd71aba135573ca00646666ae68cdc3a8012400046424460040066eb8d5d09aab9e500423263200933573801401200e00c26aae7540044dd500089119191999ab9a3370ea00290021091100091999ab9a3370ea00490011190911180180218031aba135573ca00846666ae68cdc3a801a400042444004464c6401466ae7002c02802001c0184d55cea80089baa0012323333573466e1d40052002200723333573466e1d40092000212200123263200633573800e00c00800626aae74dd5000a4c2400292010350543100122002112323001001223300330020020011" +} diff --git a/cardano_node_tests/tests/plutus_common.py b/cardano_node_tests/tests/plutus_common.py index 50e11fa19..43c9ca09c 100644 --- a/cardano_node_tests/tests/plutus_common.py +++ b/cardano_node_tests/tests/plutus_common.py @@ -36,6 +36,8 @@ STAKE_GUESS_42_PLUTUS_V1 = SCRIPTS_V1_DIR / "guess-42-stake.plutus" +STAKE_PLUTUS_V2 = SCRIPTS_V2_DIR / "stake-script.plutus" + REDEEMER_42 = PLUTUS_DIR / "42.redeemer" REDEEMER_42_TYPED = PLUTUS_DIR / "typed-42.redeemer" REDEEMER_42_CBOR = PLUTUS_DIR / "42.redeemer.cbor" diff --git a/cardano_node_tests/tests/test_plutus_delegation.py b/cardano_node_tests/tests/test_plutus_delegation.py index 5572eb0eb..236b2e54a 100644 --- a/cardano_node_tests/tests/test_plutus_delegation.py +++ b/cardano_node_tests/tests/test_plutus_delegation.py @@ -8,6 +8,7 @@ import logging from pathlib import Path from typing import List +from typing import Optional from typing import Tuple import allure @@ -21,6 +22,7 @@ from cardano_node_tests.utils import clusterlib_utils from cardano_node_tests.utils import dbsync_utils from cardano_node_tests.utils import helpers +from cardano_node_tests.utils import pytest_utils from cardano_node_tests.utils import tx_view LOGGER = logging.getLogger(__name__) @@ -38,8 +40,14 @@ def cluster_lock_42stake( Plutus script always has the same address. When one script is used in multiple tests that are running in parallel, the balances etc. don't add up. """ + plutus_script = ( + plutus_common.STAKE_PLUTUS_V2 + if "plutus_v2" in pytest_utils.get_current_test().test_params + else plutus_common.STAKE_GUESS_42_PLUTUS_V1 + ) + cluster_obj = cluster_manager.get( - lock_resources=[str(plutus_common.STAKE_GUESS_42_PLUTUS_V1.stem)], + lock_resources=[str(plutus_script.stem)], use_resources=[cluster_management.Resources.POOL3], ) pool_id = delegation.get_pool_id( @@ -59,19 +67,25 @@ def pool_user( cluster, *__ = cluster_lock_42stake test_id = common.get_test_id(cluster) + plutus_script = ( + plutus_common.STAKE_PLUTUS_V2 + if "plutus_v2" in pytest_utils.get_current_test().test_params + else plutus_common.STAKE_GUESS_42_PLUTUS_V1 + ) + script_stake_address = cluster.gen_stake_addr( addr_name=f"{test_id}_pool_user", - stake_script_file=plutus_common.STAKE_GUESS_42_PLUTUS_V1, + stake_script_file=plutus_script, ) payment_addr_rec = cluster.gen_payment_addr_and_keys( name=f"{test_id}_pool_user", - stake_script_file=plutus_common.STAKE_GUESS_42_PLUTUS_V1, + stake_script_file=plutus_script, ) pool_user = delegation.PoolUserScript( payment=payment_addr_rec, stake=delegation.AddressRecordScript( address=script_stake_address, - script_file=plutus_common.STAKE_GUESS_42_PLUTUS_V1, + script_file=plutus_script, ), ) @@ -94,6 +108,7 @@ def delegate_stake_addr( pool_user: delegation.PoolUserScript, pool_id: str, redeemer_file: Path, + reference_script_utxos: Optional[List[clusterlib.UTXOData]], ) -> Tuple[clusterlib.TxRawOutput, List[dict]]: """Submit registration certificate and delegate to pool.""" # create stake address registration cert @@ -116,7 +131,8 @@ def delegate_stake_addr( ) deleg_cert_script = clusterlib.ComplexCert( certificate_file=stake_addr_deleg_cert_file, - script_file=pool_user.stake.script_file, + script_file=pool_user.stake.script_file if not reference_script_utxos else "", + reference_txin=reference_script_utxos[0] if reference_script_utxos else None, collaterals=collaterals, redeemer_file=redeemer_file, ) @@ -171,6 +187,7 @@ def deregister_stake_addr( collaterals: List[clusterlib.UTXOData], pool_user: delegation.PoolUserScript, redeemer_file: Path, + reference_script_utxos: Optional[List[clusterlib.UTXOData]], ) -> clusterlib.TxRawOutput: """Deregister stake address.""" src_payment_balance = cluster_obj.get_address_balance(pool_user.payment.address) @@ -185,13 +202,15 @@ def deregister_stake_addr( # withdraw rewards to payment address, deregister stake address withdrawal_script = clusterlib.ScriptWithdrawal( txout=clusterlib.TxOut(address=pool_user.stake.address, amount=-1), - script_file=pool_user.stake.script_file, + script_file=pool_user.stake.script_file if not reference_script_utxos else "", + reference_txin=reference_script_utxos[0] if reference_script_utxos else None, collaterals=[collaterals[0]], redeemer_file=redeemer_file, ) dereg_cert_script = clusterlib.ComplexCert( certificate_file=stake_addr_dereg_cert, - script_file=pool_user.stake.script_file, + script_file=pool_user.stake.script_file if not reference_script_utxos else "", + reference_txin=reference_script_utxos[0] if reference_script_utxos else None, collaterals=[collaterals[1]], redeemer_file=redeemer_file, ) @@ -245,6 +264,7 @@ def deregister_stake_addr( assert pool_user.stake.address in tx_db_dereg.stake_deregistration # compare cost of Plutus script with data from db-sync + dbsync_utils.check_plutus_costs( redeemer_records=tx_db_dereg.redeemers, cost_records=plutus_costs ) @@ -256,6 +276,7 @@ def deregister_stake_addr( # might be already in use @pytest.mark.order(8) @common.SKIPIF_BUILD_UNUSABLE +@common.PARAM_PLUTUS_VERSION class TestDelegateAddr: """Tests for address delegation to stake pools.""" @@ -265,6 +286,7 @@ def test_delegate_deregister( self, cluster_lock_42stake: Tuple[clusterlib.ClusterLib, str], pool_user: delegation.PoolUserScript, + plutus_version: str, ): """Delegate and deregister Plutus script stake address. @@ -303,6 +325,15 @@ def test_delegate_deregister( clusterlib.TxOut(address=pool_user.payment.address, amount=dereg_fund), ] + if plutus_version == "v2": + txouts_step1.append( + clusterlib.TxOut( + address=pool_user.payment.address, + amount=10_000_000, + reference_script_file=plutus_common.STAKE_PLUTUS_V2, + ) + ) + tx_files_step1 = clusterlib.TxFiles( signing_key_files=[pool_user.payment.skey_file], ) @@ -329,6 +360,10 @@ def test_delegate_deregister( deleg_utxos = cluster.get_utxo(txin=f"{txid_step1}#4") dereg_utxos = cluster.get_utxo(txin=f"{txid_step1}#5") + reference_script_utxos = ( + cluster.get_utxo(txin=f"{txid_step1}#6") if plutus_version == "v2" else None + ) + # Step 2: register and delegate clusterlib_utils.wait_for_epoch_interval( @@ -345,6 +380,7 @@ def test_delegate_deregister( pool_user=pool_user, pool_id=pool_id, redeemer_file=plutus_common.REDEEMER_42, + reference_script_utxos=reference_script_utxos, ) assert ( @@ -383,6 +419,7 @@ def test_delegate_deregister( collaterals=[*collateral_withdraw, *collateral_dereg], pool_user=pool_user, redeemer_file=plutus_common.REDEEMER_42, + reference_script_utxos=reference_script_utxos, ) if reward_error: diff --git a/cardano_node_tests/utils/dbsync_utils.py b/cardano_node_tests/utils/dbsync_utils.py index 221047c17..5950854bb 100644 --- a/cardano_node_tests/utils/dbsync_utils.py +++ b/cardano_node_tests/utils/dbsync_utils.py @@ -887,6 +887,11 @@ def check_tx( for r in tx_raw_output.script_txins if r.reference_txin ], + *[ + f"{r.reference_txin.utxo_hash}#{r.reference_txin.utxo_ix}" + for r in tx_raw_output.complex_certs + if r.reference_txin + ], } db_utxos_reference_inputs = { f"{r.utxo_hash}#{r.utxo_ix}" for r in response.reference_inputs if r