Add migration to set showTestNetworks to true if there is evidence of testnet use (#12675)
* Add migration to set showTestNetworks to true if there is evidence the user has used a test network * Add migration to index file * Remove console.log * Clean up conditional structure in migration 67feature/default_network_editable
parent
405b56c730
commit
2ced3a8bfa
@ -0,0 +1,66 @@ |
||||
import { cloneDeep } from 'lodash'; |
||||
import BigNumber from 'bignumber.js'; |
||||
import { TEST_CHAINS } from '../../../shared/constants/network'; |
||||
|
||||
const hexNumberIsGreaterThanZero = (hexNumber) => |
||||
new BigNumber(hexNumber || '0x0', 16).gt(0); |
||||
|
||||
const version = 67; |
||||
|
||||
/** |
||||
* Sets the showTestNetworks property to true if it was false or undefined, and there is evidence |
||||
* that the user has used a test net |
||||
*/ |
||||
export default { |
||||
version, |
||||
async migrate(originalVersionedData) { |
||||
const versionedData = cloneDeep(originalVersionedData); |
||||
versionedData.meta.version = version; |
||||
const state = versionedData.data; |
||||
const newState = transformState(state); |
||||
versionedData.data = newState; |
||||
return versionedData; |
||||
}, |
||||
}; |
||||
|
||||
function transformState(state) { |
||||
const PreferencesController = state?.PreferencesController || {}; |
||||
const preferences = PreferencesController.preferences || {}; |
||||
|
||||
if (preferences.showTestNetworks) { |
||||
return state; |
||||
} |
||||
|
||||
const transactions = state?.TransactionController?.transactions || {}; |
||||
const provider = state.NetworkController?.provider || {}; |
||||
const cachedBalances = state.CachedBalancesController?.cachedBalances || {}; |
||||
|
||||
const userIsCurrentlyOnATestNet = TEST_CHAINS.includes(provider?.chainId); |
||||
const userHasMadeATestNetTransaction = Object.values( |
||||
transactions, |
||||
).some(({ chainId }) => TEST_CHAINS.includes(chainId)); |
||||
const userHasACachedBalanceOnATestnet = TEST_CHAINS.some((chainId) => { |
||||
const cachedBalancesForChain = Object.values(cachedBalances[chainId] || {}); |
||||
const userHasABalanceGreaterThanZeroOnThisChain = cachedBalancesForChain.some( |
||||
hexNumberIsGreaterThanZero, |
||||
); |
||||
return userHasABalanceGreaterThanZeroOnThisChain; |
||||
}); |
||||
const userHasUsedATestnet = |
||||
userIsCurrentlyOnATestNet || |
||||
userHasMadeATestNetTransaction || |
||||
userHasACachedBalanceOnATestnet; |
||||
|
||||
const newState = { |
||||
...state, |
||||
PreferencesController: { |
||||
...PreferencesController, |
||||
preferences: { |
||||
...preferences, |
||||
showTestNetworks: userHasUsedATestnet, |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
return newState; |
||||
} |
@ -0,0 +1,217 @@ |
||||
import { TEST_CHAINS } from '../../../shared/constants/network'; |
||||
import migration67 from './067'; |
||||
|
||||
describe('migration #67', () => { |
||||
it('should update the version metadata', async () => { |
||||
const oldStorage = { |
||||
meta: { |
||||
version: 66, |
||||
}, |
||||
data: {}, |
||||
}; |
||||
|
||||
const newStorage = await migration67.migrate(oldStorage); |
||||
expect(newStorage.meta).toStrictEqual({ |
||||
version: 67, |
||||
}); |
||||
}); |
||||
|
||||
it('should set showTestNetworks to true if the user is currently on a test network', async () => { |
||||
const oldStorage = { |
||||
meta: {}, |
||||
data: { |
||||
PreferencesController: { |
||||
preferences: { |
||||
showTestNetworks: false, |
||||
}, |
||||
}, |
||||
NetworkController: { |
||||
provider: { |
||||
chainId: TEST_CHAINS[0], |
||||
}, |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
const newStorage = await migration67.migrate(oldStorage); |
||||
expect( |
||||
newStorage.data.PreferencesController.preferences.showTestNetworks, |
||||
).toBe(true); |
||||
}); |
||||
|
||||
it('should set showTestNetworks to true if there is a transaction on a test network in state', async () => { |
||||
const oldStorage = { |
||||
meta: {}, |
||||
data: { |
||||
PreferencesController: { |
||||
preferences: { |
||||
showTestNetworks: false, |
||||
}, |
||||
}, |
||||
NetworkController: { |
||||
provider: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
TransactionController: { |
||||
transactions: { |
||||
abc123: { |
||||
chainId: TEST_CHAINS[0], |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
const newStorage = await migration67.migrate(oldStorage); |
||||
expect( |
||||
newStorage.data.PreferencesController.preferences.showTestNetworks, |
||||
).toBe(true); |
||||
}); |
||||
|
||||
it('should set showTestNetworks to true if the user has a cached balance on a test network', async () => { |
||||
const oldStorage = { |
||||
meta: {}, |
||||
data: { |
||||
PreferencesController: { |
||||
preferences: { |
||||
showTestNetworks: false, |
||||
}, |
||||
}, |
||||
NetworkController: { |
||||
provider: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
TransactionController: { |
||||
transactions: { |
||||
abc123: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
}, |
||||
CachedBalancesController: { |
||||
cachedBalances: { |
||||
'0x1': { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
[TEST_CHAINS[0]]: { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x1', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
[TEST_CHAINS[1]]: { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
const newStorage = await migration67.migrate(oldStorage); |
||||
expect( |
||||
newStorage.data.PreferencesController.preferences.showTestNetworks, |
||||
).toBe(true); |
||||
}); |
||||
|
||||
it('should leave showTestNetworks false if there is no evidence of test network usage', async () => { |
||||
const oldStorage = { |
||||
meta: {}, |
||||
data: { |
||||
PreferencesController: { |
||||
preferences: { |
||||
showTestNetworks: false, |
||||
}, |
||||
}, |
||||
NetworkController: { |
||||
provider: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
TransactionController: { |
||||
transactions: { |
||||
abc123: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
}, |
||||
CachedBalancesController: { |
||||
cachedBalances: { |
||||
'0x1': { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x10', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x20', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x30', |
||||
}, |
||||
[TEST_CHAINS[0]]: { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
[TEST_CHAINS[1]]: { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}; |
||||
const newStorage = await migration67.migrate(oldStorage); |
||||
expect( |
||||
newStorage.data.PreferencesController.preferences.showTestNetworks, |
||||
).toBe(false); |
||||
}); |
||||
|
||||
it('should leave showTestNetworks true if it was true but there is no evidence of test network usage', async () => { |
||||
const oldStorage = { |
||||
meta: {}, |
||||
data: { |
||||
PreferencesController: { |
||||
preferences: { |
||||
showTestNetworks: true, |
||||
}, |
||||
}, |
||||
NetworkController: { |
||||
provider: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
TransactionController: { |
||||
transactions: { |
||||
abc123: { |
||||
chainId: 'not a test net', |
||||
}, |
||||
}, |
||||
}, |
||||
CachedBalancesController: { |
||||
cachedBalances: { |
||||
'0x1': { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x10', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x20', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x30', |
||||
}, |
||||
[TEST_CHAINS[0]]: { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
[TEST_CHAINS[1]]: { |
||||
'0x027d4ae98b79d0c52918bab4c3170bea701fb8ab': '0x0', |
||||
'0x2f318c334780961fb129d2a6c30d0763d9a5c970': '0x0', |
||||
'0x7a46ce51fbbb29c34aea1fe9833c27b5d2781925': '0x0', |
||||
}, |
||||
}, |
||||
}, |
||||
}, |
||||
}; |
||||
|
||||
const newStorage = await migration67.migrate(oldStorage); |
||||
expect( |
||||
newStorage.data.PreferencesController.preferences.showTestNetworks, |
||||
).toBe(true); |
||||
}); |
||||
}); |
Loading…
Reference in new issue