From 3faeb645061320afa16563331b859a60bd5f5ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Sat, 2 Mar 2024 16:39:53 +0100 Subject: [PATCH 1/5] Raise an error when trying to supply a datum when inline datums are present --- pycardano/txbuilder.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pycardano/txbuilder.py b/pycardano/txbuilder.py index 52a0f989..16178004 100644 --- a/pycardano/txbuilder.py +++ b/pycardano/txbuilder.py @@ -236,6 +236,10 @@ def add_script_input( f"Datum hash in transaction output is {utxo.output.datum_hash}, " f"but actual datum hash from input datum is {datum_hash(datum)}." ) + if datum is not None and utxo.output.datum is not None: + raise InvalidArgumentException( + f"Inline Datum found in transaction output, so attaching a Datum to the transaction input manually is not allowed." + ) if datum is not None: self.datums[datum_hash(datum)] = datum From bca29b76d36429be38b7f9f3e967683ebc1c22e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=BCndler?= Date: Sat, 2 Mar 2024 16:48:25 +0100 Subject: [PATCH 2/5] Add a test to check the inline datum issue --- pycardano/txbuilder.py | 3 ++- test/pycardano/test_txbuilder.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/pycardano/txbuilder.py b/pycardano/txbuilder.py index 16178004..9244fa4b 100644 --- a/pycardano/txbuilder.py +++ b/pycardano/txbuilder.py @@ -238,7 +238,8 @@ def add_script_input( ) if datum is not None and utxo.output.datum is not None: raise InvalidArgumentException( - f"Inline Datum found in transaction output, so attaching a Datum to the transaction input manually is not allowed." + f"Inline Datum found in transaction output {utxo.input}, " + "so attaching a Datum to the transaction input manually is not allowed." ) if datum is not None: diff --git a/test/pycardano/test_txbuilder.py b/test/pycardano/test_txbuilder.py index 7ba70819..a362da6d 100644 --- a/test/pycardano/test_txbuilder.py +++ b/test/pycardano/test_txbuilder.py @@ -1032,6 +1032,30 @@ def test_estimate_execution_unit(chain_context): assert [plutus_script] == witness.plutus_v1_script +def test_add_script_input_inline_datum_extra(chain_context): + tx_builder = TransactionBuilder(chain_context) + tx_in1 = TransactionInput.from_primitive( + ["18cbe6cadecd3f89b60e08e68e5e6c7d72d730aaa1ad21431590f7e6643438ef", 0] + ) + tx_in2 = TransactionInput.from_primitive( + ["18cbe6cadecd3f89b60e08e68e5e6c7d72d730aaa1ad21431590f7e6643438ef", 1] + ) + plutus_script = PlutusV1Script(b"dummy test script") + script_hash = plutus_script_hash(plutus_script) + script_address = Address(script_hash) + datum = PlutusData() + utxo1 = UTxO(tx_in1, TransactionOutput(script_address, 10000000, datum=datum)) + redeemer1 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000)) + pytest.raises( + InvalidArgumentException, + tx_builder.add_script_input, + utxo1, + plutus_script, + datum, + redeemer1, + ) + + def test_tx_builder_exact_fee_no_change(chain_context): tx_builder = TransactionBuilder(chain_context) sender = "addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x" From db8ff3d76944fb9aa464c7e6c88f9f80ff8631a8 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sun, 3 Mar 2024 21:41:40 -0800 Subject: [PATCH 3/5] Allow datum when datum hash was attached to the target utxo --- pycardano/txbuilder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pycardano/txbuilder.py b/pycardano/txbuilder.py index 9244fa4b..f3f8fa15 100644 --- a/pycardano/txbuilder.py +++ b/pycardano/txbuilder.py @@ -236,7 +236,7 @@ def add_script_input( f"Datum hash in transaction output is {utxo.output.datum_hash}, " f"but actual datum hash from input datum is {datum_hash(datum)}." ) - if datum is not None and utxo.output.datum is not None: + if datum is not None and utxo.output.datum_hash is None and utxo.output.datum is not None: raise InvalidArgumentException( f"Inline Datum found in transaction output {utxo.input}, " "so attaching a Datum to the transaction input manually is not allowed." From 4cbe340b87c3faf5019d485aa5bd7b19a111c867 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sun, 3 Mar 2024 21:45:00 -0800 Subject: [PATCH 4/5] Fix linter --- pycardano/txbuilder.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pycardano/txbuilder.py b/pycardano/txbuilder.py index f3f8fa15..154ae651 100644 --- a/pycardano/txbuilder.py +++ b/pycardano/txbuilder.py @@ -236,7 +236,11 @@ def add_script_input( f"Datum hash in transaction output is {utxo.output.datum_hash}, " f"but actual datum hash from input datum is {datum_hash(datum)}." ) - if datum is not None and utxo.output.datum_hash is None and utxo.output.datum is not None: + if ( + datum is not None + and utxo.output.datum_hash is None + and utxo.output.datum is not None + ): raise InvalidArgumentException( f"Inline Datum found in transaction output {utxo.input}, " "so attaching a Datum to the transaction input manually is not allowed." From 536d1bc7dd9ac2e2788157d131fab4939a13e056 Mon Sep 17 00:00:00 2001 From: Jerry Date: Sun, 3 Mar 2024 22:29:52 -0800 Subject: [PATCH 5/5] Always keep datum_hash in TransactionOutput if the datum isn't inline --- pycardano/backend/ogmios.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pycardano/backend/ogmios.py b/pycardano/backend/ogmios.py index ddffb9a4..63ffaf14 100644 --- a/pycardano/backend/ogmios.py +++ b/pycardano/backend/ogmios.py @@ -359,8 +359,6 @@ def _utxos_kupo(self, address: str) -> List[UTxO]: ) if datum_hash and result.get("datum_type", "inline"): datum = self._get_datum_from_kupo(result["datum_hash"]) - if datum is not None: - datum_hash = None if not result["value"]["assets"]: tx_out = TransactionOutput(