Skip to content

Commit afd8c6f

Browse files
committed
Remove the need to specify the RedeemerTag
This reduces friction for writing applications
1 parent ab01bec commit afd8c6f

File tree

9 files changed

+47
-34
lines changed

9 files changed

+47
-34
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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ def test_mint_nft_with_script(self):
215215

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

221221
# Set nft we want to mint
@@ -311,7 +311,7 @@ class MyPlutusData(PlutusData):
311311

312312
# Add minting script with an empty datum and a minting redeemer
313313
builder.add_minting_script(
314-
anymint_script, redeemer=Redeemer(RedeemerTag.MINT, MyPlutusData(a=42))
314+
anymint_script, redeemer=Redeemer(MyPlutusData(a=42))
315315
)
316316

317317
# 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 & 2 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: RedeemerTag = field(default=None, init=False)
701701

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

@@ -711,8 +711,9 @@ 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])
713713
redeemer = super(Redeemer, cls).from_primitive(
714-
[values[0], values[2], values[3]]
714+
[values[2], values[3]]
715715
)
716+
redeemer.tag = RedeemerTag.from_primitive(values[0])
716717
redeemer.index = values[1]
717718
return redeemer
718719

pycardano/txbuilder.py

Lines changed: 8 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):

test/pycardano/test_plutus.py

Lines changed: 7 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

@@ -54,6 +54,7 @@ class MyRedeemer(Redeemer):
5454
data: MyTest
5555

5656

57+
5758
def test_plutus_data():
5859
"""Ground truth of this test is generated by test/resources/haskell/PlutusData. See its README for more details."""
5960
key_hash = bytes.fromhex("c2ff616e11299d9094ce0a7eb5b7284b705147a822f4ffbd471f971a")
@@ -152,7 +153,8 @@ def test_plutus_data_hash():
152153

