import { cloneDeep } from 'lodash'; import { GOERLI, GOERLI_CHAIN_ID, KOVAN, KOVAN_CHAIN_ID, MAINNET, MAINNET_CHAIN_ID, NETWORK_TYPE_RPC, RINKEBY, RINKEBY_CHAIN_ID, ROPSTEN, ROPSTEN_CHAIN_ID, } from '../../../shared/constants/network'; const version = 52; /** * Migrate tokens in Preferences to be keyed by chainId instead of * providerType. To prevent breaking user's MetaMask and selected * tokens, this migration copies the RPC entry into *every* custom RPC * chainId. */ export default { version, async migrate(originalVersionedData) { const versionedData = cloneDeep(originalVersionedData); versionedData.meta.version = version; const state = versionedData.data; versionedData.data = transformState(state); return versionedData; }, }; function transformState(state = {}) { if (state.PreferencesController) { const { accountTokens, accountHiddenTokens, frequentRpcListDetail } = state.PreferencesController; const newAccountTokens = {}; const newAccountHiddenTokens = {}; if (accountTokens && Object.keys(accountTokens).length > 0) { for (const address of Object.keys(accountTokens)) { newAccountTokens[address] = {}; if (accountTokens[address][NETWORK_TYPE_RPC]) { frequentRpcListDetail.forEach((detail) => { newAccountTokens[address][detail.chainId] = accountTokens[address][NETWORK_TYPE_RPC]; }); } for (const providerType of Object.keys(accountTokens[address])) { switch (providerType) { case MAINNET: newAccountTokens[address][MAINNET_CHAIN_ID] = accountTokens[address][MAINNET]; break; case ROPSTEN: newAccountTokens[address][ROPSTEN_CHAIN_ID] = accountTokens[address][ROPSTEN]; break; case RINKEBY: newAccountTokens[address][RINKEBY_CHAIN_ID] = accountTokens[address][RINKEBY]; break; case GOERLI: newAccountTokens[address][GOERLI_CHAIN_ID] = accountTokens[address][GOERLI]; break; case KOVAN: newAccountTokens[address][KOVAN_CHAIN_ID] = accountTokens[address][KOVAN]; break; default: break; } } } state.PreferencesController.accountTokens = newAccountTokens; } if (accountHiddenTokens && Object.keys(accountHiddenTokens).length > 0) { for (const address of Object.keys(accountHiddenTokens)) { newAccountHiddenTokens[address] = {}; if (accountHiddenTokens[address][NETWORK_TYPE_RPC]) { frequentRpcListDetail.forEach((detail) => { newAccountHiddenTokens[address][detail.chainId] = accountHiddenTokens[address][NETWORK_TYPE_RPC]; }); } for (const providerType of Object.keys(accountHiddenTokens[address])) { switch (providerType) { case MAINNET: newAccountHiddenTokens[address][MAINNET_CHAIN_ID] = accountHiddenTokens[address][MAINNET]; break; case ROPSTEN: newAccountHiddenTokens[address][ROPSTEN_CHAIN_ID] = accountHiddenTokens[address][ROPSTEN]; break; case RINKEBY: newAccountHiddenTokens[address][RINKEBY_CHAIN_ID] = accountHiddenTokens[address][RINKEBY]; break; case GOERLI: newAccountHiddenTokens[address][GOERLI_CHAIN_ID] = accountHiddenTokens[address][GOERLI]; break; case KOVAN: newAccountHiddenTokens[address][KOVAN_CHAIN_ID] = accountHiddenTokens[address][KOVAN]; break; default: break; } } } state.PreferencesController.accountHiddenTokens = newAccountHiddenTokens; } } return state; }