diff options
author | frankiebee <frankie.diamond@gmail.com> | 2017-06-17 08:07:12 +0800 |
---|---|---|
committer | frankiebee <frankie.diamond@gmail.com> | 2017-06-17 08:07:12 +0800 |
commit | 0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa (patch) | |
tree | 04fc3248e18f0b78be1efb01566be8dd150ccc4e | |
parent | e672f2da0d74bc1e001acb35be0345e49663463e (diff) | |
parent | 7ec7e1226691474ea200ccf867f7a7d1f0c1086a (diff) | |
download | tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.tar tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.tar.gz tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.tar.bz2 tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.tar.lz tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.tar.xz tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.tar.zst tangerine-wallet-browser-0d8c02db35ac56acb2552c30e7a1bb9f1c1193aa.zip |
Merge branch 'master' into nonce-tracker
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | ISSUE_TEMPLATE | 15 | ||||
-rw-r--r-- | app/scripts/controllers/transactions.js | 103 | ||||
-rw-r--r-- | app/scripts/metamask-controller.js | 7 | ||||
-rw-r--r-- | package.json | 4 |
5 files changed, 92 insertions, 38 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f99e680e..0d3e86342 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## Current Master - Add a warning to JSON file import. +- Fix bug where slowly mined txs would sometimes be incorrectly marked as failed. ## 3.7.8 2017-6-12 diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE new file mode 100644 index 000000000..d0ff3c08e --- /dev/null +++ b/ISSUE_TEMPLATE @@ -0,0 +1,15 @@ +<!-- +FAQ: + BEFORE SUBMITTING, please make sure your question hasn't been answered in our FAQ: https://github.com/MetaMask/faq + Common questions such as "Where is my ether?" or "Where did my tokens go?" are answered in the FAQ. + +Bug Reports: + + Briefly describe the issue you've encountered + * Expected Behavior + * Actual Behavior + * Browser Used + * Operating System Used + + Screenshots are very helpful and will expedite your issue being resolved! +--> diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index e7fe9927e..c2f98e66a 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -30,11 +30,12 @@ module.exports = class TransactionController extends EventEmitter { }) this.query = opts.ethQuery this.txProviderUtils = new TxProviderUtil(this.query) - this.blockTracker.on('block', this.checkForTxInBlock.bind(this)) - this.blockTracker.on('block', this.resubmitPendingTxs.bind(this)) + this.blockTracker.on('rawBlock', this.checkForTxInBlock.bind(this)) + this.blockTracker.on('latest', this.resubmitPendingTxs.bind(this)) + this.blockTracker.on('sync', this.queryPendingTxs.bind(this)) this.signEthTx = opts.signTransaction this.nonceLock = Semaphore(1) - + this.ethStore = opts.ethStore // memstore is computed from a few different stores this._updateMemstore() this.store.subscribe(() => this._updateMemstore()) @@ -364,12 +365,13 @@ module.exports = class TransactionController extends EventEmitter { // checks if a signed tx is in a block and // if included sets the tx status as 'confirmed' - checkForTxInBlock () { + checkForTxInBlock (block) { var signedTxList = this.getFilteredTxList({status: 'submitted'}) if (!signedTxList.length) return signedTxList.forEach((txMeta) => { var txHash = txMeta.hash var txId = txMeta.id + if (!txHash) { const errReason = { errCode: 'No hash was provided', @@ -377,24 +379,24 @@ module.exports = class TransactionController extends EventEmitter { } return this.setTxStatusFailed(txId, errReason) } - this.query.getTransactionByHash(txHash, (err, txParams) => { - if (err || !txParams) { - if (!txParams) return - txMeta.err = { - isWarning: true, - errorCode: err, - message: 'There was a problem loading this transaction.', - } - this.updateTx(txMeta) - return log.error(err) - } - if (txParams.blockNumber) { - this.setTxStatusConfirmed(txId) - } + + block.transactions.forEach((tx) => { + if (tx.hash === txHash) this.setTxStatusConfirmed(txId) }) }) } + queryPendingTxs ({oldBlock, newBlock}) { + // check pending transactions on start + if (!oldBlock) { + this._checkPendingTxs() + return + } + // if we synced by more than one block, check for missed pending transactions + const diff = Number.parseInt(newBlock.number) - Number.parseInt(oldBlock.number) + if (diff > 1) this._checkPendingTxs() + } + // PRIVATE METHODS // Should find the tx in the tx list and @@ -437,38 +439,69 @@ module.exports = class TransactionController extends EventEmitter { const pending = this.getTxsByMetaData('status', 'submitted') // only try resubmitting if their are transactions to resubmit if (!pending.length) return - const resubmit = denodeify(this.resubmitTx.bind(this)) + const resubmit = denodeify(this._resubmitTx.bind(this)) Promise.all(pending.map(txMeta => resubmit(txMeta))) .catch((reason) => { log.info('Problem resubmitting tx', reason) }) } - resubmitTx (txMeta, cb) { - // Increment a try counter. - if (!('retryCount' in txMeta)) { - txMeta.retryCount = 0 - } + _resubmitTx (txMeta, cb) { + const address = txMeta.txParams.from + const balance = this.ethStore.getState().accounts[address].balance + const nonce = Number.parseInt(this.ethStore.getState().accounts[address].nonce) + const txNonce = Number.parseInt(txMeta.txParams.nonce) + const gtBalance = Number.parseInt(txMeta.txParams.value) > Number.parseInt(balance) + if (!('retryCount' in txMeta)) txMeta.retryCount = 0 + // if the value of the transaction is greater then the balance + // or the nonce of the transaction is lower then the accounts nonce + // dont resubmit the tx + if (gtBalance || txNonce < nonce) return cb() // Only auto-submit already-signed txs: - if (!('rawTx' in txMeta)) { - return cb() - } + if (!('rawTx' in txMeta)) return cb() - if (txMeta.retryCount > RETRY_LIMIT) { - txMeta.err = { - isWarning: true, - message: 'Gave up submitting tx.', - } - this.updateTx(txMeta) - return log.error(txMeta.err.message) - } + if (txMeta.retryCount > RETRY_LIMIT) return + // Increment a try counter. txMeta.retryCount++ const rawTx = txMeta.rawTx this.txProviderUtils.publishTransaction(rawTx, cb) } + // checks the network for signed txs and + // if confirmed sets the tx status as 'confirmed' + _checkPendingTxs () { + var signedTxList = this.getFilteredTxList({status: 'submitted'}) + if (!signedTxList.length) return + signedTxList.forEach((txMeta) => { + var txHash = txMeta.hash + var txId = txMeta.id + if (!txHash) { + const errReason = { + errCode: 'No hash was provided', + message: 'We had an error while submitting this transaction, please try again.', + } + return this.setTxStatusFailed(txId, errReason) + } + this.query.getTransactionByHash(txHash, (err, txParams) => { + if (err || !txParams) { + if (!txParams) return + txMeta.err = { + isWarning: true, + errorCode: err, + message: 'There was a problem loading this transaction.', + } + this.updateTx(txMeta) + return log.error(err) + } + if (txParams.blockNumber) { + this.setTxStatusConfirmed(txId) + } + }) + }) + } + } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 006a32eac..755bf3289 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -23,6 +23,7 @@ const autoFaucet = require('./lib/auto-faucet') const nodeify = require('./lib/nodeify') const accountImporter = require('./account-import-strategies') const getBuyEthUrl = require('./lib/buy-eth-url') +const debounce = require('debounce') const version = require('../manifest.json').version @@ -30,6 +31,9 @@ module.exports = class MetamaskController extends EventEmitter { constructor (opts) { super() + + this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200) + this.opts = opts const initState = opts.initState || {} @@ -98,6 +102,7 @@ module.exports = class MetamaskController extends EventEmitter { provider: this.provider, blockTracker: this.provider, ethQuery: this.ethQuery, + ethStore: this.ethStore, }) // notices @@ -354,7 +359,7 @@ module.exports = class MetamaskController extends EventEmitter { ) } - sendUpdate () { + privateSendUpdate () { this.emit('update', this.getState()) } diff --git a/package.json b/package.json index 2c23d9e10..9ed2e7ae0 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "eth-bin-to-ops": "^1.0.1", "eth-contract-metadata": "^1.0.0", "eth-hd-keyring": "^1.1.1", - "eth-query": "^2.1.1", + "eth-query": "^2.1.2", "eth-sig-util": "^1.1.1", "eth-simple-keyring": "^1.1.1", "ethereumjs-tx": "^1.3.0", @@ -123,7 +123,7 @@ "valid-url": "^1.0.9", "vreme": "^3.0.2", "web3": "0.18.2", - "web3-provider-engine": "^12.2.4", + "web3-provider-engine": "^13.0.3", "web3-stream-provider": "^2.0.6", "xtend": "^4.0.1" }, |