From 45a6e18fc2b94d7df580a5582c55cab20953befb Mon Sep 17 00:00:00 2001 From: Jaco Date: Tue, 28 Dec 2021 15:18:57 +0100 Subject: [PATCH] Only apply knownGenesis once for metadata (#949) * Only apply knownGenesis once for metadata * Adjust * Clear old known metadata entries * Add missing dep --- CHANGELOG.md | 8 ++++ packages/extension-base/package.json | 1 + .../src/background/handlers/State.ts | 37 +++++++++++++++++-- yarn.lock | 1 + 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd019e28..a67f0996 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # CHANGELOG +## master + +Changes: + +- Ensure that only latest metadata is applied (when multiple genesis) +- Rename all `*.test.ts` to `*.spec.ts` (cross-repo consistency) + + ## 0.42.4 Dec 27, 2021 **Important** As 0.42.3, not published to the stores, fixes dependency issue in 0.42.4. diff --git a/packages/extension-base/package.json b/packages/extension-base/package.json index 7088c80e..1071b3db 100644 --- a/packages/extension-base/package.json +++ b/packages/extension-base/package.json @@ -26,6 +26,7 @@ "@polkadot/extension-dapp": "^0.42.5-1", "@polkadot/extension-inject": "^0.42.5-1", "@polkadot/keyring": "^8.2.2", + "@polkadot/networks": "^8.2.2", "@polkadot/phishing": "^0.6.585", "@polkadot/rpc-provider": "^7.1.2-0", "@polkadot/types": "^7.1.2-0", diff --git a/packages/extension-base/src/background/handlers/State.ts b/packages/extension-base/src/background/handlers/State.ts index 7d982e1a..99a62326 100644 --- a/packages/extension-base/src/background/handlers/State.ts +++ b/packages/extension-base/src/background/handlers/State.ts @@ -9,6 +9,7 @@ import { BehaviorSubject } from 'rxjs'; import { getId } from '@polkadot/extension-base/utils/getId'; import { addMetadata, knownMetadata } from '@polkadot/extension-chains'; +import { knownGenesis } from '@polkadot/networks/defaults'; import settings from '@polkadot/ui-settings'; import { assert } from '@polkadot/util'; @@ -85,6 +86,38 @@ export enum NotificationOptions { const AUTH_URLS_KEY = 'authUrls'; +function extractMetadata (store: MetadataStore): void { + const knownEntries = Object.entries(knownGenesis); + const defs: Record = {}; + const removals: string[] = []; + + store.all((key: string, def: MetadataDef): void => { + const entry = knownEntries.find(([, hashes]) => hashes.includes(def.genesisHash)); + + if (entry) { + const [name, hashes] = entry; + const index = hashes.indexOf(def.genesisHash); + + // flatten the known metadata based on the genesis index + // (lower is better/newer) + if (!defs[name] || (defs[name].index > index)) { + if (defs[name]) { + // remove the old version of the metadata + removals.push(defs[name].key); + } + + defs[name] = { def, index, key }; + } + } else { + // this is not a known entry, so we will just apply it + defs[key] = { def, index: 0, key }; + } + }); + + removals.forEach((key) => store.remove(key)); + Object.values(defs).forEach(({ def }) => addMetadata(def)); +} + export default class State { readonly #authUrls: AuthUrls = {}; @@ -115,9 +148,7 @@ export default class State { constructor (providers: Providers = {}) { this.#providers = providers; - this.#metaStore.all((_key: string, def: MetadataDef): void => { - addMetadata(def); - }); + extractMetadata(this.#metaStore); // retrieve previously set authorizations const authString = localStorage.getItem(AUTH_URLS_KEY) || '{}'; diff --git a/yarn.lock b/yarn.lock index a2763c4c..c9adab25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2486,6 +2486,7 @@ __metadata: "@polkadot/extension-inject": ^0.42.5-1 "@polkadot/extension-mocks": ^0.42.5-1 "@polkadot/keyring": ^8.2.2 + "@polkadot/networks": ^8.2.2 "@polkadot/phishing": ^0.6.585 "@polkadot/rpc-provider": ^7.1.2-0 "@polkadot/types": ^7.1.2-0