5858 get_next_id ,
5959 rng as random ,
6060)
61- from async_substrate_interface .utils .cache import async_sql_lru_cache , CachedFetcher
61+ from async_substrate_interface .utils .cache import (
62+ async_sql_lru_cache ,
63+ CachedFetcher ,
64+ cached_fetcher ,
65+ )
6266from async_substrate_interface .utils .decoding import (
6367 _determine_if_old_runtime_call ,
6468 _bt_decode_to_dict_or_list ,
@@ -794,12 +798,6 @@ def __init__(
794798 self .registry_type_map = {}
795799 self .type_id_to_name = {}
796800 self ._mock = _mock
797- self ._block_hash_fetcher = CachedFetcher (512 , self ._get_block_hash )
798- self ._parent_hash_fetcher = CachedFetcher (512 , self ._get_parent_block_hash )
799- self ._runtime_info_fetcher = CachedFetcher (16 , self ._get_block_runtime_info )
800- self ._runtime_version_for_fetcher = CachedFetcher (
801- 512 , self ._get_block_runtime_version_for
802- )
803801
804802 async def __aenter__ (self ):
805803 if not self ._mock :
@@ -1044,35 +1042,7 @@ async def init_runtime(
10441042 if not runtime :
10451043 self .last_block_hash = block_hash
10461044
1047- runtime_block_hash = await self .get_parent_block_hash (block_hash )
1048-
1049- runtime_info = await self .get_block_runtime_info (runtime_block_hash )
1050-
1051- metadata , (metadata_v15 , registry ) = await asyncio .gather (
1052- self .get_block_metadata (block_hash = runtime_block_hash , decode = True ),
1053- self ._load_registry_at_block (block_hash = runtime_block_hash ),
1054- )
1055- if metadata is None :
1056- # does this ever happen?
1057- raise SubstrateRequestException (
1058- f"No metadata for block '{ runtime_block_hash } '"
1059- )
1060- logger .debug (
1061- f"Retrieved metadata and metadata v15 for { runtime_version } from Substrate node"
1062- )
1063-
1064- runtime = Runtime (
1065- chain = self .chain ,
1066- runtime_config = self .runtime_config ,
1067- metadata = metadata ,
1068- type_registry = self .type_registry ,
1069- metadata_v15 = metadata_v15 ,
1070- runtime_info = runtime_info ,
1071- registry = registry ,
1072- )
1073- self .runtime_cache .add_item (
1074- runtime_version = runtime_version , runtime = runtime
1075- )
1045+ runtime = await self .get_runtime_for_version (runtime_version , block_hash )
10761046
10771047 self .load_runtime (runtime )
10781048
@@ -1086,6 +1056,42 @@ async def init_runtime(
10861056 self .ss58_format = ss58_prefix_constant
10871057 return runtime
10881058
1059+ @cached_fetcher (max_size = 16 , cache_key_index = 0 )
1060+ async def get_runtime_for_version (
1061+ self , runtime_version : int , block_hash : Optional [str ] = None
1062+ ) -> Runtime :
1063+ return await self ._get_runtime_for_version (runtime_version , block_hash )
1064+
1065+ async def _get_runtime_for_version (
1066+ self , runtime_version : int , block_hash : Optional [str ] = None
1067+ ) -> Runtime :
1068+ runtime_block_hash = await self .get_parent_block_hash (block_hash )
1069+ runtime_info , metadata , (metadata_v15 , registry ) = await asyncio .gather (
1070+ self .get_block_runtime_info (runtime_block_hash ),
1071+ self .get_block_metadata (block_hash = runtime_block_hash , decode = True ),
1072+ self ._load_registry_at_block (block_hash = runtime_block_hash ),
1073+ )
1074+ if metadata is None :
1075+ # does this ever happen?
1076+ raise SubstrateRequestException (
1077+ f"No metadata for block '{ runtime_block_hash } '"
1078+ )
1079+ logger .debug (
1080+ f"Retrieved metadata and metadata v15 for { runtime_version } from Substrate node"
1081+ )
1082+
1083+ runtime = Runtime (
1084+ chain = self .chain ,
1085+ runtime_config = self .runtime_config ,
1086+ metadata = metadata ,
1087+ type_registry = self .type_registry ,
1088+ metadata_v15 = metadata_v15 ,
1089+ runtime_info = runtime_info ,
1090+ registry = registry ,
1091+ )
1092+ self .runtime_cache .add_item (runtime_version = runtime_version , runtime = runtime )
1093+ return runtime
1094+
10891095 async def create_storage_key (
10901096 self ,
10911097 pallet : str ,
@@ -1921,8 +1927,9 @@ async def get_metadata(self, block_hash=None) -> MetadataV15:
19211927
19221928 return runtime .metadata_v15
19231929
1930+ @cached_fetcher (max_size = 512 )
19241931 async def get_parent_block_hash (self , block_hash ):
1925- return await self ._parent_hash_fetcher . execute (block_hash )
1932+ return await self ._get_parent_block_hash (block_hash )
19261933
19271934 async def _get_parent_block_hash (self , block_hash ):
19281935 block_header = await self .rpc_request ("chain_getHeader" , [block_hash ])
@@ -1967,8 +1974,9 @@ async def get_storage_by_key(self, block_hash: str, storage_key: str) -> Any:
19671974 "Unknown error occurred during retrieval of events"
19681975 )
19691976
1977+ @cached_fetcher (max_size = 16 )
19701978 async def get_block_runtime_info (self , block_hash : str ) -> dict :
1971- return await self ._runtime_info_fetcher . execute (block_hash )
1979+ return await self ._get_block_runtime_info (block_hash )
19721980
19731981 get_block_runtime_version = get_block_runtime_info
19741982
@@ -1979,8 +1987,9 @@ async def _get_block_runtime_info(self, block_hash: str) -> dict:
19791987 response = await self .rpc_request ("state_getRuntimeVersion" , [block_hash ])
19801988 return response .get ("result" )
19811989
1990+ @cached_fetcher (max_size = 512 )
19821991 async def get_block_runtime_version_for (self , block_hash : str ):
1983- return await self ._runtime_version_for_fetcher . execute (block_hash )
1992+ return await self ._get_block_runtime_version_for (block_hash )
19841993
19851994 async def _get_block_runtime_version_for (self , block_hash : str ):
19861995 """
@@ -2296,8 +2305,9 @@ async def rpc_request(
22962305 else :
22972306 raise SubstrateRequestException (result [payload_id ][0 ])
22982307
2308+ @cached_fetcher (max_size = 512 )
22992309 async def get_block_hash (self , block_id : int ) -> str :
2300- return await self ._block_hash_fetcher . execute (block_id )
2310+ return await self ._get_block_hash (block_id )
23012311
23022312 async def _get_block_hash (self , block_id : int ) -> str :
23032313 return (await self .rpc_request ("chain_getBlockHash" , [block_id ]))["result" ]
0 commit comments