Skip to content

Commit 56af822

Browse files
authored
Autodetect Address and ExtrinsicSignature types in PortableRegistry (#103)
1 parent 4e180a4 commit 56af822

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

scalecodec/base.py

+37-2
Original file line numberDiff line numberDiff line change
@@ -509,12 +509,47 @@ def update_from_scale_info_types(self, scale_info_types: list, prefix: str = Non
509509

510510
def add_portable_registry(self, metadata: 'GenericMetadataVersioned', prefix=None):
511511

512+
if prefix is None:
513+
prefix = 'scale_info'
514+
512515
scale_info_types = metadata.portable_registry.value_object['types'].value_object
513516

514517
self.update_from_scale_info_types(scale_info_types, prefix=prefix)
515518

516-
# Todo process extrinsic types
517-
pass
519+
# Process extrinsic type in metadata to register correct Address and ExtrinsicSignature types
520+
try:
521+
extrinsic_type_id = metadata[1][1]['extrinsic']['ty'].value
522+
523+
extrinsic_type = self.get_decoder_class(f"{prefix}::{extrinsic_type_id}")
524+
525+
types_dict = {}
526+
527+
for param in extrinsic_type.scale_info_type.value['params']:
528+
if param['name'] == 'Address':
529+
530+
type_string = f'{prefix}::{param["type"]}'
531+
532+
types_dict['Address'] = type_string
533+
types_dict['AccountId'] = type_string
534+
types_dict['LookupSource'] = type_string
535+
536+
# Check if Address is MultiAddress
537+
addres_type = self.get_decoder_class(type_string)
538+
539+
if addres_type is self.get_decoder_class('sp_runtime::multiaddress::MultiAddress'):
540+
for address_param in addres_type.scale_info_type.value['params']:
541+
if address_param['name'] == 'AccountId':
542+
# Set AccountId
543+
types_dict['AccountId'] = f'{prefix}::{address_param["type"]}'
544+
545+
elif param['name'] == 'Signature':
546+
types_dict['ExtrinsicSignature'] = f'{prefix}::{param["type"]}'
547+
548+
# Update type registry
549+
self.update_type_registry_types(types_dict)
550+
except NotImplementedError:
551+
pass
552+
518553

519554
def add_contract_metadata_dict_to_type_registry(self, metadata_dict):
520555
# TODO

0 commit comments

Comments
 (0)