diff options
author | frankiebee <frankie.diamond@gmail.com> | 2017-09-06 11:33:50 +0800 |
---|---|---|
committer | frankiebee <frankie.diamond@gmail.com> | 2017-09-06 11:33:50 +0800 |
commit | 00bd5b143ffc13ac0a48f2049f61f26082af12c8 (patch) | |
tree | 2f30cd2af81d0a79dba403fe3d0241f50f907bca /app/scripts/lib/tx-gas-utils.js | |
parent | 4c554f32eca5ceda2d525b967075ec2b6ff41809 (diff) | |
download | tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.tar tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.tar.gz tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.tar.bz2 tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.tar.lz tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.tar.xz tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.tar.zst tangerine-wallet-browser-00bd5b143ffc13ac0a48f2049f61f26082af12c8.zip |
rename tx-utils.js -> tx-gas-utils.js
Diffstat (limited to 'app/scripts/lib/tx-gas-utils.js')
-rw-r--r-- | app/scripts/lib/tx-gas-utils.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/app/scripts/lib/tx-gas-utils.js b/app/scripts/lib/tx-gas-utils.js new file mode 100644 index 000000000..246c94ccd --- /dev/null +++ b/app/scripts/lib/tx-gas-utils.js @@ -0,0 +1,85 @@ +const EthQuery = require('ethjs-query') +const normalize = require('eth-sig-util').normalize +const { + hexToBn, + BnMultiplyByFraction, + bnToHex, +} = require('./util') + +/* +tx-utils are utility methods for Transaction manager +its passed ethquery +and used to do things like calculate gas of a tx. +*/ + +module.exports = class txProvideUtil { + constructor (provider) { + this.query = new EthQuery(provider) + } + + async analyzeGasUsage (txMeta) { + const block = await this.query.getBlockByNumber('latest', true) + let estimatedGasHex + try { + estimatedGasHex = await this.estimateTxGas(txMeta, block.gasLimit) + } catch (err) { + if (err.message.includes('Transaction execution error.')) { + txMeta.simulationFails = true + return txMeta + } + } + this.setTxGas(txMeta, block.gasLimit, estimatedGasHex) + return txMeta + } + + async estimateTxGas (txMeta, blockGasLimitHex) { + const txParams = txMeta.txParams + // check if gasLimit is already specified + txMeta.gasLimitSpecified = Boolean(txParams.gas) + // if not, fallback to block gasLimit + if (!txMeta.gasLimitSpecified) { + const blockGasLimitBN = hexToBn(blockGasLimitHex) + const saferGasLimitBN = BnMultiplyByFraction(blockGasLimitBN, 19, 20) + txParams.gas = bnToHex(saferGasLimitBN) + } + // run tx + return await this.query.estimateGas(txParams) + } + + setTxGas (txMeta, blockGasLimitHex, estimatedGasHex) { + txMeta.estimatedGas = estimatedGasHex + const txParams = txMeta.txParams + + // if gasLimit was specified and doesnt OOG, + // use original specified amount + if (txMeta.gasLimitSpecified) { + txMeta.estimatedGas = txParams.gas + return + } + // if gasLimit not originally specified, + // try adding an additional gas buffer to our estimation for safety + const recommendedGasHex = this.addGasBuffer(txMeta.estimatedGas, blockGasLimitHex) + txParams.gas = recommendedGasHex + return + } + + addGasBuffer (initialGasLimitHex, blockGasLimitHex) { + const initialGasLimitBn = hexToBn(initialGasLimitHex) + const blockGasLimitBn = hexToBn(blockGasLimitHex) + const upperGasLimitBn = blockGasLimitBn.muln(0.9) + const bufferedGasLimitBn = initialGasLimitBn.muln(1.5) + + // if initialGasLimit is above blockGasLimit, dont modify it + if (initialGasLimitBn.gt(upperGasLimitBn)) return bnToHex(initialGasLimitBn) + // if bufferedGasLimit is below blockGasLimit, use bufferedGasLimit + if (bufferedGasLimitBn.lt(upperGasLimitBn)) return bnToHex(bufferedGasLimitBn) + // otherwise use blockGasLimit + return bnToHex(upperGasLimitBn) + } + + async validateTxParams (txParams) { + if (('value' in txParams) && txParams.value.indexOf('-') === 0) { + throw new Error(`Invalid transaction value of ${txParams.value} not a positive number.`) + } + } +}
\ No newline at end of file |