diff --git a/packages/metadata/src/Metadata/util/extractTypes.ts b/packages/metadata/src/Metadata/util/extractTypes.ts new file mode 100644 index 0000000000..92f7824350 --- /dev/null +++ b/packages/metadata/src/Metadata/util/extractTypes.ts @@ -0,0 +1,37 @@ +// Copyright 2017-2020 @polkadot/metadata authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { TypeDef, TypeDefInfo } from '@polkadot/types/types'; + +import { getTypeDef } from '@polkadot/types/create'; + +type Extracted = string | Extracted[]; + +/** @internal */ +export default function extractTypes (types: string[]): Extracted[] { + return types.map((type): Extracted => { + const decoded = getTypeDef(type); + + switch (decoded.info) { + case TypeDefInfo.Plain: + return decoded.type; + + case TypeDefInfo.BTreeSet: + case TypeDefInfo.Compact: + case TypeDefInfo.Option: + case TypeDefInfo.Vec: + case TypeDefInfo.VecFixed: + return extractTypes([(decoded.sub as TypeDef).type]); + + case TypeDefInfo.BTreeMap: + case TypeDefInfo.HashMap: + case TypeDefInfo.Result: + case TypeDefInfo.Tuple: + return extractTypes((decoded.sub as TypeDef[]).map((sub): string => sub.type)); + + default: + throw new Error(`Unhandled: Unable to create and validate type from ${type}`); + } + }); +} diff --git a/packages/metadata/src/Metadata/util/validateTypes.ts b/packages/metadata/src/Metadata/util/validateTypes.ts index 51aeefb85d..1bbd133835 100644 --- a/packages/metadata/src/Metadata/util/validateTypes.ts +++ b/packages/metadata/src/Metadata/util/validateTypes.ts @@ -2,42 +2,11 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import { Registry, TypeDef, TypeDefInfo } from '@polkadot/types/types'; - -import { getTypeDef } from '@polkadot/types/create'; +import { Registry } from '@polkadot/types/types'; +import extractTypes from './extractTypes'; import flattenUniq from './flattenUniq'; -type Extracted = string | Extracted[]; - -/** @internal */ -function extractTypes (types: string[]): Extracted[] { - return types.map((type): Extracted => { - const decoded = getTypeDef(type); - - switch (decoded.info) { - case TypeDefInfo.Plain: - return decoded.type; - - case TypeDefInfo.BTreeSet: - case TypeDefInfo.Compact: - case TypeDefInfo.Option: - case TypeDefInfo.Vec: - case TypeDefInfo.VecFixed: - return extractTypes([(decoded.sub as TypeDef).type]); - - case TypeDefInfo.BTreeMap: - case TypeDefInfo.HashMap: - case TypeDefInfo.Result: - case TypeDefInfo.Tuple: - return extractTypes((decoded.sub as TypeDef[]).map((sub): string => sub.type)); - - default: - throw new Error(`Unhandled: Unable to create and validate type from ${type}`); - } - }); -} - /** @internal */ export default function validateTypes (registry: Registry, types: string[], throwError: boolean): void { const missing = flattenUniq(extractTypes(types)).filter((type) => !registry.hasType(type)); diff --git a/packages/metadata/src/Metadata/v11/static-substrate.json b/packages/metadata/src/Metadata/v11/static-substrate.json index 6bbeaaaf3e..1f1b05e842 100644 --- a/packages/metadata/src/Metadata/v11/static-substrate.json +++ b/packages/metadata/src/Metadata/v11/static-substrate.json @@ -10780,7 +10780,7 @@ "Map": { "hasher": "Twox64Concat", "key": "AccountId", - "value": "(Vec,BalanceOf)", + "value": "(Vec,BalanceOf)", "linked": false } }, diff --git a/packages/metadata/src/Metadata/v11/toLatest.ts b/packages/metadata/src/Metadata/v11/toLatest.ts index 8084680416..65ad8bdee4 100644 --- a/packages/metadata/src/Metadata/v11/toLatest.ts +++ b/packages/metadata/src/Metadata/v11/toLatest.ts @@ -16,10 +16,20 @@ import { stringCamelCase } from '@polkadot/util'; * @internal **/ function setTypeOverride (sectionTypes: OverrideModuleType, type: Type): void { - const override = Object.keys(sectionTypes).find((aliased): boolean => type.eq(aliased)); + const override = Object.keys(sectionTypes).find((aliased) => type.eq(aliased)); if (override) { type.setOverride(sectionTypes[override]); + } else { + // FIXME: NOT happy with this approach, but gets over the initial hump cased by (Vec,BalanceOf) + const orig = type.toString(); + const alias = Object.entries(sectionTypes).reduce((result: string, [from, to]): string => + [['<', '>'], ['<', ','], [',', '>'], ['(', ')'], ['(', ','], [',', ','], [',', ')']].reduce((result, [one, two]): string => + result.replace(`${one}${from}${two}`, `${one}${to}${two}`), result), orig); + + if (orig !== alias) { + type.setOverride(alias); + } } } @@ -29,7 +39,7 @@ function setTypeOverride (sectionTypes: OverrideModuleType, type: Type): void { **/ function convertCalls (registry: Registry, calls: FunctionMetadataV11[], sectionTypes: OverrideModuleType): FunctionMetadataLatest[] { return calls.map(({ args, documentation, name }): FunctionMetadataLatest => { - args.forEach(({ type }): void => setTypeOverride(sectionTypes, type)); + args.forEach(({ type }) => setTypeOverride(sectionTypes, type)); return registry.createType('FunctionMetadataLatest', { args, documentation, name }); }); @@ -41,7 +51,7 @@ function convertCalls (registry: Registry, calls: FunctionMetadataV11[], section **/ function convertEvents (registry: Registry, events: EventMetadataV11[], sectionTypes: OverrideModuleType): EventMetadataLatest[] { return events.map(({ args, documentation, name }): EventMetadataLatest => { - args.forEach((type): void => setTypeOverride(sectionTypes, type)); + args.forEach((type) => setTypeOverride(sectionTypes, type)); return registry.createType('EventMetadataLatest', { args, documentation, name }); }); diff --git a/packages/types/src/create/sanitize.spec.ts b/packages/types/src/create/sanitize.spec.ts index 04452dd10e..72a848ac11 100644 --- a/packages/types/src/create/sanitize.spec.ts +++ b/packages/types/src/create/sanitize.spec.ts @@ -26,6 +26,14 @@ describe('sanitize', (): void => { 'Text Text (Text,[Text;32],Text)"Text' ); }); + + it('handles emdedded Vec/Tuples', (): void => { + const ann = alias(['Announcement'], 'ProxyAnnouncement'); + + expect(ann('(Vec,BalanceOf)')).toEqual( + '(Vec,BalanceOf)' + ); + }); }); describe('removeColons', (): void => { diff --git a/packages/types/src/interfaces/proxy/definitions.ts b/packages/types/src/interfaces/proxy/definitions.ts index 4498be5332..25b6036f57 100644 --- a/packages/types/src/interfaces/proxy/definitions.ts +++ b/packages/types/src/interfaces/proxy/definitions.ts @@ -22,8 +22,6 @@ export default { real: 'AccountId', callHash: 'Hash', height: 'BlockNumber' - }, - // FIXME We don't want this here - Announcement: 'ProxyAnnouncement' + } } } as Definitions;