From b76f9e7e2172853c9d2686385d2ca7451b97503e Mon Sep 17 00:00:00 2001 From: Jaco Date: Wed, 2 Feb 2022 10:30:25 +0100 Subject: [PATCH] Adjust runtime upgrade init (#4519) --- CHANGELOG.md | 7 +++++++ packages/api/src/base/Init.ts | 3 +-- packages/types/src/create/registry.ts | 22 +++++---------------- packages/types/src/types/augmentRegistry.ts | 2 +- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54f6158ef3..81496dff61 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # CHANGELOG +## master + +Changes: + +- Don't clear injected `PortableRegistry` types on runtime upgrade + + ## 7.6.1 Jan 30, 2022 Upgdare priority: Low. Recommended for users with long-running scripts and those chains based around the latest Substrate master versions. diff --git a/packages/api/src/base/Init.ts b/packages/api/src/base/Init.ts index 6f316a6e53..04e5dd63ef 100644 --- a/packages/api/src/base/Init.ts +++ b/packages/api/src/base/Init.ts @@ -284,8 +284,7 @@ export abstract class Init extends Decorate { thisRegistry.metadata = metadata; thisRegistry.specVersion = version.specVersion; - // clear the registry types to ensure that we override correctly - this._initRegistry(thisRegistry.registry.init(), this._runtimeChain as Text, version, metadata); + this._initRegistry(this.registry, this._runtimeChain as Text, version, metadata); this._injectMetadata(thisRegistry, false); return true; diff --git a/packages/types/src/create/registry.ts b/packages/types/src/create/registry.ts index 94baeaf9d1..78e2f74ff2 100644 --- a/packages/types/src/create/registry.ts +++ b/packages/types/src/create/registry.ts @@ -86,7 +86,7 @@ function injectEvents (registry: TypeRegistry, { lookup, pallets }: MetadataLate lazyMethod(result, version >= 12 ? index.toNumber() : i, () => lazyVariants(lookup, events.unwrap(), getVariantStringIdx, (variant: SiVariant): CodecClass => { - const meta = (registry as Registry).createType('EventMetadataLatest', objectSpread({}, variant, { args: getFieldArgs(lookup, variant.fields) })); + const meta = registry.createType('EventMetadataLatest', objectSpread({}, variant, { args: getFieldArgs(lookup, variant.fields) })); return class extends GenericEventData { constructor (registry: Registry, value: Uint8Array) { @@ -118,7 +118,7 @@ function injectExtrinsics (registry: TypeRegistry, { lookup, pallets }: Metadata // extract additional properties from the metadata function extractProperties (registry: TypeRegistry, metadata: Metadata): ChainProperties | undefined { - const original = (registry as Registry).getChainProperties(); + const original = registry.getChainProperties(); const constants = decorateConstants(registry, metadata.asLatest, metadata.version); const ss58Format = constants.system && (constants.system.sS58Prefix || constants.system.ss58Prefix); @@ -170,20 +170,6 @@ export class TypeRegistry implements Registry { this.#knownDefaults = objectSpread({ Json, Metadata, PortableRegistry, Raw }, baseTypes); this.#knownDefinitions = definitions; - this.init(); - - if (createdAtHash) { - this.createdAtHash = this.createType('Hash', createdAtHash); - } - } - - public init (): this { - // start clean - this.#classes = new Map(); - this.#definitions = new Map(); - this.#unknownTypes = new Map(); - this.#knownTypes = {}; - // register know, first classes then on-demand-created definitions this.register(this.#knownDefaults); @@ -193,7 +179,9 @@ export class TypeRegistry implements Registry { this.register(allKnown[i].types as unknown as RegistryTypes); } - return this; + if (createdAtHash) { + this.createdAtHash = this.createType('Hash', createdAtHash); + } } public get chainDecimals (): number[] { diff --git a/packages/types/src/types/augmentRegistry.ts b/packages/types/src/types/augmentRegistry.ts index 1834a58937..5c8f922665 100644 --- a/packages/types/src/types/augmentRegistry.ts +++ b/packages/types/src/types/augmentRegistry.ts @@ -61,7 +61,7 @@ declare module '@polkadot/types-codec/types/registry' { // hasDef (name: string): boolean; // hasType (name: string): boolean; // hash (data: Uint8Array): IU8a; - init (): Registry; + // register (type: CodecClass | RegistryTypes): void; // register (name: string, type: CodecClass): void; // register (arg1: string | CodecClass | RegistryTypes, arg2?: CodecClass): void;