|
|
@ -3,7 +3,6 @@ const async = require('async') |
|
|
|
const extend = require('xtend') |
|
|
|
const extend = require('xtend') |
|
|
|
const ObservableStore = require('obs-store') |
|
|
|
const ObservableStore = require('obs-store') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const denodeify = require('denodeify') |
|
|
|
|
|
|
|
const TxProviderUtil = require('../lib/tx-utils') |
|
|
|
const TxProviderUtil = require('../lib/tx-utils') |
|
|
|
const createId = require('../lib/random-id') |
|
|
|
const createId = require('../lib/random-id') |
|
|
|
const NonceTracker = require('../lib/nonce-tracker') |
|
|
|
const NonceTracker = require('../lib/nonce-tracker') |
|
|
@ -195,7 +194,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
txMeta.txParams.nonce = nonceLock.nextNonce |
|
|
|
txMeta.txParams.nonce = nonceLock.nextNonce |
|
|
|
this.updateTx(txMeta) |
|
|
|
this.updateTx(txMeta) |
|
|
|
// sign transaction
|
|
|
|
// sign transaction
|
|
|
|
const rawTx = await denodeify(this.signTransaction.bind(this))(txId) |
|
|
|
const rawTx = await this.signTransaction(txId) |
|
|
|
await this.publishTransaction(txId, rawTx) |
|
|
|
await this.publishTransaction(txId, rawTx) |
|
|
|
// must set transaction to submitted/failed before releasing lock
|
|
|
|
// must set transaction to submitted/failed before releasing lock
|
|
|
|
nonceLock.releaseLock() |
|
|
|
nonceLock.releaseLock() |
|
|
@ -231,32 +230,27 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
signTransaction (txId, cb) { |
|
|
|
async signTransaction (txId) { |
|
|
|
const txMeta = this.getTx(txId) |
|
|
|
const txMeta = this.getTx(txId) |
|
|
|
const txParams = txMeta.txParams |
|
|
|
const txParams = txMeta.txParams |
|
|
|
const fromAddress = txParams.from |
|
|
|
const fromAddress = txParams.from |
|
|
|
// add network/chain id
|
|
|
|
// add network/chain id
|
|
|
|
txParams.chainId = this.getChainId() |
|
|
|
txParams.chainId = this.getChainId() |
|
|
|
const ethTx = this.txProviderUtils.buildEthTxFromParams(txParams) |
|
|
|
const ethTx = this.txProviderUtils.buildEthTxFromParams(txParams) |
|
|
|
this.signEthTx(ethTx, fromAddress).then(() => { |
|
|
|
const rawTx = await this.signEthTx(ethTx, fromAddress).then(() => { |
|
|
|
this.setTxStatusSigned(txMeta.id) |
|
|
|
this.setTxStatusSigned(txMeta.id) |
|
|
|
cb(null, ethUtil.bufferToHex(ethTx.serialize())) |
|
|
|
return ethUtil.bufferToHex(ethTx.serialize()) |
|
|
|
}).catch((err) => { |
|
|
|
|
|
|
|
cb(err) |
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
return rawTx |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
publishTransaction (txId, rawTx) { |
|
|
|
async publishTransaction (txId, rawTx) { |
|
|
|
const txMeta = this.getTx(txId) |
|
|
|
const txMeta = this.getTx(txId) |
|
|
|
txMeta.rawTx = rawTx |
|
|
|
txMeta.rawTx = rawTx |
|
|
|
this.updateTx(txMeta) |
|
|
|
this.updateTx(txMeta) |
|
|
|
return new Promise((resolve, reject) => { |
|
|
|
await this.txProviderUtils.publishTransaction(rawTx).then((txHash) => { |
|
|
|
this.txProviderUtils.publishTransaction(rawTx, (err, txHash) => { |
|
|
|
this.setTxHash(txId, txHash) |
|
|
|
if (err) reject(err) |
|
|
|
this.setTxStatusSubmitted(txId) |
|
|
|
this.setTxHash(txId, txHash) |
|
|
|
|
|
|
|
this.setTxStatusSubmitted(txId) |
|
|
|
|
|
|
|
resolve() |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -435,8 +429,7 @@ 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)) |
|
|
|
pending.forEach((txMeta) => this._resubmitTx(txMeta).catch((err) => { |
|
|
|
pending.forEach((txMeta) => resubmit(txMeta).catch((err) => { |
|
|
|
|
|
|
|
/* |
|
|
|
/* |
|
|
|
Dont marked as failed if the error is a "known" transaction warning |
|
|
|
Dont marked as failed if the error is a "known" transaction warning |
|
|
|
"there is already a transaction with the same sender-nonce |
|
|
|
"there is already a transaction with the same sender-nonce |
|
|
@ -463,7 +456,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
})) |
|
|
|
})) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
_resubmitTx (txMeta, cb) { |
|
|
|
async _resubmitTx (txMeta, cb) { |
|
|
|
const address = txMeta.txParams.from |
|
|
|
const address = txMeta.txParams.from |
|
|
|
const balance = this.ethStore.getState().accounts[address].balance |
|
|
|
const balance = this.ethStore.getState().accounts[address].balance |
|
|
|
if (!('retryCount' in txMeta)) txMeta.retryCount = 0 |
|
|
|
if (!('retryCount' in txMeta)) txMeta.retryCount = 0 |
|
|
@ -482,7 +475,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
// Increment a try counter.
|
|
|
|
// Increment a try counter.
|
|
|
|
txMeta.retryCount++ |
|
|
|
txMeta.retryCount++ |
|
|
|
const rawTx = txMeta.rawTx |
|
|
|
const rawTx = txMeta.rawTx |
|
|
|
this.txProviderUtils.publishTransaction(rawTx, cb) |
|
|
|
return await this.txProviderUtils.publishTransaction(rawTx, cb) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// checks the network for signed txs and
|
|
|
|
// checks the network for signed txs and
|
|
|
|