parent
09fa81636d
commit
b163b1e062
@ -1,13 +1,30 @@ |
||||
'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') { |
||||
module.exports = { |
||||
Debugger: Debugger |
||||
} |
||||
module.exports = modules() |
||||
} |
||||
if (window) { |
||||
window.remix = { |
||||
Debugger: Debugger |
||||
window.remix = modules() |
||||
} |
||||
|
||||
function modules () { |
||||
return { |
||||
code: { |
||||
codeManager: CodeManager |
||||
}, |
||||
trace: { |
||||
traceManager: TraceManager |
||||
}, |
||||
ui: { |
||||
Debugger: Debugger, |
||||
VMdebugger: VMDebugger, |
||||
BasicPanel: BasicPanel |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
@ -1,8 +1,8 @@ |
||||
'use strict' |
||||
var style = require('./styles/basicStyles') |
||||
var yo = require('yo-yo') |
||||
var CodeManager = require('./code/codeManager') |
||||
var ui = require('./helpers/ui') |
||||
var CodeManager = require('../code/codeManager') |
||||
var ui = require('../helpers/ui') |
||||
|
||||
function ASMCode (_parent, _traceManager, _web3) { |
||||
this.parent = _parent |
@ -1,7 +1,7 @@ |
||||
'use strict' |
||||
var style = require('./styles/basicStyles') |
||||
var yo = require('yo-yo') |
||||
var ui = require('./helpers/ui') |
||||
var ui = require('../helpers/ui') |
||||
|
||||
function BasicPanel (_name, _width, _height) { |
||||
this.data |
@ -1,6 +1,6 @@ |
||||
'use strict' |
||||
var util = require('./helpers/global') |
||||
var EventManager = require('./lib/eventManager') |
||||
var util = require('../helpers/global') |
||||
var EventManager = require('../lib/eventManager') |
||||
var yo = require('yo-yo') |
||||
|
||||
function ButtonNavigator (_traceManager) { |
@ -1,6 +1,6 @@ |
||||
'use strict' |
||||
var BasicPanel = require('./BasicPanel') |
||||
var util = require('./helpers/ui') |
||||
var util = require('../helpers/ui') |
||||
var yo = require('yo-yo') |
||||
|
||||
function MemoryPanel (_parent, _traceManager) { |
@ -1,9 +1,9 @@ |
||||
'use strict' |
||||
var style = require('./styles/sliderStyles') |
||||
var util = require('./helpers/global') |
||||
var EventManager = require('./lib/eventManager') |
||||
var util = require('../helpers/global') |
||||
var EventManager = require('../lib/eventManager') |
||||
var yo = require('yo-yo') |
||||
var ui = require('./helpers/ui') |
||||
var ui = require('../helpers/ui') |
||||
|
||||
function Slider (_traceManager) { |
||||
util.extend(this, new EventManager()) |
@ -1,6 +1,6 @@ |
||||
'use strict' |
||||
var BasicPanel = require('./BasicPanel') |
||||
var ui = require('./helpers/ui') |
||||
var ui = require('../helpers/ui') |
||||
var yo = require('yo-yo') |
||||
|
||||
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