From 3ba964e0bff773005daa74e5b047a71b7237cff3 Mon Sep 17 00:00:00 2001 From: aristides Date: Wed, 30 Jul 2025 21:00:14 -0600 Subject: [PATCH 1/2] still runs migrations if semver check fails for all previous migrations (#2167) --- extension/src/background/helpers/dataStorage.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/extension/src/background/helpers/dataStorage.ts b/extension/src/background/helpers/dataStorage.ts index 046dd6b9ca..c723255173 100644 --- a/extension/src/background/helpers/dataStorage.ts +++ b/extension/src/background/helpers/dataStorage.ts @@ -106,7 +106,7 @@ export const migrateTokenIdList = async () => { const tokenIdsByKey = await localStore.getItem(TOKEN_ID_LIST); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.lt(storageVersion, "1.0.0")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "1.0.0" })) { if (Array.isArray(tokenIdsByKey)) { const newTokenList = { [NETWORKS.FUTURENET]: tokenIdsByKey, @@ -122,7 +122,7 @@ export const migrateTestnetSorobanRpcUrlNetworkDetails = async () => { const localStore = dataStorageAccess(browserLocalStorage); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.lt(storageVersion, "2.0.0")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "2.0.0" })) { const networksList: NetworkDetails[] = (await localStore.getItem(NETWORKS_LIST_ID)) || DEFAULT_NETWORKS; @@ -153,7 +153,7 @@ export const migrateToAccountSubscriptions = async () => { const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; // we only want to run this once per user - if (!storageVersion || semver.eq(storageVersion, "3.0.0")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "3.0.0" })) { // once account is unlocked, setup Mercury account subscription if !HAS_ACCOUNT_SUBSCRIPTION await localStore.setItem(HAS_ACCOUNT_SUBSCRIPTION, {}); } @@ -163,7 +163,7 @@ export const migrateMainnetSorobanRpcUrlNetworkDetails = async () => { const localStore = dataStorageAccess(browserLocalStorage); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.lt(storageVersion, "4.0.0")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "4.0.0" })) { const networksList: NetworkDetails[] = (await localStore.getItem(NETWORKS_LIST_ID)) || DEFAULT_NETWORKS; @@ -193,7 +193,7 @@ export const migrateSorobanRpcUrlNetwork = async () => { const localStore = dataStorageAccess(browserLocalStorage); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.lt(storageVersion, "4.0.1")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "4.0.1" })) { // an edge case exists in `migrateSorobanRpcUrlNetworkDetails` where we may have updated the `networksList` in storage, // but not the `network`, which is the current active network, // If a user has Futurenet selected by default, they will not have sorobanRpcUrl set @@ -215,7 +215,7 @@ export const resetAccountSubscriptions = async () => { const localStore = dataStorageAccess(browserLocalStorage); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.eq(storageVersion, "4.0.2")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "4.0.2" })) { // once account is unlocked, setup Mercury account subscription if !HAS_ACCOUNT_SUBSCRIPTION await localStore.setItem(HAS_ACCOUNT_SUBSCRIPTION, {}); await migrateDataStorageVersion("4.0.2"); @@ -226,7 +226,7 @@ export const addAssetsLists = async () => { const localStore = dataStorageAccess(browserLocalStorage); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.lt(storageVersion, "4.1.0")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "4.1.0" })) { // add the base asset lists await localStore.setItem(ASSETS_LISTS_ID, DEFAULT_ASSETS_LISTS); await migrateDataStorageVersion("4.1.0"); @@ -237,7 +237,7 @@ export const addIsHashSigningEnabled = async () => { const localStore = dataStorageAccess(browserLocalStorage); const storageVersion = (await localStore.getItem(STORAGE_VERSION)) as string; - if (!storageVersion || semver.lt(storageVersion, "4.1.1")) { + if (shouldRunMigration({ storageVersion, migrationVersion: "4.1.1" })) { // add the base asset lists await localStore.setItem(IS_HASH_SIGNING_ENABLED_ID, false); await migrateDataStorageVersion("4.1.1"); From 71e3a25a9085b6c579980279b472c32e86373712 Mon Sep 17 00:00:00 2001 From: Aristides Staffieri Date: Wed, 30 Jul 2025 21:10:01 -0600 Subject: [PATCH 2/2] updates test for migrations helper changes --- extension/src/background/helpers/__tests__/migrations.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/extension/src/background/helpers/__tests__/migrations.test.ts b/extension/src/background/helpers/__tests__/migrations.test.ts index fabe0ec27e..c865d2730a 100644 --- a/extension/src/background/helpers/__tests__/migrations.test.ts +++ b/extension/src/background/helpers/__tests__/migrations.test.ts @@ -150,7 +150,7 @@ describe("Storage migrations", () => { expect(storedNetworks[NETWORKS_LIST_ID]).toBeUndefined; }); it("migrateToAccountSubscriptions should set an empty map for account subscriptions", async () => { - await mockStorage.set({ [STORAGE_VERSION]: "3.0.0" }); + await mockStorage.set({ [STORAGE_VERSION]: "2.9.0" }); await DataStorage.migrateToAccountSubscriptions(); const storedAccountSubs = await mockStorage.get(HAS_ACCOUNT_SUBSCRIPTION); expect(storedAccountSubs[HAS_ACCOUNT_SUBSCRIPTION]).toEqual({}); @@ -209,7 +209,7 @@ describe("Storage migrations", () => { expect(storedVersion[STORAGE_VERSION]).toEqual("4.0.1"); }); it("resetAccountSubscriptions should reset accoutn subscriptions at storage versions 4.0.2", async () => { - await mockStorage.set({ [STORAGE_VERSION]: "4.0.2" }); + await mockStorage.set({ [STORAGE_VERSION]: "4.0.1" }); await DataStorage.resetAccountSubscriptions(); const storedAccountSubs = await mockStorage.get(HAS_ACCOUNT_SUBSCRIPTION); expect(storedAccountSubs[HAS_ACCOUNT_SUBSCRIPTION]).toEqual({});