1515import warnings
1616
1717from eth_abi import (
18+ decoding ,
1819 encoding ,
1920)
2021from eth_abi .base import (
2829 TupleType ,
2930 parse ,
3031)
32+ from eth_abi .registry import (
33+ BaseEquals ,
34+ registry as default_registry
35+ )
3136from eth_typing import (
3237 TypeStr ,
3338)
@@ -287,16 +292,16 @@ def from_type_str(cls, abi_type, registry):
287292 )
288293
289294
290- def filter_by_encodability (abi_encoder , args , kwargs , contract_abi ):
295+ def filter_by_encodability (abi_codec , args , kwargs , contract_abi ):
291296 return [
292297 function_abi
293298 for function_abi
294299 in contract_abi
295- if check_if_arguments_can_be_encoded (function_abi , abi_encoder , args , kwargs )
300+ if check_if_arguments_can_be_encoded (function_abi , abi_codec , args , kwargs )
296301 ]
297302
298303
299- def check_if_arguments_can_be_encoded (function_abi , abi_encoder , args , kwargs ):
304+ def check_if_arguments_can_be_encoded (function_abi , abi_codec , args , kwargs ):
300305 try :
301306 arguments = merge_args_and_kwargs (function_abi , args , kwargs )
302307 except TypeError :
@@ -311,7 +316,7 @@ def check_if_arguments_can_be_encoded(function_abi, abi_encoder, args, kwargs):
311316 return False
312317
313318 return all (
314- abi_encoder .is_encodable (_type , arg )
319+ abi_codec .is_encodable (_type , arg )
315320 for _type , arg in zip (types , aligned_args )
316321 )
317322
@@ -782,3 +787,67 @@ def strip_abi_type(elements):
782787 return elements .data
783788 else :
784789 return elements
790+
791+
792+ def build_default_registry ():
793+ # We make a copy here just to make sure that eth-abi's default registry is not
794+ # affected by our custom encoder subclasses
795+ registry = default_registry .copy ()
796+
797+ registry .unregister ('address' )
798+ registry .unregister ('bytes<M>' )
799+ registry .unregister ('bytes' )
800+ registry .unregister ('string' )
801+
802+ registry .register (
803+ BaseEquals ('address' ),
804+ AddressEncoder , decoding .AddressDecoder ,
805+ label = 'address' ,
806+ )
807+ registry .register (
808+ BaseEquals ('bytes' , with_sub = True ),
809+ BytesEncoder , decoding .BytesDecoder ,
810+ label = 'bytes<M>' ,
811+ )
812+ registry .register (
813+ BaseEquals ('bytes' , with_sub = False ),
814+ ByteStringEncoder , decoding .ByteStringDecoder ,
815+ label = 'bytes' ,
816+ )
817+ registry .register (
818+ BaseEquals ('string' ),
819+ TextStringEncoder , decoding .StringDecoder ,
820+ label = 'string' ,
821+ )
822+ return registry
823+
824+
825+ def build_strict_registry ():
826+ registry = default_registry .copy ()
827+
828+ registry .unregister ('address' )
829+ registry .unregister ('bytes<M>' )
830+ registry .unregister ('bytes' )
831+ registry .unregister ('string' )
832+
833+ registry .register (
834+ BaseEquals ('address' ),
835+ AddressEncoder , decoding .AddressDecoder ,
836+ label = 'address' ,
837+ )
838+ registry .register (
839+ BaseEquals ('bytes' , with_sub = True ),
840+ ExactLengthBytesEncoder , decoding .BytesDecoder ,
841+ label = 'bytes<M>' ,
842+ )
843+ registry .register (
844+ BaseEquals ('bytes' , with_sub = False ),
845+ StrictByteStringEncoder , decoding .ByteStringDecoder ,
846+ label = 'bytes' ,
847+ )
848+ registry .register (
849+ BaseEquals ('string' ),
850+ TextStringEncoder , decoding .StringDecoder ,
851+ label = 'string' ,
852+ )
853+ return registry
0 commit comments