Skip to content

Commit

Permalink
Refactor analyzeGasUsage to return results (#8487)
Browse files Browse the repository at this point in the history
`analyzeGasUsage` now returns the results of the analysis rather than
setting them directly on `txMeta`. The caller is now responsible for
mutating `txMeta` instead. Functionally this should be identical to
before.
  • Loading branch information
Gudahtt authored May 1, 2020
1 parent 157cc98 commit c2b5889
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
9 changes: 8 additions & 1 deletion app/scripts/controllers/transactions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,14 @@ export default class TransactionController extends EventEmitter {
txMeta.gasLimitSpecified = Boolean(txParams.gas)
return txMeta
}
return await this.txGasUtil.analyzeGasUsage(txMeta)

const { blockGasLimit, estimatedGasHex, simulationFails } = await this.txGasUtil.analyzeGasUsage(txMeta)
if (simulationFails) {
txMeta.simulationFails = simulationFails
} else {
this.txGasUtil.setTxGas(txMeta, blockGasLimit, estimatedGasHex)
}
return txMeta
}

/**
Expand Down
20 changes: 14 additions & 6 deletions app/scripts/controllers/transactions/tx-gas-utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,15 @@ import { hexToBn, BnMultiplyByFraction, bnToHex } from '../../lib/util'
import log from 'loglevel'
import { addHexPrefix } from 'ethereumjs-util'

/**
* Result of gas analysis, including either a gas estimate for a successful analysis, or
* debug information for a failed analysis.
* @typedef {Object} GasAnalysisResult
* @property {string} blockGasLimit - The gas limit of the block used for the analysis
* @property {string} estimatedGasHex - The estimated gas, in hexidecimal
* @property {Object} simulationFails - Debug information about why an analysis failed
*/

/**
tx-gas-utils are gas utility methods for Transaction manager
its passed ethquery
Expand All @@ -18,25 +27,24 @@ export default class TxGasUtil {

/**
@param {Object} txMeta - the txMeta object
@returns {Object} - the txMeta object with the gas written to the txParams
@returns {GasAnalysisResult} The result of the gas analysis
*/
async analyzeGasUsage (txMeta) {
const block = await this.query.getBlockByNumber('latest', false)
let estimatedGasHex
let simulationFails
try {
estimatedGasHex = await this.estimateTxGas(txMeta, block.gasLimit)
} catch (err) {
log.warn(err)
txMeta.simulationFails = {
simulationFails = {
reason: err.message,
errorKey: err.errorKey,
debug: { blockNumber: block.number, blockGasLimit: block.gasLimit },
}

return txMeta
}
this.setTxGas(txMeta, block.gasLimit, estimatedGasHex)
return txMeta

return { blockGasLimit: block.gasLimit, estimatedGasHex, simulationFails }
}

/**
Expand Down

0 comments on commit c2b5889

Please sign in to comment.