diff options
author | kumavis <kumavis@users.noreply.github.com> | 2017-08-24 15:15:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-24 15:15:24 +0800 |
commit | 9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c (patch) | |
tree | e36d653722775ddd129efb156afbed64b2d8b8af /app | |
parent | 799c4cb6903bd7395c82abe879978cc911ae0a36 (diff) | |
parent | c2624dd1a071ea4388df23400f4319e863d061c6 (diff) | |
download | tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.tar tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.tar.gz tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.tar.bz2 tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.tar.lz tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.tar.xz tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.tar.zst tangerine-wallet-browser-9ce82640f25efa2dd1e0b8e8d449b7a9619e5f2c.zip |
Merge pull request #1973 from MetaMask/hotfix-migration019
hotfix - fail submitted txs whos nonce is out of bound
Diffstat (limited to 'app')
-rw-r--r-- | app/scripts/lib/nonce-tracker.js | 2 | ||||
-rw-r--r-- | app/scripts/migrations/019.js | 83 | ||||
-rw-r--r-- | app/scripts/migrations/index.js | 1 |
3 files changed, 85 insertions, 1 deletions
diff --git a/app/scripts/lib/nonce-tracker.js b/app/scripts/lib/nonce-tracker.js index 08f1e1e86..0029ac953 100644 --- a/app/scripts/lib/nonce-tracker.js +++ b/app/scripts/lib/nonce-tracker.js @@ -88,7 +88,7 @@ class NonceTracker { // and pending count are from the same block const currentBlock = await this._getCurrentBlock() const blockNumber = currentBlock.blockNumber - const baseCountBN = await this.ethQuery.getTransactionCount(address, blockNumber) + const baseCountBN = await this.ethQuery.getTransactionCount(address, blockNumber || 'latest') const baseCount = baseCountBN.toNumber() assert(Number.isInteger(baseCount), `nonce-tracker - baseCount is not an integer - got: (${typeof baseCount}) "${baseCount}"`) const nonceDetails = { blockNumber, baseCount } diff --git a/app/scripts/migrations/019.js b/app/scripts/migrations/019.js new file mode 100644 index 000000000..072c96370 --- /dev/null +++ b/app/scripts/migrations/019.js @@ -0,0 +1,83 @@ + +const version = 19 + +/* + +This migration sets transactions as failed +whos nonce is too high + +*/ + +const clone = require('clone') + +module.exports = { + version, + + migrate: function (originalVersionedData) { + const versionedData = clone(originalVersionedData) + versionedData.meta.version = version + try { + const state = versionedData.data + const newState = transformState(state) + versionedData.data = newState + } catch (err) { + console.warn(`MetaMask Migration #${version}` + err.stack) + } + return Promise.resolve(versionedData) + }, +} + +function transformState (state) { + const newState = state + const transactions = newState.TransactionController.transactions + + newState.TransactionController.transactions = transactions.map((txMeta, _, txList) => { + if (txMeta.status !== 'submitted') return txMeta + + const confirmedTxs = txList.filter((tx) => tx.status === 'confirmed') + .filter((tx) => tx.txParams.from === txMeta.txParams.from) + .filter((tx) => tx.metamaskNetworkId.from === txMeta.metamaskNetworkId.from) + const highestConfirmedNonce = getHighestNonce(confirmedTxs) + + const pendingTxs = txList.filter((tx) => tx.status === 'submitted') + .filter((tx) => tx.txParams.from === txMeta.txParams.from) + .filter((tx) => tx.metamaskNetworkId.from === txMeta.metamaskNetworkId.from) + const highestContinuousNonce = getHighestContinuousFrom(pendingTxs, highestConfirmedNonce) + + const maxNonce = Math.max(highestContinuousNonce, highestConfirmedNonce) + + if (parseInt(txMeta.txParams.nonce, 16) > maxNonce + 1) { + txMeta.status = 'failed' + txMeta.err = { + message: 'nonce too high', + note: 'migration 019 custom error', + } + } + return txMeta + }) + return newState +} + +function getHighestContinuousFrom (txList, startPoint) { + const nonces = txList.map((txMeta) => { + const nonce = txMeta.txParams.nonce + return parseInt(nonce, 16) + }) + + let highest = startPoint + while (nonces.includes(highest)) { + highest++ + } + + return highest +} + +function getHighestNonce (txList) { + const nonces = txList.map((txMeta) => { + const nonce = txMeta.txParams.nonce + return parseInt(nonce || '0x0', 16) + }) + const highestNonce = Math.max.apply(null, nonces) + return highestNonce +} + diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index 6bfc622f7..e9cbd7b98 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -29,4 +29,5 @@ module.exports = [ require('./016'), require('./017'), require('./018'), + require('./019'), ] |