diff --git a/package.json b/package.json index a2a6684c51..d549119332 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,15 @@ "devDependencies": { "babel-preset-react": "^6.5.0", "babelify": "^7.2.0", + "mocha": "^2.5.3", + "should": "^9.0.2", "standard": "^7.0.1", "standard-reporter": "^1.0.5" }, "scripts": { "start_node": "eth --rpccorsdomain \"*\" -j -v 0", "build": "mkdir -p build; browserify -t [ babelify --presets [ react ] ] src/index.js -o build/app.js", - "test" : "standard" + "test": "standard && mocha" }, "repository": { "type": "git", diff --git a/src/codeManager.js b/src/code/codeManager.js similarity index 94% rename from src/codeManager.js rename to src/code/codeManager.js index da98f3f307..ed61b451be 100644 --- a/src/codeManager.js +++ b/src/code/codeManager.js @@ -1,8 +1,8 @@ 'use strict' -var traceManagerUtil = require('./traceManagerUtil') +var traceHelper = require('../helpers/traceHelper') var codeResolver = require('./codeResolver') -var util = require('./util') -var EventManager = require('./eventManager') +var util = require('../helpers/global') +var EventManager = require('../lib/eventManager') /* resolve contract code referenced by vmtrace in order to be used by asm listview. @@ -42,7 +42,7 @@ CodeManager.prototype.resolveStep = function (stepIndex, tx) { CodeManager.prototype.ensureCodeLoaded = function (address, currentStep, tx) { var self = this if (address !== this.currentAddress) { - if (traceManagerUtil.isContractCreation(address)) { + if (traceHelper.isContractCreation(address)) { this.traceManager.getContractCreationCode(address, function (error, hexCode) { // contract creation if (error) { diff --git a/src/codeResolver.js b/src/code/codeResolver.js similarity index 100% rename from src/codeResolver.js rename to src/code/codeResolver.js diff --git a/src/codeUtils.js b/src/code/codeUtils.js similarity index 100% rename from src/codeUtils.js rename to src/code/codeUtils.js diff --git a/src/opcodes.js b/src/code/opcodes.js similarity index 100% rename from src/opcodes.js rename to src/code/opcodes.js diff --git a/src/debugger.js b/src/debugger.js index 84709b7374..8baa0b8a9a 100644 --- a/src/debugger.js +++ b/src/debugger.js @@ -4,8 +4,8 @@ var TxBrowser = require('./txBrowser') var StepManager = require('./stepManager') var VmDebugger = require('./vmDebugger') var style = require('./basicStyles') -var util = require('./util') -var EventManager = require('./eventManager') +var util = require('./helpers/global') +var EventManager = require('./lib/eventManager') module.exports = React.createClass({ ethDebuggerSelectedItem: -1, diff --git a/src/util.js b/src/helpers/global.js similarity index 100% rename from src/util.js rename to src/helpers/global.js diff --git a/src/helpers/init.js b/src/helpers/init.js new file mode 100644 index 0000000000..e4c93ae891 --- /dev/null +++ b/src/helpers/init.js @@ -0,0 +1,19 @@ +'use strict' +var Web3 = require('web3') +var Web3Admin = require('../util/web3Admin') +var TraceManager = require('../trace/traceManager') +var CodeManager = require('../code/codeManager') + +module.exports = { + loadContext: function () { + var web3 = new Web3() + web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545')) + Web3Admin.extend(web3) + var traceManager = new TraceManager(web3) + return { + web3: web3, + traceManager: traceManager, + codeManager: new CodeManager(web3, traceManager) + } + } +} diff --git a/src/traceManagerUtil.js b/src/helpers/traceHelper.js similarity index 100% rename from src/traceManagerUtil.js rename to src/helpers/traceHelper.js diff --git a/src/helpers/ui.js b/src/helpers/ui.js new file mode 100644 index 0000000000..615c9959ce --- /dev/null +++ b/src/helpers/ui.js @@ -0,0 +1,35 @@ +'use strict' +module.exports = { + formatMemory: function (mem, width) { + var ret = '' + if (!mem) { + return ret + } + + if (!mem.substr) { + mem = mem.join('') // geth returns an array, eth return raw string + } + + for (var k = 0; k < mem.length; k += (width * 2)) { + var memory = mem.substr(k, width * 2) + var content = this.tryConvertAsciiFormat(memory) + ret += '0x' + k.toString(16) + ' ' + content.raw + ' ' + content.ascii + '\n' + } + return ret + }, + + tryConvertAsciiFormat: function (memorySlot) { + var ret = { ascii: '', raw: '' } + for (var k = 0; k < memorySlot.length; k += 2) { + var raw = memorySlot.substr(k, 2) + var ascii = String.fromCharCode(parseInt(raw, 16)) + ascii = ascii.replace(/\W/g, '?') + if (ascii === '') { + ascii = '?' + } + ret.ascii += ascii + ret.raw += ' ' + raw + } + return ret + } +} diff --git a/src/index.js b/src/index.js index 3b970a9867..a3b608a91f 100644 --- a/src/index.js +++ b/src/index.js @@ -1,26 +1,10 @@ 'use strict' var ReactDOM = require('react-dom') var React = require('react') -var Web3 = require('web3') -var Web3Admin = require('./web3Admin') -var TraceManager = require('./traceManager') -var CodeManager = require('./codeManager') - -function loadContext () { - var web3 = new Web3() - web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545')) - Web3Admin.extend(web3) - var traceManager = new TraceManager(web3) - return { - web3: web3, - traceManager: traceManager, - codeManager: new CodeManager(web3, traceManager) - } -} - +var util = require('./helpers/init') var Debugger = require('./debugger') ReactDOM.render( - , + , document.getElementById('app') ) diff --git a/src/eventManager.js b/src/lib/eventManager.js similarity index 100% rename from src/eventManager.js rename to src/lib/eventManager.js diff --git a/src/memoryPanel.js b/src/memoryPanel.js index 4a656309d2..804055ec0b 100644 --- a/src/memoryPanel.js +++ b/src/memoryPanel.js @@ -1,6 +1,7 @@ 'use strict' var React = require('react') var BasicPanel = require('./basicPanel') +var util = require('./helpers/ui') module.exports = React.createClass({ contextTypes: { @@ -33,43 +34,10 @@ module.exports = React.createClass({ console.log(error) } else if (self.context.root.ethDebuggerSelectedItem === index) { self.setState({ - data: self.formatMemory(memory, 16) + data: util.formatMemory(memory, 16) }) } }) }) - }, - - formatMemory: function (mem, width) { - var ret = '' - if (!mem) { - return ret - } - - if (!mem.substr) { - mem = mem.join('') // geth returns an array, eth return raw string - } - - for (var k = 0; k < mem.length; k += (width * 2)) { - var memory = mem.substr(k, width * 2) - var content = this.tryAsciiFormat(memory) - ret += this.context.web3.toHex(k) + ' ' + content.raw + ' ' + content.ascii + '\n' - } - return ret - }, - - tryAsciiFormat: function (memorySlot) { - var ret = { ascii: '', raw: '' } - for (var k = 0; k < memorySlot.length; k += 2) { - var raw = memorySlot.substr(k, 2) - var ascii = String.fromCharCode(parseInt(raw, 16)) - ascii = ascii.replace(/\W/g, '?') - if (ascii === '') { - ascii = '?' - } - ret.ascii += ascii - ret.raw += ' ' + raw - } - return ret } }) diff --git a/src/traceAnalyser.js b/src/trace/traceAnalyser.js similarity index 77% rename from src/traceAnalyser.js rename to src/trace/traceAnalyser.js index 2e7f67a9c4..b482ae86d3 100644 --- a/src/traceAnalyser.js +++ b/src/trace/traceAnalyser.js @@ -1,5 +1,5 @@ 'use strict' -var traceManagerUtil = require('./traceManagerUtil') +var traceHelper = require('../helpers/traceHelper') function TraceAnalyser (_cache) { this.traceCache = _cache @@ -18,7 +18,7 @@ TraceAnalyser.prototype.analyse = function (trace, tx, callback) { callStack: callStack.slice(0) }) - if (traceManagerUtil.isContractCreation(tx.to)) { + if (traceHelper.isContractCreation(tx.to)) { this.traceCache.pushContractCreation(tx.to, tx.input) } @@ -45,17 +45,17 @@ TraceAnalyser.prototype.buildMemory = function (index, step) { } TraceAnalyser.prototype.buildStorage = function (index, step, context) { - if (traceManagerUtil.newContextStorage(step)) { - var calledAddress = traceManagerUtil.resolveCalledAddress(index, this.trace) + if (traceHelper.newContextStorage(step)) { + var calledAddress = traceHelper.resolveCalledAddress(index, this.trace) if (calledAddress) { context.currentStorageAddress = calledAddress } else { console.log('unable to build storage changes. ' + index + ' does not match with a CALL. storage changes will be corrupted') } this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress) - } else if (traceManagerUtil.isSSTOREInstruction(step)) { + } else if (traceHelper.isSSTOREInstruction(step)) { this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress, step.stack[step.stack.length - 1], step.stack[step.stack.length - 2]) - } else if (traceManagerUtil.isReturnInstruction(step)) { + } else if (traceHelper.isReturnInstruction(step)) { context.currentStorageAddress = context.previousStorageAddress this.traceCache.pushStoreChanges(index + 1, context.currentStorageAddress) } @@ -63,14 +63,14 @@ TraceAnalyser.prototype.buildStorage = function (index, step, context) { } TraceAnalyser.prototype.buildDepth = function (index, step, callStack) { - if (traceManagerUtil.isCallInstruction(step) && !traceManagerUtil.isCallToPrecompiledContract(index, this.trace)) { - if (traceManagerUtil.isCreateInstruction(step)) { - var contractToken = traceManagerUtil.contractCreationToken(index) + if (traceHelper.isCallInstruction(step) && !traceHelper.isCallToPrecompiledContract(index, this.trace)) { + if (traceHelper.isCreateInstruction(step)) { + var contractToken = traceHelper.contractCreationToken(index) callStack.push(contractToken) var lastMemoryChange = this.traceCache.memoryChanges[this.traceCache.memoryChanges.length - 1] this.traceCache.pushContractCreationFromMemory(index, contractToken, this.trace, lastMemoryChange) } else { - var newAddress = traceManagerUtil.resolveCalledAddress(index, this.trace) + var newAddress = traceHelper.resolveCalledAddress(index, this.trace) if (newAddress) { callStack.push(newAddress) } else { @@ -81,7 +81,7 @@ TraceAnalyser.prototype.buildDepth = function (index, step, callStack) { this.traceCache.pushCallStack(index + 1, { callStack: callStack.slice(0) }) - } else if (traceManagerUtil.isReturnInstruction(step)) { + } else if (traceHelper.isReturnInstruction(step)) { callStack.pop() this.traceCache.pushCallChanges(step, index + 1) this.traceCache.pushCallStack(index + 1, { diff --git a/src/traceCache.js b/src/trace/traceCache.js similarity index 100% rename from src/traceCache.js rename to src/trace/traceCache.js diff --git a/src/traceManager.js b/src/trace/traceManager.js similarity index 92% rename from src/traceManager.js rename to src/trace/traceManager.js index 8c33bdf6c4..f736d9afb9 100644 --- a/src/traceManager.js +++ b/src/trace/traceManager.js @@ -3,7 +3,7 @@ var TraceAnalyser = require('./traceAnalyser') var TraceRetriever = require('./traceRetriever') var TraceCache = require('./traceCache') var TraceStepManager = require('./traceStepManager') -var traceManagerUtil = require('./traceManagerUtil') +var traceHelper = require('../helpers/traceHelper') function TraceManager (_web3) { this.web3 = _web3 @@ -74,7 +74,7 @@ TraceManager.prototype.getStorageAt = function (stepIndex, tx, callback) { if (check) { return callback(check, null) } - var stoChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.storageChanges) + var stoChange = traceHelper.findLowerBound(stepIndex, this.traceCache.storageChanges) if (stoChange === undefined) return callback('no storage found', null) var self = this if (this.traceRetriever.debugStorageAtAvailable()) { @@ -98,7 +98,7 @@ TraceManager.prototype.getCallDataAt = function (stepIndex, callback) { if (check) { return callback(check, null) } - var callDataChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.callDataChanges) + var callDataChange = traceHelper.findLowerBound(stepIndex, this.traceCache.callDataChanges) if (callDataChange === undefined) return callback('no calldata found', null) callback(null, [this.trace[callDataChange].calldata]) } @@ -108,7 +108,7 @@ TraceManager.prototype.getCallStackAt = function (stepIndex, callback) { if (check) { return callback(check, null) } - var callStackChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.callChanges) + var callStackChange = traceHelper.findLowerBound(stepIndex, this.traceCache.callChanges) if (callStackChange === undefined) return callback('no callstack found', null) callback(null, this.traceCache.callStack[callStackChange].callStack) } @@ -133,7 +133,7 @@ TraceManager.prototype.getLastCallChangeSince = function (stepIndex, callback) { if (check) { return callback(check, null) } - var callChange = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.callChanges) + var callChange = traceHelper.findLowerBound(stepIndex, this.traceCache.callChanges) if (callChange === undefined) { callback(null, 0) } else { @@ -179,7 +179,7 @@ TraceManager.prototype.getMemoryAt = function (stepIndex, callback) { if (check) { return callback(check, null) } - var lastChanges = traceManagerUtil.findLowerBound(stepIndex, this.traceCache.memoryChanges) + var lastChanges = traceHelper.findLowerBound(stepIndex, this.traceCache.memoryChanges) if (lastChanges === undefined) return callback('no memory found', null) callback(null, this.trace[lastChanges].memory) } @@ -225,7 +225,7 @@ TraceManager.prototype.getRemainingGas = function (stepIndex, callback) { } TraceManager.prototype.isCreationStep = function (stepIndex) { - return traceManagerUtil.isCreateInstruction(stepIndex, this.trace) + return traceHelper.isCreateInstruction(stepIndex, this.trace) } // step section diff --git a/src/traceRetriever.js b/src/trace/traceRetriever.js similarity index 90% rename from src/traceRetriever.js rename to src/trace/traceRetriever.js index 2c2956c34f..88859facbb 100644 --- a/src/traceRetriever.js +++ b/src/trace/traceRetriever.js @@ -1,5 +1,6 @@ 'use strict' -var traceManagerUtil = require('./traceManagerUtil') +var traceHelper = require('../helpers/traceHelper') + function TraceRetriever (_web3) { this.web3 = _web3 this.storages = {} // contains all intial storage (by addresses) @@ -18,7 +19,7 @@ TraceRetriever.prototype.getTrace = function (txHash, callback) { } TraceRetriever.prototype.getStorage = function (tx, address, callback) { - if (traceManagerUtil.isContractCreation(address)) { + if (traceHelper.isContractCreation(address)) { callback(null, {}) } else if (this.storages[address]) { callback(null, this.storages[address]) diff --git a/src/traceStepManager.js b/src/trace/traceStepManager.js similarity index 92% rename from src/traceStepManager.js rename to src/trace/traceStepManager.js index 74fb033622..5f20aa25d2 100644 --- a/src/traceStepManager.js +++ b/src/trace/traceStepManager.js @@ -1,5 +1,5 @@ 'use strict' -var traceManagerUtil = require('./traceManagerUtil') +var traceHelper = require('../helpers/traceHelper') function TraceStepManager (_traceAnalyser) { this.traceAnalyser = _traceAnalyser @@ -7,12 +7,12 @@ function TraceStepManager (_traceAnalyser) { TraceStepManager.prototype.isCallInstruction = function (index) { var state = this.traceAnalyser.trace[index] - return traceManagerUtil.isCallInstruction(state) + return traceHelper.isCallInstruction(state) } TraceStepManager.prototype.isReturnInstruction = function (index) { var state = this.traceAnalyser.trace[index] - return traceManagerUtil.isReturnInstruction(state) + return traceHelper.isReturnInstruction(state) } TraceStepManager.prototype.findStepOverBack = function (currentStep) { diff --git a/src/txBrowser.js b/src/txBrowser.js index f4ff916b9a..945ed8c552 100644 --- a/src/txBrowser.js +++ b/src/txBrowser.js @@ -1,7 +1,7 @@ 'use strict' var React = require('react') var style = require('./basicStyles') -var traceManagerUtil = require('./traceManagerUtil') +var traceHelper = require('./helpers/traceHelper') module.exports = React.createClass({ contextTypes: { @@ -31,7 +31,7 @@ module.exports = React.createClass({ } if (tx) { if (!tx.to) { - tx.to = traceManagerUtil.contractCreationToken('0') + tx.to = traceHelper.contractCreationToken('0') } this.setState({from: tx.from, to: tx.to, hash: tx.hash}) this.props.onNewTxRequested(this.state.blockNumber, parseInt(this.state.txNumber), tx) diff --git a/src/web3Admin.js b/src/util/web3Admin.js similarity index 100% rename from src/web3Admin.js rename to src/util/web3Admin.js diff --git a/test/index.js b/test/index.js new file mode 100644 index 0000000000..1542d841f9 --- /dev/null +++ b/test/index.js @@ -0,0 +1,12 @@ +/* global describe it*/ +var should = require('should') + +var init = require('../src/helpers/init') +describe('index', function () { + describe('loadContext', function () { + it('web3', function () { + var context = init.loadContext() + should.exist(context.web3) + }) + }) +})