mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-28 23:06:37 +01:00
3b0d37c3bf
* Handle the case where tokensChainsCache data is undefined in migration 77 * Delete parts of state that should have been removed in migrations 82,84,86 and 88 * Create 077-supplements.md * Update 077-supplements.md * Update 077-supplements/*.js code comments * Fix types and jsdoc * Type/lint fix * Cleanup * Add 'should set data to an empty object if it is null' test case to 077.test.js * Update app/scripts/migrations/077.test.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Modify deletion criteria so that all decimal chain id proprties are deleted in migration 88 supplement * Readme.md * Update app/scripts/migrations/077.test.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Update app/scripts/migrations/077.test.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Update app/scripts/migrations/077.test.js Co-authored-by: Mark Stacey <markjstacey@gmail.com> * Lint fix * Only delete decimal chain id keyed-entries in migration 88 supplement if there are hexadecimal keyed entries as well * Remove redundant test * Add 'does not delete' cases for nftcontroller related tests in 077.test.js --------- Co-authored-by: Mark Stacey <markjstacey@gmail.com>
153 lines
4.8 KiB
TypeScript
153 lines
4.8 KiB
TypeScript
import { hasProperty, isObject, isStrictHexString } from '@metamask/utils';
|
|
|
|
/**
|
|
* Deletes properties of `NftController.allNftContracts`, `NftController.allNfts`,
|
|
* `TokenListController.tokensChainsCache`, `TokensController.allTokens`,
|
|
* `TokensController.allIgnoredTokens` and `TokensController.allDetectedTokens` if
|
|
* their keyed by decimal number chainId and another hexadecimal chainId property
|
|
* exists within the same object.
|
|
* Further explanation in ./077-supplements.md
|
|
*
|
|
* @param state - The persisted MetaMask state, keyed by controller.
|
|
* @returns Updated versioned MetaMask extension state.
|
|
*/
|
|
export default function transformState077For086(
|
|
state: Record<string, unknown>,
|
|
): Record<string, unknown> {
|
|
if (hasProperty(state, 'NftController') && isObject(state.NftController)) {
|
|
const nftControllerState = state.NftController;
|
|
|
|
// Migrate NftController.allNftContracts
|
|
if (
|
|
hasProperty(nftControllerState, 'allNftContracts') &&
|
|
isObject(nftControllerState.allNftContracts)
|
|
) {
|
|
const { allNftContracts } = nftControllerState;
|
|
|
|
if (
|
|
Object.keys(allNftContracts).every((address) =>
|
|
isObject(allNftContracts[address]),
|
|
)
|
|
) {
|
|
Object.keys(allNftContracts).forEach((address) => {
|
|
const nftContractsByChainId = allNftContracts[address];
|
|
if (
|
|
isObject(nftContractsByChainId) &&
|
|
anyKeysAreHex(nftContractsByChainId)
|
|
) {
|
|
for (const chainId of Object.keys(nftContractsByChainId)) {
|
|
if (!isStrictHexString(chainId)) {
|
|
delete nftContractsByChainId[chainId];
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// Migrate NftController.allNfts
|
|
if (
|
|
hasProperty(nftControllerState, 'allNfts') &&
|
|
isObject(nftControllerState.allNfts)
|
|
) {
|
|
const { allNfts } = nftControllerState;
|
|
|
|
if (Object.keys(allNfts).every((address) => isObject(allNfts[address]))) {
|
|
Object.keys(allNfts).forEach((address) => {
|
|
const nftsByChainId = allNfts[address];
|
|
if (isObject(nftsByChainId) && anyKeysAreHex(nftsByChainId)) {
|
|
for (const chainId of Object.keys(nftsByChainId)) {
|
|
if (!isStrictHexString(chainId)) {
|
|
delete nftsByChainId[chainId];
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
state.NftController = nftControllerState;
|
|
}
|
|
|
|
if (
|
|
hasProperty(state, 'TokenListController') &&
|
|
isObject(state.TokenListController)
|
|
) {
|
|
const tokenListControllerState = state.TokenListController;
|
|
|
|
// Migrate TokenListController.tokensChainsCache
|
|
if (
|
|
hasProperty(tokenListControllerState, 'tokensChainsCache') &&
|
|
isObject(tokenListControllerState.tokensChainsCache) &&
|
|
anyKeysAreHex(tokenListControllerState.tokensChainsCache)
|
|
) {
|
|
for (const chainId of Object.keys(
|
|
tokenListControllerState.tokensChainsCache,
|
|
)) {
|
|
if (!isStrictHexString(chainId)) {
|
|
delete tokenListControllerState.tokensChainsCache[chainId];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (
|
|
hasProperty(state, 'TokensController') &&
|
|
isObject(state.TokensController)
|
|
) {
|
|
const tokensControllerState = state.TokensController;
|
|
|
|
// Migrate TokensController.allTokens
|
|
if (
|
|
hasProperty(tokensControllerState, 'allTokens') &&
|
|
isObject(tokensControllerState.allTokens) &&
|
|
anyKeysAreHex(tokensControllerState.allTokens)
|
|
) {
|
|
const { allTokens } = tokensControllerState;
|
|
|
|
for (const chainId of Object.keys(allTokens)) {
|
|
if (!isStrictHexString(chainId)) {
|
|
delete tokensControllerState.allTokens[chainId];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Migrate TokensController.allIgnoredTokens
|
|
if (
|
|
hasProperty(tokensControllerState, 'allIgnoredTokens') &&
|
|
isObject(tokensControllerState.allIgnoredTokens) &&
|
|
anyKeysAreHex(tokensControllerState.allIgnoredTokens)
|
|
) {
|
|
const { allIgnoredTokens } = tokensControllerState;
|
|
|
|
for (const chainId of Object.keys(allIgnoredTokens)) {
|
|
if (!isStrictHexString(chainId)) {
|
|
delete tokensControllerState.allIgnoredTokens[chainId];
|
|
}
|
|
}
|
|
}
|
|
|
|
// Migrate TokensController.allDetectedTokens
|
|
if (
|
|
hasProperty(tokensControllerState, 'allDetectedTokens') &&
|
|
isObject(tokensControllerState.allDetectedTokens) &&
|
|
anyKeysAreHex(tokensControllerState.allDetectedTokens)
|
|
) {
|
|
const { allDetectedTokens } = tokensControllerState;
|
|
|
|
for (const chainId of Object.keys(allDetectedTokens)) {
|
|
if (!isStrictHexString(chainId)) {
|
|
delete tokensControllerState.allDetectedTokens[chainId];
|
|
}
|
|
}
|
|
}
|
|
|
|
state.TokensController = tokensControllerState;
|
|
}
|
|
return state;
|
|
}
|
|
|
|
function anyKeysAreHex(obj: Record<string, unknown>) {
|
|
return Object.keys(obj).some((chainId) => isStrictHexString(chainId));
|
|
}
|