Skip to content

Commit 032beed

Browse files
committed
Deserialize CBORTag inline datum into RawPlutusData, so when the tx output is re-serialized, its cbor will match the original one.
1 parent 69349fb commit 032beed

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

pycardano/transaction.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from pycardano.metadata import AuxiliaryData
3030
from pycardano.nativescript import NativeScript
3131
from pycardano.network import Network
32-
from pycardano.plutus import Datum, PlutusV1Script, PlutusV2Script
32+
from pycardano.plutus import Datum, PlutusV1Script, PlutusV2Script, RawPlutusData
3333
from pycardano.serialization import (
3434
ArrayCBORSerializable,
3535
CBORSerializable,
@@ -317,7 +317,11 @@ def from_primitive(
317317
if values[0] == 0:
318318
return _DatumOption(DatumHash(values[1]))
319319
else:
320-
return _DatumOption(cbor2.loads(values[1].value))
320+
v = cbor2.loads(values[1].value)
321+
if isinstance(v, CBORTag):
322+
return _DatumOption(RawPlutusData.from_primitive(v))
323+
else:
324+
return _DatumOption(v)
321325

322326

323327
@dataclass(repr=False)

test/pycardano/test_transaction.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from dataclasses import dataclass
2+
13
from test.pycardano.util import check_two_way_cbor
24

35
import pytest
@@ -7,7 +9,7 @@
79
from pycardano.hash import SCRIPT_HASH_SIZE, ScriptHash, TransactionId
810
from pycardano.key import PaymentKeyPair, PaymentSigningKey, VerificationKey
911
from pycardano.nativescript import ScriptPubkey
10-
from pycardano.plutus import PlutusV1Script, PlutusV2Script, datum_hash
12+
from pycardano.plutus import PlutusData, PlutusV1Script, PlutusV2Script, datum_hash
1113
from pycardano.transaction import (
1214
Asset,
1315
AssetName,
@@ -421,3 +423,20 @@ def test_values():
421423

422424
with pytest.raises(InvalidOperationException):
423425
b - c
426+
427+
428+
def test_inline_datum_serdes():
429+
@dataclass
430+
class TestDatum(PlutusData):
431+
a: int
432+
b: bytes
433+
434+
output = TransactionOutput(
435+
Address.from_primitive("addr_test1vrm9x2zsux7va6w892g38tvchnzahvcd9tykqf3ygnmwtaqyfg52x"),
436+
1000000,
437+
datum=TestDatum(1, b"test"),
438+
)
439+
440+
cbor = output.to_cbor()
441+
442+
assert cbor == TransactionOutput.from_cbor(cbor).to_cbor()

0 commit comments

Comments
 (0)