diff --git a/packages/api/src/base/Decorate.ts b/packages/api/src/base/Decorate.ts index a39ea41114..2d568c9c59 100644 --- a/packages/api/src/base/Decorate.ts +++ b/packages/api/src/base/Decorate.ts @@ -9,7 +9,7 @@ import type { DecoratedMeta } from '@polkadot/types/metadata/decorate/types'; import type { StorageEntry } from '@polkadot/types/primitive/types'; import type { AnyFunction, AnyTuple, CallFunction, Codec, DefinitionRpc, DefinitionRpcSub, DetectCodec, IMethod, IStorageKey, Registry, RegistryError, RegistryTypes } from '@polkadot/types/types'; import type { SubmittableExtrinsic } from '../submittable/types'; -import type { ApiDecoration, ApiInterfaceRx, ApiOptions, ApiTypes, AugmentedQuery, DecoratedErrors, DecoratedEvents, DecoratedRpc, DecoratedRpcSection, DecorateMethod, GenericStorageEntryFunction, PaginationOptions, QueryableConsts, QueryableModuleStorage, QueryableModuleStorageAt, QueryableStorage, QueryableStorageAt, QueryableStorageEntry, QueryableStorageEntryAt, QueryableStorageMulti, QueryableStorageMultiArg, SubmittableExtrinsicFunction, SubmittableExtrinsics, SubmittableModuleExtrinsics } from '../types'; +import type { ApiDecoration, ApiInterfaceRx, ApiOptions, ApiTypes, AugmentedQuery, DecoratedErrors, DecoratedEvents, DecoratedRpc, DecoratedRpcSection, DecorateMethod, GenericStorageEntryFunction, PaginationOptions, QueryableConsts, QueryableStorage, QueryableStorageAt, QueryableStorageEntry, QueryableStorageEntryAt, QueryableStorageMulti, QueryableStorageMultiArg, SubmittableExtrinsicFunction, SubmittableExtrinsics } from '../types'; import type { VersionedRegistry } from './types'; import { BehaviorSubject, combineLatest, from, map, of, switchMap, tap, toArray } from 'rxjs'; @@ -17,7 +17,7 @@ import { BehaviorSubject, combineLatest, from, map, of, switchMap, tap, toArray import { ExactDerive, getAvailableDerives } from '@polkadot/api-derive'; import { memo, RpcCore } from '@polkadot/rpc-core'; import { WsProvider } from '@polkadot/rpc-provider'; -import { expandMetadata, Metadata, TypeRegistry, unwrapStorageType } from '@polkadot/types'; +import { expandMetadata, lazyMethod, lazyMethods, Metadata, TypeRegistry, unwrapStorageType } from '@polkadot/types'; import { arrayChunk, arrayFlatten, assert, BN, BN_ZERO, compactStripLength, logger, u8aToHex } from '@polkadot/util'; import { createSubmittable } from '../submittable'; @@ -427,19 +427,20 @@ export abstract class Decorate extends Events { } protected _decorateExtrinsics ({ tx }: DecoratedMeta, decorateMethod: DecorateMethod): SubmittableExtrinsics { - const creator = createSubmittable(this._type, this._rx, decorateMethod) as SubmittableExtrinsics; + const result = createSubmittable(this._type, this._rx, decorateMethod) as SubmittableExtrinsics; - for (const [name, section] of Object.entries(tx)) { - const methods: SubmittableModuleExtrinsics = {}; + const lazySection = (s: string) => + lazyMethods(Object.keys(tx[s]), (m: string) => + this._decorateExtrinsicEntry(tx[s][m], result) + ); - for (const [name, method] of Object.entries(section)) { - methods[name] = this._decorateExtrinsicEntry(method, creator); - } + const sections = Object.keys(tx); - creator[name] = methods; + for (let i = 0; i < sections.length; i++) { + lazyMethod(result, sections[i], lazySection); } - return creator; + return result; } private _decorateExtrinsicEntry (method: CallFunction, creator: (value: Call | Uint8Array | string) => SubmittableExtrinsic): SubmittableExtrinsicFunction { @@ -457,14 +458,15 @@ export abstract class Decorate extends Events { protected _decorateStorage ({ query }: DecoratedMeta, decorateMethod: DecorateMethod): QueryableStorage { const result = {} as QueryableStorage; - for (const [name, section] of Object.entries(query)) { - const methods: QueryableModuleStorage = {}; + const lazySection = (s: string) => + lazyMethods(Object.keys(query[s]), (m: string) => + this._decorateStorageEntry(query[s][m], decorateMethod) + ); - for (const [name, method] of Object.entries(section)) { - methods[name] = this._decorateStorageEntry(method, decorateMethod); - } + const sections = Object.keys(query); - result[name] = methods; + for (let i = 0; i < sections.length; i++) { + lazyMethod(result, sections[i], lazySection); } return result; @@ -473,14 +475,15 @@ export abstract class Decorate extends Events { protected _decorateStorageAt ({ query, registry }: DecoratedMeta, decorateMethod: DecorateMethod, blockHash: Uint8Array): QueryableStorageAt { const result = {} as QueryableStorageAt; - for (const [name, section] of Object.entries(query)) { - const methods: QueryableModuleStorageAt = {}; + const lazySection = (s: string) => + lazyMethods(Object.keys(query[s]), (m: string) => + this._decorateStorageEntryAt(registry, query[s][m], decorateMethod, blockHash) + ); - for (const [name, method] of Object.entries(section)) { - methods[name] = this._decorateStorageEntryAt(registry, method, decorateMethod, blockHash); - } + const sections = Object.keys(query); - result[name] = methods; + for (let i = 0; i < sections.length; i++) { + lazyMethod(result, sections[i], lazySection); } return result; diff --git a/packages/types/src/create/registry.ts b/packages/types/src/create/registry.ts index f56449c84b..575e0fe332 100644 --- a/packages/types/src/create/registry.ts +++ b/packages/types/src/create/registry.ts @@ -59,21 +59,22 @@ function getVariantStringIdx ({ index }: SiVariant): string { function injectErrors (_: Registry, { lookup, pallets }: MetadataLatest, version: number, result: Record>): void { const lazySection = ({ errors, name }: PalletMetadataLatest, index: number): void => { const section = stringCamelCase(name); - const creator = () => lazyMethods( - getVariants(lookup, errors.unwrap()), - ({ docs, fields, index, name }: SiVariant): RegistryError => ({ - args: getFieldArgs(lookup, fields), - docs: docs.map(valueToString), - fields, - index: index.toNumber(), - method: name.toString(), - name: name.toString(), - section - }), - getVariantStringIdx - ); - lazyMethod(result, index, creator); + lazyMethod(result, index, () => + lazyMethods( + getVariants(lookup, errors.unwrap()), + ({ docs, fields, index, name }: SiVariant): RegistryError => ({ + args: getFieldArgs(lookup, fields), + docs: docs.map(valueToString), + fields, + index: index.toNumber(), + method: name.toString(), + name: name.toString(), + section + }), + getVariantStringIdx + ) + ); }; clearRecord(result); @@ -91,24 +92,25 @@ function injectErrors (_: Registry, { lookup, pallets }: MetadataLatest, version function injectEvents (registry: Registry, { lookup, pallets }: MetadataLatest, version: number, result: Record>>): void { const lazySection = ({ events, name }: PalletMetadataLatest, index: number): void => { const section = stringCamelCase(name); - const creator = () => lazyMethods( - getVariants(lookup, events.unwrap()), - (variant: SiVariant): Constructor => { - const meta = registry.createType('EventMetadataLatest', { - ...variant, - args: getFieldArgs(lookup, variant.fields) - }); - return class extends GenericEventData { - constructor (registry: Registry, value: Uint8Array) { - super(registry, value, meta, section, variant.name.toString()); - } - }; - }, - getVariantStringIdx + lazyMethod(result, index, () => + lazyMethods( + getVariants(lookup, events.unwrap()), + (variant: SiVariant): Constructor => { + const meta = registry.createType('EventMetadataLatest', { + ...variant, + args: getFieldArgs(lookup, variant.fields) + }); + + return class extends GenericEventData { + constructor (registry: Registry, value: Uint8Array) { + super(registry, value, meta, section, variant.name.toString()); + } + }; + }, + getVariantStringIdx + ) ); - - lazyMethod(result, index, creator); }; clearRecord(result); @@ -126,14 +128,15 @@ function injectEvents (registry: Registry, { lookup, pallets }: MetadataLatest, function injectExtrinsics (registry: Registry, { lookup, pallets }: MetadataLatest, version: number, result: Record>): void { const lazySection = ({ calls, name }: PalletMetadataLatest, index: number): void => { const section = stringCamelCase(name); - const creator = () => lazyMethods( - getVariants(lookup, calls.unwrap()), - (variant: SiVariant) => - createCallFunction(registry, lookup, variant, index, section), - getVariantStringIdx - ); - lazyMethod(result, index, creator); + lazyMethod(result, index, () => + lazyMethods( + getVariants(lookup, calls.unwrap()), + (variant: SiVariant) => + createCallFunction(registry, lookup, variant, index, section), + getVariantStringIdx + ) + ); }; clearRecord(result); diff --git a/packages/types/src/metadata/decorate/constants/index.ts b/packages/types/src/metadata/decorate/constants/index.ts index 37ac98c8b2..df7d248c0b 100644 --- a/packages/types/src/metadata/decorate/constants/index.ts +++ b/packages/types/src/metadata/decorate/constants/index.ts @@ -24,17 +24,13 @@ export function decorateConstants (registry: Registry, { pallets }: MetadataLate const result: Constants = {}; const lazySection = ({ constants, name }: PalletMetadataLatest): void => { - lazyMethod( - result, - constants, - (constants: PalletConstantMetadataLatest[]) => - lazyMethods( - constants, - (constant: PalletConstantMetadataLatest) => - createConstantCodec(registry, constant), - objectNameToCamel - ), - () => stringCamelCase(name) + lazyMethod(result, stringCamelCase(name), () => + lazyMethods( + constants, + (constant: PalletConstantMetadataLatest) => + createConstantCodec(registry, constant), + objectNameToCamel + ) ); }; diff --git a/packages/types/src/metadata/decorate/errors/index.ts b/packages/types/src/metadata/decorate/errors/index.ts index 0c64087338..4626278f5a 100644 --- a/packages/types/src/metadata/decorate/errors/index.ts +++ b/packages/types/src/metadata/decorate/errors/index.ts @@ -42,17 +42,13 @@ export function decorateErrors (registry: Registry, { lookup, pallets }: Metadat const result: Errors = {}; const lazySection = ({ errors, name }: PalletMetadataLatest, sectionIndex: number): void => { - lazyMethod( - result, - lookup.getSiType(errors.unwrap().type).def.asVariant.variants, - (variants: SiVariant[]) => - lazyMethods( - variants, - (variant: SiVariant) => - createIsError(registry, lookup, variant, sectionIndex), - objectNameToString - ), - () => stringCamelCase(name) + lazyMethod(result, stringCamelCase(name), () => + lazyMethods( + lookup.getSiType(errors.unwrap().type).def.asVariant.variants, + (v: SiVariant) => + createIsError(registry, lookup, v, sectionIndex), + objectNameToString + ) ); }; diff --git a/packages/types/src/metadata/decorate/events/index.ts b/packages/types/src/metadata/decorate/events/index.ts index 7e7408cef4..440c653c3b 100644 --- a/packages/types/src/metadata/decorate/events/index.ts +++ b/packages/types/src/metadata/decorate/events/index.ts @@ -29,17 +29,13 @@ export function decorateEvents (registry: Registry, { lookup, pallets }: Metadat const result: Events = {}; const lazySection = ({ events, name }: PalletMetadataLatest, sectionIndex: number): void => { - lazyMethod( - result, - lookup.getSiType(events.unwrap().type).def.asVariant.variants, - (variants: SiVariant[]) => - lazyMethods( - variants, - (variant: SiVariant) => - createIsEvent(registry, lookup, variant, sectionIndex), - objectNameToString - ), - () => stringCamelCase(name) + lazyMethod(result, stringCamelCase(name), () => + lazyMethods( + lookup.getSiType(events.unwrap().type).def.asVariant.variants, + (v: SiVariant) => + createIsEvent(registry, lookup, v, sectionIndex), + objectNameToString + ) ); }; diff --git a/packages/types/src/metadata/decorate/extrinsics/index.ts b/packages/types/src/metadata/decorate/extrinsics/index.ts index 11aa221cc7..6cdb6b43fb 100644 --- a/packages/types/src/metadata/decorate/extrinsics/index.ts +++ b/packages/types/src/metadata/decorate/extrinsics/index.ts @@ -48,17 +48,13 @@ export function decorateExtrinsics (registry: Registry, { lookup, pallets }: Met const lazySection = ({ calls, name }: PalletMetadataLatest, sectionIndex: number): void => { const sectionName = stringCamelCase(name); - lazyMethod( - result, - lookup.getSiType(calls.unwrap().type).def.asVariant.variants, - (variants: SiVariant[]) => - lazyMethods( - variants, - (variant: SiVariant) => - createCallFunction(registry, lookup, variant, sectionIndex, sectionName), - objectNameToCamel - ), - () => sectionName + lazyMethod(result, sectionName, () => + lazyMethods( + lookup.getSiType(calls.unwrap().type).def.asVariant.variants, + (v: SiVariant) => + createCallFunction(registry, lookup, v, sectionIndex, sectionName), + objectNameToCamel + ) ); }; diff --git a/packages/types/src/metadata/decorate/storage/index.ts b/packages/types/src/metadata/decorate/storage/index.ts index 26ece7b26d..768a42ad95 100644 --- a/packages/types/src/metadata/decorate/storage/index.ts +++ b/packages/types/src/metadata/decorate/storage/index.ts @@ -23,24 +23,20 @@ export function decorateStorage (registry: Registry, { pallets }: MetadataLatest const { items, prefix: _prefix } = storage.unwrap(); const prefix = _prefix.toString(); - lazyMethod( - result, - items, - (items: StorageEntryMetadataLatest[]) => - lazyMethods( - items, - (meta: StorageEntryMetadataLatest) => - createFunction(registry, { meta, method: meta.name.toString(), prefix, section }, {}), - objectNameFirstLower, - { - palletVersion: createRuntimeFunction( - { method: 'palletVersion', prefix, section }, - createKeyRaw(registry, { method: ':__STORAGE_VERSION__:', prefix: name.toString() }, [], [], []), - { docs: 'Returns the current pallet version from storage', type: 'u16' } - )(registry) - } - ), - () => section + lazyMethod(result, section, () => + lazyMethods( + items, + (meta: StorageEntryMetadataLatest) => + createFunction(registry, { meta, method: meta.name.toString(), prefix, section }, {}), + objectNameFirstLower, + { + palletVersion: createRuntimeFunction( + { method: 'palletVersion', prefix, section }, + createKeyRaw(registry, { method: ':__STORAGE_VERSION__:', prefix: name.toString() }, [], [], []), + { docs: 'Returns the current pallet version from storage', type: 'u16' } + )(registry) + } + ) ); };