From b121521ec3b2e2c2949f81e3d6ff8f8a48fa285c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Thu, 27 Apr 2023 17:20:09 +0200 Subject: [PATCH] A very simple setup to invoke the actual python script when submitting the tx Set a breakpoint in the opshin validator to debug :)) --- src/utils/mock.py | 9 ++++++++- src/utils/tx_tools.py | 4 ++-- src/week06/tests/test_negative_r_timed.py | 5 +++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/utils/mock.py b/src/utils/mock.py index f88668e..7faa84d 100644 --- a/src/utils/mock.py +++ b/src/utils/mock.py @@ -1,5 +1,5 @@ from collections import defaultdict -from typing import Dict, List, Union, Optional +from typing import Dict, List, Union, Optional, Any import pycardano from pycardano import * @@ -32,6 +32,8 @@ def __init__( self._network = Network.TESTNET self._epoch = 0 self._last_block_slot = 0 + self.opshin_scripts: Dict[ScriptType, Any] = {} + @property def protocol_param(self) -> ProtocolParameters: @@ -105,12 +107,17 @@ def evaluate_tx(self, tx: Transaction) -> Dict[str, ExecutionUnits]: ) ret = {} for invocation in script_invocations: + # run opshin script if available + if self.opshin_scripts.get(invocation.script) is not None: + opshin_module = self.opshin_scripts[invocation.script] + opshin_module.validator(invocation.datum, invocation.redeemer.data, invocation.script_context) redeemer = invocation.redeemer if redeemer.ex_units.steps <= 0 and redeemer.ex_units.mem <= 0: redeemer.ex_units = ExecutionUnits( self.protocol_param.max_tx_ex_mem, self.protocol_param.max_tx_ex_steps, ) + (suc, err), (cpu, mem), logs = evaluate_script(invocation) if err: raise ValueError(err, logs) diff --git a/src/utils/tx_tools.py b/src/utils/tx_tools.py index 679343a..f6bf936 100644 --- a/src/utils/tx_tools.py +++ b/src/utils/tx_tools.py @@ -205,7 +205,7 @@ def to_tx_info( @dataclass class ScriptInvocation: - script_type: pycardano.ScriptType + script: pycardano.ScriptType datum: Optional[pycardano.Datum] redeemer: pycardano.Redeemer script_context: ScriptContext @@ -342,7 +342,7 @@ def uplc_unflat(hex: str): def evaluate_script(script_invocation: ScriptInvocation): - uplc_program = uplc_unflat(script_invocation.script_type.hex()) + uplc_program = uplc_unflat(script_invocation.script.hex()) args = [script_invocation.redeemer.data, script_invocation.script_context] if script_invocation.datum is not None: args.insert(0, script_invocation.datum) diff --git a/src/week06/tests/test_negative_r_timed.py b/src/week06/tests/test_negative_r_timed.py index 982d85b..b98fffc 100644 --- a/src/week06/tests/test_negative_r_timed.py +++ b/src/week06/tests/test_negative_r_timed.py @@ -9,6 +9,8 @@ from src.week06 import lecture_dir from src.week06.lecture.negative_r_timed import CustomDatum +from src.week06.lecture import negative_r_timed + @pytest.mark.parametrize( ["d", "r", "validates"], @@ -78,6 +80,7 @@ def setup_user(context: MockChainContext): def run(deadline_slot: int, redeemer_data: int): mock_chain_context = MockChainContext() + mock_chain_context.opshin_scripts[plutus_script] = negative_r_timed # setup users u1 = setup_user(mock_chain_context) u2 = setup_user(mock_chain_context) @@ -111,6 +114,8 @@ def run(deadline_slot: int, redeemer_data: int): ) tx_builder.validity_start = mock_chain_context.last_block_slot tx_builder.ttl = tx_builder.validity_start + 1 + + tx = tx_builder.build_and_sign([u2.signing_key], change_address=u2.address) mock_chain_context.submit_tx(tx)