Skip to content

Commit 8f29313

Browse files
authored
Remove the need to specify the RedeemerTag (#178)
* Remove the need to specify the RedeemerTag This reduces friction for writing applications * Default initialize the tag to SPEND TODO I would rather set it to None, so that we catch situations where it is incorrectly initialized * Initialize to None * Formatting
1 parent ab01bec commit 8f29313

File tree

9 files changed

+49
-60
lines changed

9 files changed

+49
-60
lines changed

examples/plutus/forty_two/forty_two.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def create_collateral(target_address, skey):
9494
# Notice that transaction builder will automatically estimate execution units (num steps & memory) for a redeemer if
9595
# no execution units are provided in the constructor of Redeemer.
9696
# Put integer 42 (the secret that unlocks the fund) in the redeemer.
97-
redeemer = Redeemer(RedeemerTag.SPEND, 42)
97+
redeemer = Redeemer(42)
9898

9999
utxo_to_spend = None
100100
for utxo in chain_context.utxos(str(script_address)):

integration-test/test/test_min_utxo.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ class MyPlutusData(PlutusData):
6666

6767
# Add minting script with an empty datum and a minting redeemer
6868
builder.add_minting_script(
69-
anymint_script, redeemer=Redeemer(RedeemerTag.MINT, MyPlutusData(a=42))
69+
anymint_script, redeemer=Redeemer(MyPlutusData(a=42))
7070
)
7171

7272
# Set nft we want to mint

integration-test/test/test_mint.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,9 +214,7 @@ def test_mint_nft_with_script(self):
214214
builder.add_input_address(address)
215215

216216
# Add minting script with an empty datum and a minting redeemer
217-
builder.add_minting_script(
218-
forty_two_script, redeemer=Redeemer(RedeemerTag.MINT, 42)
219-
)
217+
builder.add_minting_script(forty_two_script, redeemer=Redeemer(42))
220218

221219
# Set nft we want to mint
222220
builder.mint = my_nft
@@ -311,7 +309,7 @@ class MyPlutusData(PlutusData):
311309

312310
# Add minting script with an empty datum and a minting redeemer
313311
builder.add_minting_script(
314-
anymint_script, redeemer=Redeemer(RedeemerTag.MINT, MyPlutusData(a=42))
312+
anymint_script, redeemer=Redeemer(MyPlutusData(a=42))
315313
)
316314

317315
# Set nft we want to mint

integration-test/test/test_plutus.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_plutus_v1(self):
6161

6262
# ----------- Taker take ---------------
6363

64-
redeemer = Redeemer(RedeemerTag.SPEND, 42)
64+
redeemer = Redeemer(42)
6565

6666
utxo_to_spend = self.chain_context.utxos(str(script_address))[0]
6767

@@ -128,7 +128,7 @@ def test_plutus_v2_datum_hash(self):
128128

129129
# ----------- Taker take ---------------
130130

131-
redeemer = Redeemer(RedeemerTag.SPEND, 42)
131+
redeemer = Redeemer(42)
132132

133133
utxo_to_spend = None
134134

@@ -206,7 +206,7 @@ def test_plutus_v2_inline_script_inline_datum(self):
206206

207207
# ----------- Taker take ---------------
208208

209-
redeemer = Redeemer(RedeemerTag.SPEND, 42)
209+
redeemer = Redeemer(42)
210210

211211
utxo_to_spend = None
212212

@@ -285,7 +285,7 @@ def test_plutus_v2_ref_script(self):
285285

286286
# ----------- Taker take ---------------
287287

288-
redeemer = Redeemer(RedeemerTag.SPEND, 42)
288+
redeemer = Redeemer(42)
289289

290290
utxo_to_spend = None
291291

pycardano/plutus.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -697,7 +697,7 @@ def __add__(self, other: ExecutionUnits) -> ExecutionUnits:
697697

698698
@dataclass(repr=False)
699699
class Redeemer(ArrayCBORSerializable):
700-
tag: RedeemerTag
700+
tag: Optional[RedeemerTag] = field(default=None, init=False)
701701

702702
index: int = field(default=0, init=False)
703703

@@ -710,9 +710,8 @@ class Redeemer(ArrayCBORSerializable):
710710
def from_primitive(cls: Type[Redeemer], values: list) -> Redeemer:
711711
if isinstance(values[2], CBORTag) and cls is Redeemer:
712712
values[2] = RawPlutusData.from_primitive(values[2])
713-
redeemer = super(Redeemer, cls).from_primitive(
714-
[values[0], values[2], values[3]]
715-
)
713+
redeemer = super(Redeemer, cls).from_primitive([values[2], values[3]])
714+
redeemer.tag = RedeemerTag.from_primitive(values[0])
716715
redeemer.index = values[1]
717716
return redeemer
718717

pycardano/txbuilder.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,12 @@ def add_script_input(
226226
self.datums[datum_hash(datum)] = datum
227227

228228
if redeemer:
229+
if redeemer.tag is not None and redeemer.tag != RedeemerTag.SPEND:
230+
raise InvalidArgumentException(
231+
f"Expect the redeemer tag's type to be {RedeemerTag.SPEND}, "
232+
f"but got {redeemer.tag} instead."
233+
)
234+
redeemer.tag = RedeemerTag.SPEND
229235
self._consolidate_redeemer(redeemer)
230236
self._inputs_to_redeemers[utxo] = redeemer
231237

@@ -266,11 +272,12 @@ def add_minting_script(
266272
TransactionBuilder: Current transaction builder.
267273
"""
268274
if redeemer:
269-
if redeemer.tag != RedeemerTag.MINT:
275+
if redeemer.tag is not None and redeemer.tag != RedeemerTag.MINT:
270276
raise InvalidArgumentException(
271277
f"Expect the redeemer tag's type to be {RedeemerTag.MINT}, "
272278
f"but got {redeemer.tag} instead."
273279
)
280+
redeemer.tag = RedeemerTag.MINT
274281
self._consolidate_redeemer(redeemer)
275282

276283
if isinstance(script, UTxO):
@@ -1119,6 +1126,9 @@ def _update_execution_units(
11191126
change_address, merge_change, collateral_change_address
11201127
)
11211128
for r in self.redeemers:
1129+
assert (
1130+
r.tag is not None
1131+
), "Expected tag of redeemer to be set, but found None"
11221132
key = f"{r.tag.name.lower()}:{r.index}"
11231133
if (
11241134
key not in estimated_execution_units

test/pycardano/test_plutus.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
from dataclasses import dataclass
1+
from dataclasses import dataclass, field
22
from test.pycardano.util import check_two_way_cbor
3-
from typing import Union
3+
from typing import Union, Optional
44

55
import pytest
66

@@ -152,7 +152,8 @@ def test_plutus_data_hash():
152152

153153
def test_redeemer():
154154
data = MyTest(123, b"234", IndefiniteList([4, 5, 6]), {1: b"1", 2: b"2"})
155-
redeemer = MyRedeemer(RedeemerTag.SPEND, data, ExecutionUnits(1000000, 1000000))
155+
redeemer = MyRedeemer(data, ExecutionUnits(1000000, 1000000))
156+
redeemer.tag = RedeemerTag.SPEND
156157
assert (
157158
"840000d8668218829f187b433233349f040506ffa2014131024132ff821a000f42401a000f4240"
158159
== redeemer.to_cbor()
@@ -162,7 +163,8 @@ def test_redeemer():
162163

163164
def test_redeemer_empty_datum():
164165
data = MyTest(123, b"234", IndefiniteList([]), {1: b"1", 2: b"2"})
165-
redeemer = MyRedeemer(RedeemerTag.SPEND, data, ExecutionUnits(1000000, 1000000))
166+
redeemer = MyRedeemer(data, ExecutionUnits(1000000, 1000000))
167+
redeemer.tag = RedeemerTag.SPEND
166168
assert (
167169
"840000d8668218829f187b433233349fffa2014131024132ff821a000f42401a000f4240"
168170
== redeemer.to_cbor()

test/pycardano/test_txbuilder.py

Lines changed: 19 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -455,15 +455,11 @@ def test_add_script_input(chain_context):
455455
script_address, Value(10000000, mint), datum_hash=datum.hash()
456456
),
457457
)
458-
redeemer1 = Redeemer(
459-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
460-
)
461-
redeemer2 = Redeemer(
462-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
463-
)
458+
redeemer1 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
459+
redeemer2 = Redeemer(PlutusData(), ExecutionUnits(5000000, 1000000))
464460
tx_builder.mint = mint
465461
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
466-
tx_builder.add_script_input(utxo2, plutus_script, datum, redeemer2)
462+
tx_builder.add_minting_script(plutus_script, redeemer2)
467463
receiver = Address.from_primitive(
468464
"addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
469465
)
@@ -490,9 +486,7 @@ def test_add_script_input_no_script(chain_context):
490486
script_address, 10000000, datum_hash=datum.hash(), script=plutus_script
491487
),
492488
)
493-
redeemer = Redeemer(
494-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
495-
)
489+
redeemer = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
496490
tx_builder.add_script_input(utxo1, datum=datum, redeemer=redeemer)
497491
receiver = Address.from_primitive(
498492
"addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
@@ -534,9 +528,7 @@ def test_add_script_input_find_script(chain_context):
534528

535529
mock_utxos.return_value = original_utxos + [existing_script_utxo]
536530

537-
redeemer = Redeemer(
538-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
539-
)
531+
redeemer = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
540532
tx_builder.add_script_input(utxo1, datum=datum, redeemer=redeemer)
541533
receiver = Address.from_primitive(
542534
"addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
@@ -573,9 +565,7 @@ def test_add_script_input_with_script_from_specified_utxo(chain_context):
573565
TransactionOutput(script_address, 1234567, script=plutus_script),
574566
)
575567

576-
redeemer = Redeemer(
577-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
578-
)
568+
redeemer = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
579569
tx_builder.add_script_input(
580570
utxo1, script=existing_script_utxo, datum=datum, redeemer=redeemer
581571
)
@@ -609,9 +599,7 @@ def test_add_minting_script_from_specified_utxo(chain_context):
609599

610600
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
611601

612-
redeemer = Redeemer(
613-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
614-
)
602+
redeemer = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
615603
tx_builder.add_minting_script(existing_script_utxo, redeemer=redeemer)
616604
receiver = Address.from_primitive(
617605
"addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
@@ -662,9 +650,7 @@ def test_collateral_return(chain_context):
662650

663651
mock_utxos.return_value = original_utxos + [existing_script_utxo]
664652

665-
redeemer = Redeemer(
666-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
667-
)
653+
redeemer = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
668654
tx_builder.add_script_input(utxo1, datum=datum, redeemer=redeemer)
669655
receiver = Address.from_primitive(
670656
"addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
@@ -700,16 +686,14 @@ def test_wrong_redeemer_execution_units(chain_context):
700686
script_address, Value(10000000, mint), datum_hash=datum.hash()
701687
),
702688
)
703-
redeemer1 = Redeemer(RedeemerTag.SPEND, PlutusData())
704-
redeemer2 = Redeemer(RedeemerTag.MINT, PlutusData())
705-
redeemer3 = Redeemer(
706-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
707-
)
689+
redeemer1 = Redeemer(PlutusData())
690+
redeemer2 = Redeemer(PlutusData())
691+
redeemer3 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
708692
tx_builder.mint = mint
709693
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
710-
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer2)
694+
tx_builder.add_minting_script(plutus_script, redeemer2)
711695
with pytest.raises(InvalidArgumentException):
712-
tx_builder.add_script_input(utxo2, plutus_script, datum, redeemer3)
696+
tx_builder.add_minting_script(plutus_script, redeemer3)
713697

714698

715699
def test_all_redeemer_should_provide_execution_units(chain_context):
@@ -728,10 +712,8 @@ def test_all_redeemer_should_provide_execution_units(chain_context):
728712
tx_in1, TransactionOutput(script_address, 10000000, datum_hash=datum.hash())
729713
)
730714
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
731-
redeemer1 = Redeemer(
732-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
733-
)
734-
redeemer2 = Redeemer(RedeemerTag.MINT, PlutusData())
715+
redeemer1 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
716+
redeemer2 = Redeemer(PlutusData())
735717
tx_builder.mint = mint
736718
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
737719
with pytest.raises(InvalidArgumentException):
@@ -748,9 +730,7 @@ def test_add_minting_script(chain_context):
748730
script_address = Address(script_hash)
749731
utxo1 = UTxO(tx_in1, TransactionOutput(script_address, 10000000))
750732
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
751-
redeemer1 = Redeemer(
752-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
753-
)
733+
redeemer1 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
754734
tx_builder.mint = mint
755735
tx_builder.add_input(utxo1)
756736
tx_builder.add_minting_script(plutus_script, redeemer1)
@@ -766,9 +746,8 @@ def test_add_minting_script(chain_context):
766746
def test_add_minting_script_wrong_redeemer_type(chain_context):
767747
tx_builder = TransactionBuilder(chain_context)
768748
plutus_script = PlutusV1Script(b"dummy test script")
769-
redeemer1 = Redeemer(
770-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
771-
)
749+
redeemer1 = Redeemer(PlutusData(), ExecutionUnits(1000000, 1000000))
750+
redeemer1.tag = RedeemerTag.SPEND
772751

773752
with pytest.raises(InvalidArgumentException):
774753
tx_builder.add_minting_script(plutus_script, redeemer1)
@@ -853,7 +832,7 @@ def test_estimate_execution_unit(chain_context):
853832
tx_in1, TransactionOutput(script_address, 10000000, datum_hash=datum.hash())
854833
)
855834
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
856-
redeemer1 = Redeemer(RedeemerTag.SPEND, PlutusData())
835+
redeemer1 = Redeemer(PlutusData())
857836
tx_builder.mint = mint
858837
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
859838
receiver = Address.from_primitive(

test/pycardano/test_util.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ def test_min_lovelace_multi_asset_9(self, chain_context):
147147

148148
def test_script_data_hash():
149149
unit = PlutusData()
150-
redeemers = [Redeemer(RedeemerTag.SPEND, unit, ExecutionUnits(1000000, 1000000))]
150+
redeemers = [Redeemer(unit, ExecutionUnits(1000000, 1000000))]
151+
redeemers[0].tag = RedeemerTag.SPEND
151152
assert ScriptDataHash.from_primitive(
152153
"032d812ee0731af78fe4ec67e4d30d16313c09e6fb675af28f825797e8b5621d"
153154
) == script_data_hash(redeemers=redeemers, datums=[unit])

0 commit comments

Comments
 (0)