Merge pull request #1762 from MetaMask/ImproveRetryLogic

Improve retry logic
feature/default_network_editable
kumavis 7 years ago committed by GitHub
commit a1fd9bc6be
  1. 3
      CHANGELOG.md
  2. 13
      app/scripts/controllers/transactions.js
  3. 9
      app/scripts/lib/tx-utils.js
  4. 38
      test/unit/tx-utils-test.js

@ -2,6 +2,9 @@
## Current Master
- No longer validate nonce client-side in retry loop.
- Fix bug where insufficient balance error was sometimes shown on successful transactions.
## 3.8.4 2017-7-7
- Improve transaction resubmit logic to fail more eagerly when a user would expect it to.

@ -447,27 +447,16 @@ module.exports = class TransactionController extends EventEmitter {
_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, fail.
if (gtBalance) {
if (!this.txProviderUtils.sufficientBalance(txMeta.txParams, balance)) {
const message = 'Insufficient balance.'
this.setTxStatusFailed(txMeta.id, { message })
cb()
return log.error(message)
}
// if the nonce of the transaction is lower then the accounts nonce, fail.
if (txNonce < nonce) {
const message = 'Invalid nonce.'
this.setTxStatusFailed(txMeta.id, { message })
cb()
return log.error(message)
}
// Only auto-submit already-signed txs:
if (!('rawTx' in txMeta)) return cb()

@ -118,6 +118,15 @@ module.exports = class txProviderUtils {
}
}
sufficientBalance (tx, hexBalance) {
const balance = hexToBn(hexBalance)
const value = hexToBn(tx.value)
const gasLimit = hexToBn(tx.gas)
const gasPrice = hexToBn(tx.gasPrice)
const maxCost = value.add(gasLimit.mul(gasPrice))
return balance.gte(maxCost)
}
}

@ -16,6 +16,44 @@ describe('txUtils', function () {
}))
})
describe('#sufficientBalance', function () {
it('returns true if max tx cost is equal to balance.', function () {
const tx = {
'value': '0x1',
'gas': '0x2',
'gasPrice': '0x3',
}
const balance = '0x8'
const result = txUtils.sufficientBalance(tx, balance)
assert.ok(result, 'sufficient balance found.')
})
it('returns true if max tx cost is less than balance.', function () {
const tx = {
'value': '0x1',
'gas': '0x2',
'gasPrice': '0x3',
}
const balance = '0x9'
const result = txUtils.sufficientBalance(tx, balance)
assert.ok(result, 'sufficient balance found.')
})
it('returns false if max tx cost is more than balance.', function () {
const tx = {
'value': '0x1',
'gas': '0x2',
'gasPrice': '0x3',
}
const balance = '0x6'
const result = txUtils.sufficientBalance(tx, balance)
assert.ok(!result, 'insufficient balance found.')
})
})
describe('chain Id', function () {
it('prepares a transaction with the provided chainId', function () {
const txParams = {

Loading…
Cancel
Save