7
7
from nacl .encoding import RawEncoder
8
8
from nacl .hash import blake2b
9
9
10
- from pycardano .exception import DeserializeException
10
+ from pycardano .exception import DeserializeException , InvalidArgumentException
11
11
from pycardano .hash import AuxiliaryDataHash , AUXILIARY_DATA_HASH_SIZE
12
12
from pycardano .nativescript import NativeScript
13
13
from pycardano .serialization import (CBORSerializable , DictCBORSerializable , ArrayCBORSerializable ,
@@ -18,6 +18,38 @@ class Metadata(DictCBORSerializable):
18
18
KEY_TYPE = int # transaction_metadatum_label, see https://github.com/cardano-foundation/CIPs/tree/master/CIP-0010
19
19
VALUE_TYPE = Any
20
20
21
+ MAX_ITEM_SIZE = 64
22
+ INTERNAL_TYPES = (dict , list , int , bytes , str )
23
+
24
+ def _validate (self ):
25
+
26
+ def _validate_type_and_size (data ):
27
+ if not isinstance (data , self .INTERNAL_TYPES ):
28
+ raise InvalidArgumentException (f"A value in Metadata has to be one of { self .INTERNAL_TYPES } , "
29
+ f"got { type (data )} instead." )
30
+ if isinstance (data , bytes ):
31
+ if len (data ) > self .MAX_ITEM_SIZE :
32
+ raise InvalidArgumentException (f"The size of { data } exceeds { self .MAX_ITEM_SIZE } bytes." )
33
+ elif isinstance (data , str ):
34
+ if len (data .encode ("utf-8" )) > self .MAX_ITEM_SIZE :
35
+ raise InvalidArgumentException (f"The size of { data } exceeds { self .MAX_ITEM_SIZE } bytes." )
36
+ elif isinstance (data , list ):
37
+ for item in data :
38
+ _validate_type_and_size (item )
39
+ elif isinstance (data , dict ):
40
+ for key in data :
41
+ _validate_type_and_size (data [key ])
42
+
43
+ for k in self :
44
+ if not isinstance (k , self .KEY_TYPE ):
45
+ raise InvalidArgumentException (f"Keys in the first layer of Metadata has to be { self .KEY_TYPE } , "
46
+ f"got { type (k )} instead." )
47
+ _validate_type_and_size (self [k ])
48
+
49
+ def __init__ (self , * args , ** kwargs ):
50
+ super ().__init__ (* args , ** kwargs )
51
+ self ._validate ()
52
+
21
53
22
54
@dataclass
23
55
class ShellayMarryMetadata (ArrayCBORSerializable ):
0 commit comments