From 1ba74c1566fe67f610a730c362b3989e63787d4c Mon Sep 17 00:00:00 2001 From: frankiebee Date: Thu, 5 Apr 2018 17:49:50 -0700 Subject: [PATCH 1/2] test - run live migrations over first time state --- test/unit/migrator-test.js | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/test/unit/migrator-test.js b/test/unit/migrator-test.js index 16066fefe..9e8b59958 100644 --- a/test/unit/migrator-test.js +++ b/test/unit/migrator-test.js @@ -1,7 +1,8 @@ const assert = require('assert') const clone = require('clone') const Migrator = require('../../app/scripts/lib/migrator/') -const migrations = [ +const liveMigrations = require('../../app/scripts/migrations/') +const stubMigrations = [ { version: 1, migrate: (data) => { @@ -29,13 +30,33 @@ const migrations = [ }, ] const versionedData = {meta: {version: 0}, data: {hello: 'world'}} -describe('Migrator', () => { - const migrator = new Migrator({ migrations }) + +const firstTimeState = { + meta: { version: 0 }, + data: require('../../app/scripts/first-time-state'), +} + +describe.only('Migrator', () => { + const migrator = new Migrator({ migrations: stubMigrations }) it('migratedData version should be version 3', (done) => { + migrator.on('error', console.log) migrator.migrateData(versionedData) .then((migratedData) => { - assert.equal(migratedData.meta.version, migrations[2].version) + assert.equal(migratedData.meta.version, stubMigrations[2].version) done() }).catch(done) }) + + it('should match the last version in live migrations', (done) => { + const migrator = new Migrator({ migrations: liveMigrations }) + migrator.on('error', console.log) + migrator.migrateData(firstTimeState) + .then((migratedData) => { + console.log(migratedData) + const last = liveMigrations.length - 1 + assert.equal(migratedData.meta.version, liveMigrations[last].version) + done() + }).catch(done) + }) + }) From 7d243aacf9db9dc8e3e2e3acfc54298ffc06fe12 Mon Sep 17 00:00:00 2001 From: frankiebee Date: Thu, 5 Apr 2018 18:05:03 -0700 Subject: [PATCH 2/2] create migration 25 --- app/scripts/migrations/025.js | 61 ++++++++++++++++++++++++++++++++ app/scripts/migrations/index.js | 1 + test/unit/migrations/025-test.js | 49 +++++++++++++++++++++++++ test/unit/migrator-test.js | 4 +-- 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 app/scripts/migrations/025.js create mode 100644 test/unit/migrations/025-test.js diff --git a/app/scripts/migrations/025.js b/app/scripts/migrations/025.js new file mode 100644 index 000000000..fc3b20a44 --- /dev/null +++ b/app/scripts/migrations/025.js @@ -0,0 +1,61 @@ +// next version number +const version = 25 + +/* + +normalizes txParams on unconfirmed txs + +*/ +const ethUtil = require('ethereumjs-util') +const clone = require('clone') + +module.exports = { + version, + + migrate: async function (originalVersionedData) { + const versionedData = clone(originalVersionedData) + versionedData.meta.version = version + const state = versionedData.data + const newState = transformState(state) + versionedData.data = newState + return versionedData + }, +} + +function transformState (state) { + const newState = state + + if (newState.TransactionController) { + if (newState.TransactionController.transactions) { + const transactions = newState.TransactionController.transactions + newState.TransactionController.transactions = transactions.map((txMeta) => { + if (txMeta.status !== 'unapproved') return txMeta + txMeta.txParams = normalizeTxParams(txMeta.txParams) + return txMeta + }) + } + } + + return newState +} + +function normalizeTxParams (txParams) { + // functions that handle normalizing of that key in txParams + const whiteList = { + from: from => ethUtil.addHexPrefix(from).toLowerCase(), + to: to => ethUtil.addHexPrefix(txParams.to).toLowerCase(), + nonce: nonce => ethUtil.addHexPrefix(nonce), + value: value => ethUtil.addHexPrefix(value), + data: data => ethUtil.addHexPrefix(data), + gas: gas => ethUtil.addHexPrefix(gas), + gasPrice: gasPrice => ethUtil.addHexPrefix(gasPrice), + } + + // apply only keys in the whiteList + const normalizedTxParams = {} + Object.keys(whiteList).forEach((key) => { + if (txParams[key]) normalizedTxParams[key] = whiteList[key](txParams[key]) + }) + + return normalizedTxParams +} diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index 7e4542740..6c4a51b32 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -35,4 +35,5 @@ module.exports = [ require('./022'), require('./023'), require('./024'), + require('./025'), ] diff --git a/test/unit/migrations/025-test.js b/test/unit/migrations/025-test.js new file mode 100644 index 000000000..76c25dbb6 --- /dev/null +++ b/test/unit/migrations/025-test.js @@ -0,0 +1,49 @@ +const assert = require('assert') +const migration25 = require('../../../app/scripts/migrations/025') +const firstTimeState = { + meta: {}, + data: require('../../../app/scripts/first-time-state'), +} + +const storage = { + "meta": {}, + "data": { + "TransactionController": { + "transactions": [ + ] + }, + }, +} + +const transactions = [] + + +while (transactions.length <= 10) { + transactions.push({ txParams: { from: '0x8aCce2391c0d510a6c5E5d8f819a678f79b7e675', random: 'stuff', chainId: 2 }, status: 'unapproved' }) + transactions.push({ txParams: { from: '0x8aCce2391c0d510a6c5E5d8f819a678f79b7e675' }, status: 'confirmed' }) +} + + +storage.data.TransactionController.transactions = transactions + +describe('storage is migrated successfully and the txParams.from are lowercase', () => { + it('should lowercase the from for unapproved txs', (done) => { + migration25.migrate(storage) + .then((migratedData) => { + const migratedTransactions = migratedData.data.TransactionController.transactions + migratedTransactions.forEach((tx) => { + if (tx.status === 'unapproved') assert(!tx.txParams.random) + if (tx.status === 'unapproved') assert(!tx.txParams.chainId) + }) + done() + }).catch(done) + }) + + it('should migrate first time state', (done) => { + migration25.migrate(firstTimeState) + .then((migratedData) => { + assert.equal(migratedData.meta.version, 25) + done() + }).catch(done) + }) +}) diff --git a/test/unit/migrator-test.js b/test/unit/migrator-test.js index 9e8b59958..2bad7da51 100644 --- a/test/unit/migrator-test.js +++ b/test/unit/migrator-test.js @@ -36,10 +36,9 @@ const firstTimeState = { data: require('../../app/scripts/first-time-state'), } -describe.only('Migrator', () => { +describe('Migrator', () => { const migrator = new Migrator({ migrations: stubMigrations }) it('migratedData version should be version 3', (done) => { - migrator.on('error', console.log) migrator.migrateData(versionedData) .then((migratedData) => { assert.equal(migratedData.meta.version, stubMigrations[2].version) @@ -49,7 +48,6 @@ describe.only('Migrator', () => { it('should match the last version in live migrations', (done) => { const migrator = new Migrator({ migrations: liveMigrations }) - migrator.on('error', console.log) migrator.migrateData(firstTimeState) .then((migratedData) => { console.log(migratedData)