|
|
@ -4,8 +4,8 @@ const clone = require('clone') |
|
|
|
const ObservableStore = require('obs-store') |
|
|
|
const ObservableStore = require('obs-store') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const EthQuery = require('ethjs-query') |
|
|
|
const EthQuery = require('ethjs-query') |
|
|
|
const TxProviderUtils = require('../lib/tx-utils') |
|
|
|
const TxProviderUtil = require('../lib/tx-utils') |
|
|
|
const PendingTransactionWatchers = require('../lib/pending-tx-watchers') |
|
|
|
const PendingTransactionTracker = require('../lib/pending-tx-tracker') |
|
|
|
const createId = require('../lib/random-id') |
|
|
|
const createId = require('../lib/random-id') |
|
|
|
const NonceTracker = require('../lib/nonce-tracker') |
|
|
|
const NonceTracker = require('../lib/nonce-tracker') |
|
|
|
|
|
|
|
|
|
|
@ -35,13 +35,17 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
}) |
|
|
|
this.query = new EthQuery(this.provider) |
|
|
|
this.query = new EthQuery(this.provider) |
|
|
|
this.txProviderUtils = new TxProviderUtils(this.provider) |
|
|
|
this.txProviderUtil = new TxProviderUtil(this.provider) |
|
|
|
|
|
|
|
|
|
|
|
this.pendingTxWatchers = new PendingTransactionWatchers({ |
|
|
|
this.pendingTxTracker = new PendingTransactionTracker({ |
|
|
|
provider: this.provider, |
|
|
|
provider: this.provider, |
|
|
|
nonceTracker: this.nonceTracker, |
|
|
|
nonceTracker: this.nonceTracker, |
|
|
|
getBalance: (address) => this.ethStore.getState().accounts[address].balance, |
|
|
|
getBalance: async (address) => { |
|
|
|
publishTransaction: this.txProviderUtils.publishTransaction.bind(this.txProviderUtils), |
|
|
|
const account = this.ethStore.getState().accounts[address] |
|
|
|
|
|
|
|
if (!account) return |
|
|
|
|
|
|
|
return account.balance |
|
|
|
|
|
|
|
}, |
|
|
|
|
|
|
|
publishTransaction: this.txProviderUtil.publishTransaction.bind(this.txProviderUtil), |
|
|
|
getPendingTransactions: (address) => { |
|
|
|
getPendingTransactions: (address) => { |
|
|
|
return this.getFilteredTxList({ |
|
|
|
return this.getFilteredTxList({ |
|
|
|
from: address, |
|
|
|
from: address, |
|
|
@ -50,16 +54,18 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
}, |
|
|
|
}, |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
this.pendingTxWatchers.on('txWarning', this.updateTx.bind(this)) |
|
|
|
this.pendingTxTracker.on('txWarning', this.updateTx.bind(this)) |
|
|
|
this.pendingTxWatchers.on('txFailed', this.setTxStatusFailed.bind(this)) |
|
|
|
this.pendingTxTracker.on('txFailed', this.setTxStatusFailed.bind(this)) |
|
|
|
this.pendingTxWatchers.on('txConfirmed', this.setTxStatusConfirmed.bind(this)) |
|
|
|
this.pendingTxTracker.on('txConfirmed', this.setTxStatusConfirmed.bind(this)) |
|
|
|
|
|
|
|
|
|
|
|
this.blockTracker.on('rawBlock', this.pendingTxWatchers.checkForTxInBlock.bind(this.pendingTxWatchers)) |
|
|
|
this.blockTracker.on('rawBlock', this.pendingTxTracker.checkForTxInBlock.bind(this.pendingTxTracker)) |
|
|
|
// this is a little messy but until ethstore has been either
|
|
|
|
// this is a little messy but until ethstore has been either
|
|
|
|
// removed or redone this is to guard against the race condition
|
|
|
|
// removed or redone this is to guard against the race condition
|
|
|
|
// where ethStore hasent been populated by the results yet
|
|
|
|
// where ethStore hasent been populated by the results yet
|
|
|
|
this.blockTracker.once('latest', () => this.blockTracker.on('latest', this.pendingTxWatchers.resubmitPendingTxs.bind(this.pendingTxWatchers))) |
|
|
|
this.blockTracker.once('latest', () => { |
|
|
|
this.blockTracker.on('sync', this.pendingTxWatchers.queryPendingTxs.bind(this.pendingTxWatchers)) |
|
|
|
this.blockTracker.on('latest', this.pendingTxTracker.resubmitPendingTxs.bind(this.pendingTxTracker)) |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
this.blockTracker.on('sync', this.pendingTxTracker.queryPendingTxs.bind(this.pendingTxTracker)) |
|
|
|
// 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()) |
|
|
@ -191,7 +197,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
|
|
|
|
|
|
|
|
async addUnapprovedTransaction (txParams) { |
|
|
|
async addUnapprovedTransaction (txParams) { |
|
|
|
// validate
|
|
|
|
// validate
|
|
|
|
await this.txProviderUtils.validateTxParams(txParams) |
|
|
|
await this.txProviderUtil.validateTxParams(txParams) |
|
|
|
// construct txMeta
|
|
|
|
// construct txMeta
|
|
|
|
const txMeta = { |
|
|
|
const txMeta = { |
|
|
|
id: createId(), |
|
|
|
id: createId(), |
|
|
@ -217,7 +223,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
txParams.gasPrice = gasPrice |
|
|
|
txParams.gasPrice = gasPrice |
|
|
|
} |
|
|
|
} |
|
|
|
// set gasLimit
|
|
|
|
// set gasLimit
|
|
|
|
return await this.txProviderUtils.analyzeGasUsage(txMeta) |
|
|
|
return await this.txProviderUtil.analyzeGasUsage(txMeta) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async updateAndApproveTransaction (txMeta) { |
|
|
|
async updateAndApproveTransaction (txMeta) { |
|
|
@ -260,7 +266,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
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.txProviderUtil.buildEthTxFromParams(txParams) |
|
|
|
await this.signEthTx(ethTx, fromAddress) |
|
|
|
await this.signEthTx(ethTx, fromAddress) |
|
|
|
this.setTxStatusSigned(txMeta.id) |
|
|
|
this.setTxStatusSigned(txMeta.id) |
|
|
|
const rawTx = ethUtil.bufferToHex(ethTx.serialize()) |
|
|
|
const rawTx = ethUtil.bufferToHex(ethTx.serialize()) |
|
|
@ -271,7 +277,7 @@ module.exports = class TransactionController extends EventEmitter { |
|
|
|
const txMeta = this.getTx(txId) |
|
|
|
const txMeta = this.getTx(txId) |
|
|
|
txMeta.rawTx = rawTx |
|
|
|
txMeta.rawTx = rawTx |
|
|
|
this.updateTx(txMeta) |
|
|
|
this.updateTx(txMeta) |
|
|
|
const txHash = await this.txProviderUtils.publishTransaction(rawTx) |
|
|
|
const txHash = await this.txProviderUtil.publishTransaction(rawTx) |
|
|
|
this.setTxHash(txId, txHash) |
|
|
|
this.setTxHash(txId, txHash) |
|
|
|
this.setTxStatusSubmitted(txId) |
|
|
|
this.setTxStatusSubmitted(txId) |
|
|
|
} |
|
|
|
} |
|
|
|