Skip to content

Commit 20bdc6e

Browse files
authored
Additional type detection in MultiAddress (#2866)
* Additional type detection in MultiAddress * instanceof self
1 parent b200b20 commit 20bdc6e

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

packages/types/src/generic/MultiAddress.ts

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,40 @@
33

44
import { Registry } from '../types';
55

6-
import { isString, u8aConcat } from '@polkadot/util';
6+
import { isBn, isNumber, isString, isU8a } from '@polkadot/util';
77
import { decodeAddress } from '@polkadot/util-crypto';
88

99
import { 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

1141
export 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

Comments
 (0)