Skip to content

Commit eee4ac4

Browse files
committed
More robust type map pulling from metadata
1 parent a0d566e commit eee4ac4

File tree

3 files changed

+63
-7
lines changed

3 files changed

+63
-7
lines changed

async_substrate_interface/async_substrate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,6 +718,7 @@ def __init__(
718718
self.reload_type_registry()
719719
self._initializing = False
720720
self.registry_type_map = {}
721+
self.type_id_to_name = {}
721722

722723
async def __aenter__(self):
723724
await self.initialize()

async_substrate_interface/sync_substrate.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -517,6 +517,7 @@ def __init__(
517517
self.reload_type_registry()
518518
self.ws = self.connect(init=True)
519519
self.registry_type_map = {}
520+
self.type_id_to_name = {}
520521
if not _mock:
521522
self.initialize()
522523

async_substrate_interface/types.py

Lines changed: 61 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)