153154
def test_redeemer():
154155
data = MyTest(123, b"234", IndefiniteList([4, 5, 6]), {1: b"1", 2: b"2"})
155-
redeemer = MyRedeemer(RedeemerTag.SPEND, data, ExecutionUnits(1000000, 1000000))
156+
redeemer = MyRedeemer(data, ExecutionUnits(1000000, 1000000))
157+
redeemer.tag = RedeemerTag.SPEND
156158
assert (
157159
"840000d8668218829f187b433233349f040506ffa2014131024132ff821a000f42401a000f4240"
158160
== redeemer.to_cbor()
@@ -162,7 +164,8 @@ def test_redeemer():
162164

163165
def test_redeemer_empty_datum():
164166
data = MyTest(123, b"234", IndefiniteList([]), {1: b"1", 2: b"2"})
165-
redeemer = MyRedeemer(RedeemerTag.SPEND, data, ExecutionUnits(1000000, 1000000))
167+
redeemer = MyRedeemer(data, ExecutionUnits(1000000, 1000000))
168+
redeemer.tag = RedeemerTag.SPEND
166169
assert (
167170
"840000d8668218829f187b433233349fffa2014131024132ff821a000f42401a000f4240"
168171
== redeemer.to_cbor()

test/pycardano/test_txbuilder.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -456,14 +456,14 @@ def test_add_script_input(chain_context):
456456
),
457457
)
458458
redeemer1 = Redeemer(
459-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
459+
PlutusData(), ExecutionUnits(1000000, 1000000)
460460
)
461461
redeemer2 = Redeemer(
462-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
462+
PlutusData(), ExecutionUnits(5000000, 1000000)
463463
)
464464
tx_builder.mint = mint
465465
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
466-
tx_builder.add_script_input(utxo2, plutus_script, datum, redeemer2)
466+
tx_builder.add_minting_script(plutus_script, redeemer2)
467467
receiver = Address.from_primitive(
468468
"addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"
469469
)
@@ -491,7 +491,7 @@ def test_add_script_input_no_script(chain_context):
491491
),
492492
)
493493
redeemer = Redeemer(
494-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
494+
PlutusData(), ExecutionUnits(1000000, 1000000)
495495
)
496496
tx_builder.add_script_input(utxo1, datum=datum, redeemer=redeemer)
497497
receiver = Address.from_primitive(
@@ -535,7 +535,7 @@ def test_add_script_input_find_script(chain_context):
535535
mock_utxos.return_value = original_utxos + [existing_script_utxo]
536536

537537
redeemer = Redeemer(
538-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
538+
PlutusData(), ExecutionUnits(1000000, 1000000)
539539
)
540540
tx_builder.add_script_input(utxo1, datum=datum, redeemer=redeemer)
541541
receiver = Address.from_primitive(
@@ -574,7 +574,7 @@ def test_add_script_input_with_script_from_specified_utxo(chain_context):
574574
)
575575

576576
redeemer = Redeemer(
577-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
577+
PlutusData(), ExecutionUnits(1000000, 1000000)
578578
)
579579
tx_builder.add_script_input(
580580
utxo1, script=existing_script_utxo, datum=datum, redeemer=redeemer
@@ -610,7 +610,7 @@ def test_add_minting_script_from_specified_utxo(chain_context):
610610
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
611611

612612
redeemer = Redeemer(
613-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
613+
PlutusData(), ExecutionUnits(1000000, 1000000)
614614
)
615615
tx_builder.add_minting_script(existing_script_utxo, redeemer=redeemer)
616616
receiver = Address.from_primitive(
@@ -663,7 +663,7 @@ def test_collateral_return(chain_context):
663663
mock_utxos.return_value = original_utxos + [existing_script_utxo]
664664

665665
redeemer = Redeemer(
666-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
666+
PlutusData(), ExecutionUnits(1000000, 1000000)
667667
)
668668
tx_builder.add_script_input(utxo1, datum=datum, redeemer=redeemer)
669669
receiver = Address.from_primitive(
@@ -700,16 +700,16 @@ def test_wrong_redeemer_execution_units(chain_context):
700700
script_address, Value(10000000, mint), datum_hash=datum.hash()
701701
),
702702
)
703-
redeemer1 = Redeemer(RedeemerTag.SPEND, PlutusData())
704-
redeemer2 = Redeemer(RedeemerTag.MINT, PlutusData())
703+
redeemer1 = Redeemer(PlutusData())
704+
redeemer2 = Redeemer(PlutusData())
705705
redeemer3 = Redeemer(
706-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
706+
PlutusData(), ExecutionUnits(1000000, 1000000)
707707
)
708708
tx_builder.mint = mint
709709
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
710-
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer2)
710+
tx_builder.add_minting_script(plutus_script, redeemer2)
711711
with pytest.raises(InvalidArgumentException):
712-
tx_builder.add_script_input(utxo2, plutus_script, datum, redeemer3)
712+
tx_builder.add_minting_script(plutus_script, redeemer3)
713713

714714

715715
def test_all_redeemer_should_provide_execution_units(chain_context):
@@ -729,9 +729,9 @@ def test_all_redeemer_should_provide_execution_units(chain_context):
729729
)
730730
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
731731
redeemer1 = Redeemer(
732-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
732+
PlutusData(), ExecutionUnits(1000000, 1000000)
733733
)
734-
redeemer2 = Redeemer(RedeemerTag.MINT, PlutusData())
734+
redeemer2 = Redeemer(PlutusData())
735735
tx_builder.mint = mint
736736
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
737737
with pytest.raises(InvalidArgumentException):
@@ -749,7 +749,7 @@ def test_add_minting_script(chain_context):
749749
utxo1 = UTxO(tx_in1, TransactionOutput(script_address, 10000000))
750750
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
751751
redeemer1 = Redeemer(
752-
RedeemerTag.MINT, PlutusData(), ExecutionUnits(1000000, 1000000)
752+
PlutusData(), ExecutionUnits(1000000, 1000000)
753753
)
754754
tx_builder.mint = mint
755755
tx_builder.add_input(utxo1)
@@ -767,8 +767,9 @@ def test_add_minting_script_wrong_redeemer_type(chain_context):
767767
tx_builder = TransactionBuilder(chain_context)
768768
plutus_script = PlutusV1Script(b"dummy test script")
769769
redeemer1 = Redeemer(
770-
RedeemerTag.SPEND, PlutusData(), ExecutionUnits(1000000, 1000000)
770+
PlutusData(), ExecutionUnits(1000000, 1000000)
771771
)
772+
redeemer1.tag = RedeemerTag.SPEND
772773

773774
with pytest.raises(InvalidArgumentException):
774775
tx_builder.add_minting_script(plutus_script, redeemer1)
@@ -853,7 +854,7 @@ def test_estimate_execution_unit(chain_context):
853854
tx_in1, TransactionOutput(script_address, 10000000, datum_hash=datum.hash())
854855
)
855856
mint = MultiAsset.from_primitive({script_hash.payload: {b"TestToken": 1}})
856-
redeemer1 = Redeemer(RedeemerTag.SPEND, PlutusData())
857+
redeemer1 = Redeemer(PlutusData())
857858
tx_builder.mint = mint
858859
tx_builder.add_script_input(utxo1, plutus_script, datum, redeemer1)
859860
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)