diff --git a/pycardano/plutus.py b/pycardano/plutus.py index 685af3f3..1d70bcca 100644 --- a/pycardano/plutus.py +++ b/pycardano/plutus.py @@ -739,6 +739,12 @@ def __add__(self, other: ExecutionUnits) -> ExecutionUnits: ) return ExecutionUnits(self.mem + other.mem, self.steps + other.steps) + def is_empty(self) -> bool: + return self.mem == 0 and self.steps == 0 + + def __bool__(self): + return not self.is_empty() + @dataclass(repr=False) class Redeemer(ArrayCBORSerializable): diff --git a/pycardano/txbuilder.py b/pycardano/txbuilder.py index 793f3629..24a54be3 100644 --- a/pycardano/txbuilder.py +++ b/pycardano/txbuilder.py @@ -166,7 +166,7 @@ def _consolidate_redeemer(self, redeemer): self._should_estimate_execution_units = True redeemer.ex_units = ExecutionUnits(0, 0) else: - if not self._should_estimate_execution_units and redeemer.ex_units is None: + if not self._should_estimate_execution_units and not redeemer.ex_units: raise InvalidArgumentException( f"All redeemers need to provide execution units if the firstly " f"added redeemer specifies execution units. \n" @@ -174,7 +174,7 @@ def _consolidate_redeemer(self, redeemer): f"New redeemer: {redeemer}" ) if self._should_estimate_execution_units: - if redeemer.ex_units is not None: + if redeemer.ex_units: raise InvalidArgumentException( f"No redeemer should provide execution units if the firstly " f"added redeemer didn't provide execution units. \n" diff --git a/test/pycardano/test_plutus.py b/test/pycardano/test_plutus.py index 2e4b875f..4bdaa641 100644 --- a/test/pycardano/test_plutus.py +++ b/test/pycardano/test_plutus.py @@ -208,6 +208,15 @@ def test_plutus_data_hash(): ) +def test_execution_units_bool(): + assert ExecutionUnits( + 1000000, 1000000 + ), "ExecutionUnits should be true when its value is not 0" + assert not ExecutionUnits( + 0, 0 + ), "ExecutionUnits should be false when its value is 0" + + def test_redeemer(): data = MyTest(123, b"234", IndefiniteList([4, 5, 6]), {1: b"1", 2: b"2"}) redeemer = MyRedeemer(data, ExecutionUnits(1000000, 1000000)) diff --git a/test/pycardano/test_txbuilder.py b/test/pycardano/test_txbuilder.py index 741997c1..34cfdecc 100644 --- a/test/pycardano/test_txbuilder.py +++ b/test/pycardano/test_txbuilder.py @@ -585,6 +585,89 @@ def test_add_script_input_with_script_from_specified_utxo(chain_context): assert [existing_script_utxo.input] == tx_body.reference_inputs +def test_add_script_input_multiple_redeemers(chain_context): + tx_builder = TransactionBuilder(chain_context) + tx_in1 = TransactionInput.from_primitive( + ["18cbe6cadecd3f89b60e08e68e5e6c7d72d730aaa1ad21431590f7e6643438ef", 0] + ) + tx_in2 = TransactionInput.from_primitive( + ["18cbe6cadecd3f89b60e08e68e5e6c7d72d730aaa1ad21431590f7e6643438ef", 1] + ) + plutus_script = PlutusV2Script(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_hash=datum.hash()) + ) + + existing_script_utxo = UTxO( + TransactionInput.from_primitive( + [ + "41cb004bec7051621b19b46aea28f0657a586a05ce2013152ea9b9f1a5614cc7", + 1, + ] + ), + TransactionOutput(script_address, 1234567, script=plutus_script), + ) + + utxo2 = UTxO( + tx_in2, TransactionOutput(script_address, 10000000, datum_hash=datum.hash()) + ) + + existing_script_utxo = UTxO( + TransactionInput.from_primitive( + [ + "41cb004bec7051621b19b46aea28f0657a586a05ce2013152ea9b9f1a5614cc7", + 1, + ] + ), + TransactionOutput(script_address, 1234567, script=plutus_script), + ) + + tx_builder.add_script_input( + utxo1, script=existing_script_utxo, datum=datum, redeemer=Redeemer(PlutusData()) + ) + + tx_builder.add_script_input( + utxo2, script=existing_script_utxo, datum=datum, redeemer=Redeemer(PlutusData()) + ) + + pytest.raises( + InvalidArgumentException, + tx_builder.add_script_input, + utxo2, + script=existing_script_utxo, + datum=datum, + redeemer=Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000)), + ) + + tx_builder = TransactionBuilder(chain_context) + + tx_builder.add_script_input( + utxo1, + script=existing_script_utxo, + datum=datum, + redeemer=Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000)), + ) + + tx_builder.add_script_input( + utxo2, + script=existing_script_utxo, + datum=datum, + redeemer=Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000)), + ) + + pytest.raises( + InvalidArgumentException, + tx_builder.add_script_input, + utxo2, + script=existing_script_utxo, + datum=datum, + redeemer=Redeemer(PlutusData()), + ) + + def test_add_minting_script_from_specified_utxo(chain_context): tx_builder = TransactionBuilder(chain_context) plutus_script = PlutusV2Script(b"dummy test script")