diff --git a/pycardano/plutus.py b/pycardano/plutus.py index 1d70bcca..3f64400b 100644 --- a/pycardano/plutus.py +++ b/pycardano/plutus.py @@ -693,7 +693,7 @@ def from_primitive(cls: Type[RawPlutusData], value: CBORTag) -> RawPlutusData: return cls(value) -Datum = Union[PlutusData, dict, IndefiniteList, int, bytes, RawCBOR, RawPlutusData] +Datum = Union[PlutusData, dict, int, bytes, IndefiniteList, RawCBOR, RawPlutusData] """Plutus Datum type. A Union type that contains all valid datum types.""" diff --git a/pycardano/serialization.py b/pycardano/serialization.py index 8d8d35e2..9aa9bff0 100644 --- a/pycardano/serialization.py +++ b/pycardano/serialization.py @@ -496,7 +496,10 @@ def _restore_typed_primitive( raise DeserializeException(f"Expected type list but got {type(v)}") return IndefiniteList([_restore_typed_primitive(t, w) for w in v]) elif isclass(t) and issubclass(t, IndefiniteList): - return IndefiniteList(v) + try: + return IndefiniteList(v) + except TypeError: + raise DeserializeException(f"Can not initialize IndefiniteList from {v}") elif hasattr(t, "__origin__") and (t.__origin__ is dict): t_args = t.__args__ if len(t_args) != 2: diff --git a/test/pycardano/test_serialization.py b/test/pycardano/test_serialization.py index 6df869b7..db0f10c6 100644 --- a/test/pycardano/test_serialization.py +++ b/test/pycardano/test_serialization.py @@ -1,4 +1,7 @@ +import cbor2 from dataclasses import dataclass, field + +from pycardano import Datum, RawPlutusData from test.pycardano.util import check_two_way_cbor from typing import Any, Dict, List, Optional, Set, Tuple, Union @@ -174,6 +177,22 @@ class Test1(MapCBORSerializable): check_two_way_cbor(t) +def test_datum_type(): + @dataclass + class Test1(MapCBORSerializable): + b: Datum + + # make sure that no "not iterable" error is thrown + t = Test1(b=RawPlutusData(cbor2.CBORTag(125, []))) + + check_two_way_cbor(t) + + # Make sure that iterable objects are not deserialized to the wrong object + t = Test1(b=b"hello!") + + check_two_way_cbor(t) + + def test_wrong_primitive_type(): @dataclass class Test1(MapCBORSerializable):