aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts/lib/idStore.js
diff options
context:
space:
mode:
authorkumavis <aaron@kumavis.me>2016-06-17 10:51:34 +0800
committerkumavis <aaron@kumavis.me>2016-06-17 10:51:34 +0800
commitc1e94442007803c8a27534f4e10af256285fcfe6 (patch)
tree1b47f8dee78d88362f861a3b596d290367374ce6 /app/scripts/lib/idStore.js
parent08a153e20306da3aee585fc8b3bcfec2d73ce49e (diff)
downloadtangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.tar
tangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.tar.gz
tangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.tar.bz2
tangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.tar.lz
tangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.tar.xz
tangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.tar.zst
tangerine-wallet-browser-c1e94442007803c8a27534f4e10af256285fcfe6.zip
idStore - add DELEGATE_CALL detection
Diffstat (limited to 'app/scripts/lib/idStore.js')
-rw-r--r--app/scripts/lib/idStore.js44
1 files changed, 35 insertions, 9 deletions
diff --git a/app/scripts/lib/idStore.js b/app/scripts/lib/idStore.js
index e9b9e0e06..98bf00605 100644
--- a/app/scripts/lib/idStore.js
+++ b/app/scripts/lib/idStore.js
@@ -1,12 +1,14 @@
const EventEmitter = require('events').EventEmitter
const inherits = require('util').inherits
const Transaction = require('ethereumjs-tx')
+const ethUtil = require('ethereumjs-util')
const LightwalletKeyStore = require('eth-lightwallet').keystore
const LightwalletSigner = require('eth-lightwallet').signing
const async = require('async')
const clone = require('clone')
const extend = require('xtend')
const createId = require('web3-provider-engine/util/random-id')
+const ethBinToOps = require('eth-bin-to-ops')
const autoFaucet = require('./auto-faucet')
const configManager = require('./config-manager-singleton')
const messageManager = require('./message-manager')
@@ -181,13 +183,13 @@ IdentityStore.prototype.exportAccount = function(address, cb) {
//
// comes from dapp via zero-client hooked-wallet provider
-IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, cb){
-
+IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, onTxDoneCb, cb){
+ var self = this
// create txData obj with parameters and meta data
var time = (new Date()).getTime()
var txId = createId()
txParams.metamaskId = txId
- txParams.metamaskNetworkId = this._currentState.network
+ txParams.metamaskNetworkId = self._currentState.network
var txData = {
id: txId,
txParams: txParams,
@@ -197,14 +199,38 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, cb){
configManager.addTx(txData)
console.log('addUnconfirmedTransaction:', txData)
- // keep the cb around for after approval (requires user interaction)
- // This cb fires completion to the Dapp's write operation.
- this._unconfTxCbs[txId] = cb
+ // 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()
+ }
+ })
+ } else {
+ didComplete()
+ }
- // signal update
- this._didUpdate()
+ function didComplete(err){
+ if (err) return cb(err)
+ // signal update
+ self._didUpdate()
+ // signal completion of add tx
+ cb(null, txData)
+ }
- return txId
}
// comes from metamask ui