From 97e38b4983629eb76a130da4f9782152f2cb1860 Mon Sep 17 00:00:00 2001 From: kumavis Date: Wed, 13 Jul 2016 23:39:44 -0700 Subject: [PATCH] new tx - calculate estimatedGas and show thing in tx-details (#441) * new tx - calculate estimatedGas and show thing in tx-details * Bump changelog --- CHANGELOG.md | 1 + app/scripts/lib/idStore.js | 54 +++++++++++++++++-------- package.json | 1 + ui/app/components/pending-tx-details.js | 15 ++++--- 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96f7749c8..464a39569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - New vaults now generate only one wallet instead of three. - Bumped version of web3 provider engine. - Fixed bug where some lowercase or uppercase addresses were not being recognized as valid. +- Fixed bug where gas cost was misestimated on the tx confirmation view. ## 2.6.0 2016-07-11 diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js index 133078668..2c8e9108b 100644 --- a/app/scripts/lib/idStore.js +++ b/app/scripts/lib/idStore.js @@ -1,6 +1,8 @@ const EventEmitter = require('events').EventEmitter const inherits = require('util').inherits +const async = require('async') const ethUtil = require('ethereumjs-util') +const EthQuery = require('eth-query') const LightwalletKeyStore = require('eth-lightwallet').keystore const clone = require('clone') const extend = require('xtend') @@ -197,35 +199,53 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone time: time, status: 'unconfirmed', } - configManager.addTx(txData) + console.log('addUnconfirmedTransaction:', txData) // keep the onTxDoneCb around for after approval/denial (requires user interaction) // This onTxDoneCb fires completion to the Dapp's write operation. self._unconfTxCbs[txId] = onTxDoneCb - // perform static analyis on the target contract code var provider = self._ethStore._query.currentProvider - if (txParams.to) { - provider.sendAsync({ id: 1, method: 'eth_getCode', params: [txParams.to, 'latest'] }, function (err, res) { - if (err) return didComplete(err) - if (res.error) return didComplete(res.error) - var code = ethUtil.toBuffer(res.result) - if (code !== '0x') { - var ops = ethBinToOps(code) - var containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') - txData.containsDelegateCall = containsDelegateCall - didComplete() - } else { - didComplete() - } + var query = new EthQuery(provider) + + // calculate metadata for tx + async.parallel([ + analyzeForDelegateCall, + estimateGas, + ], didComplete) + + // perform static analyis on the target contract code + function analyzeForDelegateCall(cb){ + if (txParams.to) { + query.getCode(txParams.to, function (err, result) { + if (err) return cb(err) + var code = ethUtil.toBuffer(result) + if (code !== '0x') { + var ops = ethBinToOps(code) + var containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') + txData.containsDelegateCall = containsDelegateCall + cb() + } else { + cb() + } + }) + } else { + cb() + } + } + + function estimateGas(cb){ + query.estimateGas(txParams, function(err, result){ + if (err) return cb(err) + txData.estimatedGas = result + cb() }) - } else { - didComplete() } function didComplete (err) { if (err) return cb(err) + configManager.addTx(txData) // signal update self._didUpdate() // signal completion of add tx diff --git a/package.json b/package.json index 4438092c2..8d2540ef2 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "end-of-stream": "^1.1.0", "eth-bin-to-ops": "^1.0.0", "eth-lightwallet": "^2.3.3", + "eth-query": "^1.0.3", "eth-store": "^1.1.0", "ethereumjs-tx": "^1.0.0", "ethereumjs-util": "^4.4.0", diff --git a/ui/app/components/pending-tx-details.js b/ui/app/components/pending-tx-details.js index 9a06ad09e..a6f72a89b 100644 --- a/ui/app/components/pending-tx-details.js +++ b/ui/app/components/pending-tx-details.js @@ -11,9 +11,6 @@ const nameForAddress = require('../../lib/contract-namer') const ethUtil = require('ethereumjs-util') const BN = ethUtil.BN -const baseGasFee = new BN('21000', 10) -const gasCost = new BN('4a817c800', 16) -const baseFeeHex = baseGasFee.mul(gasCost).toString(16) module.exports = PendingTxDetails @@ -33,9 +30,11 @@ PTXP.render = function () { var identity = props.identities[address] || { address: address } var balance = props.accounts[address].balance - var gasCost = ethUtil.stripHexPrefix(txParams.gas || baseFeeHex) - var txValue = ethUtil.stripHexPrefix(txParams.value || '0x0') - var maxCost = ((new BN(txValue, 16)).add(new BN(gasCost, 16))).toString(16) + var gasCost = new BN(ethUtil.stripHexPrefix(txParams.gas || txData.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) var dataLength = txParams.data ? (txParams.data.length - 2) / 2 : 0 var imageify = props.imageifyIdenticons === undefined ? true : props.imageifyIdenticons @@ -112,7 +111,7 @@ PTXP.render = function () { h('.cell.row', [ h('.cell.label', 'Max Transaction Fee'), - h('.cell.value', formatBalance(gasCost)), + h('.cell.value', formatBalance(txFee.toString(16))), ]), h('.cell.row', { @@ -130,7 +129,7 @@ PTXP.render = function () { }, }, [ h(EtherBalance, { - value: maxCost, + value: maxCost.toString(16), inline: true, labelColor: 'black', fontSize: '16px',