Skip to content

Commit 0fec24a

Browse files
nielstroncffls
andauthored
Fix/disallow attach inline datum (#325)
* Raise an error when trying to supply a datum when inline datums are present * Add a test to check the inline datum issue * Allow datum when datum hash was attached to the target utxo * Fix linter * Always keep datum_hash in TransactionOutput if the datum isn't inline --------- Co-authored-by: Jerry <[email protected]>
1 parent 7db66cf commit 0fec24a

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

pycardano/backend/ogmios.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,6 @@ def _utxos_kupo(self, address: str) -> List[UTxO]:
359359
)
360360
if datum_hash and result.get("datum_type", "inline"):
361361
datum = self._get_datum_from_kupo(result["datum_hash"])
362-
if datum is not None:
363-
datum_hash = None
364362

365363
if not result["value"]["assets"]:
366364
tx_out = TransactionOutput(

pycardano/txbuilder.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,15 @@ def add_script_input(
236236
f"Datum hash in transaction output is {utxo.output.datum_hash}, "
237237
f"but actual datum hash from input datum is {datum_hash(datum)}."
238238
)
239+
if (
240+
datum is not None
241+
and utxo.output.datum_hash is None
242+
and utxo.output.datum is not None
243+
):
244+
raise InvalidArgumentException(
245+
f"Inline Datum found in transaction output {utxo.input}, "
246+
"so attaching a Datum to the transaction input manually is not allowed."
247+
)
239248

240249
if datum is not None:
241250
self.datums[datum_hash(datum)] = datum

test/pycardano/test_txbuilder.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,6 +1032,30 @@ def test_estimate_execution_unit(chain_context):
10321032
assert [plutus_script] == witness.plutus_v1_script
10331033

10341034

1035+
def test_add_script_input_inline_datum_extra(chain_context):
1036+
tx_builder = TransactionBuilder(chain_context)
1037+
tx_in1 = TransactionInput.from_primitive(
1038+
["18cbe6cadecd3f89b60e08e68e5e6c7d72d730aaa1ad21431590f7e6643438ef", 0]
1039+
)
1040+
tx_in2 = TransactionInput.from_primitive(
1041+
["18cbe6cadecd3f89b60e08e68e5e6c7d72d730aaa1ad21431590f7e6643438ef", 1]
1042+
)
1043+
plutus_script = PlutusV1Script(b"dummy test script")
1044+
script_hash = plutus_script_hash(plutus_script)
1045+
script_address = Address(script_hash)
1046+
datum = PlutusData()
1047+
utxo1 = UTxO(tx_in1, TransactionOutput(script_address, 10000000, datum=datum))
1048+
redeemer1 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
1049+
pytest.raises(
1050+
InvalidArgumentException,
1051+
tx_builder.add_script_input,
1052+
utxo1,
1053+
plutus_script,
1054+
datum,
1055+
redeemer1,
1056+
)
1057+
1058+
10351059
def test_tx_builder_exact_fee_no_change(chain_context):
10361060
tx_builder = TransactionBuilder(chain_context)
10371061
sender = "addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"

0 commit comments

Comments
 (0)