From b56c1a8282aeab4acbb36ea7b85b88860547bbda Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 17 Sep 2020 23:15:09 +0200 Subject: [PATCH] Explicit tie of metadata to registry (not implicit) (#2621) * Explicit tie of metadata to registry (not implicit) * Update type generation * Test updates * Revert non-problematic * Cleanup mocks * Updata metadata tests * CHANGELOG * linting --- CHANGELOG.md | 1 + package.json | 2 +- packages/api-derive/src/util/memo.ts | 2 +- packages/api/src/base/Init.ts | 5 +++-- .../consts/fromMetadata/fromMetadata.spec.ts | 2 ++ .../extrinsics/fromMetadata/fromMetadata.spec.ts | 3 +++ .../metadata/src/Decorated/extrinsics/index.spec.ts | 3 +++ packages/metadata/src/Metadata/MetadataVersioned.ts | 2 -- packages/metadata/src/Metadata/util/testUtil.ts | 12 +++++++++--- packages/rpc-provider/src/mock/index.ts | 11 ++++++++--- packages/typegen/src/generate/consts.ts | 6 +++++- packages/typegen/src/generate/query.ts | 6 +++++- packages/typegen/src/generate/tx.ts | 6 +++++- packages/types/src/codec/Tuple.spec.ts | 5 +++-- packages/types/src/codec/Vec.spec.ts | 4 ++-- packages/types/src/extrinsic/Extrinsic.spec.ts | 4 ++-- packages/types/src/extrinsic/SignerPayload.spec.ts | 4 ++-- packages/types/src/extrinsic/v2/Extrinsic.spec.ts | 6 +++--- packages/types/src/extrinsic/v3/Extrinsic.spec.ts | 6 +++--- packages/types/src/extrinsic/v4/Extrinsic.spec.ts | 8 ++++---- packages/types/src/generic/Block.spec.ts | 4 ++-- packages/types/src/generic/Call.spec.ts | 4 ++-- packages/types/src/index.spec.ts | 4 ++-- .../types/src/interfaces/runtime/SignedBlock.spec.ts | 4 ++-- .../types/src/interfaces/system/EventRecord.spec.ts | 10 ++++++---- yarn.lock | 10 +++++----- 26 files changed, 84 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 004c5488a6..1c7dafc274 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ Upgrade priority: High. Metadata v12 is the next major version containing struct Changes: +- Ensure Metadata retrieval does not pollute the default registry - When passing `{ nonce: -1 }` to `signAndSend` the API will use `system.accountNextIndex` to determine the nonce - Ensure that upgrades override old registry types (non-specified in current) - Support for Metadata v12 with fixed indices diff --git a/package.json b/package.json index 9b1992820f..69868a87a2 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@babel/core": "^7.11.6", "@babel/register": "^7.11.5", "@babel/runtime": "^7.11.2", - "@polkadot/dev": "^0.55.52", + "@polkadot/dev": "^0.55.53", "@polkadot/ts": "^0.3.47", "@polkadot/typegen": "workspace:packages/typegen", "@types/jest": "^26.0.13", diff --git a/packages/api-derive/src/util/memo.ts b/packages/api-derive/src/util/memo.ts index 816544d95a..78f7ca1c88 100644 --- a/packages/api-derive/src/util/memo.ts +++ b/packages/api-derive/src/util/memo.ts @@ -1,5 +1,5 @@ // Copyright 2017-2020 @polkadot/api-derive authors & contributors -// SPDX-License-Identifier: Apache-2.0v +// SPDX-License-Identifier: Apache-2.0 import createMemo from 'memoizee'; import { Observable, Observer, TeardownLogic } from 'rxjs'; diff --git a/packages/api/src/base/Init.ts b/packages/api/src/base/Init.ts index d797d7599d..03c789e5b6 100644 --- a/packages/api/src/base/Init.ts +++ b/packages/api/src/base/Init.ts @@ -127,8 +127,6 @@ export default abstract class Init extends Decorate extends Decorate extends Decorate { diff --git a/packages/metadata/src/Decorated/extrinsics/index.spec.ts b/packages/metadata/src/Decorated/extrinsics/index.spec.ts index 0b1da6709e..877cd8b6d7 100644 --- a/packages/metadata/src/Decorated/extrinsics/index.spec.ts +++ b/packages/metadata/src/Decorated/extrinsics/index.spec.ts @@ -11,6 +11,9 @@ import fromMetadata from './fromMetadata'; const keyring = testingPairs({ type: 'ed25519' }, false); const registry = new TypeRegistry(); const metadata = new Metadata(registry, metadataStatic); + +registry.setMetadata(metadata); + const extrinsics = fromMetadata(registry, metadata); describe('extrinsics', (): void => { diff --git a/packages/metadata/src/Metadata/MetadataVersioned.ts b/packages/metadata/src/Metadata/MetadataVersioned.ts index 59f5d4d06b..45ff6d718b 100644 --- a/packages/metadata/src/Metadata/MetadataVersioned.ts +++ b/packages/metadata/src/Metadata/MetadataVersioned.ts @@ -40,8 +40,6 @@ export default class MetadataVersioned extends Struct { magicNumber: MagicNumber, metadata: 'MetadataAll' }, value as Map); - - registry.setMetadata(this); } private _assertVersion (version: number): boolean { diff --git a/packages/metadata/src/Metadata/util/testUtil.ts b/packages/metadata/src/Metadata/util/testUtil.ts index 3e1f3d0b26..5628382646 100644 --- a/packages/metadata/src/Metadata/util/testUtil.ts +++ b/packages/metadata/src/Metadata/util/testUtil.ts @@ -14,6 +14,8 @@ export function decodeLatestSubstrate (registry: Registry it('decodes latest substrate properly', (): void => { const metadata = new Metadata(registry, rpcData); + registry.setMetadata(metadata); + try { expect(metadata.version).toBe(version); expect((metadata[`asV${version}` as keyof Metadata] as unknown as MetadataInterface).modules.length).not.toBe(0); @@ -29,11 +31,15 @@ export function decodeLatestSubstrate (registry: Registry /** @internal */ export function toLatest (registry: Registry, version: number, rpcData: string, withThrow = true): void { it(`converts v${version} to latest`, (): void => { - const metadata = new Metadata(registry, rpcData)[`asV${version}` as keyof Metadata]; - const metadataLatest = new Metadata(registry, rpcData).asLatest; + const metadata = new Metadata(registry, rpcData); + + registry.setMetadata(metadata); + + const metadataInit = metadata[`asV${version}` as keyof Metadata]; + const metadataLatest = metadata.asLatest; expect( - getUniqTypes(registry, metadata as unknown as MetadataInterface, withThrow) + getUniqTypes(registry, metadataInit as unknown as MetadataInterface, withThrow) ).toEqual( getUniqTypes(registry, metadataLatest, withThrow) ); diff --git a/packages/rpc-provider/src/mock/index.ts b/packages/rpc-provider/src/mock/index.ts index d4ed903fa0..949b04e814 100644 --- a/packages/rpc-provider/src/mock/index.ts +++ b/packages/rpc-provider/src/mock/index.ts @@ -10,7 +10,8 @@ import { MockStateSubscriptions, MockStateSubscriptionCallback, MockStateDb } fr import BN from 'bn.js'; import EventEmitter from 'eventemitter3'; -import Metadata from '@polkadot/metadata/Decorated'; +import Decorated from '@polkadot/metadata/Decorated'; +import Metadata from '@polkadot/metadata/Metadata'; import rpcMetadata from '@polkadot/metadata/Metadata/static'; import jsonrpc from '@polkadot/types/interfaces/jsonrpc'; import testKeyring from '@polkadot/keyring/testing'; @@ -171,6 +172,10 @@ export default class Mock implements ProviderInterface { const metadata = new Metadata(this.registry, rpcMetadata); + this.registry.setMetadata(metadata); + + const decorated = new Decorated(this.registry, metadata); + // Do something every 1 seconds setInterval((): void => { if (!this.isUpdating) { @@ -182,11 +187,11 @@ export default class Mock implements ProviderInterface { // increment the balances and nonce for each account keyring.getPairs().forEach(({ publicKey }, index): void => { - this.setStateBn(metadata.query.system.account(publicKey), newHead.number.toBn().addn(index)); + this.setStateBn(decorated.query.system.account(publicKey), newHead.number.toBn().addn(index)); }); // set the timestamp for the current block - this.setStateBn(metadata.query.timestamp.now(), Math.floor(Date.now() / 1000)); + this.setStateBn(decorated.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 f51eb16fb5..728ff548d8 100644 --- a/packages/typegen/src/generate/consts.ts +++ b/packages/typegen/src/generate/consts.ts @@ -77,5 +77,9 @@ export default function generateConsts (dest = 'packages/api/src/augment/consts. registerDefinitions(registry, extraTypes); - return generateForMeta(new Metadata(registry, data), dest, extraTypes, isStrict); + const metadata = new Metadata(registry, data); + + registry.setMetadata(metadata); + + return generateForMeta(metadata, dest, extraTypes, isStrict); } diff --git a/packages/typegen/src/generate/query.ts b/packages/typegen/src/generate/query.ts index 79fbcf4aff..41c43f7585 100644 --- a/packages/typegen/src/generate/query.ts +++ b/packages/typegen/src/generate/query.ts @@ -133,5 +133,9 @@ export default function generateQuery (dest = 'packages/api/src/augment/query.ts registerDefinitions(registry, extraTypes); - return generateForMeta(registry, new Metadata(registry, data), dest, extraTypes, isStrict); + const metadata = new Metadata(registry, data); + + registry.setMetadata(metadata); + + return generateForMeta(registry, metadata, dest, extraTypes, isStrict); } diff --git a/packages/typegen/src/generate/tx.ts b/packages/typegen/src/generate/tx.ts index 4b54ed7d72..dc971f2682 100644 --- a/packages/typegen/src/generate/tx.ts +++ b/packages/typegen/src/generate/tx.ts @@ -98,5 +98,9 @@ export default function generateTx (dest = 'packages/api/src/augment/tx.ts', dat registerDefinitions(registry, extraTypes); - return generateForMeta(registry, new Metadata(registry, data), dest, extraTypes, isStrict); + const metadata = new Metadata(registry, data); + + registry.setMetadata(metadata); + + return generateForMeta(registry, metadata, dest, extraTypes, isStrict); } diff --git a/packages/types/src/codec/Tuple.spec.ts b/packages/types/src/codec/Tuple.spec.ts index f0114f7a1c..85ba2b03e9 100644 --- a/packages/types/src/codec/Tuple.spec.ts +++ b/packages/types/src/codec/Tuple.spec.ts @@ -83,8 +83,9 @@ describe('Tuple', (): void => { }); it('creates properly via actual hex string', (): void => { - // eslint-disable-next-line no-new - new Metadata(registry, rpcMetadata); + const metadata = new Metadata(registry, rpcMetadata); + + registry.setMetadata(metadata); const test = new (Tuple.with([ registry.createClass('BlockNumber'), registry.createClass('VoteThreshold') diff --git a/packages/types/src/codec/Vec.spec.ts b/packages/types/src/codec/Vec.spec.ts index 739c09bddb..b8f4367118 100644 --- a/packages/types/src/codec/Vec.spec.ts +++ b/packages/types/src/codec/Vec.spec.ts @@ -14,9 +14,9 @@ import Vec from './Vec'; import Tuple from './Tuple'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, rpcMetadata); -// eslint-disable-next-line no-new -new Metadata(registry, rpcMetadata); +registry.setMetadata(metadata); describe('Vec', (): void => { let vector: Vec; diff --git a/packages/types/src/extrinsic/Extrinsic.spec.ts b/packages/types/src/extrinsic/Extrinsic.spec.ts index 6dc6b05623..acffdcf8d6 100644 --- a/packages/types/src/extrinsic/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/Extrinsic.spec.ts @@ -9,9 +9,9 @@ import { TypeRegistry } from '../create'; import Extrinsic from './Extrinsic'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, rpcMetadata); -// eslint-disable-next-line no-new -new Metadata(registry, rpcMetadata); +registry.setMetadata(metadata); describe('Extrinsic', (): void => { describe('V1', (): void => { diff --git a/packages/types/src/extrinsic/SignerPayload.spec.ts b/packages/types/src/extrinsic/SignerPayload.spec.ts index 2343df042b..517375b295 100644 --- a/packages/types/src/extrinsic/SignerPayload.spec.ts +++ b/packages/types/src/extrinsic/SignerPayload.spec.ts @@ -8,9 +8,9 @@ import { TypeRegistry } from '../create'; import SignerPayload from './SignerPayload'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, rpcMetadata); -// eslint-disable-next-line no-new -new Metadata(registry, rpcMetadata); +registry.setMetadata(metadata); describe('SignerPayload', (): void => { const TEST = { diff --git a/packages/types/src/extrinsic/v2/Extrinsic.spec.ts b/packages/types/src/extrinsic/v2/Extrinsic.spec.ts index 580f7e5ba9..3c10bf92fb 100644 --- a/packages/types/src/extrinsic/v2/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v2/Extrinsic.spec.ts @@ -11,11 +11,11 @@ import { TypeRegistry } from '../../create'; import Extrinsic from './Extrinsic'; const registry = new TypeRegistry(); -const decorated = new Decorated(registry, rpcMetadata); +const metadata = new Metadata(registry, rpcMetadata); +const decorated = new Decorated(registry, metadata); const keyring = testingPairs({ type: 'ed25519' }, false); -// eslint-disable-next-line no-new -new Metadata(registry, rpcMetadata); +registry.setMetadata(metadata); describe('ExtrinsicV2', (): void => { it('constructs a sane Uint8Array (default)', (): void => { diff --git a/packages/types/src/extrinsic/v3/Extrinsic.spec.ts b/packages/types/src/extrinsic/v3/Extrinsic.spec.ts index 274708c57b..2a2d87d073 100644 --- a/packages/types/src/extrinsic/v3/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v3/Extrinsic.spec.ts @@ -11,11 +11,11 @@ import { TypeRegistry } from '../../create'; import Extrinsic from './Extrinsic'; const registry = new TypeRegistry(); -const decorated = new Decorated(registry, rpcMetadata); +const metadata = new Metadata(registry, rpcMetadata); +const decorated = new Decorated(registry, metadata); const keyring = testingPairs({ type: 'ed25519' }, false); -// eslint-disable-next-line no-new -new Metadata(registry, rpcMetadata); +registry.setMetadata(metadata); describe('ExtrinsicV3', (): void => { it('constructs a sane Uint8Array (default)', (): void => { diff --git a/packages/types/src/extrinsic/v4/Extrinsic.spec.ts b/packages/types/src/extrinsic/v4/Extrinsic.spec.ts index 26ff22e222..a1d15e93d4 100644 --- a/packages/types/src/extrinsic/v4/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v4/Extrinsic.spec.ts @@ -5,17 +5,17 @@ import BN from 'bn.js'; import testingPairs from '@polkadot/keyring/testingPairs'; import Decorated from '@polkadot/metadata/Decorated'; import Metadata from '@polkadot/metadata/Metadata'; -import metadataStatic from '@polkadot/metadata/Metadata/static'; +import rpcMetadata from '@polkadot/metadata/Metadata/static'; import { TypeRegistry } from '../../create'; import Extrinsic from './Extrinsic'; const registry = new TypeRegistry(); -const decorated = new Decorated(registry, metadataStatic); +const metadata = new Metadata(registry, rpcMetadata); +const decorated = new Decorated(registry, metadata); const keyring = testingPairs({ type: 'ed25519' }, false); -// eslint-disable-next-line no-new -new Metadata(registry, metadataStatic); +registry.setMetadata(metadata); describe('ExtrinsicV4', (): void => { it.only('constructs a sane Uint8Array (default)', (): void => { diff --git a/packages/types/src/generic/Block.spec.ts b/packages/types/src/generic/Block.spec.ts index d29f9d407e..5678a18fff 100644 --- a/packages/types/src/generic/Block.spec.ts +++ b/packages/types/src/generic/Block.spec.ts @@ -12,9 +12,9 @@ import block00300 from '../json/SignedBlock.003.00.json'; import Block from './Block'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, metadataStatic); -// eslint-disable-next-line no-new -new Metadata(registry, metadataStatic); +registry.setMetadata(metadata); describe('Block', (): void => { it('has a valid toRawType', (): void => { diff --git a/packages/types/src/generic/Call.spec.ts b/packages/types/src/generic/Call.spec.ts index 9b61d22045..15ecc75f3d 100644 --- a/packages/types/src/generic/Call.spec.ts +++ b/packages/types/src/generic/Call.spec.ts @@ -8,9 +8,9 @@ import { TypeRegistry } from '../create'; import Call from './Call'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, metadataStatic); -// eslint-disable-next-line no-new -new Metadata(registry, metadataStatic); +registry.setMetadata(metadata); describe('Call', (): void => { it('handles decoding correctly (bare)', (): void => { diff --git a/packages/types/src/index.spec.ts b/packages/types/src/index.spec.ts index 106743a1e4..8da13a4f88 100644 --- a/packages/types/src/index.spec.ts +++ b/packages/types/src/index.spec.ts @@ -22,9 +22,9 @@ const UNCONSTRUCTABLE = [ ].map((v): string => v.toLowerCase()); const registry = new TypeRegistry(); +const metadata = new Metadata(registry, metadataStatic); -// eslint-disable-next-line no-new -new Metadata(registry, metadataStatic); +registry.setMetadata(metadata); function testTypes (type: string, typeNames: string[]): void { describe(type, (): void => { diff --git a/packages/types/src/interfaces/runtime/SignedBlock.spec.ts b/packages/types/src/interfaces/runtime/SignedBlock.spec.ts index 72e436e67a..aa71d48b33 100644 --- a/packages/types/src/interfaces/runtime/SignedBlock.spec.ts +++ b/packages/types/src/interfaces/runtime/SignedBlock.spec.ts @@ -12,9 +12,9 @@ import mortalTxs from '../../json/SignedBlock.004.mortal.json'; import knownMehods from '../../json/SignedBlock.005.json'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, metadataStatic); -// eslint-disable-next-line no-new -new Metadata(registry, metadataStatic); +registry.setMetadata(metadata); describe('SignedBlock', (): void => { it('decodes a full block', (): void => { diff --git a/packages/types/src/interfaces/system/EventRecord.spec.ts b/packages/types/src/interfaces/system/EventRecord.spec.ts index 5da8790eb3..07903b9ddc 100644 --- a/packages/types/src/interfaces/system/EventRecord.spec.ts +++ b/packages/types/src/interfaces/system/EventRecord.spec.ts @@ -17,8 +17,9 @@ describe('EventRecord', (): void => { describe('EventRecordTo76', (): void => { beforeEach((): void => { - // eslint-disable-next-line no-new - new Metadata(registry, rpcMetadataV1); + const metadata = new Metadata(registry, rpcMetadataV1); + + registry.setMetadata(metadata); }); it('decodes correctly', (): void => { @@ -31,8 +32,9 @@ describe('EventRecord', (): void => { describe('EventRecord (current)', (): void => { beforeEach((): void => { - // eslint-disable-next-line no-new - new Metadata(registry, rpcMetadata); + const metadata = new Metadata(registry, rpcMetadata); + + registry.setMetadata(metadata); }); it('decodes older EventRecord correctly', (): void => { diff --git a/yarn.lock b/yarn.lock index a52d771bf7..79aa4d4e4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2803,9 +2803,9 @@ __metadata: languageName: unknown linkType: soft -"@polkadot/dev@npm:^0.55.52": - version: 0.55.52 - resolution: "@polkadot/dev@npm:0.55.52" +"@polkadot/dev@npm:^0.55.53": + version: 0.55.53 + resolution: "@polkadot/dev@npm:0.55.53" dependencies: "@babel/cli": ^7.11.6 "@babel/core": ^7.11.6 @@ -2895,7 +2895,7 @@ __metadata: polkadot-exec-typedoc: scripts/polkadot-exec-typedoc.js polkadot-exec-vuepress: scripts/polkadot-exec-vuepress.js polkadot-exec-webpack: scripts/polkadot-exec-webpack.js - checksum: 72d8af9ad50913285743bead3ccbfc7cf49c1e90ecdec78e9ab1f97701b2589408c769341e66fcc09a8c3a229fabc268ba3734355091aa11f927cba93143c00c + checksum: 99de00bb9f821cd4566b98720b1d840cf59ddb3e1702e54addf9753015e46c1ebccbdfaee0d63e67f8ee92cfa8948558703fd5877e9dd17b17a7316f45f552c2 languageName: node linkType: hard @@ -15911,7 +15911,7 @@ fsevents@^1.2.7: "@babel/core": ^7.11.6 "@babel/register": ^7.11.5 "@babel/runtime": ^7.11.2 - "@polkadot/dev": ^0.55.52 + "@polkadot/dev": ^0.55.53 "@polkadot/ts": ^0.3.47 "@polkadot/typegen": "workspace:packages/typegen" "@types/jest": ^26.0.13