Skip to content

Commit 9cc0023

Browse files
committed
Dynamically pulls the info for Vec<AccountId> from the metadata
1 parent 88013cc commit 9cc0023

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

async_substrate_interface/async_substrate.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,7 @@ def __init__(
717717
self.metadata_version_hex = "0x0f000000" # v15
718718
self.reload_type_registry()
719719
self._initializing = False
720+
self.registry_type_map = {}
720721

721722
async def __aenter__(self):
722723
await self.initialize()
@@ -806,6 +807,15 @@ async def load_registry(self):
806807
metadata_option_bytes
807808
)
808809
self.registry = PortableRegistry.from_metadata_v15(self.metadata_v15)
810+
registry_type_map = {}
811+
for i in json.loads(self.registry.registry)["types"]:
812+
for variants in (
813+
i.get("type").get("def", {}).get("variant", {}).get("variants", [{}])
814+
):
815+
for field in variants.get("fields", [{}]):
816+
if field.get("type") and field.get("typeName"):
817+
field["typeName"] = registry_type_map[field["type"]]
818+
self.registry_type_map = registry_type_map
809819

810820
async def _load_registry_at_block(self, block_hash: str) -> MetadataV15:
811821
# Should be called for any block that fails decoding.

async_substrate_interface/sync_substrate.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ def __init__(
516516
self.metadata_version_hex = "0x0f000000" # v15
517517
self.reload_type_registry()
518518
self.ws = self.connect(init=True)
519+
self.registry_type_map = {}
519520
if not _mock:
520521
self.initialize()
521522

@@ -610,6 +611,15 @@ def load_registry(self):
610611
metadata_option_bytes
611612
)
612613
self.registry = PortableRegistry.from_metadata_v15(self.metadata_v15)
614+
registry_type_map = {}
615+
for i in json.loads(self.registry.registry)["types"]:
616+
for variants in (
617+
i.get("type").get("def", {}).get("variant", {}).get("variants", [{}])
618+
):
619+
for field in variants.get("fields", [{}]):
620+
if field.get("type") and field.get("typeName"):
621+
field["typeName"] = registry_type_map[field["type"]]
622+
self.registry_type_map = registry_type_map
613623

614624
def _load_registry_at_block(self, block_hash: str) -> MetadataV15:
615625
# Should be called for any block that fails decoding.

async_substrate_interface/types.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,7 @@ class SubstrateMixin(ABC):
345345
type_registry: Optional[dict]
346346
ss58_format: Optional[int]
347347
ws_max_size = 2**32
348+
registry_type_map: dict[str, int]
348349

349350
@property
350351
def chain(self):
@@ -722,12 +723,19 @@ def _encode_scale(self, type_string, value: Any) -> bytes:
722723
if value is None:
723724
result = b"\x00"
724725
else:
726+
try:
727+
vec_acct_id = (
728+
f"scale_info::{self.registry_type_map['Vec<T::AccountId>']}"
729+
)
730+
except KeyError:
731+
vec_acct_id = "scale_info::152"
732+
725733
if type_string == "scale_info::0": # Is an AccountId
726734
# encode string into AccountId
727735
## AccountId is a composite type with one, unnamed field
728736
return bytes.fromhex(ss58_decode(value, SS58_FORMAT))
729737

730-
elif type_string == "scale_info::151": # Vec<AccountId>
738+
elif type_string == vec_acct_id: # Vec<AccountId>
731739
if not isinstance(value, (list, tuple)):
732740
value = [value]
733741

0 commit comments

Comments
 (0)