mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
check nonce and balance when resubmiting tx
This commit is contained in:
parent
07539a63e4
commit
2e5deef2b0
@ -25,10 +25,10 @@ module.exports = class TransactionController extends EventEmitter {
|
|||||||
this.query = opts.ethQuery
|
this.query = opts.ethQuery
|
||||||
this.txProviderUtils = new TxProviderUtil(this.query)
|
this.txProviderUtils = new TxProviderUtil(this.query)
|
||||||
this.blockTracker.on('block', this.checkForTxInBlock.bind(this))
|
this.blockTracker.on('block', this.checkForTxInBlock.bind(this))
|
||||||
this.blockTracker.on('latest', this.resubmitPendingTxs.bind(this))
|
this.provider._blockTracker.on('latest', this.resubmitPendingTxs.bind(this))
|
||||||
this.signEthTx = opts.signTransaction
|
this.signEthTx = opts.signTransaction
|
||||||
this.nonceLock = Semaphore(1)
|
this.nonceLock = Semaphore(1)
|
||||||
|
this.ethStore = opts.ethStore
|
||||||
// memstore is computed from a few different stores
|
// memstore is computed from a few different stores
|
||||||
this._updateMemstore()
|
this._updateMemstore()
|
||||||
this.store.subscribe(() => this._updateMemstore())
|
this.store.subscribe(() => this._updateMemstore())
|
||||||
@ -411,26 +411,31 @@ module.exports = class TransactionController extends EventEmitter {
|
|||||||
const pending = this.getTxsByMetaData('status', 'submitted')
|
const pending = this.getTxsByMetaData('status', 'submitted')
|
||||||
// only try resubmitting if their are transactions to resubmit
|
// only try resubmitting if their are transactions to resubmit
|
||||||
if (!pending.length) return
|
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)))
|
Promise.all(pending.map(txMeta => resubmit(txMeta)))
|
||||||
.catch((reason) => {
|
.catch((reason) => {
|
||||||
log.info('Problem resubmitting tx', reason)
|
log.info('Problem resubmitting tx', reason)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
resubmitTx (txMeta, cb) {
|
_resubmitTx (txMeta, cb) {
|
||||||
// Increment a try counter.
|
const address = txMeta.txParams.from
|
||||||
if (!('retryCount' in txMeta)) {
|
const balance = this.ethStore.getState().accounts[address].balance
|
||||||
txMeta.retryCount = 0
|
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:
|
// Only auto-submit already-signed txs:
|
||||||
if (!('rawTx' in txMeta)) {
|
if (!('rawTx' in txMeta)) return cb()
|
||||||
return cb()
|
|
||||||
}
|
|
||||||
|
|
||||||
if (txMeta.retryCount > RETRY_LIMIT) return
|
if (txMeta.retryCount > RETRY_LIMIT) return
|
||||||
|
|
||||||
|
// Increment a try counter.
|
||||||
txMeta.retryCount++
|
txMeta.retryCount++
|
||||||
const rawTx = txMeta.rawTx
|
const rawTx = txMeta.rawTx
|
||||||
this.txProviderUtils.publishTransaction(rawTx, cb)
|
this.txProviderUtils.publishTransaction(rawTx, cb)
|
||||||
|
@ -98,6 +98,7 @@ module.exports = class MetamaskController extends EventEmitter {
|
|||||||
provider: this.provider,
|
provider: this.provider,
|
||||||
blockTracker: this.provider,
|
blockTracker: this.provider,
|
||||||
ethQuery: this.ethQuery,
|
ethQuery: this.ethQuery,
|
||||||
|
ethStore: this.ethStore,
|
||||||
})
|
})
|
||||||
|
|
||||||
// notices
|
// notices
|
||||||
|
@ -19,6 +19,7 @@ describe('Transaction Controller', function () {
|
|||||||
txController = new TransactionController({
|
txController = new TransactionController({
|
||||||
networkStore: new ObservableStore(currentNetworkId),
|
networkStore: new ObservableStore(currentNetworkId),
|
||||||
txHistoryLimit: 10,
|
txHistoryLimit: 10,
|
||||||
|
provider: { _blockTracker: new EventEmitter() },
|
||||||
blockTracker: new EventEmitter(),
|
blockTracker: new EventEmitter(),
|
||||||
ethQuery: new EthQuery(new EventEmitter()),
|
ethQuery: new EthQuery(new EventEmitter()),
|
||||||
signTransaction: (ethTx) => new Promise((resolve) => {
|
signTransaction: (ethTx) => new Promise((resolve) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user