mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-28 23:06:37 +01:00
f033a59b17
Migration #77 would set the `TokenListController.tokensChainsCache` state to `undefined` if it wasn't already set to anything when that migration was run. This is probably harmless except that it results in Sentry errors during migrations, and it results in that property having a value (at least temporarily) that doesn't match its type. Migration #77 has been updated to prevent this property from being set to `undefined` going forward. A new migration has been added to delete this value for any users already affected by this problem. The new migration was named "92.1" so that it could run after 92 but before 93, to make backporting this to v10.34.x easier (v10.34.x is currently on migration 92). "92.1" is still a valid number so this should work just as well as a whole number.
54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { cloneDeep } from 'lodash';
|
|
import { hasProperty, isObject } from '@metamask/utils';
|
|
import log from 'loglevel';
|
|
|
|
export const version = 92.1;
|
|
|
|
/**
|
|
* Check whether the `TokenListController.tokensChainsCache` state is
|
|
* `undefined`, and delete it if so.
|
|
*
|
|
* This property was accidentally set to `undefined` by an earlier revision of
|
|
* migration #77 in some cases.
|
|
*
|
|
* @param originalVersionedData - Versioned MetaMask extension state, exactly what we persist to dist.
|
|
* @param originalVersionedData.meta - State metadata.
|
|
* @param originalVersionedData.meta.version - The current state version.
|
|
* @param originalVersionedData.data - The persisted MetaMask state, keyed by controller.
|
|
* @returns Updated versioned MetaMask extension state.
|
|
*/
|
|
export async function migrate(originalVersionedData: {
|
|
meta: { version: number };
|
|
data: Record<string, unknown>;
|
|
}) {
|
|
const versionedData = cloneDeep(originalVersionedData);
|
|
versionedData.meta.version = version;
|
|
versionedData.data = transformState(versionedData.data);
|
|
return versionedData;
|
|
}
|
|
|
|
function transformState(state: Record<string, unknown>) {
|
|
if (!hasProperty(state, 'TokenListController')) {
|
|
log.warn('Skipping migration, TokenListController state is missing');
|
|
return state;
|
|
} else if (!isObject(state.TokenListController)) {
|
|
global.sentry?.captureException?.(
|
|
new Error(
|
|
`typeof state.TokenListController is ${typeof state.TokenListController}`,
|
|
),
|
|
);
|
|
return state;
|
|
} else if (!hasProperty(state.TokenListController, 'tokensChainsCache')) {
|
|
log.warn(
|
|
'Skipping migration, TokenListController.tokensChainsCache state is missing',
|
|
);
|
|
return state;
|
|
}
|
|
|
|
if (state.TokenListController.tokensChainsCache === undefined) {
|
|
delete state.TokenListController.tokensChainsCache;
|
|
}
|
|
|
|
return state;
|
|
}
|