|
|
@ -1,6 +1,8 @@ |
|
|
|
const EventEmitter = require('events').EventEmitter |
|
|
|
const EventEmitter = require('events').EventEmitter |
|
|
|
const inherits = require('util').inherits |
|
|
|
const inherits = require('util').inherits |
|
|
|
|
|
|
|
const async = require('async') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
const ethUtil = require('ethereumjs-util') |
|
|
|
|
|
|
|
const EthQuery = require('eth-query') |
|
|
|
const LightwalletKeyStore = require('eth-lightwallet').keystore |
|
|
|
const LightwalletKeyStore = require('eth-lightwallet').keystore |
|
|
|
const clone = require('clone') |
|
|
|
const clone = require('clone') |
|
|
|
const extend = require('xtend') |
|
|
|
const extend = require('xtend') |
|
|
@ -197,35 +199,53 @@ IdentityStore.prototype.addUnconfirmedTransaction = function (txParams, onTxDone |
|
|
|
time: time, |
|
|
|
time: time, |
|
|
|
status: 'unconfirmed', |
|
|
|
status: 'unconfirmed', |
|
|
|
} |
|
|
|
} |
|
|
|
configManager.addTx(txData) |
|
|
|
|
|
|
|
console.log('addUnconfirmedTransaction:', txData) |
|
|
|
console.log('addUnconfirmedTransaction:', txData) |
|
|
|
|
|
|
|
|
|
|
|
// keep the onTxDoneCb around for after approval/denial (requires user interaction)
|
|
|
|
// keep the onTxDoneCb around for after approval/denial (requires user interaction)
|
|
|
|
// This onTxDoneCb fires completion to the Dapp's write operation.
|
|
|
|
// This onTxDoneCb fires completion to the Dapp's write operation.
|
|
|
|
self._unconfTxCbs[txId] = onTxDoneCb |
|
|
|
self._unconfTxCbs[txId] = onTxDoneCb |
|
|
|
|
|
|
|
|
|
|
|
// perform static analyis on the target contract code
|
|
|
|
|
|
|
|
var provider = self._ethStore._query.currentProvider |
|
|
|
var provider = self._ethStore._query.currentProvider |
|
|
|
|
|
|
|
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) { |
|
|
|
if (txParams.to) { |
|
|
|
provider.sendAsync({ id: 1, method: 'eth_getCode', params: [txParams.to, 'latest'] }, function (err, res) { |
|
|
|
query.getCode(txParams.to, function (err, result) { |
|
|
|
if (err) return didComplete(err) |
|
|
|
if (err) return cb(err) |
|
|
|
if (res.error) return didComplete(res.error) |
|
|
|
var code = ethUtil.toBuffer(result) |
|
|
|
var code = ethUtil.toBuffer(res.result) |
|
|
|
|
|
|
|
if (code !== '0x') { |
|
|
|
if (code !== '0x') { |
|
|
|
var ops = ethBinToOps(code) |
|
|
|
var ops = ethBinToOps(code) |
|
|
|
var containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') |
|
|
|
var containsDelegateCall = ops.some((op) => op.name === 'DELEGATECALL') |
|
|
|
txData.containsDelegateCall = containsDelegateCall |
|
|
|
txData.containsDelegateCall = containsDelegateCall |
|
|
|
didComplete() |
|
|
|
cb() |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
didComplete() |
|
|
|
cb() |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
didComplete() |
|
|
|
cb() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function estimateGas(cb){ |
|
|
|
|
|
|
|
query.estimateGas(txParams, function(err, result){ |
|
|
|
|
|
|
|
if (err) return cb(err) |
|
|
|
|
|
|
|
txData.estimatedGas = result |
|
|
|
|
|
|
|
cb() |
|
|
|
|
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function didComplete (err) { |
|
|
|
function didComplete (err) { |
|
|
|
if (err) return cb(err) |
|
|
|
if (err) return cb(err) |
|
|
|
|
|
|
|
configManager.addTx(txData) |
|
|
|
// signal update
|
|
|
|
// signal update
|
|
|
|
self._didUpdate() |
|
|
|
self._didUpdate() |
|
|
|
// signal completion of add tx
|
|
|
|
// signal completion of add tx
|
|
|
|