Skip to content

Commit 7c38964

Browse files
author
µ
committed
make asyncsubstrate.runtime a real property, move version dependent properties from asyncsubstrate to asyncsubstrate.runtime
1 parent c0db16a commit 7c38964

File tree

1 file changed

+37
-45
lines changed

1 file changed

+37
-45
lines changed

async_substrate_interface/async_substrate.py

Lines changed: 37 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -777,7 +777,7 @@ async def name(self):
777777

778778
async def get_storage_item(self, module: str, storage_function: str, block_hash: str = None):
779779
await self.init_runtime(block_hash=block_hash)
780-
metadata_pallet = self._metadata.get_metadata_pallet(module)
780+
metadata_pallet = self.runtime.metadata.get_metadata_pallet(module)
781781
storage_item = metadata_pallet.get_storage_function(storage_function)
782782
return storage_item
783783

@@ -815,18 +815,18 @@ async def _load_registry_at_block(self, block_hash: Optional[str]) -> MetadataV1
815815
metadata_option_hex_str = metadata_rpc_result["result"]
816816
metadata_option_bytes = bytes.fromhex(metadata_option_hex_str[2:])
817817
metadata = MetadataV15.decode_from_metadata_option(metadata_option_bytes)
818-
self.registry = PortableRegistry.from_metadata_v15(metadata)
819-
self._load_registry_type_map()
820-
return metadata
818+
registry = PortableRegistry.from_metadata_v15(metadata)
819+
self._load_registry_type_map(registry)
820+
return metadata,registry
821821

822822
async def _wait_for_registry(self, _attempt: int = 1, _retries: int = 3) -> None:
823823
async def _waiter():
824-
while self.registry is None:
824+
while self.runtime.registry is None:
825825
await asyncio.sleep(0.1)
826826
return
827827

828828
try:
829-
if not self.registry:
829+
if not self.runtime.registry:
830830
await asyncio.wait_for(_waiter(), timeout=10)
831831
except TimeoutError:
832832
# indicates that registry was never loaded
@@ -893,25 +893,22 @@ async def decode_scale(
893893
return ss58_encode(scale_bytes, SS58_FORMAT)
894894
else:
895895
await self._wait_for_registry(_attempt, _retries)
896-
obj = decode_by_type_string(type_string, self.registry, scale_bytes)
896+
obj = decode_by_type_string(type_string, self.runtime.registry, scale_bytes)
897897
if return_scale_obj:
898898
return ScaleObj(obj)
899899
else:
900900
return obj
901901

902-
async def load_runtime(self,runtime_info=None,metadata=None,metadata_v15=None,registry=None):
902+
async def load_runtime(self,runtime):
903903
# Update type registry
904904
self.reload_type_registry(use_remote_preset=False, auto_discover=True)
905905

906-
self.metadata_v15 = metadata_v15
907-
self.registry = registry
908-
self.runtime_version = runtime_info.get("specVersion")
909-
self._metadata = metadata
910-
self.runtime_config.set_active_spec_version_id(self.runtime_version)
911-
self.transaction_version = runtime_info.get("transactionVersion")
906+
self.runtime = runtime
907+
908+
self.runtime_config.set_active_spec_version_id(runtime.runtime_version)
912909
if self.implements_scaleinfo:
913910
logger.debug("Add PortableRegistry from metadata to type registry")
914-
self.runtime_config.add_portable_registry(metadata)
911+
self.runtime_config.add_portable_registry(runtime.metadata)
915912
# Set runtime compatibility flags
916913
try:
917914
_ = self.runtime_config.create_scale_object("sp_weights::weight_v2::Weight")
@@ -957,7 +954,7 @@ async def init_runtime(
957954
f"No runtime information for block '{block_hash}'"
958955
)
959956

960-
if runtime_version == self.runtime_version:
957+
if self.runtime and runtime_version == self.runtime.runtime_version:
961958
return
962959

963960
runtime = self.runtime_cache.retrieve(runtime_version=runtime_version)
@@ -984,7 +981,7 @@ async def init_runtime(
984981
)
985982
)
986983

