Skip to content

Commit 3f3d507

Browse files
committed
WIP check-in
1 parent a297127 commit 3f3d507

File tree

3 files changed

+44
-14
lines changed

3 files changed

+44
-14
lines changed

async_substrate_interface/async_substrate.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,9 @@ def __init__(
755755
ws_shutdown_timer: how long after the last connection your websocket should close
756756
757757
"""
758-
super().__init__(type_registry, type_registry_preset, use_remote_preset)
758+
super().__init__(
759+
type_registry, type_registry_preset, use_remote_preset, ss58_format
760+
)
759761
self.max_retries = max_retries
760762
self.retry_timeout = retry_timeout
761763
self.chain_endpoint = url
@@ -784,7 +786,6 @@ def __init__(
784786
}
785787
self.initialized = False
786788
self._forgettable_task = None
787-
self.ss58_format = ss58_format
788789
self.type_registry = type_registry
789790
self.type_registry_preset = type_registry_preset
790791
self.runtime_cache = RuntimeCache()
@@ -1057,10 +1058,12 @@ async def _get_runtime_for_version(
10571058
logger.debug(
10581059
f"Retrieved metadata and metadata v15 for {runtime_version} from Substrate node"
10591060
)
1060-
1061+
implements_scale_info = metadata.portable_registry is not None
10611062
runtime = Runtime(
10621063
chain=self.chain,
1063-
runtime_config=self.runtime_config,
1064+
runtime_config=self._runtime_config_copy(
1065+
implements_scale_info=implements_scale_info
1066+
),
10641067
metadata=metadata,
10651068
type_registry=self.type_registry,
10661069
metadata_v15=metadata_v15,

async_substrate_interface/sync_substrate.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,9 @@ def __init__(
506506
_log_raw_websockets: whether to log raw websocket requests during RPC requests
507507
508508
"""
509-
super().__init__(type_registry, type_registry_preset, use_remote_preset)
509+
super().__init__(
510+
type_registry, type_registry_preset, use_remote_preset, ss58_format
511+
)
510512
self.max_retries = max_retries
511513
self.retry_timeout = retry_timeout
512514
self.chain_endpoint = url
@@ -519,7 +521,6 @@ def __init__(
519521
"strict_scale_decode": True,
520522
}
521523
self.initialized = False
522-
self.ss58_format = ss58_format
523524
self.type_registry = type_registry
524525
self.type_registry_preset = type_registry_preset
525526
self.runtime_cache = RuntimeCache()
@@ -731,7 +732,9 @@ def init_runtime(
731732
if block_id is not None:
732733
if runtime := self.runtime_cache.retrieve(block=block_id):
733734
self.runtime = runtime
734-
return runtime
735+
self.runtime.load_runtime()
736+
self.runtime.load_registry_type_map()
737+
return self.runtime
735738
block_hash = self.get_block_hash(block_id)
736739

737740
if not block_hash:
@@ -740,7 +743,9 @@ def init_runtime(
740743
self.last_block_hash = block_hash
741744
if runtime := self.runtime_cache.retrieve(block_hash=block_hash):
742745
self.runtime = runtime
743-
return runtime
746+
self.runtime.load_runtime()
747+
self.runtime.load_registry_type_map()
748+
return self.runtime
744749

745750
runtime_version = self.get_block_runtime_version_for(block_hash)
746751
if runtime_version is None:
@@ -753,9 +758,13 @@ def init_runtime(
753758

754759
if runtime := self.runtime_cache.retrieve(runtime_version=runtime_version):
755760
self.runtime = runtime
761+
self.runtime.load_runtime()
762+
self.runtime.load_registry_type_map()
756763
return runtime
757764
else:
758765
self.runtime = self.get_runtime_for_version(runtime_version, block_hash)
766+
self.runtime.load_runtime()
767+
self.runtime.load_registry_type_map()
759768
return self.runtime
760769

761770
def get_runtime_for_version(
@@ -2525,7 +2534,9 @@ def runtime_call(
25252534
for idx, param in enumerate(runtime_call_def["inputs"]):
25262535
param_type_string = f"scale_info::{param['ty']}"
25272536
if isinstance(params, list):
2528-
param_data += self.encode_scale(param_type_string, params[idx], runtime=runtime)
2537+
param_data += self.encode_scale(
2538+
param_type_string, params[idx], runtime=runtime
2539+
)
25292540
else:
25302541
if param["name"] not in params:
25312542
raise ValueError(f"Runtime Call param '{param['name']}' is missing")

async_substrate_interface/types.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import copy
12
import logging
23
from abc import ABC
34
from collections import defaultdict
@@ -91,11 +92,11 @@ def __init__(
9192
self.registry = registry
9293
self.runtime_version = runtime_info.get("specVersion")
9394
self.transaction_version = runtime_info.get("transactionVersion")
94-
self._load_runtime()
95+
self.load_runtime()
9596
if registry is not None:
96-
self._load_registry_type_map()
97+
self.load_registry_type_map()
9798

98-
def _load_runtime(self):
99+
def load_runtime(self):
99100
# Update type registry
100101
self.reload_type_registry(use_remote_preset=False, auto_discover=True)
101102

@@ -208,7 +209,7 @@ def apply_type_registry_presets(
208209
# Load type registries in runtime configuration
209210
self.runtime_config.update_type_registry(self.type_registry)
210211

211-
def _load_registry_type_map(self):
212+
def load_registry_type_map(self):
212213
registry_type_map = {}
213214
type_id_to_name = {}
214215
types = json.loads(self.registry.registry)["types"]
@@ -512,9 +513,11 @@ def __init__(
512513
type_registry: Optional[dict] = None,
513514
type_registry_preset: Optional[str] = None,
514515
use_remote_preset: bool = False,
516+
ss58_format: Optional[int] = None,
515517
):
516518
# We load a very basic RuntimeConfigurationObject that is only used for the initial metadata decoding
517-
self.runtime_config = RuntimeConfigurationObject()
519+
self.runtime_config = RuntimeConfigurationObject(ss58_format=ss58_format)
520+
self.ss58_format = ss58_format
518521
self.runtime_config.update_type_registry(load_type_registry_preset(name="core"))
519522
if type_registry_preset is not None:
520523
type_registry_preset_dict = load_type_registry_preset(
@@ -537,6 +540,19 @@ def __init__(
537540
# Load type registries in runtime configuration
538541
self.runtime_config.update_type_registry(type_registry)
539542

543+
def _runtime_config_copy(self, implements_scale_info: bool = False):
544+
runtime_config = RuntimeConfigurationObject(
545+
ss58_format=self.ss58_format, implements_scale_info=implements_scale_info
546+
)
547+
runtime_config.active_spec_version_id = (
548+
self.runtime_config.active_spec_version_id
549+
)
550+
runtime_config.chain_id = self.runtime_config.chain_id
551+
# TODO. This works, but deepcopy does not. Indicating this gets updated somewhere else.
552+
runtime_config.type_registry = self.runtime_config.type_registry
553+
assert runtime_config.type_registry == self.runtime_config.type_registry
554+
return runtime_config
555+
540556
@property
541557
def chain(self):
542558
"""

0 commit comments

Comments
 (0)