@@ -348,6 +348,7 @@ class SubstrateMixin(ABC):
348348 ss58_format : Optional [int ]
349349 ws_max_size = 2 ** 32
350350 registry_type_map : dict [str , int ]
351+ type_id_to_name : dict [int , str ]
351352 metadata_v15 = None
352353
353354 @property
@@ -606,14 +607,67 @@ def serialize_module_error(module, error, spec_version) -> dict:
606607
607608 def _load_registry_type_map (self ):
608609 registry_type_map = {}
609- for i in json .loads (self .registry .registry )["types" ]:
610- for variants in (
611- i .get ("type" ).get ("def" , {}).get ("variant" , {}).get ("variants" , [{}])
612- ):
613- for field in variants .get ("fields" , [{}]):
614- if field .get ("type" ) and field .get ("typeName" ):
615- registry_type_map [field ["typeName" ]] = field ["type" ]
610+ type_id_to_name = {}
611+ types = json .loads (self .registry .registry )["types" ]
612+ for type_entry in types :
613+ type_type = type_entry ["type" ]
614+ type_id = type_entry ["id" ]
615+ type_def = type_type ["def" ]
616+ type_path = type_type .get ("path" )
617+ if type_entry .get ("params" ) or type_def .get ("variant" ):
618+ continue # has generics or is Enum
619+ if type_path :
620+ type_name = type_path [- 1 ]
621+ registry_type_map [type_name ] = type_id
622+ type_id_to_name [type_id ] = type_name
623+ else :
624+ # probably primitive
625+ if type_def .get ("primitive" ):
626+ type_name = type_def ["primitive" ]
627+ registry_type_map [type_name ] = type_id
628+ type_id_to_name [type_id ] = type_name
629+ for type_entry in types :
630+ type_type = type_entry ["type" ]
631+ type_id = type_entry ["id" ]
632+ type_def = type_type ["def" ]
633+ if type_def .get ("sequence" ):
634+ sequence_type_id = type_def ["sequence" ]["type" ]
635+ inner_type = type_id_to_name .get (sequence_type_id )
636+ if inner_type :
637+ type_name = f"Vec<{ inner_type } >"
638+ type_id_to_name [type_id ] = type_name
639+ registry_type_map [type_name ] = type_id
640+ elif type_def .get ("array" ):
641+ array_type_id = type_def ["array" ]["type" ]
642+ inner_type = type_id_to_name .get (array_type_id )
643+ maybe_len = type_def ["array" ].get ("len" )
644+ if inner_type :
645+ if maybe_len :
646+ type_name = f"[{ inner_type } ; { maybe_len } ]"
647+ else :
648+ type_name = f"[{ inner_type } ]"
649+ type_id_to_name [type_id ] = type_name
650+ registry_type_map [type_name ] = type_id
651+ elif type_def .get ("compact" ):
652+ compact_type_id = type_def ["compact" ]["type" ]
653+ inner_type = type_id_to_name .get (compact_type_id )
654+ if inner_type :
655+ type_name = f"Compact<{ inner_type } >"
656+ type_id_to_name [type_id ] = type_name
657+ registry_type_map [type_name ] = type_id
658+ elif type_def .get ("tuple" ):
659+ tuple_type_ids = type_def ["tuple" ]
660+ type_names = []
661+ for inner_type_id in tuple_type_ids :
662+ inner_type = type_id_to_name .get (inner_type_id )
663+ if inner_type :
664+ type_names .append (inner_type )
665+ type_name = ", " .join (type_names )
666+ type_name = f"({ type_name } )"
667+ type_id_to_name [type_id ] = type_name
668+ registry_type_map [type_name ] = type_id
616669 self .registry_type_map = registry_type_map
670+ self .type_id_to_name = type_id_to_name
617671
618672 def reload_type_registry (
619673 self , use_remote_preset : bool = True , auto_discover : bool = True
0 commit comments