1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-10-22 19:26:13 +02:00

Migrate 'localhost' tokens (#9570)

* Delete localhost state from incoming tx controller

* Migrate localhost tokens

Co-authored-by: Dan Finlay <542863+danfinlay@users.noreply.github.com>
This commit is contained in:
Erik Marks 2020-10-13 07:07:00 -07:00 committed by GitHub
parent ded43cbcdf
commit 6e8c9aede8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 111 additions and 0 deletions

View File

@ -12,6 +12,7 @@ const version = 48
* 5. Convert transactions metamaskNetworkId to decimal if they are hex
* 6. Convert address book keys from decimal to hex
* 7. Delete localhost key in IncomingTransactionsController
* 8. Merge 'localhost' tokens into 'rpc' tokens
*/
export default {
version,
@ -110,6 +111,25 @@ function transformState (state = {}) {
?.incomingTxLastFetchedBlocksByNetwork
?.localhost
// 8. Merge 'localhost' tokens into 'rpc' tokens
const accountTokens = state.PreferencesController?.accountTokens
if (accountTokens) {
Object.keys(accountTokens).forEach((account) => {
const localhostTokens = accountTokens[account]?.localhost || []
if (localhostTokens.length > 0) {
const rpcTokens = accountTokens[account].rpc || []
if (rpcTokens.length > 0) {
accountTokens[account].rpc = mergeTokenArrays(localhostTokens, rpcTokens)
} else {
accountTokens[account].rpc = localhostTokens
}
}
delete accountTokens[account]?.localhost
})
}
return state
}
@ -169,3 +189,36 @@ function updateChainIds (networkEntries, chainId) {
}
})
}
/**
* Merges the two given, non-empty arrays of token objects and returns a new
* array.
*
* @returns {Array<Object>}
*/
function mergeTokenArrays (localhostTokens, rpcTokens) {
const localhostTokensMap = tokenArrayToMap(localhostTokens)
const rpcTokensMap = tokenArrayToMap(rpcTokens)
const mergedTokens = []
new Set([
...Object.keys(localhostTokensMap),
...Object.keys(rpcTokensMap),
]).forEach((tokenAddress) => {
mergedTokens.push({
...localhostTokensMap[tokenAddress],
...rpcTokensMap[tokenAddress],
})
})
return mergedTokens
function tokenArrayToMap (array) {
return array.reduce((map, token) => {
if (token?.address && typeof token?.address === 'string') {
map[token.address] = token
}
return map
}, {})
}
}

View File

@ -575,4 +575,62 @@ describe('migration #48', function () {
foo: 'bar',
})
})
it('should merge localhost token list into rpc token list', async function () {
const oldStorage = {
meta: {},
data: {
PreferencesController: {
accountTokens: {
address1: {
localhost: [
{ address: '1', data1: 'stuff1' },
{ address: '2', a: 'X', b: 'B' },
],
rpc: [
{ address: '2', a: 'A', c: 'C' },
{ address: '3', data3: 'stuff3' },
],
foo: [],
},
address2: {
localhost: [],
rpc: [],
foo: [],
},
address3: {},
},
bar: 'baz',
},
foo: 'bar',
},
}
const newStorage = await migration48.migrate(oldStorage)
assert.deepEqual(newStorage.data, {
PreferencesController: {
accountTokens: {
address1: {
rpc: [
{ address: '1', data1: 'stuff1' },
{ address: '2', a: 'A', b: 'B', c: 'C' },
{ address: '3', data3: 'stuff3' },
],
foo: [],
},
address2: {
rpc: [],
foo: [],
},
address3: {},
},
bar: 'baz',
// from other migration
frequentRpcListDetail: [{
...localhostNetwork,
}],
},
foo: 'bar',
})
})
})