Skip to content

Fix error when adding multiple redeemers #192

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 4, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions pycardano/plutus.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
4 changes: 2 additions & 2 deletions pycardano/txbuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,15 +166,15 @@ 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"
f"Added redeemers: {self.redeemers} \n"
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"
Expand Down
9 changes: 9 additions & 0 deletions test/pycardano/test_plutus.py
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
83 changes: 83 additions & 0 deletions test/pycardano/test_txbuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down