aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--app/scripts/controllers/transactions.js36
-rw-r--r--app/scripts/metamask-controller.js1
-rw-r--r--package.json2
4 files changed, 20 insertions, 20 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/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js
index d56a81150..d9d9849b1 100644
--- a/app/scripts/controllers/transactions.js
+++ b/app/scripts/controllers/transactions.js
@@ -25,11 +25,11 @@ module.exports = class TransactionController extends EventEmitter {
this.query = opts.ethQuery
this.txProviderUtils = new TxProviderUtil(this.query)
this.blockTracker.on('rawBlock', this.checkForTxInBlock.bind(this))
- this.blockTracker.on('block', this.resubmitPendingTxs.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())
@@ -413,33 +413,31 @@ 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)
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index d745d29dc..de9a15924 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -102,6 +102,7 @@ module.exports = class MetamaskController extends EventEmitter {
provider: this.provider,
blockTracker: this.provider,
ethQuery: this.ethQuery,
+ ethStore: this.ethStore,
})
// notices
diff --git a/package.json b/package.json
index 3cace3250..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",