From 60a426a5d25530008d17ed00bffbc492734a193f Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 22 Nov 2020 12:19:31 +0100 Subject: [PATCH 1/2] Additional type detection in MultiAddress --- packages/types/src/generic/MultiAddress.ts | 46 ++++++++++++++-------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/packages/types/src/generic/MultiAddress.ts b/packages/types/src/generic/MultiAddress.ts index 4b570ab96549..1f22272793ce 100644 --- a/packages/types/src/generic/MultiAddress.ts +++ b/packages/types/src/generic/MultiAddress.ts @@ -3,10 +3,38 @@ import { Registry } from '../types'; -import { isString, u8aConcat } from '@polkadot/util'; +import { isBn, isNumber, isString, isU8a } from '@polkadot/util'; import { decodeAddress } from '@polkadot/util-crypto'; import { Enum } from '../codec/Enum'; +import { GenericAccountId } from './AccountId'; +import { GenericAccountIndex } from './AccountIndex'; + +function decodeMultiU8a (registry: Registry, value?: unknown): unknown { + if (isU8a(value) && value.length <= 32) { + if (value.length === 32) { + return { id: value }; + } else if (value.length === 20) { + return { Address20: value }; + } else { + return decodeMultiAny(registry, registry.createType('AccountIndex', value)); + } + } + + return value; +} + +function decodeMultiAny (registry: Registry, value?: unknown): unknown { + if (value instanceof GenericAccountId) { + return { Id: value }; + } else if (value instanceof GenericAccountIndex || isNumber(value) || isBn(value)) { + return { Index: registry.createType('Compact', value) }; + } else if (isString(value)) { + return decodeMultiU8a(registry, decodeAddress(value.toString())); + } + + return decodeMultiU8a(registry, value); +} export class GenericMultiAddress extends Enum { constructor (registry: Registry, value?: unknown) { @@ -18,21 +46,7 @@ export class GenericMultiAddress extends Enum { Address32: 'H256', // eslint-disable-next-line sort-keys Address20: 'H160' - }, GenericMultiAddress._decodeMultiAddress(value as string)); - } - - private static _decodeMultiAddress (value?: unknown): unknown { - if (isString(value)) { - try { - const u8a = decodeAddress(value.toString()); - - return u8aConcat(new Uint8Array(u8a.length <= 8 ? 1 : 0), u8a); - } catch (error) { - // ignore, not a valid ss58 address - } - } - - return value; + }, decodeMultiAny(registry, value)); } /** From eb070b49cb59297bd9e0192393b4ec647ec60458 Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Sun, 22 Nov 2020 12:30:24 +0100 Subject: [PATCH 2/2] instanceof self --- packages/types/src/generic/MultiAddress.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/types/src/generic/MultiAddress.ts b/packages/types/src/generic/MultiAddress.ts index 1f22272793ce..d0ca654b27bd 100644 --- a/packages/types/src/generic/MultiAddress.ts +++ b/packages/types/src/generic/MultiAddress.ts @@ -25,7 +25,9 @@ function decodeMultiU8a (registry: Registry, value?: unknown): unknown { } function decodeMultiAny (registry: Registry, value?: unknown): unknown { - if (value instanceof GenericAccountId) { + if (value instanceof GenericMultiAddress) { + return value; + } else if (value instanceof GenericAccountId) { return { Id: value }; } else if (value instanceof GenericAccountIndex || isNumber(value) || isBn(value)) { return { Index: registry.createType('Compact', value) };