Skip to content

Commit 7528c52

Browse files
committed
Use Address and Signature types stored in MetadataV15
1 parent 0dbb0c4 commit 7528c52

File tree

2 files changed

+57
-26
lines changed

2 files changed

+57
-26
lines changed

scalecodec/base.py

+53-26
Original file line numberDiff line numberDiff line change
@@ -532,42 +532,69 @@ def add_portable_registry(self, metadata: 'GenericMetadataVersioned', prefix=Non
532532

533533
# Process extrinsic type in metadata to register correct Address and ExtrinsicSignature types
534534
try:
535-
# Retrieve Extrinsic using common namespace
536-
extrinsic_type = self.get_decoder_class("sp_runtime::generic::unchecked_extrinsic::UncheckedExtrinsic")
537535

538-
# Try to fall back on extrinsic type in metadata
539-
if extrinsic_type is None:
540-
extrinsic_type_id = metadata[1][1]['extrinsic']['ty'].value
541-
extrinsic_type = self.get_decoder_class(f"{prefix}::{extrinsic_type_id}")
536+
if metadata.version >= 15:
542537

543-
if extrinsic_type is not None:
544-
# Extract Address and Signature type and set in type registry
538+
extrinsic_dict = metadata[1][1]['extrinsic'].value
545539

546-
types_dict = {}
540+
address_type_string = f"{prefix}::{extrinsic_dict['address_type']}"
547541

548-
for param in extrinsic_type.scale_info_type.value['params']:
549-
if param['name'] == 'Address':
542+
# Update type registry
543+
types_dict = {
544+
"Address": address_type_string,
545+
"AccountId": address_type_string,
546+
"LookupSource": address_type_string,
547+
"ExtrinsicSignature": f"{prefix}::{extrinsic_dict['signature_type']}"
548+
}
550549

551-
type_string = f'{prefix}::{param["type"]}'
550+
# Check if Address is MultiAddress
551+
addres_type = self.get_decoder_class(address_type_string)
552552

553-
types_dict['Address'] = type_string
554-
types_dict['AccountId'] = type_string
555-
types_dict['LookupSource'] = type_string
553+
if addres_type is self.get_decoder_class('sp_runtime::multiaddress::MultiAddress'):
554+
for address_param in addres_type.scale_info_type.value['params']:
555+
if address_param['name'] == 'AccountId':
556+
# Set AccountId
557+
types_dict['AccountId'] = f'{prefix}::{address_param["type"]}'
556558

557-
# Check if Address is MultiAddress
558-
addres_type = self.get_decoder_class(type_string)
559+
self.update_type_registry_types(types_dict)
560+
else:
559561

560-
if addres_type is self.get_decoder_class('sp_runtime::multiaddress::MultiAddress'):
561-
for address_param in addres_type.scale_info_type.value['params']:
562-
if address_param['name'] == 'AccountId':
563-
# Set AccountId
564-
types_dict['AccountId'] = f'{prefix}::{address_param["type"]}'
562+
# Retrieve Extrinsic using common namespace
563+
extrinsic_type = self.get_decoder_class("sp_runtime::generic::unchecked_extrinsic::UncheckedExtrinsic")
565564

566-
elif param['name'] == 'Signature':
567-
types_dict['ExtrinsicSignature'] = f'{prefix}::{param["type"]}'
565+
# Try to fall back on extrinsic type in metadata
566+
if extrinsic_type is None:
567+
extrinsic_type_id = metadata[1][1]['extrinsic']['ty'].value
568+
extrinsic_type = self.get_decoder_class(f"{prefix}::{extrinsic_type_id}")
568569

569-
# Update type registry
570-
self.update_type_registry_types(types_dict)
570+
if extrinsic_type is not None:
571+
# Extract Address and Signature type and set in type registry
572+
573+
types_dict = {}
574+
575+
for param in extrinsic_type.scale_info_type.value['params']:
576+
if param['name'] == 'Address':
577+
578+
type_string = f'{prefix}::{param["type"]}'
579+
580+
types_dict['Address'] = type_string
581+
types_dict['AccountId'] = type_string
582+
types_dict['LookupSource'] = type_string
583+
584+
# Check if Address is MultiAddress
585+
addres_type = self.get_decoder_class(type_string)
586+
587+
if addres_type is self.get_decoder_class('sp_runtime::multiaddress::MultiAddress'):
588+
for address_param in addres_type.scale_info_type.value['params']:
589+
if address_param['name'] == 'AccountId':
590+
# Set AccountId
591+
types_dict['AccountId'] = f'{prefix}::{address_param["type"]}'
592+
593+
elif param['name'] == 'Signature':
594+
types_dict['ExtrinsicSignature'] = f'{prefix}::{param["type"]}'
595+
596+
# Update type registry
597+
self.update_type_registry_types(types_dict)
571598
except NotImplementedError:
572599
pass
573600

scalecodec/types.py

+4
Original file line numberDiff line numberDiff line change
@@ -2307,6 +2307,10 @@ def get_module_error(self, module_index, error_index):
23072307
def get_metadata(self):
23082308
return self.value_object[1]
23092309

2310+
@property
2311+
def version(self) -> int:
2312+
return self.value_object[1].index
2313+
23102314
@property
23112315
def portable_registry(self):
23122316
return self.value_object[1].portable_registry

0 commit comments

Comments
 (0)