Skip to content

Commit 8c3a12b

Browse files
authored
Add test cases and fix inlineDatum fetching for the Cardano CLI Backend (#303)
* Add tests for plutus script fetching and inline datums * Add test case for datum hash * Add epoch test case * Formatting * Fix typing * Be more lenient in assigning datum hash This is consistent with ogmios * Generalize the types inside RawPlutusData * Add support for RawCBOR primitivization * Fix limit primitive type to not use a Union type
1 parent 58e0cb2 commit 8c3a12b

File tree

3 files changed

+160
-11
lines changed

3 files changed

+160
-11
lines changed

pycardano/backend/cardano_cli.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
from pycardano.hash import DatumHash, ScriptHash
3232
from pycardano.nativescript import NativeScript
3333
from pycardano.network import Network
34-
from pycardano.plutus import PlutusV1Script, PlutusV2Script
34+
from pycardano.plutus import PlutusV1Script, PlutusV2Script, RawPlutusData, Datum
3535
from pycardano.serialization import RawCBOR
3636
from pycardano.transaction import (
3737
Asset,
@@ -437,16 +437,16 @@ def _utxos(self, address: str) -> List[UTxO]:
437437

438438
datum_hash = (
439439
DatumHash.from_primitive(utxo["datumhash"])
440-
if utxo.get("datumhash") and utxo.get("inlineDatum") is None
440+
if utxo.get("datumhash") is not None
441441
else None
442442
)
443443

444-
datum = None
444+
datum: Optional[Datum] = None
445445

446446
if utxo.get("datum"):
447447
datum = RawCBOR(bytes.fromhex(utxo["datum"]))
448448
elif utxo.get("inlineDatumhash"):
449-
datum = utxo["inlineDatum"]
449+
datum = RawPlutusData.from_dict(utxo["inlineDatum"])
450450

451451
script = None
452452

pycardano/plutus.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -781,11 +781,14 @@ def __deepcopy__(self, memo):
781781
return self.__class__.from_cbor(self.to_cbor_hex())
782782

783783

784+
RawDatum = Union[PlutusData, dict, int, bytes, IndefiniteList, RawCBOR, CBORTag]
785+
786+
784787
@dataclass(repr=True)
785788
class RawPlutusData(CBORSerializable):
786-
data: CBORTag
789+
data: RawDatum
787790

788-
def to_primitive(self) -> CBORTag:
791+
def to_primitive(self) -> RawDatum:
789792
def _dfs(obj):
790793
if isinstance(obj, list) and obj:
791794
return IndefiniteList([_dfs(item) for item in obj])
@@ -823,6 +826,8 @@ def _dfs(obj):
823826
elif isinstance(obj, CBORTag):
824827
constructor, fields = get_constructor_id_and_fields(obj)
825828
return {"constructor": constructor, "fields": [_dfs(f) for f in fields]}
829+
elif isinstance(obj, RawCBOR):
830+
return RawPlutusData.from_cbor(obj.cbor).to_dict()
826831
raise TypeError(f"Unexpected type {type(obj)}")
827832

828833
return _dfs(RawPlutusData.to_primitive(self))
@@ -840,8 +845,10 @@ def to_json(self, **kwargs) -> str:
840845
return json.dumps(RawPlutusData.to_dict(self), **kwargs)
841846

842847
@classmethod
843-
@limit_primitive_type(CBORTag)
844-
def from_primitive(cls: Type[RawPlutusData], value: CBORTag) -> RawPlutusData:
848+
@limit_primitive_type(
849+
PlutusData, dict, int, bytes, IndefiniteList, RawCBOR, CBORTag
850+
) # equal to RawDatum parameter list
851+
def from_primitive(cls: Type[RawPlutusData], value: RawDatum) -> RawPlutusData:
845852
return cls(value)
846853

847854
@classmethod

0 commit comments

Comments
 (0)