From caec49a8dc0fde9ecddc9f80c02ff29bdbffa3f9 Mon Sep 17 00:00:00 2001 From: Jaco Date: Sat, 18 Sep 2021 11:56:35 +0300 Subject: [PATCH] Fix Substrate key generation (#3968) * Fix Substrate key generation * 6.0.2 --- CHANGELOG.md | 9 ++++ package.json | 2 +- packages/api-contract/package.json | 6 +-- packages/api-derive/package.json | 10 ++-- packages/api/package.json | 12 ++--- packages/rpc-core/package.json | 6 +-- packages/rpc-provider/package.json | 6 +-- packages/typegen/package.json | 10 ++-- packages/types-known/package.json | 4 +- packages/types-support/package.json | 2 +- packages/types/package.json | 4 +- .../decorate/storage/getStorage.spec.ts | 8 ++- .../decorate/storage/substrate.spec.ts | 17 +++++- .../metadata/decorate/storage/substrate.ts | 52 ++++++++++++++++-- yarn.lock | 54 +++++++++---------- 15 files changed, 137 insertions(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1cab85ff3c..ca06c2785d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # CHANGELOG +## 6.0.2 Sep 18, 2021 + +Upgrade priority: Low. Recommended for all users on 6.0.1, especially those using `api.query.substrate.*` calls + +Changes: + +- Fix `api.query.substrate.*` key generation + + ## 6.0.1 Sep 18, 2021 Upgrade priority: Low. Recommended for users of the latest Substrate/Polkadot with Metadata v14. diff --git a/package.json b/package.json index fef9082aaf..b284d4d51f 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,6 @@ "@types/jest": "^27.0.1", "copyfiles": "^2.4.1" }, - "version": "6.0.1", + "version": "6.0.2", "packageManager": "yarn@3.0.1" } diff --git a/packages/api-contract/package.json b/packages/api-contract/package.json index a21379803f..72c15b6dbc 100644 --- a/packages/api-contract/package.json +++ b/packages/api-contract/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/api-contract", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Interfaces for interacting with contracts and contract ABIs", "main": "index.js", @@ -20,8 +20,8 @@ "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-contract#readme", "dependencies": { "@babel/runtime": "^7.15.4", - "@polkadot/api": "6.0.1", - "@polkadot/types": "6.0.1", + "@polkadot/api": "6.0.2", + "@polkadot/types": "6.0.2", "@polkadot/util": "^7.4.1", "rxjs": "^7.3.0" } diff --git a/packages/api-derive/package.json b/packages/api-derive/package.json index a3b7b3380e..e57235d0ed 100644 --- a/packages/api-derive/package.json +++ b/packages/api-derive/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/api-derive", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Common functions used across Polkadot, derived from RPC calls and storage queries.", "main": "index.js", @@ -20,15 +20,15 @@ "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api-derive#readme", "dependencies": { "@babel/runtime": "^7.15.4", - "@polkadot/api": "6.0.1", - "@polkadot/rpc-core": "6.0.1", - "@polkadot/types": "6.0.1", + "@polkadot/api": "6.0.2", + "@polkadot/rpc-core": "6.0.2", + "@polkadot/types": "6.0.2", "@polkadot/util": "^7.4.1", "@polkadot/util-crypto": "^7.4.1", "rxjs": "^7.3.0" }, "devDependencies": { "@polkadot/keyring": "^7.4.1", - "@polkadot/rpc-provider": "6.0.1" + "@polkadot/rpc-provider": "6.0.2" } } diff --git a/packages/api/package.json b/packages/api/package.json index 0416cac896..3e9bf16360 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/api", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Promise and RxJS wrappers around the Polkadot JS RPC", "main": "index.js", @@ -20,12 +20,12 @@ "homepage": "https://github.com/polkadot-js/api/tree/master/packages/api#readme", "dependencies": { "@babel/runtime": "^7.15.4", - "@polkadot/api-derive": "6.0.1", + "@polkadot/api-derive": "6.0.2", "@polkadot/keyring": "^7.4.1", - "@polkadot/rpc-core": "6.0.1", - "@polkadot/rpc-provider": "6.0.1", - "@polkadot/types": "6.0.1", - "@polkadot/types-known": "6.0.1", + "@polkadot/rpc-core": "6.0.2", + "@polkadot/rpc-provider": "6.0.2", + "@polkadot/types": "6.0.2", + "@polkadot/types-known": "6.0.2", "@polkadot/util": "^7.4.1", "@polkadot/util-crypto": "^7.4.1", "eventemitter3": "^4.0.7", diff --git a/packages/rpc-core/package.json b/packages/rpc-core/package.json index dd0274f9d6..4589ea95d0 100644 --- a/packages/rpc-core/package.json +++ b/packages/rpc-core/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/rpc-core", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "A JavaScript wrapper for the Polkadot JsonRPC interface", "main": "index.js", @@ -20,8 +20,8 @@ "homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-core#readme", "dependencies": { "@babel/runtime": "^7.15.4", - "@polkadot/rpc-provider": "6.0.1", - "@polkadot/types": "6.0.1", + "@polkadot/rpc-provider": "6.0.2", + "@polkadot/types": "6.0.2", "@polkadot/util": "^7.4.1", "rxjs": "^7.3.0" }, diff --git a/packages/rpc-provider/package.json b/packages/rpc-provider/package.json index 018b7ff69e..a0af6009ce 100644 --- a/packages/rpc-provider/package.json +++ b/packages/rpc-provider/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/rpc-provider", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Transport providers for the API", "main": "index.js", @@ -20,7 +20,7 @@ "homepage": "https://github.com/polkadot-js/api/tree/master/packages/rpc-provider#readme", "dependencies": { "@babel/runtime": "^7.15.4", - "@polkadot/types": "6.0.1", + "@polkadot/types": "6.0.2", "@polkadot/util": "^7.4.1", "@polkadot/util-crypto": "^7.4.1", "@polkadot/x-fetch": "^7.4.1", @@ -30,7 +30,7 @@ }, "devDependencies": { "@polkadot/keyring": "^7.4.1", - "@polkadot/types": "6.0.1", + "@polkadot/types": "6.0.2", "mock-socket": "^9.0.3", "nock": "^13.1.3" } diff --git a/packages/typegen/package.json b/packages/typegen/package.json index 372420e045..defea4aa93 100644 --- a/packages/typegen/package.json +++ b/packages/typegen/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/typegen", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Type generation scripts", "main": "index.js", @@ -29,10 +29,10 @@ "@babel/core": "^7.15.5", "@babel/register": "^7.15.3", "@babel/runtime": "^7.15.4", - "@polkadot/api": "6.0.1", - "@polkadot/rpc-provider": "6.0.1", - "@polkadot/types": "6.0.1", - "@polkadot/types-support": "6.0.1", + "@polkadot/api": "6.0.2", + "@polkadot/rpc-provider": "6.0.2", + "@polkadot/types": "6.0.2", + "@polkadot/types-support": "6.0.2", "@polkadot/util": "^7.4.1", "handlebars": "^4.7.7", "websocket": "^1.0.34", diff --git a/packages/types-known/package.json b/packages/types-known/package.json index aa787b2a93..3ce0e0a298 100644 --- a/packages/types-known/package.json +++ b/packages/types-known/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/types-known", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Known type definitions", "main": "index.js", @@ -21,7 +21,7 @@ "dependencies": { "@babel/runtime": "^7.15.4", "@polkadot/networks": "^7.4.1", - "@polkadot/types": "6.0.1", + "@polkadot/types": "6.0.2", "@polkadot/util": "^7.4.1" } } diff --git a/packages/types-support/package.json b/packages/types-support/package.json index 6af68a9bbb..2364bda1ae 100644 --- a/packages/types-support/package.json +++ b/packages/types-support/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/types-support", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Supporting files for types, mostly for testing", "main": "index.js", diff --git a/packages/types/package.json b/packages/types/package.json index a4e0d6765b..ebfae52c37 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@polkadot/types", - "version": "6.0.1", + "version": "6.0.2", "type": "module", "description": "Implementation of the Parity codec", "main": "index.js", @@ -26,7 +26,7 @@ }, "devDependencies": { "@polkadot/keyring": "^7.4.1", - "@polkadot/types-support": "6.0.1", + "@polkadot/types-support": "6.0.2", "@types/bn.js": "^4.11.6", "bn.js": "^4.12.0" } diff --git a/packages/types/src/metadata/decorate/storage/getStorage.spec.ts b/packages/types/src/metadata/decorate/storage/getStorage.spec.ts index 699c0f7526..a8902e0825 100644 --- a/packages/types/src/metadata/decorate/storage/getStorage.spec.ts +++ b/packages/types/src/metadata/decorate/storage/getStorage.spec.ts @@ -1,13 +1,19 @@ // Copyright 2017-2021 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 +import metadataStatic from '@polkadot/types-support/metadata/static-substrate'; import { compactAddLength, u8aToU8a } from '@polkadot/util'; import { TypeRegistry } from '../../../create'; +import { Metadata } from '../../Metadata'; import { getStorage } from './getStorage'; +const registry = new TypeRegistry(); +const metadata = new Metadata(registry, metadataStatic); + +registry.setMetadata(metadata); + describe('getSorage', (): void => { - const registry = new TypeRegistry(); const storage = getStorage(registry); it('should return well known keys', (): void => { diff --git a/packages/types/src/metadata/decorate/storage/substrate.spec.ts b/packages/types/src/metadata/decorate/storage/substrate.spec.ts index 09a177500d..17241f93d7 100644 --- a/packages/types/src/metadata/decorate/storage/substrate.spec.ts +++ b/packages/types/src/metadata/decorate/storage/substrate.spec.ts @@ -1,19 +1,34 @@ // Copyright 2017-2021 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 +import metadataStatic from '@polkadot/types-support/metadata/static-substrate'; import { compactAddLength, u8aToU8a } from '@polkadot/util'; import { TypeRegistry } from '../../../create'; +import { Metadata } from '../../Metadata'; import { substrate } from './substrate'; const registry = new TypeRegistry(); +const metadata = new Metadata(registry, metadataStatic); + +registry.setMetadata(metadata); + +// console.log(JSON.stringify(registry.lookup.types)); describe('substrate', (): void => { + const code = substrate.code(registry); + it('creates a well-known :code key', (): void => { expect( - substrate.code(registry)() + code() ).toEqual( compactAddLength(u8aToU8a(':code')) ); }); + + it('has the correct metadata', (): void => { + expect( + code.meta.type.isPlain + ).toEqual(true); + }); }); diff --git a/packages/types/src/metadata/decorate/storage/substrate.ts b/packages/types/src/metadata/decorate/storage/substrate.ts index 7cc6c5137d..702919e193 100644 --- a/packages/types/src/metadata/decorate/storage/substrate.ts +++ b/packages/types/src/metadata/decorate/storage/substrate.ts @@ -1,7 +1,7 @@ // Copyright 2017-2021 @polkadot/types authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { StorageEntryMetadataLatest } from '../../../interfaces'; +import type { PortableType } from '../../../interfaces'; import type { StorageEntry } from '../../../primitive/types'; import type { Registry } from '../../../types'; @@ -14,18 +14,60 @@ interface SubstrateMetadata { type Creator = (registry: Registry) => StorageEntry; +function findSiPrimitive (registry: Registry, _prim: string): PortableType | undefined { + const prim = _prim.toLowerCase(); + + const portable = registry.lookup.types.find((t) => + ( + t.type.def.isPrimitive && + t.type.def.asPrimitive.toString().toLowerCase() === prim + ) || ( + t.type.def.isHistoricMetaCompat && + t.type.def.asHistoricMetaCompat.toString().toLowerCase() === prim + ) + ); + + return portable; +} + +function findSiType (registry: Registry, orig: string): PortableType | undefined { + let portable = findSiPrimitive(registry, orig); + + if (!portable && orig === 'Bytes') { + const u8 = findSiPrimitive(registry, 'u8'); + + if (u8) { + portable = registry.lookup.types.find((t) => + ( + t.type.def.isSequence && + t.type.def.asSequence.type.eq(u8.id) + ) || ( + t.type.def.isHistoricMetaCompat && + t.type.def.asHistoricMetaCompat.eq(orig) + ) + ); + } + } + + if (!portable) { + console.warn(`Unable to map ${orig} to a lookup index`); + } + + return portable; +} + // Small helper function to factorize code on this page. /** @internal */ function createRuntimeFunction (method: string, key: string, { docs, type }: SubstrateMetadata): (registry: Registry) => StorageEntry { return (registry: Registry): StorageEntry => createFunction(registry, { - meta: { + meta: registry.createType('StorageEntryMetadataLatest', { docs: registry.createType('Vec', [docs]), - modifier: registry.createType('StorageEntryModifierLatest', 1), // required + modifier: registry.createType('StorageEntryModifierLatest', 'Required'), name: registry.createType('Text', method), toJSON: (): any => key, - type: registry.createType('StorageEntryTypeLatest', type, 0) - } as StorageEntryMetadataLatest, + type: registry.createType('StorageEntryTypeLatest', { Plain: findSiType(registry, type)?.id || 0 }) + }), method, prefix: 'Substrate', section: 'substrate' diff --git a/yarn.lock b/yarn.lock index 9682e2a351..d1e540b3b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1854,40 +1854,40 @@ __metadata: resolution: "@polkadot/api-contract@workspace:packages/api-contract" dependencies: "@babel/runtime": ^7.15.4 - "@polkadot/api": 6.0.1 - "@polkadot/types": 6.0.1 + "@polkadot/api": 6.0.2 + "@polkadot/types": 6.0.2 "@polkadot/util": ^7.4.1 rxjs: ^7.3.0 languageName: unknown linkType: soft -"@polkadot/api-derive@6.0.1, @polkadot/api-derive@workspace:packages/api-derive": +"@polkadot/api-derive@6.0.2, @polkadot/api-derive@workspace:packages/api-derive": version: 0.0.0-use.local resolution: "@polkadot/api-derive@workspace:packages/api-derive" dependencies: "@babel/runtime": ^7.15.4 - "@polkadot/api": 6.0.1 + "@polkadot/api": 6.0.2 "@polkadot/keyring": ^7.4.1 - "@polkadot/rpc-core": 6.0.1 - "@polkadot/rpc-provider": 6.0.1 - "@polkadot/types": 6.0.1 + "@polkadot/rpc-core": 6.0.2 + "@polkadot/rpc-provider": 6.0.2 + "@polkadot/types": 6.0.2 "@polkadot/util": ^7.4.1 "@polkadot/util-crypto": ^7.4.1 rxjs: ^7.3.0 languageName: unknown linkType: soft -"@polkadot/api@6.0.1, @polkadot/api@workspace:packages/api": +"@polkadot/api@6.0.2, @polkadot/api@workspace:packages/api": version: 0.0.0-use.local resolution: "@polkadot/api@workspace:packages/api" dependencies: "@babel/runtime": ^7.15.4 - "@polkadot/api-derive": 6.0.1 + "@polkadot/api-derive": 6.0.2 "@polkadot/keyring": ^7.4.1 - "@polkadot/rpc-core": 6.0.1 - "@polkadot/rpc-provider": 6.0.1 - "@polkadot/types": 6.0.1 - "@polkadot/types-known": 6.0.1 + "@polkadot/rpc-core": 6.0.2 + "@polkadot/rpc-provider": 6.0.2 + "@polkadot/types": 6.0.2 + "@polkadot/types-known": 6.0.2 "@polkadot/util": ^7.4.1 "@polkadot/util-crypto": ^7.4.1 eventemitter3: ^4.0.7 @@ -2012,26 +2012,26 @@ __metadata: languageName: node linkType: hard -"@polkadot/rpc-core@6.0.1, @polkadot/rpc-core@workspace:packages/rpc-core": +"@polkadot/rpc-core@6.0.2, @polkadot/rpc-core@workspace:packages/rpc-core": version: 0.0.0-use.local resolution: "@polkadot/rpc-core@workspace:packages/rpc-core" dependencies: "@babel/runtime": ^7.15.4 "@polkadot/keyring": ^7.4.1 - "@polkadot/rpc-provider": 6.0.1 - "@polkadot/types": 6.0.1 + "@polkadot/rpc-provider": 6.0.2 + "@polkadot/types": 6.0.2 "@polkadot/util": ^7.4.1 rxjs: ^7.3.0 languageName: unknown linkType: soft -"@polkadot/rpc-provider@6.0.1, @polkadot/rpc-provider@workspace:packages/rpc-provider": +"@polkadot/rpc-provider@6.0.2, @polkadot/rpc-provider@workspace:packages/rpc-provider": version: 0.0.0-use.local resolution: "@polkadot/rpc-provider@workspace:packages/rpc-provider" dependencies: "@babel/runtime": ^7.15.4 "@polkadot/keyring": ^7.4.1 - "@polkadot/types": 6.0.1 + "@polkadot/types": 6.0.2 "@polkadot/util": ^7.4.1 "@polkadot/util-crypto": ^7.4.1 "@polkadot/x-fetch": ^7.4.1 @@ -2059,10 +2059,10 @@ __metadata: "@babel/core": ^7.15.5 "@babel/register": ^7.15.3 "@babel/runtime": ^7.15.4 - "@polkadot/api": 6.0.1 - "@polkadot/rpc-provider": 6.0.1 - "@polkadot/types": 6.0.1 - "@polkadot/types-support": 6.0.1 + "@polkadot/api": 6.0.2 + "@polkadot/rpc-provider": 6.0.2 + "@polkadot/types": 6.0.2 + "@polkadot/types-support": 6.0.2 "@polkadot/util": ^7.4.1 "@types/websocket": ^1.0.4 "@types/yargs": ^17.0.2 @@ -2078,18 +2078,18 @@ __metadata: languageName: unknown linkType: soft -"@polkadot/types-known@6.0.1, @polkadot/types-known@workspace:packages/types-known": +"@polkadot/types-known@6.0.2, @polkadot/types-known@workspace:packages/types-known": version: 0.0.0-use.local resolution: "@polkadot/types-known@workspace:packages/types-known" dependencies: "@babel/runtime": ^7.15.4 "@polkadot/networks": ^7.4.1 - "@polkadot/types": 6.0.1 + "@polkadot/types": 6.0.2 "@polkadot/util": ^7.4.1 languageName: unknown linkType: soft -"@polkadot/types-support@6.0.1, @polkadot/types-support@workspace:packages/types-support": +"@polkadot/types-support@6.0.2, @polkadot/types-support@workspace:packages/types-support": version: 0.0.0-use.local resolution: "@polkadot/types-support@workspace:packages/types-support" dependencies: @@ -2098,13 +2098,13 @@ __metadata: languageName: unknown linkType: soft -"@polkadot/types@6.0.1, @polkadot/types@workspace:packages/types": +"@polkadot/types@6.0.2, @polkadot/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@polkadot/types@workspace:packages/types" dependencies: "@babel/runtime": ^7.15.4 "@polkadot/keyring": ^7.4.1 - "@polkadot/types-support": 6.0.1 + "@polkadot/types-support": 6.0.2 "@polkadot/util": ^7.4.1 "@polkadot/util-crypto": ^7.4.1 "@types/bn.js": ^4.11.6