@@ -281,17 +281,26 @@ async def process_events(self):
281281 self .__weight = dispatch_info ["weight" ]
282282
283283 if "Module" in dispatch_error :
284- module_index = dispatch_error ["Module" ][ 0 ][ "index" ]
285- error_index = int . from_bytes (
286- bytes ( dispatch_error ["Module" ][0 ][ "error" ]),
287- byteorder = "little" ,
288- signed = False ,
289- )
284+ if isinstance ( dispatch_error ["Module" ], tuple ):
285+ module_index = dispatch_error [ "Module" ][ 0 ]
286+ error_index = dispatch_error ["Module" ][1 ]
287+ else :
288+ module_index = dispatch_error [ "Module" ][ "index" ]
289+ error_index = dispatch_error [ "Module" ][ "error" ]
290290
291291 if isinstance (error_index , str ):
292292 # Actual error index is first u8 in new [u8; 4] format
293293 error_index = int (error_index [2 :4 ], 16 )
294- module_error = self .substrate .metadata .get_module_error (
294+
295+ if self .block_hash :
296+ runtime = await self .substrate .init_runtime (
297+ block_hash = self .block_hash
298+ )
299+ else :
300+ runtime = await self .substrate .init_runtime (
301+ block_id = self .block_number
302+ )
303+ module_error = runtime .metadata .get_module_error (
295304 module_index = module_index , error_index = error_index
296305 )
297306 self .__error_message = {
@@ -823,6 +832,7 @@ async def initialize(self):
823832 if ss58_prefix_constant :
824833 self .ss58_format = ss58_prefix_constant .value
825834 runtime .ss58_format = ss58_prefix_constant .value
835+ runtime .runtime_config .ss58_format = ss58_prefix_constant .value
826836 self .initialized = True
827837 self ._initializing = False
828838
@@ -999,7 +1009,7 @@ async def decode_scale(
9991009 else :
10001010 if not runtime :
10011011 runtime = await self .init_runtime (block_hash = block_hash )
1002- if runtime .metadata_v15 is not None or force_legacy is True :
1012+ if runtime .metadata_v15 is not None and force_legacy is False :
10031013 obj = decode_by_type_string (type_string , runtime .registry , scale_bytes )
10041014 if self .decode_ss58 :
10051015 try :
@@ -1930,7 +1940,13 @@ def convert_event_data(data):
19301940 if key == "who" :
19311941 who = ss58_encode (bytes (value [0 ]), self .ss58_format )
19321942 attributes ["who" ] = who
1933- if isinstance (value , dict ):
1943+ elif key == "from" :
1944+ who_from = ss58_encode (bytes (value [0 ]), self .ss58_format )
1945+ attributes ["from" ] = who_from
1946+ elif key == "to" :
1947+ who_to = ss58_encode (bytes (value [0 ]), self .ss58_format )
1948+ attributes ["to" ] = who_to
1949+ elif isinstance (value , dict ):
19341950 # Convert nested single-key dictionaries to their keys as strings
19351951 for sub_key , sub_value in value .items ():
19361952 if isinstance (sub_value , dict ):
@@ -1958,16 +1974,15 @@ def convert_event_data(data):
19581974 block_hash = await self .get_chain_head ()
19591975
19601976 storage_obj = await self .query (
1961- module = "System" , storage_function = "Events" , block_hash = block_hash
1977+ module = "System" ,
1978+ storage_function = "Events" ,
1979+ block_hash = block_hash ,
1980+ force_legacy_decode = True ,
19621981 )
1982+ # bt-decode Metadata V15 is not ideal for events. Force legacy decoding for this
19631983 if storage_obj :
19641984 for item in list (storage_obj ):
1965- try :
1966- events .append (convert_event_data (item ))
1967- except (
1968- AttributeError
1969- ): # indicates this was legacy decoded with scalecodec
1970- events .append (item )
1985+ events .append (item )
19711986 return events
19721987
19731988 async def get_metadata (self , block_hash = None ) -> MetadataV15 :
@@ -2175,6 +2190,7 @@ async def _process_response(
21752190 storage_item : Optional [ScaleType ] = None ,
21762191 result_handler : Optional [ResultHandler ] = None ,
21772192 runtime : Optional [Runtime ] = None ,
2193+ force_legacy_decode : bool = False ,
21782194 ) -> tuple [Any , bool ]:
21792195 """
21802196 Processes the RPC call response by decoding it, returning it as is, or setting a handler for subscriptions,
@@ -2187,6 +2203,7 @@ async def _process_response(
21872203 storage_item: The ScaleType object used for decoding ScaleBytes results
21882204 result_handler: the result handler coroutine used for handling longer-running subscriptions
21892205 runtime: Optional Runtime to use for decoding. If not specified, the currently-loaded `self.runtime` is used
2206+ force_legacy_decode: Whether to force the use of the legacy Metadata V14 decoder
21902207
21912208 Returns:
21922209 (decoded response, completion)
@@ -2208,7 +2225,9 @@ async def _process_response(
22082225 q = bytes (query_value )
22092226 else :
22102227 q = query_value
2211- result = await self .decode_scale (value_scale_type , q , runtime = runtime )
2228+ result = await self .decode_scale (
2229+ value_scale_type , q , runtime = runtime , force_legacy = force_legacy_decode
2230+ )
22122231 if asyncio .iscoroutinefunction (result_handler ):
22132232 # For multipart responses as a result of subscriptions.
22142233 message , bool_result = await result_handler (result , subscription_id )
@@ -2223,6 +2242,7 @@ async def _make_rpc_request(
22232242 result_handler : Optional [ResultHandler ] = None ,
22242243 attempt : int = 1 ,
22252244 runtime : Optional [Runtime ] = None ,
2245+ force_legacy_decode : bool = False ,
22262246 ) -> RequestManager .RequestResults :
22272247 request_manager = RequestManager (payloads )
22282248
@@ -2267,6 +2287,7 @@ async def _make_rpc_request(
22672287 storage_item ,
22682288 result_handler ,
22692289 runtime = runtime ,
2290+ force_legacy_decode = force_legacy_decode ,
22702291 )
22712292
22722293 request_manager .add_response (
@@ -2298,6 +2319,7 @@ async def _make_rpc_request(
22982319 storage_item ,
22992320 result_handler ,
23002321 attempt + 1 ,
2322+ force_legacy_decode ,
23012323 )
23022324
23032325 return request_manager .get_results ()
@@ -3323,6 +3345,7 @@ async def query(
33233345 subscription_handler = None ,
33243346 reuse_block_hash : bool = False ,
33253347 runtime : Optional [Runtime ] = None ,
3348+ force_legacy_decode : bool = False ,
33263349 ) -> Optional [Union ["ScaleObj" , Any ]]:
33273350 """
33283351 Queries substrate. This should only be used when making a single request. For multiple requests,
@@ -3355,6 +3378,7 @@ async def query(
33553378 storage_item ,
33563379 result_handler = subscription_handler ,
33573380 runtime = runtime ,
3381+ force_legacy_decode = force_legacy_decode ,
33583382 )
33593383 result = responses [preprocessed .queryable ][0 ]
33603384 if isinstance (result , (list , tuple , int , float )):
0 commit comments