Merge pull request #296 from MetaMask/i252

idStore - add DELEGATE_CALL detection
feature/default_network_editable
Dan Finlay 9 years ago committed by GitHub
commit 7ecc028c5d
  1. 16
      app/scripts/background.js
  2. 42
      app/scripts/lib/idStore.js
  3. 1
      package.json

@ -248,15 +248,15 @@ function updateBadge(state){
// Add unconfirmed Tx + Msg // Add unconfirmed Tx + Msg
// //
function newUnsignedTransaction(txParams, cb){ function newUnsignedTransaction(txParams, onTxDoneCb){
var state = idStore.getState() var state = idStore.getState()
if (!state.isUnlocked) { if (!state.isUnlocked) {
createUnlockRequestNotification({ createUnlockRequestNotification({
title: 'Account Unlock Request', title: 'Account Unlock Request',
}) })
var txId = idStore.addUnconfirmedTransaction(txParams, cb) idStore.addUnconfirmedTransaction(txParams, onTxDoneCb, noop)
} else { } else {
addUnconfirmedTx(txParams, cb) addUnconfirmedTx(txParams, onTxDoneCb)
} }
} }
@ -272,13 +272,15 @@ function newUnsignedMessage(msgParams, cb){
} }
} }
function addUnconfirmedTx(txParams, cb){ function addUnconfirmedTx(txParams, onTxDoneCb){
var txId = idStore.addUnconfirmedTransaction(txParams, cb) idStore.addUnconfirmedTransaction(txParams, onTxDoneCb, function(err, txData){
if (err) return onTxDoneCb(err)
createTxNotification({ createTxNotification({
title: 'New Unsigned Transaction', title: 'New Unsigned Transaction',
txParams: txParams, txParams: txParams,
confirm: idStore.approveTransaction.bind(idStore, txId, noop), confirm: idStore.approveTransaction.bind(idStore, txData.id, noop),
cancel: idStore.cancelTransaction.bind(idStore, txId), cancel: idStore.cancelTransaction.bind(idStore, txData.id),
})
}) })
} }

@ -1,12 +1,14 @@
const EventEmitter = require('events').EventEmitter const EventEmitter = require('events').EventEmitter
const inherits = require('util').inherits const inherits = require('util').inherits
const Transaction = require('ethereumjs-tx') const Transaction = require('ethereumjs-tx')
const ethUtil = require('ethereumjs-util')
const LightwalletKeyStore = require('eth-lightwallet').keystore const LightwalletKeyStore = require('eth-lightwallet').keystore
const LightwalletSigner = require('eth-lightwallet').signing const LightwalletSigner = require('eth-lightwallet').signing
const async = require('async') const async = require('async')
const clone = require('clone') const clone = require('clone')
const extend = require('xtend') const extend = require('xtend')
const createId = require('web3-provider-engine/util/random-id') const createId = require('web3-provider-engine/util/random-id')
const ethBinToOps = require('eth-bin-to-ops')
const autoFaucet = require('./auto-faucet') const autoFaucet = require('./auto-faucet')
const configManager = require('./config-manager-singleton') const configManager = require('./config-manager-singleton')
const messageManager = require('./message-manager') const messageManager = require('./message-manager')
@ -182,13 +184,13 @@ IdentityStore.prototype.exportAccount = function(address, cb) {
// //
// comes from dapp via zero-client hooked-wallet provider // 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 // create txData obj with parameters and meta data
var time = (new Date()).getTime() var time = (new Date()).getTime()
var txId = createId() var txId = createId()
txParams.metamaskId = txId txParams.metamaskId = txId
txParams.metamaskNetworkId = this._currentState.network txParams.metamaskNetworkId = self._currentState.network
var txData = { var txData = {
id: txId, id: txId,
txParams: txParams, txParams: txParams,
@ -198,14 +200,38 @@ IdentityStore.prototype.addUnconfirmedTransaction = function(txParams, cb){
configManager.addTx(txData) configManager.addTx(txData)
console.log('addUnconfirmedTransaction:', txData) console.log('addUnconfirmedTransaction:', txData)
// keep the cb around for after approval (requires user interaction) // keep the onTxDoneCb around for after approval/denial (requires user interaction)
// This cb fires completion to the Dapp's write operation. // This onTxDoneCb fires completion to the Dapp's write operation.
this._unconfTxCbs[txId] = cb 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()
}
function didComplete(err){
if (err) return cb(err)
// signal update // signal update
this._didUpdate() self._didUpdate()
// signal completion of add tx
cb(null, txData)
}
return txId
} }
// comes from metamask ui // comes from metamask ui

@ -31,6 +31,7 @@
"debounce": "^1.0.0", "debounce": "^1.0.0",
"dnode": "^1.2.2", "dnode": "^1.2.2",
"end-of-stream": "^1.1.0", "end-of-stream": "^1.1.0",
"eth-bin-to-ops": "^1.0.0",
"eth-lightwallet": "^2.3.3", "eth-lightwallet": "^2.3.3",
"eth-store": "^1.1.0", "eth-store": "^1.1.0",
"ethereumjs-tx": "^1.0.0", "ethereumjs-tx": "^1.0.0",

Loading…
Cancel
Save