From c2b588975ce71bf9706e089ff901bdc1518b1677 Mon Sep 17 00:00:00 2001 From: Mark Stacey Date: Thu, 30 Apr 2020 21:44:51 -0300 Subject: [PATCH] Refactor `analyzeGasUsage` to return results (#8487) `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. --- app/scripts/controllers/transactions/index.js | 9 ++++++++- .../controllers/transactions/tx-gas-utils.js | 20 +++++++++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js index fbebc2003..e05f07c4e 100644 --- a/app/scripts/controllers/transactions/index.js +++ b/app/scripts/controllers/transactions/index.js @@ -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 } /** diff --git a/app/scripts/controllers/transactions/tx-gas-utils.js b/app/scripts/controllers/transactions/tx-gas-utils.js index c272dcc30..a05f64ee5 100644 --- a/app/scripts/controllers/transactions/tx-gas-utils.js +++ b/app/scripts/controllers/transactions/tx-gas-utils.js @@ -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 @@ -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 } } /**