parent
09fa81636d
commit
b163b1e062
@ -1,13 +1,30 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var Debugger = require('./Ethdebugger') |
var VMDebugger = require('./ui/VmDebugger') |
||||||
|
var Debugger = require('./ui/Ethdebugger') |
||||||
|
var BasicPanel = require('./ui/BasicPanel') |
||||||
|
var TraceManager = require('./trace/traceManager') |
||||||
|
var CodeManager = require('./code/codeManager') |
||||||
|
|
||||||
if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') { |
if (typeof (module) !== 'undefined' && typeof (module.exports) !== 'undefined') { |
||||||
module.exports = { |
module.exports = modules() |
||||||
Debugger: Debugger |
|
||||||
} |
|
||||||
} |
} |
||||||
if (window) { |
if (window) { |
||||||
window.remix = { |
window.remix = modules() |
||||||
Debugger: Debugger |
} |
||||||
|
|
||||||
|
function modules () { |
||||||
|
return { |
||||||
|
code: { |
||||||
|
codeManager: CodeManager |
||||||
|
}, |
||||||
|
trace: { |
||||||
|
traceManager: TraceManager |
||||||
|
}, |
||||||
|
ui: { |
||||||
|
Debugger: Debugger, |
||||||
|
VMdebugger: VMDebugger, |
||||||
|
BasicPanel: BasicPanel |
||||||
|
} |
||||||
} |
} |
||||||
} |
} |
||||||
|
|
||||||
|
@ -1,8 +1,8 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var style = require('./styles/basicStyles') |
var style = require('./styles/basicStyles') |
||||||
var yo = require('yo-yo') |
var yo = require('yo-yo') |
||||||
var CodeManager = require('./code/codeManager') |
var CodeManager = require('../code/codeManager') |
||||||
var ui = require('./helpers/ui') |
var ui = require('../helpers/ui') |
||||||
|
|
||||||
function ASMCode (_parent, _traceManager, _web3) { |
function ASMCode (_parent, _traceManager, _web3) { |
||||||
this.parent = _parent |
this.parent = _parent |
@ -1,7 +1,7 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var style = require('./styles/basicStyles') |
var style = require('./styles/basicStyles') |
||||||
var yo = require('yo-yo') |
var yo = require('yo-yo') |
||||||
var ui = require('./helpers/ui') |
var ui = require('../helpers/ui') |
||||||
|
|
||||||
function BasicPanel (_name, _width, _height) { |
function BasicPanel (_name, _width, _height) { |
||||||
this.data |
this.data |
@ -1,6 +1,6 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var util = require('./helpers/global') |
var util = require('../helpers/global') |
||||||
var EventManager = require('./lib/eventManager') |
var EventManager = require('../lib/eventManager') |
||||||
var yo = require('yo-yo') |
var yo = require('yo-yo') |
||||||
|
|
||||||
function ButtonNavigator (_traceManager) { |
function ButtonNavigator (_traceManager) { |
@ -1,6 +1,6 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var BasicPanel = require('./BasicPanel') |
var BasicPanel = require('./BasicPanel') |
||||||
var util = require('./helpers/ui') |
var util = require('../helpers/ui') |
||||||
var yo = require('yo-yo') |
var yo = require('yo-yo') |
||||||
|
|
||||||
function MemoryPanel (_parent, _traceManager) { |
function MemoryPanel (_parent, _traceManager) { |
@ -1,9 +1,9 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var style = require('./styles/sliderStyles') |
var style = require('./styles/sliderStyles') |
||||||
var util = require('./helpers/global') |
var util = require('../helpers/global') |
||||||
var EventManager = require('./lib/eventManager') |
var EventManager = require('../lib/eventManager') |
||||||
var yo = require('yo-yo') |
var yo = require('yo-yo') |
||||||
var ui = require('./helpers/ui') |
var ui = require('../helpers/ui') |
||||||
|
|
||||||
function Slider (_traceManager) { |
function Slider (_traceManager) { |
||||||
util.extend(this, new EventManager()) |
util.extend(this, new EventManager()) |
@ -1,6 +1,6 @@ |
|||||||
'use strict' |
'use strict' |
||||||
var BasicPanel = require('./BasicPanel') |
var BasicPanel = require('./BasicPanel') |
||||||
var ui = require('./helpers/ui') |
var ui = require('../helpers/ui') |
||||||
var yo = require('yo-yo') |
var yo = require('yo-yo') |
||||||
|
|
||||||
function StackPanel (_parent, _traceManager) { |
function StackPanel (_parent, _traceManager) { |
@ -0,0 +1,70 @@ |
|||||||
|
var Web3VMProvider = require('./web3VmProvider') |
||||||
|
|
||||||
|
function Web3Provider () { |
||||||
|
var self = this |
||||||
|
this.currentMode |
||||||
|
this.actions = {} |
||||||
|
this.modes = {} |
||||||
|
this.currentProvider = {'host': 'browser-solidity proxy provider'} |
||||||
|
this.providers = { 'HttpProvider': function (url) {} } |
||||||
|
this.eth = {} |
||||||
|
this.debug = {} |
||||||
|
this.eth.getCode = function (address, cb) { if (self.check(cb)) { return self.actions[self.currentMode]['eth.getCode'].apply(self.executingMode(), arguments) } } |
||||||
|
this.setProvider = function (provider) { if (self.check()) { return self.actions[self.currentMode]['setProvider'].apply(self.executingMode(), [provider]) } } |
||||||
|
this.debug.traceTransaction = function (txHash, options, cb) { if (self.check()) { return self.actions[self.currentMode]['debug.traceTransaction'].apply(self.executingMode(), arguments) } } |
||||||
|
this.debug.storageAt = function (blockNumber, txIndex, address, cb) { if (self.check()) { return self.actions[self.currentMode]['debug.storageAt'].apply(self.executingMode(), arguments) } } |
||||||
|
this.eth.getTransaction = function (txHash) { if (self.check()) { return self.actions[self.currentMode]['eth.getTransaction'].apply(self.executingMode(), arguments) } } |
||||||
|
this.eth.getTransactionFromBlock = function (blockNumber, txIndex) { if (self.check()) { return self.actions[self.currentMode]['eth.getTransactionFromBlock'].apply(self.executingMode(), arguments) } } |
||||||
|
this.eth.getBlockNumber = function (cb) { if (self.check()) { return self.actions[self.currentMode]['eth.getBlockNumber'].apply(self.executingMode(), arguments) } } |
||||||
|
} |
||||||
|
|
||||||
|
Web3Provider.prototype.check = function (cb) { |
||||||
|
if (!this.currentMode) { |
||||||
|
if (cb) { |
||||||
|
cb('error: no provider has been setup ', null) |
||||||
|
} |
||||||
|
return false |
||||||
|
} |
||||||
|
return true |
||||||
|
} |
||||||
|
|
||||||
|
Web3Provider.prototype.switchTo = function (type, cb) { |
||||||
|
if (this.actions[type]) { |
||||||
|
this.currentMode = type |
||||||
|
cb(null, 'ok') |
||||||
|
} else { |
||||||
|
cb('error: this provider has not been setup (' + type + ')', null) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Web3Provider.prototype.executingMode = function () { |
||||||
|
return this.modes[this.currentMode] |
||||||
|
} |
||||||
|
|
||||||
|
Web3Provider.prototype.initWeb3 = function (web3) { |
||||||
|
this.actions['EXTERNAL'] = {} |
||||||
|
this.actions['EXTERNAL']['eth.getCode'] = web3.eth.getCode |
||||||
|
this.actions['EXTERNAL']['setProvider'] = web3.setProvider |
||||||
|
this.actions['EXTERNAL']['debug.traceTransaction'] = web3.debug.traceTransaction |
||||||
|
this.actions['EXTERNAL']['debug.storageAt'] = web3.debug.storageAt |
||||||
|
this.actions['EXTERNAL']['eth.getTransaction'] = web3.eth.getTransaction |
||||||
|
this.actions['EXTERNAL']['eth.getTransactionFromBlock'] = web3.eth.getTransactionFromBlock |
||||||
|
this.actions['EXTERNAL']['eth.getBlockNumber'] = web3.eth.getBlockNumber |
||||||
|
this.modes['EXTERNAL'] = web3 |
||||||
|
} |
||||||
|
|
||||||
|
Web3Provider.prototype.initVM = function (vm) { |
||||||
|
var vmProvider = new Web3VMProvider() |
||||||
|
vmProvider.setVM(vm) |
||||||
|
this.actions['VM'] = {} |
||||||
|
this.actions['VM']['eth.getCode'] = vmProvider.getCode |
||||||
|
this.actions['VM']['setProvider'] = vmProvider.setProvider |
||||||
|
this.actions['VM']['debug.traceTransaction'] = vmProvider.traceTransaction |
||||||
|
this.actions['VM']['debug.storageAt'] = vmProvider.storageAt |
||||||
|
this.actions['VM']['eth.getTransaction'] = vmProvider.getTransaction |
||||||
|
this.actions['VM']['eth.getTransactionFromBlock'] = vmProvider.getTransactionFromBlock |
||||||
|
this.actions['VM']['eth.getBlockNumber'] = vmProvider.getBlockNumber |
||||||
|
this.modes['VM'] = vmProvider |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = Web3Provider |
@ -0,0 +1,168 @@ |
|||||||
|
var ethJSUtil = require('ethereumjs-util') |
||||||
|
var BN = ethJSUtil.BN |
||||||
|
|
||||||
|
function web3VmProvider () { |
||||||
|
this.vm |
||||||
|
this.vmTraces = {} |
||||||
|
this.txs = {} |
||||||
|
this.processingHash |
||||||
|
this.incr = 0 |
||||||
|
} |
||||||
|
|
||||||
|
var hexConvert = function (ints) { |
||||||
|
var ret = '0x' |
||||||
|
for (var i = 0; i < ints.length; i++) { |
||||||
|
try { |
||||||
|
var h = ints[i] |
||||||
|
if (h) { |
||||||
|
h = h.toString(16) |
||||||
|
ret += ('0x' + h) < 0x10 ? '0' + h : h |
||||||
|
} else { |
||||||
|
ret += '00' |
||||||
|
} |
||||||
|
} catch (e) { |
||||||
|
console.log('hexconvert ' + i + ' ' + ints.length) |
||||||
|
console.log(e) |
||||||
|
} |
||||||
|
} |
||||||
|
return ret |
||||||
|
} |
||||||
|
|
||||||
|
var hexListConvert = function (intsList) { |
||||||
|
var ret = [] |
||||||
|
for (var k in intsList) { |
||||||
|
ret.push(hexConvert(intsList[k])) |
||||||
|
} |
||||||
|
return ret |
||||||
|
} |
||||||
|
|
||||||
|
var formatMemory = function (mem) { |
||||||
|
var hexMem = hexConvert(mem).substr(2) |
||||||
|
var ret = [] |
||||||
|
for (var k = 0; k < hexMem.length; k += 32) { |
||||||
|
var row = hexMem.substr(k, 32) |
||||||
|
ret.push(row) |
||||||
|
} |
||||||
|
return ret |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.setVM = function (vm) { |
||||||
|
var self = this |
||||||
|
this.vm = vm |
||||||
|
this.vm.on('step', function (data) { |
||||||
|
self.pushTrace(self, data) |
||||||
|
}) |
||||||
|
this.vm.on('afterTx', function (data) { |
||||||
|
self.txProcessed(self, data) |
||||||
|
}) |
||||||
|
this.vm.on('beforeTx', function (data) { |
||||||
|
self.txWillProcess(self, data) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.releaseCurrentHash = function () { |
||||||
|
var ret = this.processingHash |
||||||
|
this.processingHash = undefined |
||||||
|
return ret |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.txWillProcess = function (self, data) { |
||||||
|
self.incr++ |
||||||
|
self.processingHash = '0x' + ethJSUtil.sha3([data.r, data.s, data.v, self.incr]).join('') |
||||||
|
self.vmTraces[self.processingHash] = { |
||||||
|
gas: '0x0', |
||||||
|
return: '0x0', |
||||||
|
structLogs: [] |
||||||
|
} |
||||||
|
var tx = {} |
||||||
|
tx.hash = self.processingHash |
||||||
|
tx.from = hexConvert(data.getSenderAddress()) |
||||||
|
if (data.to && data.to.length) { |
||||||
|
tx.to = hexConvert(data.to) |
||||||
|
} |
||||||
|
tx.data = hexConvert(data.data) |
||||||
|
tx.input = hexConvert(data.input) |
||||||
|
tx.gas = hexConvert(data.gas) |
||||||
|
if (data.value) { |
||||||
|
tx.value = hexConvert(data.value) |
||||||
|
} |
||||||
|
self.txs[self.processingHash] = tx |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.txProcessed = function (self, data) { |
||||||
|
self.vmTraces[self.processingHash].gas = '0x' + data.gasUsed.toString(16) |
||||||
|
if (data.createdAddress) { |
||||||
|
self.vmTraces[self.processingHash].return = hexConvert(data.createdAddress) |
||||||
|
} else { |
||||||
|
self.vmTraces[self.processingHash].return = hexConvert(data.vm.return) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.pushTrace = function (self, data) { |
||||||
|
if (!self.processingHash) { |
||||||
|
console.log('no tx processing') |
||||||
|
return |
||||||
|
} |
||||||
|
var step = { |
||||||
|
stack: hexListConvert(data.stack), |
||||||
|
memory: formatMemory(data.memory), |
||||||
|
storage: data.storage, |
||||||
|
op: data.opcode.name, |
||||||
|
pc: data.pc, |
||||||
|
gas: data.opcode.fee.toString(), |
||||||
|
gasLeft: data.gasLeft.toString(), |
||||||
|
gasCost: self.vmTraces[self.processingHash].structLogs.length > 0 ? ((new BN(self.vmTraces[self.processingHash].structLogs[0].gasLeft)) - data.gasLeft).toString() : data.opcode.fee.toString() |
||||||
|
} |
||||||
|
self.vmTraces[self.processingHash].structLogs.push(step) |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.getCode = function (address, cb) { |
||||||
|
this.vm.stateManager.getContractCode(address, function (error, result) { |
||||||
|
cb(error, hexConvert(result)) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.setProvider = function (provider) {} |
||||||
|
|
||||||
|
web3VmProvider.prototype.traceTransaction = function (txHash, options, cb) { |
||||||
|
if (this.vmTraces[txHash]) { |
||||||
|
if (cb) { |
||||||
|
cb(null, this.vmTraces[txHash]) |
||||||
|
} |
||||||
|
return this.vmTraces[txHash] |
||||||
|
} else { |
||||||
|
var mes = 'unable to retrieve traces ' + txHash |
||||||
|
if (cb) { |
||||||
|
cb('unable to retrieve traces ' + txHash, null) |
||||||
|
} |
||||||
|
throw mes |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.storageAt = function (blockNumber, txIndex, address, cb) { cb(null, {}) } |
||||||
|
|
||||||
|
web3VmProvider.prototype.getTransaction = function (txHash, cb) { |
||||||
|
if (this.txs[txHash]) { |
||||||
|
if (cb) { |
||||||
|
cb(null, this.txs[txHash]) |
||||||
|
} |
||||||
|
return this.txs[txHash] |
||||||
|
} else { |
||||||
|
var mes = 'unable to retrieve tx ' + txHash |
||||||
|
if (cb) { |
||||||
|
cb('unable to retrieve tx ' + txHash, null) |
||||||
|
} |
||||||
|
throw mes |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
web3VmProvider.prototype.getTransactionFromBlock = function (blockNumber, txIndex, cb) { |
||||||
|
var mes = 'not supposed to be needed by remix' |
||||||
|
console.log(mes) |
||||||
|
if (cb) { |
||||||
|
cb(mes, null) |
||||||
|
} |
||||||
|
throw mes |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = web3VmProvider |
Loading…
Reference in new issue