mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
tx manager - adjust new tx flow and txMeta decorations
This commit is contained in:
parent
81d3658343
commit
1495240969
@ -12,48 +12,49 @@ and used to do things like calculate gas of a tx.
|
||||
*/
|
||||
|
||||
module.exports = class txProviderUtils {
|
||||
|
||||
constructor (provider) {
|
||||
this.provider = provider
|
||||
this.query = new EthQuery(provider)
|
||||
}
|
||||
|
||||
analyzeGasUsage (txData, cb) {
|
||||
analyzeGasUsage (txMeta, cb) {
|
||||
var self = this
|
||||
this.query.getBlockByNumber('latest', true, (err, block) => {
|
||||
if (err) return cb(err)
|
||||
async.waterfall([
|
||||
self.estimateTxGas.bind(self, txData, block.gasLimit),
|
||||
self.setTxGas.bind(self, txData, block.gasLimit),
|
||||
self.estimateTxGas.bind(self, txMeta, block.gasLimit),
|
||||
self.setTxGas.bind(self, txMeta, block.gasLimit),
|
||||
], cb)
|
||||
})
|
||||
}
|
||||
|
||||
estimateTxGas (txData, blockGasLimitHex, cb) {
|
||||
const txParams = txData.txParams
|
||||
estimateTxGas (txMeta, blockGasLimitHex, cb) {
|
||||
const txParams = txMeta.txParams
|
||||
// check if gasLimit is already specified
|
||||
txData.gasLimitSpecified = Boolean(txParams.gas)
|
||||
txMeta.gasLimitSpecified = Boolean(txParams.gas)
|
||||
// if not, fallback to block gasLimit
|
||||
if (!txData.gasLimitSpecified) {
|
||||
if (!txMeta.gasLimitSpecified) {
|
||||
txParams.gas = blockGasLimitHex
|
||||
}
|
||||
// run tx, see if it will OOG
|
||||
this.query.estimateGas(txParams, cb)
|
||||
}
|
||||
|
||||
setTxGas (txData, blockGasLimitHex, estimatedGasHex, cb) {
|
||||
txData.estimatedGas = estimatedGasHex
|
||||
const txParams = txData.txParams
|
||||
setTxGas (txMeta, blockGasLimitHex, estimatedGasHex, cb) {
|
||||
txMeta.estimatedGas = estimatedGasHex
|
||||
const txParams = txMeta.txParams
|
||||
|
||||
// if gasLimit was specified and doesnt OOG,
|
||||
// use original specified amount
|
||||
if (txData.gasLimitSpecified) {
|
||||
txData.estimatedGas = txParams.gas
|
||||
if (txMeta.gasLimitSpecified) {
|
||||
txMeta.estimatedGas = txParams.gas
|
||||
cb()
|
||||
return
|
||||
}
|
||||
// if gasLimit not originally specified,
|
||||
// try adding an additional gas buffer to our estimation for safety
|
||||
const recommendedGasHex = this.addGasBuffer(txData.estimatedGas, blockGasLimitHex)
|
||||
const recommendedGasHex = this.addGasBuffer(txMeta.estimatedGas, blockGasLimitHex)
|
||||
txParams.gas = recommendedGasHex
|
||||
cb()
|
||||
return
|
||||
@ -90,16 +91,13 @@ module.exports = class txProviderUtils {
|
||||
|
||||
// builds ethTx from txParams object
|
||||
buildEthTxFromParams (txParams) {
|
||||
// apply gas multiplyer
|
||||
let gasPrice = hexToBn(txParams.gasPrice)
|
||||
// multiply and divide by 100 so as to add percision to integer mul
|
||||
txParams.gasPrice = ethUtil.intToHex(gasPrice.toNumber())
|
||||
// normalize values
|
||||
txParams.to = normalize(txParams.to)
|
||||
txParams.from = normalize(txParams.from)
|
||||
txParams.value = normalize(txParams.value)
|
||||
txParams.data = normalize(txParams.data)
|
||||
txParams.gas = normalize(txParams.gas || txParams.gasLimit)
|
||||
txParams.gasPrice = normalize(txParams.gasPrice)
|
||||
txParams.nonce = normalize(txParams.nonce)
|
||||
// build ethTx
|
||||
log.info(`Prepared tx for signing: ${JSON.stringify(txParams)}`)
|
||||
|
@ -4,7 +4,6 @@ const extend = require('xtend')
|
||||
const Semaphore = require('semaphore')
|
||||
const ObservableStore = require('obs-store')
|
||||
const ethUtil = require('ethereumjs-util')
|
||||
const BN = require('ethereumjs-util').BN
|
||||
const TxProviderUtil = require('./lib/tx-utils')
|
||||
const createId = require('./lib/random-id')
|
||||
|
||||
@ -121,44 +120,38 @@ module.exports = class TransactionManager extends EventEmitter {
|
||||
async.waterfall([
|
||||
// validate
|
||||
(cb) => this.txProviderUtils.validateTxParams(txParams, cb),
|
||||
// prepare txMeta
|
||||
// construct txMeta
|
||||
(cb) => {
|
||||
// create txMeta obj with parameters and meta data
|
||||
let time = (new Date()).getTime()
|
||||
let txId = createId()
|
||||
txParams.metamaskId = txId
|
||||
txParams.metamaskNetworkId = this.getNetwork()
|
||||
txMeta = {
|
||||
id: txId,
|
||||
time: time,
|
||||
id: createId(),
|
||||
time: (new Date()).getTime(),
|
||||
status: 'unapproved',
|
||||
metamaskNetworkId: this.getNetwork(),
|
||||
txParams: txParams,
|
||||
}
|
||||
// calculate metadata for tx
|
||||
this.txProviderUtils.analyzeGasUsage(txMeta, cb)
|
||||
cb()
|
||||
},
|
||||
// add default tx params
|
||||
(cb) => this.addTxDefaults(txMeta, cb),
|
||||
// save txMeta
|
||||
(cb) => {
|
||||
this.addTx(txMeta)
|
||||
this.setMaxTxCostAndFee(txMeta)
|
||||
cb(null, txMeta)
|
||||
},
|
||||
], done)
|
||||
}
|
||||
|
||||
setMaxTxCostAndFee (txMeta) {
|
||||
var txParams = txMeta.txParams
|
||||
var gasCost = new BN(ethUtil.stripHexPrefix(txParams.gas || txMeta.estimatedGas), 16)
|
||||
var gasPrice = new BN(ethUtil.stripHexPrefix(txParams.gasPrice || '0x4a817c800'), 16)
|
||||
var txFee = gasCost.mul(gasPrice)
|
||||
var txValue = new BN(ethUtil.stripHexPrefix(txParams.value || '0x0'), 16)
|
||||
var maxCost = txValue.add(txFee)
|
||||
txMeta.txFee = txFee
|
||||
txMeta.txValue = txValue
|
||||
txMeta.maxCost = maxCost
|
||||
txMeta.gasPrice = gasPrice
|
||||
this.updateTx(txMeta)
|
||||
addTxDefaults (txMeta, cb) {
|
||||
const txParams = txMeta.txParams
|
||||
// ensure value
|
||||
txParams.value = txParams.value || '0x0'
|
||||
this.query.gasPrice((err, gasPrice) => {
|
||||
if (err) return cb(err)
|
||||
// set gasPrice
|
||||
txParams.gasPrice = gasPrice
|
||||
// set gasLimit
|
||||
this.txProviderUtils.analyzeGasUsage(txMeta, cb)
|
||||
})
|
||||
}
|
||||
|
||||
getUnapprovedTxList () {
|
||||
|
Loading…
Reference in New Issue
Block a user