33
44import { Registry } from '../types' ;
55
6- import { isString , u8aConcat } from '@polkadot/util' ;
6+ import { isBn , isNumber , isString , isU8a } from '@polkadot/util' ;
77import { decodeAddress } from '@polkadot/util-crypto' ;
88
99import { Enum } from '../codec/Enum' ;
10+ import { GenericAccountId } from './AccountId' ;
11+ import { GenericAccountIndex } from './AccountIndex' ;
12+
13+ function decodeMultiU8a ( registry : Registry , value ?: unknown ) : unknown {
14+ if ( isU8a ( value ) && value . length <= 32 ) {
15+ if ( value . length === 32 ) {
16+ return { id : value } ;
17+ } else if ( value . length === 20 ) {
18+ return { Address20 : value } ;
19+ } else {
20+ return decodeMultiAny ( registry , registry . createType ( 'AccountIndex' , value ) ) ;
21+ }
22+ }
23+
24+ return value ;
25+ }
26+
27+ function decodeMultiAny ( registry : Registry , value ?: unknown ) : unknown {
28+ if ( value instanceof GenericMultiAddress ) {
29+ return value ;
30+ } else if ( value instanceof GenericAccountId ) {
31+ return { Id : value } ;
32+ } else if ( value instanceof GenericAccountIndex || isNumber ( value ) || isBn ( value ) ) {
33+ return { Index : registry . createType ( 'Compact<AccountIndex>' , value ) } ;
34+ } else if ( isString ( value ) ) {
35+ return decodeMultiU8a ( registry , decodeAddress ( value . toString ( ) ) ) ;
36+ }
37+
38+ return decodeMultiU8a ( registry , value ) ;
39+ }
1040
1141export class GenericMultiAddress extends Enum {
1242 constructor ( registry : Registry , value ?: unknown ) {
@@ -18,21 +48,7 @@ export class GenericMultiAddress extends Enum {
1848 Address32 : 'H256' ,
1949 // eslint-disable-next-line sort-keys
2050 Address20 : 'H160'
21- } , GenericMultiAddress . _decodeMultiAddress ( value as string ) ) ;
22- }
23-
24- private static _decodeMultiAddress ( value ?: unknown ) : unknown {
25- if ( isString ( value ) ) {
26- try {
27- const u8a = decodeAddress ( value . toString ( ) ) ;
28-
29- return u8aConcat ( new Uint8Array ( u8a . length <= 8 ? 1 : 0 ) , u8a ) ;
30- } catch ( error ) {
31- // ignore, not a valid ss58 address
32- }
33- }
34-
35- return value ;
51+ } , decodeMultiAny ( registry , value ) ) ;
3652 }
3753
3854 /**
0 commit comments