987-
metadata_v15 = await self._load_registry_at_block(block_hash=runtime_block_hash)
984+
metadata_v15,registry = await self._load_registry_at_block(block_hash=runtime_block_hash)
988985
logger.debug(
989986
"Retrieved metadata v15 for {} from Substrate node".format(
990987
runtime_version
@@ -998,16 +995,11 @@ async def init_runtime(
998995
type_registry=self.type_registry,
999996
metadata_v15=metadata_v15,
1000997
runtime_info=runtime_info,
1001-
registry=self.registry,
998+
registry=registry,
1002999
)
10031000
self.runtime_cache.add_item(runtime_version=runtime_version, runtime=runtime)
10041001

1005-
await self.load_runtime(
1006-
runtime_info=runtime.runtime_info,
1007-
metadata=runtime.metadata,
1008-
metadata_v15=runtime.metadata_v15,
1009-
registry=runtime.registry,
1010-
)
1002+
await self.load_runtime(runtime)
10111003

10121004
if self.ss58_format is None:
10131005
# Check and apply runtime constants
@@ -1044,7 +1036,7 @@ async def create_storage_key(
10441036
storage_function,
10451037
params,
10461038
runtime_config=self.runtime_config,
1047-
metadata=self._metadata,
1039+
metadata=self.runtime.metadata,
10481040
)
10491041

10501042
async def get_metadata_storage_functions(self, block_hash=None) -> list:
@@ -1069,7 +1061,7 @@ async def get_metadata_storage_functions(self, block_hash=None) -> list:
10691061
self.serialize_storage_item(
10701062
storage_item=storage,
10711063
module=module,
1072-
spec_version_id=self.runtime_version,
1064+
spec_version_id=self.runtime.runtime_version,
10731065
)
10741066
)
10751067

@@ -1112,14 +1104,14 @@ async def get_metadata_errors(
11121104

11131105
error_list = []
11141106

1115-
for module_idx, module in enumerate(self._metadata.pallets):
1107+
for module_idx, module in enumerate(self.runtime.metadata.pallets):
11161108
if module.errors:
11171109
for error in module.errors:
11181110
error_list.append(
11191111
self.serialize_module_error(
11201112
module=module,
11211113
error=error,
1122-
spec_version=self.runtime_version,
1114+
spec_version=self.runtime.runtime_version,
11231115
)
11241116
)
11251117

@@ -1140,7 +1132,7 @@ async def get_metadata_error(self, module_name, error_name, block_hash=None):
11401132
"""
11411133
await self.init_runtime(block_hash=block_hash)
11421134

1143-
for module_idx, module in enumerate(self._metadata.pallets):
1135+
for module_idx, module in enumerate(self.runtime.metadata.pallets):
11441136
if module.name == module_name and module.errors:
11451137
for error in module.errors:
11461138
if error_name == error.name:
@@ -1233,7 +1225,7 @@ async def decode_block(block_data, block_data_hash=None) -> dict[str, Any]:
12331225
try:
12341226
extrinsic_decoder = extrinsic_cls(
12351227
data=ScaleBytes(extrinsic_data),
1236-
metadata=self._metadata,
1228+
metadata=self.runtime.metadata,
12371229
runtime_config=self.runtime_config,
12381230
)
12391231
extrinsic_decoder.decode(check_remaining=True)
@@ -1761,7 +1753,7 @@ async def _preprocess(
17611753
"""
17621754
params = query_for if query_for else []
17631755
# Search storage call in metadata
1764-
metadata_pallet = self._metadata.get_metadata_pallet(module)
1756+
metadata_pallet = self.runtime.metadata.get_metadata_pallet(module)
17651757

17661758
if not metadata_pallet:
17671759
raise SubstrateRequestException(f'Pallet "{module}" not found')
@@ -1797,7 +1789,7 @@ async def _preprocess(
17971789
storage_item.value["name"],
17981790
params,
17991791
runtime_config=self.runtime_config,
1800-
metadata=self._metadata,
1792+
metadata=self.runtime.metadata,
18011793
)
18021794
method = "state_getStorageAt"
18031795
return Preprocessed(
@@ -2048,7 +2040,7 @@ async def compose_call(
20482040
await self.init_runtime(block_hash=block_hash)
20492041

20502042
call = self.runtime_config.create_scale_object(
2051-
type_string="Call", metadata=self._metadata
2043+
type_string="Call", metadata=self.runtime.metadata
20522044
)
20532045

20542046
call.encode(
@@ -2227,12 +2219,12 @@ async def generate_signature_payload(
22272219
)
22282220

22292221
# Process signed extensions in metadata
2230-
if "signed_extensions" in self._metadata[1][1]["extrinsic"]:
2222+
if "signed_extensions" in self.runtime.metadata[1][1]["extrinsic"]:
22312223
# Base signature payload
22322224
signature_payload.type_mapping = [["call", "CallBytes"]]
22332225

22342226
# Add signed extensions to payload
2235-
signed_extensions = self._metadata.get_signed_extensions()
2227+
signed_extensions = self.runtime.metadata.get_signed_extensions()
22362228

22372229
if "CheckMortality" in signed_extensions:
22382230
signature_payload.type_mapping.append(
@@ -2321,10 +2313,10 @@ async def generate_signature_payload(
23212313
"era": era,
23222314
"nonce": nonce,
23232315
"tip": tip,
2324-
"spec_version": self.runtime_version,
2316+
"spec_version": self.runtime.runtime_version,
23252317
"genesis_hash": genesis_hash,
23262318
"block_hash": block_hash,
2327-
"transaction_version": self.transaction_version,
2319+
"transaction_version": self.runtime.transaction_version,
23282320
"asset_id": {"tip": tip, "asset_id": tip_asset_id},
23292321
"metadata_hash": None,
23302322
"mode": "Disabled",
@@ -2373,9 +2365,9 @@ async def create_signed_extrinsic(
23732365
raise TypeError("'call' must be of type Call")
23742366

23752367
# Check if extrinsic version is supported
2376-
if self._metadata[1][1]["extrinsic"]["version"] != 4: # type: ignore
2368+
if self.runtime.metadata[1][1]["extrinsic"]["version"] != 4: # type: ignore
23772369
raise NotImplementedError(
2378-
f"Extrinsic version {self._metadata[1][1]['extrinsic']['version']} not supported" # type: ignore
2370+
f"Extrinsic version {self.runtime.metadata[1][1]['extrinsic']['version']} not supported" # type: ignore
23792371
)
23802372

23812373
# Retrieve nonce
@@ -2417,7 +2409,7 @@ async def create_signed_extrinsic(
24172409

24182410
# Create extrinsic
24192411
extrinsic = self.runtime_config.create_scale_object(
2420-
type_string="Extrinsic", metadata=self._metadata
2412+
type_string="Extrinsic", metadata=self.runtime.metadata
24212413
)
24222414

24232415
value = {
@@ -2533,7 +2525,7 @@ async def runtime_call(
25332525
params = {}
25342526

25352527
try:
2536-
metadata_v15_value = self.metadata_v15.value()
2528+
metadata_v15_value = self.runtime.metadata_v15.value()
25372529

25382530
apis = {entry["name"]: entry for entry in metadata_v15_value["apis"]}
25392531
api_entry = apis[api]
@@ -2641,7 +2633,7 @@ async def get_metadata_constant(self, module_name, constant_name, block_hash=Non
26412633
"""
26422634
await self.init_runtime(block_hash=block_hash)
26432635

2644-
for module in self._metadata.pallets:
2636+
for module in self.runtime.metadata.pallets:
26452637
if module_name == module.name and module.constants:
26462638
for constant in module.constants:
26472639
if constant_name == constant.value["name"]:
@@ -2790,7 +2782,7 @@ async def get_metadata_modules(self, block_hash=None) -> list[dict[str, Any]]:
27902782
"metadata_index": idx,
27912783
"module_id": module.get_identifier(),
27922784
"name": module.name,
2793-
"spec_version": self.runtime_version,
2785+
"spec_version": self.runtime.runtime_version,
27942786
"count_call_functions": len(module.calls or []),
27952787
"count_storage_functions": len(module.storage or []),
27962788
"count_events": len(module.events or []),
@@ -2907,7 +2899,7 @@ async def query_map(
29072899
self.last_block_hash = block_hash
29082900
await self.init_runtime(block_hash=block_hash)
29092901

2910-
metadata_pallet = self._metadata.get_metadata_pallet(module)
2902+
metadata_pallet = self.runtime.metadata.get_metadata_pallet(module)
29112903
if not metadata_pallet:
29122904
raise ValueError(f'Pallet "{module}" not found')
29132905
storage_item = metadata_pallet.get_storage_function(storage_function)
@@ -2935,7 +2927,7 @@ async def query_map(
29352927
storage_item.value["name"],
29362928
params,
29372929
runtime_config=self.runtime_config,
2938-
metadata=self._metadata,
2930+
metadata=self.runtime.metadata,
29392931
)
29402932
prefix = storage_key.to_hex()
29412933

0 commit comments

Comments
 (0)