11import re
2- from typing import Union , Type
2+ from typing import Any , Union , Type
33
44from eth_utils .crypto import keccak
55from eth_utils .conversions import to_int
88class EIP712Type :
99 """The base type for members of a struct.
1010 """
11- def __init__ (self , type_name : str ):
11+ def __init__ (self , type_name : str , none_val : Any ):
1212 self .type_name = type_name
13+ self .none_val = none_val
1314
1415 def encode_value (self , value ) -> bytes :
16+ if value is None :
17+ return self ._encode_value (self .none_val )
18+ else :
19+ return self ._encode_value (value )
20+
21+ def _encode_value (self , value ) -> bytes :
1522 """Given a value, verify it and convert into the format required by the spec.
1623
1724 :param value: A correct input value for the implemented type.
@@ -38,19 +45,19 @@ def __init__(self, member_type: Union[EIP712Type, Type[EIP712Type]], fixed_lengt
3845 type_name = f'{ member_type .type_name } [{ fixed_length } ]'
3946 self .member_type = member_type
4047 self .fixed_length = fixed_length
41- super (Array , self ).__init__ (type_name )
48+ super (Array , self ).__init__ (type_name , [] )
4249
43- def encode_value (self , value ):
50+ def _encode_value (self , value ):
4451 encoder = self .member_type
4552 encoded_values = [encoder .encode_value (v ) for v in value ]
4653 return keccak (b'' .join (encoded_values ))
4754
4855
4956class Address (EIP712Type ):
5057 def __init__ (self ):
51- super (Address , self ).__init__ ('address' )
58+ super (Address , self ).__init__ ('address' , 0 )
5259
53- def encode_value (self , value ):
60+ def _encode_value (self , value ):
5461 # Some smart conversions - need to get an address as an int
5562 if isinstance (value , bytes ):
5663 v = to_int (value )
@@ -63,9 +70,9 @@ def encode_value(self, value):
6370
6471class Boolean (EIP712Type ):
6572 def __init__ (self ):
66- super (Boolean , self ).__init__ ('bool' )
73+ super (Boolean , self ).__init__ ('bool' , False )
6774
68- def encode_value (self , value ):
75+ def _encode_value (self , value ):
6976 if value is False :
7077 return Uint (256 ).encode_value (0 )
7178 elif value is True :
@@ -85,9 +92,9 @@ def __init__(self, length: int = 0):
8592 else :
8693 raise ValueError (f'Byte length must be between 1 or 32. Got: { length } ' )
8794 self .length = length
88- super (Bytes , self ).__init__ (type_name )
95+ super (Bytes , self ).__init__ (type_name , b'' )
8996
90- def encode_value (self , value ):
97+ def _encode_value (self , value ):
9198 if self .length == 0 :
9299 return keccak (value )
93100 else :
@@ -103,18 +110,18 @@ def __init__(self, length: int):
103110 if length < 8 or length > 256 or length % 8 != 0 :
104111 raise ValueError (f'Int length must be a multiple of 8, between 8 and 256. Got: { length } ' )
105112 self .length = length
106- super (Int , self ).__init__ (f'int{ length } ' )
113+ super (Int , self ).__init__ (f'int{ length } ' , 0 )
107114
108- def encode_value (self , value : int ):
115+ def _encode_value (self , value : int ):
109116 value .to_bytes (self .length // 8 , byteorder = 'big' , signed = True ) # For validation
110117 return value .to_bytes (32 , byteorder = 'big' , signed = True )
111118
112119
113120class String (EIP712Type ):
114121 def __init__ (self ):
115- super (String , self ).__init__ ('string' )
122+ super (String , self ).__init__ ('string' , '' )
116123
117- def encode_value (self , value ):
124+ def _encode_value (self , value ):
118125 return keccak (text = value )
119126
120127
@@ -124,9 +131,9 @@ def __init__(self, length: int):
124131 if length < 8 or length > 256 or length % 8 != 0 :
125132 raise ValueError (f'Uint length must be a multiple of 8, between 8 and 256. Got: { length } ' )
126133 self .length = length
127- super (Uint , self ).__init__ (f'uint{ length } ' )
134+ super (Uint , self ).__init__ (f'uint{ length } ' , 0 )
128135
129- def encode_value (self , value : int ):
136+ def _encode_value (self , value : int ):
130137 value .to_bytes (self .length // 8 , byteorder = 'big' , signed = False ) # For validation
131138 return value .to_bytes (32 , byteorder = 'big' , signed = False )
132139
0 commit comments