aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/idStore.js
diff options
context:
space:
mode:
authorDan Finlay <dan@danfinlay.com>2016-11-24 08:54:27 +0800
committerDan Finlay <dan@danfinlay.com>2016-11-24 08:54:27 +0800
commitb8991195829474691f17db3a7a6c9c081f9a95c9 (patch)
treea68a7c2529a82f4634913755bfc3f781f9476c3c /app/scripts/lib/idStore.js
parentb9b3ef8fedc848cbebc60eab70b90aa4f75060f2 (diff)
parent323f3cb1a05947f320f77fc3e87c9d6c70ea1900 (diff)
downloadtangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.tar
tangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.tar.gz
tangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.tar.bz2
tangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.tar.lz
tangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.tar.xz
tangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.tar.zst
tangerine-wallet-browser-b8991195829474691f17db3a7a6c9c081f9a95c9.zip
Merge branch 'master' into dev
Diffstat (limited to 'app/scripts/lib/idStore.js')
-rw-r--r--app/scripts/lib/idStore.js70
1 files changed, 48 insertions, 22 deletions
diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js
index e5861c0ca..d36504f13 100644
--- a/app/scripts/lib/idStore.js
+++ b/app/scripts/lib/idStore.js
@@ -258,24 +258,51 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone
function estimateGas (cb) {
var estimationParams = extend(txParams)
- // 1 billion gas for estimation
- var gasLimit = '0x3b9aca00'
- estimationParams.gas = gasLimit
- query.estimateGas(estimationParams, function (err, result) {
- if (err) return cb(err.message || err)
- if (result === estimationParams.gas) {
- txData.simulationFails = true
- query.getBlockByNumber('latest', true, function (err, block) {
- if (err) return cb(err)
- txData.estimatedGas = block.gasLimit
- txData.txParams.gas = block.gasLimit
+ query.getBlockByNumber('latest', true, function(err, block){
+ if (err) return cb(err)
+ // check if gasLimit is already specified
+ const gasLimitSpecified = Boolean(txParams.gas)
+ // if not, fallback to block gasLimit
+ if (!gasLimitSpecified) {
+ estimationParams.gas = block.gasLimit
+ }
+ // run tx, see if it will OOG
+ query.estimateGas(estimationParams, function(err, estimatedGasHex){
+ if (err) return cb(err.message || err)
+ // all gas used - must be an error
+ if (estimatedGasHex === estimationParams.gas) {
+ txData.simulationFails = true
+ txData.estimatedGas = estimatedGasHex
+ txData.txParams.gas = estimatedGasHex
+ cb()
+ return
+ }
+ // otherwise, did not use all gas, must be ok
+
+ // if specified gasLimit and no error, we're done
+ if (gasLimitSpecified) {
+ txData.estimatedGas = txParams.gas
cb()
- })
+ return
+ }
+
+ // try adding an additional gas buffer to our estimation for safety
+ const estimatedGasBn = new BN(ethUtil.stripHexPrefix(estimatedGasHex), 16)
+ const blockGasLimitBn = new BN(ethUtil.stripHexPrefix(block.gasLimit), 16)
+ const estimationWithBuffer = self.addGasBuffer(estimatedGasBn)
+ // added gas buffer is too high
+ if (estimationWithBuffer.gt(blockGasLimitBn)) {
+ txData.estimatedGas = estimatedGasHex
+ txData.txParams.gas = estimatedGasHex
+ // added gas buffer is safe
+ } else {
+ const gasWithBufferHex = ethUtil.intToHex(estimationWithBuffer)
+ txData.estimatedGas = gasWithBufferHex
+ txData.txParams.gas = gasWithBufferHex
+ }
+ cb()
return
- }
- txData.estimatedGas = self.addGasBuffer(result)
- txData.txParams.gas = txData.estimatedGas
- cb()
+ })
})
}
@@ -300,12 +327,11 @@ IdentityStore.prototype.checkForDelegateCall = function (codeHex) {
}
}
-IdentityStore.prototype.addGasBuffer = function (gas) {
- const bnGas = new BN(ethUtil.stripHexPrefix(gas), 16)
- const five = new BN('5', 10)
- const gasBuffer = bnGas.div(five)
- const correct = bnGas.add(gasBuffer)
- return ethUtil.addHexPrefix(correct.toString(16))
+IdentityStore.prototype.addGasBuffer = function (gasBn) {
+ // add 20% to specified gas
+ const gasBuffer = gasBn.div(new BN('5', 10))
+ const gasWithBuffer = gasBn.add(gasBuffer)
+ return gasWithBuffer
}
// comes from metamask ui