diff --git a/packages/api-contract/src/Abi.ts b/packages/api-contract/src/Abi.ts index 0426e99fa9..cf21587fa2 100644 --- a/packages/api-contract/src/Abi.ts +++ b/packages/api-contract/src/Abi.ts @@ -5,10 +5,12 @@ import { AnyJson, Codec, CodecArg } from '@polkadot/types/types'; import { ChainProperties, ContractConstructorSpec, ContractEventSpec, ContractMessageSpec, ContractMessageParamSpec, ContractProject } from '@polkadot/types/interfaces'; import { AbiConstructor, AbiEvent, AbiMessage, AbiParam, DecodedEvent, DecodedMessage } from './types'; -import { assert, compactAddLength, compactStripLength, isNumber, isObject, isString, stringCamelCase, u8aConcat, u8aToHex } from '@polkadot/util'; +import { assert, compactAddLength, compactStripLength, isNumber, isObject, isString, logger, stringCamelCase, u8aConcat, u8aToHex } from '@polkadot/util'; import MetaRegistry from './MetaRegistry'; +const l = logger('Abi'); + function findMessage (list: T[], messageOrId: T | string | number): T { const message = isNumber(messageOrId) ? list[messageOrId] @@ -115,7 +117,7 @@ export default class Abi { type: this.registry.getMetaTypeDef(arg.type) }; } catch (error) { - console.error(`Error expanding argument ${index} in ${JSON.stringify(spec)}`); + l.error(`Error expanding argument ${index} in ${JSON.stringify(spec)}`); throw error; } diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index b308cbc3fa..7675da29c3 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -1,7 +1,7 @@ // Copyright 2017-2020 @polkadot/api authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { Constants } from '@polkadot/metadata/Decorated/types'; +import { Constants, DecoratedMeta } from '@polkadot/metadata/decorate/types'; import { RpcInterface } from '@polkadot/rpc-core/types'; import { Call, Hash, RuntimeVersion } from '@polkadot/types/interfaces'; import { AnyFunction, CallFunction, Codec, CodecArg as Arg, InterfaceTypes, Registry, RegistryTypes } from '@polkadot/types/types'; @@ -13,7 +13,7 @@ import { BehaviorSubject, Observable, combineLatest, of } from 'rxjs'; import { map, switchMap, take, tap, toArray } from 'rxjs/operators'; import decorateDerive, { ExactDerive } from '@polkadot/api-derive'; import { memo } from '@polkadot/api-derive/util'; -import DecoratedMeta from '@polkadot/metadata/Decorated'; +import { expandMetadata } from '@polkadot/metadata'; import RpcCore from '@polkadot/rpc-core'; import { WsProvider } from '@polkadot/rpc-provider'; import { Metadata, Option, Raw, Text, TypeRegistry, u64 } from '@polkadot/types'; @@ -171,8 +171,8 @@ export default abstract class Decorate extends Events return this._rpcCore.provider.hasSubscriptions; } - public injectMetadata (metadata: Metadata, fromEmpty?: boolean): void { - const decoratedMeta = new DecoratedMeta(metadata); + public injectMetadata (metadata: Metadata, fromEmpty?: boolean, registry?: Registry): void { + const decoratedMeta = expandMetadata(registry || this.#registry, metadata); if (fromEmpty || !this._extrinsics) { this._extrinsics = this._decorateExtrinsics(decoratedMeta, this._decorateMethod); diff --git a/packages/api/src/base/Init.ts b/packages/api/src/base/Init.ts index 4fe6a5ddf7..a71797ba1e 100644 --- a/packages/api/src/base/Init.ts +++ b/packages/api/src/base/Init.ts @@ -204,7 +204,7 @@ export default abstract class Init extends Decorate registry === metadata.registry); + const thisRegistry = this.#registries.find(({ isDefault }) => isDefault); assert(thisRegistry, 'Initialization error, cannot find the default registry'); @@ -216,7 +216,7 @@ export default abstract class Init extends Decorate { beforeEach((): void => { const metadata = new Metadata(registry, metaStatic); - storage = storageFromMeta(registry, metadata.asLatest); + storage = storageFromMeta(registry, metadata); }); it('validates no-arg plain', (): void => { diff --git a/packages/metadata/src/Decorated/Decorated.ts b/packages/metadata/src/Decorated/Decorated.ts deleted file mode 100644 index ece4754ea6..0000000000 --- a/packages/metadata/src/Decorated/Decorated.ts +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2017-2020 @polkadot/metadata authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import { ModulesWithCalls } from '@polkadot/types/types'; -import { Constants, Storage } from './types'; - -import { assert } from '@polkadot/util'; - -import Metadata from '../Metadata'; -import constantsFromMeta from './consts/fromMetadata'; -import extrinsicsFromMeta from './extrinsics/fromMetadata'; -import storageFromMeta from './storage/fromMetadata'; - -/** - * This class represents a decorated wrapper over the [[Metadata]]. The - * [[Metadata]] type is a Codec type returned by the node, and `Decorated` - * composes it and populates the `.query`, `.tx` and `.consts` sections. - */ -export default class Decorated { - public readonly consts: Constants; - - public readonly query: Storage; - - public readonly tx: ModulesWithCalls; - - constructor (value: Metadata) { - assert(value instanceof Metadata, 'You need to pass a valid Metadata instance to Decorated'); - - const latest = value.asLatest; - - // decoration - this.tx = extrinsicsFromMeta(value.registry, latest); - this.query = storageFromMeta(value.registry, latest); - this.consts = constantsFromMeta(value.registry, latest); - } -} diff --git a/packages/metadata/src/Decorated/consts/README.md b/packages/metadata/src/Decorated/consts/README.md deleted file mode 100644 index 0b68af65d0..0000000000 --- a/packages/metadata/src/Decorated/consts/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @polkadot/metadata/consts - -A base interface to the parameter types diff --git a/packages/metadata/src/Decorated/extrinsics/README.md b/packages/metadata/src/Decorated/extrinsics/README.md deleted file mode 100644 index ea7c044708..0000000000 --- a/packages/metadata/src/Decorated/extrinsics/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @polkadot/metadata/extrinsics - -Base extrinsic definitions & codecs diff --git a/packages/metadata/src/Decorated/index.ts b/packages/metadata/src/Decorated/index.ts deleted file mode 100644 index 6c09f51c95..0000000000 --- a/packages/metadata/src/Decorated/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2017-2020 @polkadot/metadata authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import Decorated from './Decorated'; - -export default Decorated; diff --git a/packages/metadata/src/Decorated/storage/README.md b/packages/metadata/src/Decorated/storage/README.md deleted file mode 100644 index d9df68aacf..0000000000 --- a/packages/metadata/src/Decorated/storage/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# @polkadot/metadata/storage - -A base interface to the storage layer diff --git a/packages/metadata/src/Metadata/MagicNumber.spec.ts b/packages/metadata/src/MagicNumber.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/MagicNumber.spec.ts rename to packages/metadata/src/MagicNumber.spec.ts diff --git a/packages/metadata/src/Metadata/MagicNumber.ts b/packages/metadata/src/MagicNumber.ts similarity index 100% rename from packages/metadata/src/Metadata/MagicNumber.ts rename to packages/metadata/src/MagicNumber.ts diff --git a/packages/metadata/src/Metadata/Metadata.spec.ts b/packages/metadata/src/Metadata.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/Metadata.spec.ts rename to packages/metadata/src/Metadata.spec.ts diff --git a/packages/metadata/src/Metadata/Metadata.ts b/packages/metadata/src/Metadata.ts similarity index 100% rename from packages/metadata/src/Metadata/Metadata.ts rename to packages/metadata/src/Metadata.ts diff --git a/packages/metadata/src/Metadata/index.ts b/packages/metadata/src/Metadata/index.ts deleted file mode 100644 index 88acdfa677..0000000000 --- a/packages/metadata/src/Metadata/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright 2017-2020 @polkadot/metadata authors & contributors -// SPDX-License-Identifier: Apache-2.0 - -import Metadata from './Metadata'; - -export default Metadata; diff --git a/packages/metadata/src/Metadata/MetadataVersioned.ts b/packages/metadata/src/MetadataVersioned.ts similarity index 100% rename from packages/metadata/src/Metadata/MetadataVersioned.ts rename to packages/metadata/src/MetadataVersioned.ts diff --git a/packages/metadata/src/Metadata/README.md b/packages/metadata/src/README.md similarity index 100% rename from packages/metadata/src/Metadata/README.md rename to packages/metadata/src/README.md diff --git a/packages/metadata/src/Decorated/consts/fromMetadata/fromMetadata.spec.ts b/packages/metadata/src/decorate/consts/fromMetadata.spec.ts similarity index 75% rename from packages/metadata/src/Decorated/consts/fromMetadata/fromMetadata.spec.ts rename to packages/metadata/src/decorate/consts/fromMetadata.spec.ts index 1d81440e1a..fa61980c65 100644 --- a/packages/metadata/src/Decorated/consts/fromMetadata/fromMetadata.spec.ts +++ b/packages/metadata/src/decorate/consts/fromMetadata.spec.ts @@ -1,13 +1,13 @@ // Copyright 2017-2020 @polkadot/metadata authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { Constants } from '../../types'; +import { Constants } from '../types'; import { Metadata, TypeRegistry } from '@polkadot/types'; -import rpcMetadata from '../../../Metadata/static'; -import rpcMetadataV10 from '../../../Metadata/v10/static'; -import fromMetadata from '../fromMetadata'; +import rpcMetadata from '../../static'; +import rpcMetadataV10 from '../../v10/static'; +import fromMetadata from './fromMetadata'; function init (meta: string): [Constants, TypeRegistry] { const registry = new TypeRegistry(); @@ -15,7 +15,7 @@ function init (meta: string): [Constants, TypeRegistry] { registry.setMetadata(metadata); - return [fromMetadata(registry, metadata.asLatest), registry]; + return [fromMetadata(registry, metadata), registry]; } describe('fromMetadata', (): void => { @@ -28,7 +28,7 @@ describe('fromMetadata', (): void => { }); // removed from session - it('correctly handles bytes', (): void => { + it('correctly handles bytes (V10)', (): void => { const [consts] = init(rpcMetadataV10); // 0x34 removes as the length prefix removed diff --git a/packages/metadata/src/Decorated/consts/fromMetadata/index.ts b/packages/metadata/src/decorate/consts/fromMetadata.ts similarity index 76% rename from packages/metadata/src/Decorated/consts/fromMetadata/index.ts rename to packages/metadata/src/decorate/consts/fromMetadata.ts index 2e42920ff3..13bb09c4c1 100644 --- a/packages/metadata/src/Decorated/consts/fromMetadata/index.ts +++ b/packages/metadata/src/decorate/consts/fromMetadata.ts @@ -1,16 +1,17 @@ // Copyright 2017-2020 @polkadot/metadata authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { MetadataLatest } from '@polkadot/types/interfaces'; import { Registry } from '@polkadot/types/types'; -import { Constants, ConstantCodec, ModuleConstants } from '../../types'; +import { Constants, ConstantCodec, ModuleConstants } from '../types'; import { createTypeUnsafe } from '@polkadot/types/create'; import { hexToU8a, stringCamelCase } from '@polkadot/util'; +import Metadata from '../..'; + /** @internal */ -export default function fromMetadata (registry: Registry, { modules }: MetadataLatest): Constants { - return modules.reduce((result: Constants, moduleMetadata): Constants => { +export default function fromMetadata (registry: Registry, metadata: Metadata): Constants { + return metadata.asLatest.modules.reduce((result: Constants, moduleMetadata): Constants => { if (moduleMetadata.constants.isEmpty) { return result; } diff --git a/packages/metadata/src/Decorated/extrinsics/fromMetadata/createUnchecked.ts b/packages/metadata/src/decorate/extrinsics/createUnchecked.ts similarity index 71% rename from packages/metadata/src/Decorated/extrinsics/fromMetadata/createUnchecked.ts rename to packages/metadata/src/decorate/extrinsics/createUnchecked.ts index 1fcddf1e71..9ebbbde35c 100644 --- a/packages/metadata/src/Decorated/extrinsics/fromMetadata/createUnchecked.ts +++ b/packages/metadata/src/decorate/extrinsics/createUnchecked.ts @@ -7,16 +7,12 @@ import { AnyJson, CallFunction, Registry, RegistryMetadataCall } from '@polkadot import { assert, stringCamelCase } from '@polkadot/util'; /** @internal */ -export default function createDescriptor (registry: Registry, section: string, sectionIndex: number, methodIndex: number, callMetadata: RegistryMetadataCall): CallFunction { - const callIndex = new Uint8Array([sectionIndex, methodIndex]); +export default function createDescriptor (registry: Registry, section: string, callIndex: Uint8Array, callMetadata: RegistryMetadataCall): CallFunction { const expectedArgs = callMetadata.args; const funcName = stringCamelCase(callMetadata.name); const extrinsicFn = (...args: any[]): Call => { - assert( - expectedArgs.length.valueOf() === args.length, - `Extrinsic ${section}.${funcName} expects ${expectedArgs.length.valueOf()} arguments, got ${args.length}.` - ); + assert(expectedArgs.length === args.length, `Extrinsic ${section}.${funcName} expects ${expectedArgs.length.valueOf()} arguments, got ${args.length}.`); return registry.createType('Call', { args, diff --git a/packages/metadata/src/Decorated/extrinsics/fromMetadata/fromMetadata.spec.ts b/packages/metadata/src/decorate/extrinsics/fromMetadata.spec.ts similarity index 89% rename from packages/metadata/src/Decorated/extrinsics/fromMetadata/fromMetadata.spec.ts rename to packages/metadata/src/decorate/extrinsics/fromMetadata.spec.ts index ec17881053..3f69b8b74c 100644 --- a/packages/metadata/src/Decorated/extrinsics/fromMetadata/fromMetadata.spec.ts +++ b/packages/metadata/src/decorate/extrinsics/fromMetadata.spec.ts @@ -3,8 +3,8 @@ import { Metadata, TypeRegistry } from '@polkadot/types'; -import json from '../../../Metadata/static'; -import fromMetadata from '.'; +import json from '../../static'; +import fromMetadata from './fromMetadata'; // Use the pre-generated metadata const registry = new TypeRegistry(); @@ -12,7 +12,7 @@ const metadata = new Metadata(registry, json); registry.setMetadata(metadata); -const newExtrinsics = fromMetadata(registry, metadata.asLatest); +const newExtrinsics = fromMetadata(registry, metadata); describe('fromMetadata', (): void => { it('should throw if an incorrect number of args is supplied', (): void => { diff --git a/packages/metadata/src/Decorated/extrinsics/fromMetadata/index.ts b/packages/metadata/src/decorate/extrinsics/fromMetadata.ts similarity index 66% rename from packages/metadata/src/Decorated/extrinsics/fromMetadata/index.ts rename to packages/metadata/src/decorate/extrinsics/fromMetadata.ts index d86c481243..d89ac27fbc 100644 --- a/packages/metadata/src/Decorated/extrinsics/fromMetadata/index.ts +++ b/packages/metadata/src/decorate/extrinsics/fromMetadata.ts @@ -1,15 +1,16 @@ // Copyright 2017-2020 @polkadot/metadata authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { Calls, ModulesWithCalls, Registry, RegistryMetadataLatest, RegistryMetadataModule } from '@polkadot/types/types'; +import { Calls, ModulesWithCalls, Registry, RegistryMetadata, RegistryMetadataModule } from '@polkadot/types/types'; import { stringCamelCase } from '@polkadot/util'; -import extrinsics from '../'; +import extrinsics from './'; import createUnchecked from './createUnchecked'; /** @internal */ -export default function fromMetadata (registry: Registry, { modules }: RegistryMetadataLatest): ModulesWithCalls { +export default function fromMetadata (registry: Registry, metadata: RegistryMetadata): ModulesWithCalls { + const modules = metadata.asLatest.modules; const isIndexed = modules.some(({ index }) => !index.eqn(255)); return modules @@ -23,7 +24,7 @@ export default function fromMetadata (registry: Registry, { modules }: RegistryM result[section] = calls.unwrap().reduce((newModule: Calls, callMetadata, methodIndex): Calls => { const method = stringCamelCase(callMetadata.name); - newModule[method] = createUnchecked(registry, section, sectionIndex, methodIndex, callMetadata); + newModule[method] = createUnchecked(registry, section, new Uint8Array([sectionIndex, methodIndex]), callMetadata); return newModule; }, {}); diff --git a/packages/metadata/src/Decorated/extrinsics/index.spec.ts b/packages/metadata/src/decorate/extrinsics/index.spec.ts similarity index 93% rename from packages/metadata/src/Decorated/extrinsics/index.spec.ts rename to packages/metadata/src/decorate/extrinsics/index.spec.ts index 8e87ac2c1f..3d06c3f5c0 100644 --- a/packages/metadata/src/Decorated/extrinsics/index.spec.ts +++ b/packages/metadata/src/decorate/extrinsics/index.spec.ts @@ -5,7 +5,7 @@ import BN from 'bn.js'; import testingPairs from '@polkadot/keyring/testingPairs'; import { Metadata, TypeRegistry } from '@polkadot/types'; -import metadataStatic from '../../Metadata/static'; +import metadataStatic from '../../static'; import fromMetadata from './fromMetadata'; const keyring = testingPairs({ type: 'ed25519' }, false); @@ -14,7 +14,7 @@ const metadata = new Metadata(registry, metadataStatic); registry.setMetadata(metadata); -const extrinsics = fromMetadata(registry, metadata.asLatest); +const extrinsics = fromMetadata(registry, metadata); describe('extrinsics', (): void => { it('encodes an actual transfer (actual data)', (): void => { diff --git a/packages/metadata/src/Decorated/extrinsics/index.ts b/packages/metadata/src/decorate/extrinsics/index.ts similarity index 100% rename from packages/metadata/src/Decorated/extrinsics/index.ts rename to packages/metadata/src/decorate/extrinsics/index.ts diff --git a/packages/metadata/src/Decorated/Decorated.spec.ts b/packages/metadata/src/decorate/index.spec.ts similarity index 62% rename from packages/metadata/src/Decorated/Decorated.spec.ts rename to packages/metadata/src/decorate/index.spec.ts index 986c49ab99..237057a353 100644 --- a/packages/metadata/src/Decorated/Decorated.spec.ts +++ b/packages/metadata/src/decorate/index.spec.ts @@ -4,22 +4,22 @@ import { TypeRegistry } from '@polkadot/types/create'; import { u8aToHex } from '@polkadot/util'; -import Metadata from '../Metadata'; -import json from '../Metadata/static'; -import Decorated from './Decorated'; +import Metadata from '..'; +import json from '../static'; +import { constantsFromMeta, extrinsicsFromMeta, storageFromMeta } from './'; const registry = new TypeRegistry(); const metadata = new Metadata(registry, json); registry.setMetadata(metadata); -const decorated = new Decorated(metadata); - describe('Decorated', () => { it('should correctly get Alice\'s nonce storage key (u8a)', (): void => { + const query = storageFromMeta(registry, metadata); + expect( u8aToHex( - decorated.query.system.account('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY') + query.system.account('5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY') ) ).toEqual( '0x410126aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' @@ -27,8 +27,10 @@ describe('Decorated', () => { }); it('should return properly-encoded transactions', (): void => { + const tx = extrinsicsFromMeta(registry, metadata); + expect( - registry.createType('Extrinsic', decorated.tx.timestamp.set([10101])).toU8a() + registry.createType('Extrinsic', tx.timestamp.set([10101])).toU8a() ).toEqual( new Uint8Array([ // length (encoded) @@ -44,7 +46,9 @@ describe('Decorated', () => { }); it('should return constants with the correct type and value', (): void => { - expect(decorated.consts.democracy.cooloffPeriod).toBeInstanceOf(registry.createClass('BlockNumber')); - expect(decorated.consts.democracy.cooloffPeriod.toHex()).toEqual('0x000c4e00'); + const consts = constantsFromMeta(registry, metadata); + + expect(consts.democracy.cooloffPeriod).toBeInstanceOf(registry.createClass('BlockNumber')); + expect(consts.democracy.cooloffPeriod.toHex()).toEqual('0x000c4e00'); }); }); diff --git a/packages/metadata/src/decorate/index.ts b/packages/metadata/src/decorate/index.ts new file mode 100644 index 0000000000..edc4fb89a8 --- /dev/null +++ b/packages/metadata/src/decorate/index.ts @@ -0,0 +1,27 @@ +// Copyright 2017-2020 @polkadot/metadata authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import { Registry } from '@polkadot/types/types'; +import { DecoratedMeta } from './types'; + +import { assert } from '@polkadot/util'; + +import Metadata from '..'; +import constantsFromMeta from './consts/fromMetadata'; +import extrinsicsFromMeta from './extrinsics/fromMetadata'; +import storageFromMeta from './storage/fromMetadata'; + +/** + * Expands the metadata by decoration int consts, query and tx sections + */ +export default function expandMetadata (registry: Registry, value: Metadata): DecoratedMeta { + assert(value instanceof Metadata, 'You need to pass a valid Metadata instance to Decorated'); + + return { + consts: constantsFromMeta(registry, value), + query: storageFromMeta(registry, value), + tx: extrinsicsFromMeta(registry, value) + }; +} + +export { constantsFromMeta, extrinsicsFromMeta, storageFromMeta }; diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/createFunction.spec.ts b/packages/metadata/src/decorate/storage/createFunction.spec.ts similarity index 98% rename from packages/metadata/src/Decorated/storage/fromMetadata/createFunction.spec.ts rename to packages/metadata/src/decorate/storage/createFunction.spec.ts index 193a55f3dd..3bd865e9fa 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/createFunction.spec.ts +++ b/packages/metadata/src/decorate/storage/createFunction.spec.ts @@ -27,7 +27,7 @@ describe('createFunction', (): void => { method: 'NextKeys', prefix: 'Session', section: 'session' - }, {}); + }, { metaVersion: 9 }); expect( u8aToHex( diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/createFunction.ts b/packages/metadata/src/decorate/storage/createFunction.ts similarity index 77% rename from packages/metadata/src/Decorated/storage/fromMetadata/createFunction.ts rename to packages/metadata/src/decorate/storage/createFunction.ts index 6a7954f225..50462a8ee3 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/createFunction.ts +++ b/packages/metadata/src/decorate/storage/createFunction.ts @@ -15,6 +15,7 @@ import getHasher, { HasherFunction } from './getHasher'; export interface CreateItemOptions { key?: string; + metaVersion: number; skipHashing?: boolean; // We don't hash the keys defined in ./substrate.ts } @@ -30,19 +31,11 @@ interface IterFn { meta: StorageEntryMetadataLatest; } -type CreateArgType = boolean | string | number | null | BN | Uint8Array | Codec; +type CreateArgType = boolean | string | number | null | BN | BigInt | Uint8Array | Codec; const EMPTY_U8A = new Uint8Array([]); const NULL_HASHER = (value: Uint8Array): Uint8Array => value; -// with the prefix, method & options, create both the string & raw keys -/** @internal */ -function expandKey ({ method, prefix }: CreateItemFn, options: CreateItemOptions): string { - return options.key - ? options.key - : `${prefix} ${method}`; -} - // get the hashers, the base (and in the case of DoubleMap), the second key /** @internal */ function getHashers ({ meta: { type } }: CreateItemFn): [HasherFunction, HasherFunction?] { @@ -67,7 +60,7 @@ function createPrefixedKey ({ method, prefix }: CreateItemFn): Uint8Array { // create a key for a DoubleMap type /** @internal */ -function createKeyDoubleMap (registry: Registry, itemFn: CreateItemFn, stringKey: string, args: [CreateArgType, CreateArgType], [hasher1, hasher2]: [HasherFunction, HasherFunction?]): Uint8Array { +function createKeyDoubleMap (registry: Registry, itemFn: CreateItemFn, args: [CreateArgType, CreateArgType], [hasher1, hasher2]: [HasherFunction, HasherFunction?]): Uint8Array { const { meta: { name, type } } = itemFn; // since we are passing an almost-unknown through, trust, but verify @@ -91,7 +84,7 @@ function createKeyDoubleMap (registry: Registry, itemFn: CreateItemFn, stringKey // create a key for either a map or a plain value /** @internal */ -function createKey (registry: Registry, itemFn: CreateItemFn, stringKey: string, arg: CreateArgType, hasher: (value: Uint8Array) => Uint8Array): Uint8Array { +function createKey (registry: Registry, itemFn: CreateItemFn, arg: CreateArgType, hasher: (value: Uint8Array) => Uint8Array): Uint8Array { const { meta: { name, type } } = itemFn; let param: Uint8Array = EMPTY_U8A; @@ -114,7 +107,9 @@ function createKey (registry: Registry, itemFn: CreateItemFn, stringKey: string, // attach the metadata to expand to a StorageFunction /** @internal */ -function expandWithMeta ({ meta, method, prefix, section }: CreateItemFn, storageFn: StorageEntry): StorageEntry { +function expandWithMeta ({ meta, method, prefix, section }: CreateItemFn, _storageFn: (arg?: CreateArgType | [CreateArgType?, CreateArgType?]) => Uint8Array): StorageEntry { + const storageFn = _storageFn as StorageEntry; + storageFn.meta = meta; storageFn.method = stringLowerFirst(method); storageFn.prefix = prefix; @@ -148,7 +143,7 @@ function extendHeadMeta (registry: Registry, { meta: { documentation, name, type const prefixKey = registry.createType('StorageKey', iterFn, { method, section }); - return (arg?: any): StorageKey => + return (arg?: any) => !isUndefined(arg) && !isNull(arg) ? registry.createType('StorageKey', iterFn(arg), { method, section }) : prefixKey; @@ -162,41 +157,39 @@ function extendPrefixedMap (registry: Registry, itemFn: CreateItemFn, storageFn: storageFn.iterKey = extendHeadMeta(registry, itemFn, storageFn, (arg?: any): Raw => { assert(type.isDoubleMap || isUndefined(arg), 'Filtering arguments for keys/entries are only valid on double maps'); - return type.isDoubleMap && !isUndefined(arg) && !isNull(arg) - ? new Raw(registry, u8aConcat(createPrefixedKey(itemFn), getHasher(type.asDoubleMap.hasher)(registry.createType(type.asDoubleMap.key1.toString() as 'Raw', arg).toU8a()))) - : new Raw(registry, createPrefixedKey(itemFn)); + return new Raw( + registry, + type.isDoubleMap && !isUndefined(arg) && !isNull(arg) + ? u8aConcat( + createPrefixedKey(itemFn), + getHasher(type.asDoubleMap.hasher)( + registry.createType(type.asDoubleMap.key1.toString() as 'Raw', arg).toU8a() + ) + ) + : createPrefixedKey(itemFn) + ); }); return storageFn; } -// attach the full list hashing for double maps -/** @internal */ -function extendDoubleMap (registry: Registry, itemFn: CreateItemFn, storageFn: StorageEntry): StorageEntry { - return extendPrefixedMap(registry, itemFn, storageFn); -} - /** @internal */ export default function createFunction (registry: Registry, itemFn: CreateItemFn, options: CreateItemOptions): StorageEntry { const { meta: { type } } = itemFn; - const stringKey = expandKey(itemFn, options); const [hasher, key2Hasher] = getHashers(itemFn); // Can only have zero or one argument: // - storage.system.account(address) // - storage.timestamp.blockPeriod() // For doublemap queries the params is passed in as an tuple, [key1, key2] - const _storageFn = (arg?: CreateArgType | [CreateArgType?, CreateArgType?]): Uint8Array => + const storageFn = expandWithMeta(itemFn, (arg?: CreateArgType | [CreateArgType?, CreateArgType?]): Uint8Array => type.isDoubleMap - ? createKeyDoubleMap(registry, itemFn, stringKey, arg as [CreateArgType, CreateArgType], [hasher, key2Hasher]) - : createKey(registry, itemFn, stringKey, arg as CreateArgType, options.skipHashing ? NULL_HASHER : hasher); + ? createKeyDoubleMap(registry, itemFn, arg as [CreateArgType, CreateArgType], [hasher, key2Hasher]) + : createKey(registry, itemFn, arg as CreateArgType, options.skipHashing ? NULL_HASHER : hasher) + ); - const storageFn = expandWithMeta(itemFn, _storageFn as StorageEntry); - - if (type.isMap) { + if (type.isMap || type.isDoubleMap) { extendPrefixedMap(registry, itemFn, storageFn); - } else if (type.isDoubleMap) { - extendDoubleMap(registry, itemFn, storageFn); } storageFn.keyPrefix = (arg?: any): Uint8Array => diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/fromMetadata.spec.ts b/packages/metadata/src/decorate/storage/fromMetadata.spec.ts similarity index 71% rename from packages/metadata/src/Decorated/storage/fromMetadata/fromMetadata.spec.ts rename to packages/metadata/src/decorate/storage/fromMetadata.spec.ts index 515ab7cf21..3cd4b565a8 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/fromMetadata.spec.ts +++ b/packages/metadata/src/decorate/storage/fromMetadata.spec.ts @@ -5,9 +5,9 @@ import testingPairs from '@polkadot/keyring/testingPairs'; import { TypeRegistry } from '@polkadot/types'; import { u8aToHex } from '@polkadot/util'; -import Metadata from '../../../Metadata'; -import rpcMetadata from '../../../Metadata/static'; -import Decorated from '../../Decorated'; +import Metadata from '../../'; +import rpcMetadata from '../../static'; +import { storageFromMeta } from '../'; const keyring = testingPairs({ type: 'ed25519' }); @@ -18,20 +18,20 @@ describe('fromMetadata', (): void => { registry.setMetadata(metadata); - const decorated = new Decorated(metadata); + const query = storageFromMeta(registry, metadata); it('should throw if the storage function expects an argument', (): void => { - expect((): any => decorated.query.balances.account()).toThrowError(/requires one argument/); + expect((): any => query.balances.account()).toThrowError(/requires one argument/); }); it('should return a value if the storage function does not expect an argument', (): void => { - expect((): any => decorated.query.timestamp.now()).not.toThrow(); + expect((): any => query.timestamp.now()).not.toThrow(); }); it('should return the correct length-prefixed storage key', (): void => { expect( u8aToHex( - decorated.query.system.account(keyring.alice.address) + query.system.account(keyring.alice.address) ) ).toEqual( '0x410126aa394eea5630e07c48ae0c9558cef7b99d880ec681799c0cf30e8886371da9de1e86a9a8c739864cf3cc5ec2bea59fd43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d' diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/index.ts b/packages/metadata/src/decorate/storage/fromMetadata.ts similarity index 73% rename from packages/metadata/src/Decorated/storage/fromMetadata/index.ts rename to packages/metadata/src/decorate/storage/fromMetadata.ts index 641c72fe36..0f69ebec1c 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/index.ts +++ b/packages/metadata/src/decorate/storage/fromMetadata.ts @@ -1,18 +1,18 @@ // Copyright 2017-2020 @polkadot/metadata authors & contributors // SPDX-License-Identifier: Apache-2.0 -import { MetadataLatest } from '@polkadot/types/interfaces'; import { Registry } from '@polkadot/types/types'; -import { ModuleStorage, Storage } from '../../types'; +import { ModuleStorage, Storage } from '../types'; import { stringCamelCase, stringLowerFirst } from '@polkadot/util'; +import Metadata from '../../Metadata'; import createFunction from './createFunction'; import getStorage from './storage'; /** @internal */ -export default function fromMetadata (registry: Registry, { modules }: MetadataLatest): Storage { - return modules.reduce((result, moduleMetadata): Storage => { +export default function fromMetadata (registry: Registry, metadata: Metadata): Storage { + return metadata.asLatest.modules.reduce((result: Storage, moduleMetadata): Storage => { if (moduleMetadata.storage.isNone) { return result; } @@ -31,11 +31,11 @@ export default function fromMetadata (registry: Registry, { modules }: MetadataL method, prefix, section - }, {}); + }, { metaVersion: metadata.version }); return newModule; }, {} as ModuleStorage); return result; - }, { ...getStorage(registry) }); + }, { ...getStorage(registry, metadata.version) }); } diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/getHasher.spec.ts b/packages/metadata/src/decorate/storage/getHasher.spec.ts similarity index 100% rename from packages/metadata/src/Decorated/storage/fromMetadata/getHasher.spec.ts rename to packages/metadata/src/decorate/storage/getHasher.spec.ts diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/getHasher.ts b/packages/metadata/src/decorate/storage/getHasher.ts similarity index 100% rename from packages/metadata/src/Decorated/storage/fromMetadata/getHasher.ts rename to packages/metadata/src/decorate/storage/getHasher.ts diff --git a/packages/metadata/src/Decorated/storage/index.ts b/packages/metadata/src/decorate/storage/index.ts similarity index 73% rename from packages/metadata/src/Decorated/storage/index.ts rename to packages/metadata/src/decorate/storage/index.ts index 500509c7e5..ab3f8f46f0 100644 --- a/packages/metadata/src/Decorated/storage/index.ts +++ b/packages/metadata/src/decorate/storage/index.ts @@ -1,6 +1,6 @@ // Copyright 2017-2020 @polkadot/metadata authors & contributors // SPDX-License-Identifier: Apache-2.0 -import getStorage from './fromMetadata/storage'; +import getStorage from './storage'; export default getStorage; diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/storage.spec.ts b/packages/metadata/src/decorate/storage/storage.spec.ts similarity index 93% rename from packages/metadata/src/Decorated/storage/fromMetadata/storage.spec.ts rename to packages/metadata/src/decorate/storage/storage.spec.ts index c569f38544..5abf349bec 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/storage.spec.ts +++ b/packages/metadata/src/decorate/storage/storage.spec.ts @@ -7,7 +7,7 @@ import getStorage from './storage'; describe('storage', (): void => { const registry = new TypeRegistry(); - const storage = getStorage(registry); + const storage = getStorage(registry, 8); it('should return well known keys', (): void => { expect(typeof storage.substrate).toBe('object'); diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/storage.ts b/packages/metadata/src/decorate/storage/storage.ts similarity index 70% rename from packages/metadata/src/Decorated/storage/fromMetadata/storage.ts rename to packages/metadata/src/decorate/storage/storage.ts index 8e63f43c69..9132e06956 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/storage.ts +++ b/packages/metadata/src/decorate/storage/storage.ts @@ -3,17 +3,17 @@ import { StorageEntry } from '@polkadot/types/primitive/StorageKey'; import { Registry } from '@polkadot/types/types'; -import { Storage } from '../../types'; +import { Storage } from '../types'; import * as substrate from './substrate'; /** @internal */ -export default function getStorage (registry: Registry): Storage { +export default function getStorage (registry: Registry, metaVersion: number): Storage { return { substrate: Object .entries(substrate) .reduce((storage: Record, [key, fn]): Record => { - (storage as Record)[key] = fn(registry); + (storage as Record)[key] = fn(registry, metaVersion); return storage; }, {}) diff --git a/packages/metadata/src/Decorated/storage/fromMetadata/substrate.ts b/packages/metadata/src/decorate/storage/substrate.ts similarity index 89% rename from packages/metadata/src/Decorated/storage/fromMetadata/substrate.ts rename to packages/metadata/src/decorate/storage/substrate.ts index 480d1e8894..187d459c83 100644 --- a/packages/metadata/src/Decorated/storage/fromMetadata/substrate.ts +++ b/packages/metadata/src/decorate/storage/substrate.ts @@ -15,8 +15,8 @@ interface SubstrateMetadata { // Small helper function to factorize code on this page. /** @internal */ -function createRuntimeFunction (method: string, key: string, { documentation, type }: SubstrateMetadata): (registry: Registry) => StorageEntry { - return (registry: Registry): StorageEntry => +function createRuntimeFunction (method: string, key: string, { documentation, type }: SubstrateMetadata): (registry: Registry, metaVersion: number) => StorageEntry { + return (registry: Registry, metaVersion: number): StorageEntry => createFunction(registry, { meta: { documentation: registry.createType('Vec', [documentation]), @@ -27,7 +27,7 @@ function createRuntimeFunction (method: string, key: string, { documentation, ty method, prefix: 'Substrate', section: 'substrate' - }, { key, skipHashing: true }); + }, { key, metaVersion, skipHashing: true }); } export const code = createRuntimeFunction('code', ':code', { diff --git a/packages/metadata/src/Decorated/types.ts b/packages/metadata/src/decorate/types.ts similarity index 78% rename from packages/metadata/src/Decorated/types.ts rename to packages/metadata/src/decorate/types.ts index 80395865b2..54504d9c47 100644 --- a/packages/metadata/src/Decorated/types.ts +++ b/packages/metadata/src/decorate/types.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { AugmentedConst, QueryableConsts, QueryableModuleConsts } from '@polkadot/api/types/consts'; -import { Codec } from '@polkadot/types/types'; +import { Codec, ModulesWithCalls } from '@polkadot/types/types'; import { StorageEntry } from '@polkadot/types/primitive/StorageKey'; export interface ModuleStorage { @@ -19,3 +19,9 @@ export interface Storage { [key: string]: ModuleStorage; substrate: ModuleStorage; } + +export interface DecoratedMeta { + consts: Constants; + query: Storage; + tx: ModulesWithCalls +} diff --git a/packages/metadata/src/index.ts b/packages/metadata/src/index.ts new file mode 100644 index 0000000000..ea108cc9a4 --- /dev/null +++ b/packages/metadata/src/index.ts @@ -0,0 +1,9 @@ +// Copyright 2017-2020 @polkadot/metadata authors & contributors +// SPDX-License-Identifier: Apache-2.0 + +import expandMetadata, { constantsFromMeta, extrinsicsFromMeta, storageFromMeta } from './decorate'; +import Metadata from './Metadata'; + +export default Metadata; + +export { constantsFromMeta, expandMetadata, extrinsicsFromMeta, storageFromMeta }; diff --git a/packages/metadata/src/Metadata/static.ts b/packages/metadata/src/static.ts similarity index 100% rename from packages/metadata/src/Metadata/static.ts rename to packages/metadata/src/static.ts diff --git a/packages/metadata/src/Metadata/types.ts b/packages/metadata/src/types.ts similarity index 100% rename from packages/metadata/src/Metadata/types.ts rename to packages/metadata/src/types.ts diff --git a/packages/metadata/src/Metadata/util/extractTypes.ts b/packages/metadata/src/util/extractTypes.ts similarity index 100% rename from packages/metadata/src/Metadata/util/extractTypes.ts rename to packages/metadata/src/util/extractTypes.ts diff --git a/packages/metadata/src/Metadata/util/flattenUniq.ts b/packages/metadata/src/util/flattenUniq.ts similarity index 100% rename from packages/metadata/src/Metadata/util/flattenUniq.ts rename to packages/metadata/src/util/flattenUniq.ts diff --git a/packages/metadata/src/Metadata/util/getUniqTypes.ts b/packages/metadata/src/util/getUniqTypes.ts similarity index 100% rename from packages/metadata/src/Metadata/util/getUniqTypes.ts rename to packages/metadata/src/util/getUniqTypes.ts diff --git a/packages/metadata/src/Metadata/util/index.ts b/packages/metadata/src/util/index.ts similarity index 100% rename from packages/metadata/src/Metadata/util/index.ts rename to packages/metadata/src/util/index.ts diff --git a/packages/metadata/src/Metadata/util/testUtil.ts b/packages/metadata/src/util/testUtil.ts similarity index 98% rename from packages/metadata/src/Metadata/util/testUtil.ts rename to packages/metadata/src/util/testUtil.ts index 5628382646..c869911ee6 100644 --- a/packages/metadata/src/Metadata/util/testUtil.ts +++ b/packages/metadata/src/util/testUtil.ts @@ -7,7 +7,7 @@ import { MetadataInterface } from '../types'; import { unwrapStorageType } from '@polkadot/types/primitive/StorageKey'; import getUniqTypes from './getUniqTypes'; -import Metadata from '../Metadata'; +import Metadata from '..'; /** @internal */ export function decodeLatestSubstrate (registry: Registry, version: number, rpcData: string, staticSubstrate: Record): void { diff --git a/packages/metadata/src/Metadata/util/toCallsOnly.spec.ts b/packages/metadata/src/util/toCallsOnly.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/util/toCallsOnly.spec.ts rename to packages/metadata/src/util/toCallsOnly.spec.ts diff --git a/packages/metadata/src/Metadata/util/toCallsOnly.ts b/packages/metadata/src/util/toCallsOnly.ts similarity index 100% rename from packages/metadata/src/Metadata/util/toCallsOnly.ts rename to packages/metadata/src/util/toCallsOnly.ts diff --git a/packages/metadata/src/Metadata/util/validateTypes.ts b/packages/metadata/src/util/validateTypes.ts similarity index 100% rename from packages/metadata/src/Metadata/util/validateTypes.ts rename to packages/metadata/src/util/validateTypes.ts diff --git a/packages/metadata/src/Metadata/v10/Metadata.spec.ts b/packages/metadata/src/v10/Metadata.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/v10/Metadata.spec.ts rename to packages/metadata/src/v10/Metadata.spec.ts diff --git a/packages/metadata/src/Metadata/v10/static-substrate.json b/packages/metadata/src/v10/static-substrate.json similarity index 100% rename from packages/metadata/src/Metadata/v10/static-substrate.json rename to packages/metadata/src/v10/static-substrate.json diff --git a/packages/metadata/src/Metadata/v10/static.ts b/packages/metadata/src/v10/static.ts similarity index 100% rename from packages/metadata/src/Metadata/v10/static.ts rename to packages/metadata/src/v10/static.ts diff --git a/packages/metadata/src/Metadata/v10/toV11.ts b/packages/metadata/src/v10/toV11.ts similarity index 100% rename from packages/metadata/src/Metadata/v10/toV11.ts rename to packages/metadata/src/v10/toV11.ts diff --git a/packages/metadata/src/Metadata/v11/Metadata.spec.ts b/packages/metadata/src/v11/Metadata.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/v11/Metadata.spec.ts rename to packages/metadata/src/v11/Metadata.spec.ts diff --git a/packages/metadata/src/Metadata/v11/static-substrate.json b/packages/metadata/src/v11/static-substrate.json similarity index 100% rename from packages/metadata/src/Metadata/v11/static-substrate.json rename to packages/metadata/src/v11/static-substrate.json diff --git a/packages/metadata/src/Metadata/v11/static.ts b/packages/metadata/src/v11/static.ts similarity index 100% rename from packages/metadata/src/Metadata/v11/static.ts rename to packages/metadata/src/v11/static.ts diff --git a/packages/metadata/src/Metadata/v11/toV12.ts b/packages/metadata/src/v11/toV12.ts similarity index 100% rename from packages/metadata/src/Metadata/v11/toV12.ts rename to packages/metadata/src/v11/toV12.ts diff --git a/packages/metadata/src/Metadata/v12/Metadata.spec.ts b/packages/metadata/src/v12/Metadata.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/v12/Metadata.spec.ts rename to packages/metadata/src/v12/Metadata.spec.ts diff --git a/packages/metadata/src/Metadata/v12/static-substrate.json b/packages/metadata/src/v12/static-substrate.json similarity index 100% rename from packages/metadata/src/Metadata/v12/static-substrate.json rename to packages/metadata/src/v12/static-substrate.json diff --git a/packages/metadata/src/Metadata/v12/static.ts b/packages/metadata/src/v12/static.ts similarity index 100% rename from packages/metadata/src/Metadata/v12/static.ts rename to packages/metadata/src/v12/static.ts diff --git a/packages/metadata/src/Metadata/v12/toLatest.ts b/packages/metadata/src/v12/toLatest.ts similarity index 85% rename from packages/metadata/src/Metadata/v12/toLatest.ts rename to packages/metadata/src/v12/toLatest.ts index e31337d860..efb3e05324 100644 --- a/packages/metadata/src/Metadata/v12/toLatest.ts +++ b/packages/metadata/src/v12/toLatest.ts @@ -114,6 +114,24 @@ function registerOriginCaller (registry: Registry, modules: ModuleMetadataV12[]) }); } +/** @internal */ +function createModule (registry: Registry, mod: ModuleMetadataV12, { calls, events, storage }: { calls: FunctionMetadataV12[] | null, events: EventMetadataV12[] | null, storage: StorageMetadataV12 | null }): ModuleMetadataLatest { + const sectionTypes = getModuleTypes(registry, stringCamelCase(mod.name)); + + return registry.createType('ModuleMetadataLatest', { + ...mod, + calls: calls + ? convertCalls(registry, calls, sectionTypes) + : null, + events: events + ? convertEvents(registry, events, sectionTypes) + : null, + storage: storage + ? convertStorage(registry, storage, sectionTypes) + : null + }); +} + /** * Convert the Metadata (which is an alias) to latest - effectively this _always_ get applied to the top-level & * most-recent metadata, since it allows us a chance to actually apply call and storage specific type aliasses @@ -124,24 +142,10 @@ export default function toLatest (registry: Registry, { extrinsic, modules }: Me return registry.createType('MetadataLatest', { extrinsic, - modules: modules.map((mod): ModuleMetadataLatest => { - const calls = mod.calls.unwrapOr(null); - const events = mod.events.unwrapOr(null); - const storage = mod.storage.unwrapOr(null); - const sectionTypes = getModuleTypes(registry, stringCamelCase(mod.name)); - - return registry.createType('ModuleMetadataLatest', { - ...mod, - calls: calls - ? convertCalls(registry, calls, sectionTypes) - : null, - events: events - ? convertEvents(registry, events, sectionTypes) - : null, - storage: storage - ? convertStorage(registry, storage, sectionTypes) - : null - }); - }) + modules: modules.map((mod) => createModule(registry, mod, { + calls: mod.calls.unwrapOr(null), + events: mod.events.unwrapOr(null), + storage: mod.storage.unwrapOr(null) + })) }); } diff --git a/packages/metadata/src/Metadata/v9/Metadata.spec.ts b/packages/metadata/src/v9/Metadata.spec.ts similarity index 100% rename from packages/metadata/src/Metadata/v9/Metadata.spec.ts rename to packages/metadata/src/v9/Metadata.spec.ts diff --git a/packages/metadata/src/Metadata/v9/static-substrate.json b/packages/metadata/src/v9/static-substrate.json similarity index 100% rename from packages/metadata/src/Metadata/v9/static-substrate.json rename to packages/metadata/src/v9/static-substrate.json diff --git a/packages/metadata/src/Metadata/v9/static.ts b/packages/metadata/src/v9/static.ts similarity index 100% rename from packages/metadata/src/Metadata/v9/static.ts rename to packages/metadata/src/v9/static.ts diff --git a/packages/metadata/src/Metadata/v9/toV10.ts b/packages/metadata/src/v9/toV10.ts similarity index 100% rename from packages/metadata/src/Metadata/v9/toV10.ts rename to packages/metadata/src/v9/toV10.ts diff --git a/packages/rpc-provider/src/mock/index.ts b/packages/rpc-provider/src/mock/index.ts index 23654e6a43..eedc30a3c5 100644 --- a/packages/rpc-provider/src/mock/index.ts +++ b/packages/rpc-provider/src/mock/index.ts @@ -10,9 +10,8 @@ import { MockStateSubscriptions, MockStateSubscriptionCallback, MockStateDb } fr import BN from 'bn.js'; import EventEmitter from 'eventemitter3'; -import Decorated from '@polkadot/metadata/Decorated'; -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata, { storageFromMeta } from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import jsonrpc from '@polkadot/types/interfaces/jsonrpc'; import testKeyring from '@polkadot/keyring/testing'; import rpcHeader from '@polkadot/types/json/Header.004.json'; @@ -174,7 +173,7 @@ export default class Mock implements ProviderInterface { this.registry.setMetadata(metadata); - const decorated = new Decorated(metadata); + const query = storageFromMeta(this.registry, metadata); // Do something every 1 seconds setInterval((): void => { @@ -187,11 +186,11 @@ export default class Mock implements ProviderInterface { // increment the balances and nonce for each account keyring.getPairs().forEach(({ publicKey }, index): void => { - this.setStateBn(decorated.query.system.account(publicKey), newHead.number.toBn().addn(index)); + this.setStateBn(query.system.account(publicKey), newHead.number.toBn().addn(index)); }); // set the timestamp for the current block - this.setStateBn(decorated.query.timestamp.now(), Math.floor(Date.now() / 1000)); + this.setStateBn(query.timestamp.now(), Math.floor(Date.now() / 1000)); this.updateSubs('chain_subscribeNewHead', newHead); // We emit connected/disconnected at intervals diff --git a/packages/typegen/src/generate/consts.ts b/packages/typegen/src/generate/consts.ts index 185082f201..f39f31e4b1 100644 --- a/packages/typegen/src/generate/consts.ts +++ b/packages/typegen/src/generate/consts.ts @@ -3,8 +3,8 @@ import Handlebars from 'handlebars'; -import staticData from '@polkadot/metadata/Metadata/static'; -import Metadata from '@polkadot/metadata/Metadata'; +import staticData from '@polkadot/metadata/static'; +import Metadata from '@polkadot/metadata'; import { TypeRegistry } from '@polkadot/types/create'; import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import { stringCamelCase } from '@polkadot/util'; diff --git a/packages/typegen/src/generate/query.ts b/packages/typegen/src/generate/query.ts index 12a57f924e..75e3737988 100644 --- a/packages/typegen/src/generate/query.ts +++ b/packages/typegen/src/generate/query.ts @@ -6,8 +6,8 @@ import Handlebars from 'handlebars'; import { StorageEntryMetadataLatest } from '@polkadot/types/interfaces/metadata'; import { Registry } from '@polkadot/types/types'; -import staticData from '@polkadot/metadata/Metadata/static'; -import Metadata from '@polkadot/metadata/Metadata'; +import staticData from '@polkadot/metadata/static'; +import Metadata from '@polkadot/metadata'; import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import { unwrapStorageType } from '@polkadot/types/primitive/StorageKey'; import { TypeRegistry } from '@polkadot/types/create'; diff --git a/packages/typegen/src/generate/tx.ts b/packages/typegen/src/generate/tx.ts index 21e7313490..fec4611fc5 100644 --- a/packages/typegen/src/generate/tx.ts +++ b/packages/typegen/src/generate/tx.ts @@ -5,8 +5,8 @@ import Handlebars from 'handlebars'; import { Registry } from '@polkadot/types/types'; -import staticData from '@polkadot/metadata/Metadata/static'; -import Metadata from '@polkadot/metadata/Metadata'; +import staticData from '@polkadot/metadata/static'; +import Metadata from '@polkadot/metadata'; import * as defaultDefs from '@polkadot/types/interfaces/definitions'; import { Text } from '@polkadot/types/primitive'; import { TypeRegistry } from '@polkadot/types/create'; diff --git a/packages/typegen/src/metadataMd.ts b/packages/typegen/src/metadataMd.ts index 47c001e9f1..64f13d4cb2 100644 --- a/packages/typegen/src/metadataMd.ts +++ b/packages/typegen/src/metadataMd.ts @@ -5,8 +5,8 @@ import { MetadataLatest } from '@polkadot/types/interfaces/metadata'; import { Codec, DefinitionRpcParam } from '@polkadot/types/types'; import fs from 'fs'; -import Metadata from '@polkadot/metadata/Metadata'; -import rpcdata from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import rpcdata from '@polkadot/metadata/static'; import Call from '@polkadot/types/generic/Call'; import { unwrapStorageType } from '@polkadot/types/primitive/StorageKey'; import { TypeRegistry } from '@polkadot/types/create'; diff --git a/packages/types/src/codec/Tuple.spec.ts b/packages/types/src/codec/Tuple.spec.ts index 85ba2b03e9..a8771d569e 100644 --- a/packages/types/src/codec/Tuple.spec.ts +++ b/packages/types/src/codec/Tuple.spec.ts @@ -5,8 +5,8 @@ import { VoteThreshold } from '../interfaces/elections'; import { BlockNumber } from '../interfaces/runtime'; import { CodecTo } from '../types'; -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import { TypeRegistry } from '../create'; import Text from '../primitive/Text'; diff --git a/packages/types/src/codec/Vec.spec.ts b/packages/types/src/codec/Vec.spec.ts index b8f4367118..8595080a9b 100644 --- a/packages/types/src/codec/Vec.spec.ts +++ b/packages/types/src/codec/Vec.spec.ts @@ -4,8 +4,8 @@ import { PropIndex } from '../interfaces/democracy'; import { Codec, CodecTo } from '../types'; -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import { createTypeUnsafe, TypeRegistry } from '../create'; import AccountId from '../generic/AccountId'; diff --git a/packages/types/src/create/registry.ts b/packages/types/src/create/registry.ts index 7f1b62a986..aabfd0ddc4 100644 --- a/packages/types/src/create/registry.ts +++ b/packages/types/src/create/registry.ts @@ -4,9 +4,9 @@ /* eslint-disable @typescript-eslint/no-var-requires */ import { ChainProperties, DispatchErrorModule, H256 } from '../interfaces/types'; -import { CallFunction, Codec, Constructor, InterfaceTypes, RegistryError, RegistryTypes, Registry, RegistryMetadata, RegistryMetadataLatest, RegisteredTypes } from '../types'; +import { CallFunction, Codec, Constructor, InterfaceTypes, RegistryError, RegistryTypes, Registry, RegistryMetadata, RegisteredTypes } from '../types'; -import extrinsicsFromMeta from '@polkadot/metadata/Decorated/extrinsics/fromMetadata'; +import { extrinsicsFromMeta } from '@polkadot/metadata'; import { BN_ZERO, assert, formatBalance, isFunction, isString, isU8a, isUndefined, logger, stringCamelCase, u8aToHex } from '@polkadot/util'; import { blake2AsU8a } from '@polkadot/util-crypto'; @@ -22,7 +22,8 @@ import { getTypeDef } from './getTypeDef'; const l = logger('registry'); // create error mapping from metadata -function decorateErrors (_: Registry, { modules }: RegistryMetadataLatest, metadataErrors: Record): void { +function decorateErrors (_: Registry, metadata: RegistryMetadata, metadataErrors: Record): void { + const modules = metadata.asLatest.modules; const isIndexed = modules.some(({ index }) => !index.eqn(255)); // decorate the errors @@ -46,7 +47,8 @@ function decorateErrors (_: Registry, { modules }: RegistryMetadataLatest, metad } // create event classes from metadata -function decorateEvents (registry: Registry, { modules }: RegistryMetadataLatest, metadataEvents: Record>): void { +function decorateEvents (registry: Registry, metadata: RegistryMetadata, metadataEvents: Record>): void { + const modules = metadata.asLatest.modules; const isIndexed = modules.some(({ index }) => !index.eqn(255)); // decorate the events @@ -81,7 +83,7 @@ function decorateEvents (registry: Registry, { modules }: RegistryMetadataLatest } // create extrinsic mapping from metadata -function decorateExtrinsics (registry: Registry, metadata: RegistryMetadataLatest, metadataCalls: Record): void { +function decorateExtrinsics (registry: Registry, metadata: RegistryMetadata, metadataCalls: Record): void { const extrinsics = extrinsicsFromMeta(registry, metadata); // decorate the extrinsics @@ -363,17 +365,15 @@ export class TypeRegistry implements Registry { // sets the metadata public setMetadata (metadata: RegistryMetadata, signedExtensions?: string[]): void { - const latest = metadata.asLatest; - - decorateExtrinsics(this, latest, this.#metadataCalls); - decorateErrors(this, latest, this.#metadataErrors); - decorateEvents(this, latest, this.#metadataEvents); + decorateExtrinsics(this, metadata, this.#metadataCalls); + decorateErrors(this, metadata, this.#metadataErrors); + decorateEvents(this, metadata, this.#metadataEvents); // setup the available extensions this.setSignedExtensions( signedExtensions || ( - latest.extrinsic.version.gt(BN_ZERO) - ? latest.extrinsic.signedExtensions.map((key) => key.toString()) + metadata.asLatest.extrinsic.version.gt(BN_ZERO) + ? metadata.asLatest.extrinsic.signedExtensions.map((key) => key.toString()) : defaultExtensions ) ); diff --git a/packages/types/src/extrinsic/Extrinsic.spec.ts b/packages/types/src/extrinsic/Extrinsic.spec.ts index a6c6a44218..d98d560568 100644 --- a/packages/types/src/extrinsic/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/Extrinsic.spec.ts @@ -1,8 +1,8 @@ // Copyright 2017-2020 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import { TypeRegistry } from '../create'; import Extrinsic from './Extrinsic'; diff --git a/packages/types/src/extrinsic/SignerPayload.spec.ts b/packages/types/src/extrinsic/SignerPayload.spec.ts index 499d9c72ed..f318dc7d4d 100644 --- a/packages/types/src/extrinsic/SignerPayload.spec.ts +++ b/packages/types/src/extrinsic/SignerPayload.spec.ts @@ -1,8 +1,8 @@ // Copyright 2017-2020 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import { TypeRegistry } from '../create'; import SignerPayload from './SignerPayload'; diff --git a/packages/types/src/extrinsic/v4/Extrinsic.spec.ts b/packages/types/src/extrinsic/v4/Extrinsic.spec.ts index 4a20fd0b6e..304e8f1c36 100644 --- a/packages/types/src/extrinsic/v4/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v4/Extrinsic.spec.ts @@ -3,20 +3,20 @@ import BN from 'bn.js'; import testingPairs from '@polkadot/keyring/testingPairs'; -import Decorated from '@polkadot/metadata/Decorated'; -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata, { extrinsicsFromMeta } from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import { TypeRegistry } from '../../create'; import Extrinsic from './Extrinsic'; const registry = new TypeRegistry(); const metadata = new Metadata(registry, rpcMetadata); -const decorated = new Decorated(metadata); const keyring = testingPairs({ type: 'ed25519' }, false); registry.setMetadata(metadata); +const tx = extrinsicsFromMeta(registry, metadata); + describe('ExtrinsicV4', (): void => { it.only('constructs a sane Uint8Array (default)', (): void => { expect( @@ -31,7 +31,7 @@ describe('ExtrinsicV4', (): void => { expect( new Extrinsic( registry, - decorated.tx.balances.transfer(keyring.bob.publicKey, 6969n) + tx.balances.transfer(keyring.bob.publicKey, 6969n) ).toHex() ).toEqual( '0x' + @@ -46,7 +46,7 @@ describe('ExtrinsicV4', (): void => { expect( new Extrinsic( registry, - decorated.tx.balances.transfer(keyring.bob.publicKey, 6969n) + tx.balances.transfer(keyring.bob.publicKey, 6969n) ).sign(keyring.alice, { blockHash: '0xec7afaf1cca720ce88c1d1b689d81f0583cc15a97d621cf046dd9abf605ef22f', genesisHash: '0xdcd1346701ca8396496e52aa2785b1748deb6db09551b72159dcb3e08991025b', diff --git a/packages/types/src/generic/Block.spec.ts b/packages/types/src/generic/Block.spec.ts index 5678a18fff..471a84201b 100644 --- a/packages/types/src/generic/Block.spec.ts +++ b/packages/types/src/generic/Block.spec.ts @@ -4,8 +4,8 @@ /* eslint-disable sort-keys */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import Metadata from '@polkadot/metadata/Metadata'; -import metadataStatic from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import metadataStatic from '@polkadot/metadata/static'; import { TypeRegistry } from '../create'; import block00300 from '../json/SignedBlock.003.00.json'; diff --git a/packages/types/src/generic/Call.spec.ts b/packages/types/src/generic/Call.spec.ts index 15ecc75f3d..69663faf99 100644 --- a/packages/types/src/generic/Call.spec.ts +++ b/packages/types/src/generic/Call.spec.ts @@ -1,8 +1,8 @@ // Copyright 2017-2020 @polkadot/metadata authors & contributors // SPDX-License-Identifier: Apache-2.0 -import Metadata from '@polkadot/metadata/Metadata'; -import metadataStatic from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import metadataStatic from '@polkadot/metadata/static'; import { TypeRegistry } from '../create'; import Call from './Call'; diff --git a/packages/types/src/index.spec.ts b/packages/types/src/index.spec.ts index 594972100b..4d63feb87f 100644 --- a/packages/types/src/index.spec.ts +++ b/packages/types/src/index.spec.ts @@ -1,8 +1,8 @@ // Copyright 2017-2020 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 -import Metadata from '@polkadot/metadata/Metadata'; -import metadataStatic from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import metadataStatic from '@polkadot/metadata/static'; import { createTypeUnsafe, TypeRegistry } from './create'; import { Codec } from './types'; diff --git a/packages/types/src/index.types.ts b/packages/types/src/index.types.ts index fb010e7ba6..492a66b993 100644 --- a/packages/types/src/index.types.ts +++ b/packages/types/src/index.types.ts @@ -1,7 +1,7 @@ // Copyright 2017-2020 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 -export { default as Metadata } from '@polkadot/metadata/Metadata'; +export { default as Metadata } from '@polkadot/metadata'; export * from './extrinsic'; export * from './generic'; diff --git a/packages/types/src/interfaces/system/EventRecord.spec.ts b/packages/types/src/interfaces/system/EventRecord.spec.ts index f1e7ed822e..52c988201a 100644 --- a/packages/types/src/interfaces/system/EventRecord.spec.ts +++ b/packages/types/src/interfaces/system/EventRecord.spec.ts @@ -4,8 +4,8 @@ /* eslint-disable @typescript-eslint/no-unsafe-assignment */ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ -import Metadata from '@polkadot/metadata/Metadata'; -import rpcMetadata from '@polkadot/metadata/Metadata/static'; +import Metadata from '@polkadot/metadata'; +import rpcMetadata from '@polkadot/metadata/static'; import { TypeRegistry } from '../../create'; import json1 from '../../json/EventRecord.001.json'; diff --git a/packages/types/src/primitive/StorageKey.spec.ts b/packages/types/src/primitive/StorageKey.spec.ts index 3158f3ccea..c607982ef1 100644 --- a/packages/types/src/primitive/StorageKey.spec.ts +++ b/packages/types/src/primitive/StorageKey.spec.ts @@ -1,9 +1,8 @@ // Copyright 2017-2020 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 -import Decorated from '@polkadot/metadata/Decorated'; -import Metadata from '@polkadot/metadata/Metadata'; -import rpcDataV11 from '@polkadot/metadata/Metadata/v11/static'; +import Metadata, { storageFromMeta } from '@polkadot/metadata'; +import rpcDataV11 from '@polkadot/metadata/v11/static'; import { TypeRegistry } from '../create'; import StorageKey from './StorageKey'; @@ -16,12 +15,12 @@ describe('StorageKey', (): void => { registry.setMetadata(metadata); - const decorated = new Decorated(metadata); + const query = storageFromMeta(registry, metadata); it('should allow decoding of a DoubleMap key', (): void => { const key = new StorageKey(registry, '0x5f3e4907f716ac89b6347d15ececedca8bde0a0ea8864605e3b68ed9cb2da01b66ccada06515787c10000000e535263148daaf49be5ddb1579b72e84524fc29e78609e3caf42e85aa118ebfe0b0ad404b5bdd25f'); - key.setMeta(decorated.query.staking.erasStakers.meta); + key.setMeta(query.staking.erasStakers.meta); expect(key.toHuman()).toEqual([ '16', @@ -32,7 +31,7 @@ describe('StorageKey', (): void => { it('should allow decoding of a Map key', (): void => { const key = new StorageKey(registry, '0x426e15054d267946093858132eb537f191ca57b0c4b20b29ae7e99d6201d680cc906f7710aa165d62c709012f807af8fc3f0d2abb0c51ca9a88d4ef24d1a092bf89dacf5ce63ea1d'); - key.setMeta(decorated.query.society.defenderVotes.meta); + key.setMeta(query.society.defenderVotes.meta); expect(key.toHuman()).toEqual([ '5D4yQHKfqCQYThhHmTfN1JEDi47uyDJc1xg9eZfAG1R7FC7J'