diff --git a/.circleci/config.yml b/.circleci/config.yml index 3105fc8cc7..58c75f6152 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,7 +8,7 @@ jobs: docker: # specify the version you desire here - image: circleci/node:9.11.2 - + # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images # documented at https://circleci.com/docs/2.0/circleci-images/ @@ -26,10 +26,10 @@ jobs: - checkout - restore_cache: keys: - - dep-bundle-23-{{ checksum "package.json" }} + - dep-bundle-24-{{ checksum "package.json" }} - run: npm install - save_cache: - key: dep-bundle-23-{{ checksum "package.json" }} + key: dep-bundle-24-{{ checksum "package.json" }} paths: - ~/repo/node_modules - run: npm run lint && npm run test && npm run make-mock-compiler && npm run build diff --git a/package.json b/package.json index 4c03f2f2c4..ee04e5d03f 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "babel-polyfill": "^6.22.0", "babel-preset-env": "^1.6.1", "babel-preset-es2015": "^6.24.0", + "babel-preset-es2017": "^6.24.1", "babel-preset-stage-0": "^6.24.1", "babelify": "^7.3.0", "brace": "^0.8.0", @@ -37,11 +38,11 @@ "npm-link-local": "^1.1.0", "npm-run-all": "^4.0.2", "onchange": "^3.2.1", - "remix-debug": "0.2.14", - "remix-analyzer": "0.2.13", - "remix-lib": "0.3.13", - "remix-solidity": "0.2.14", - "remix-tests": "0.0.21", + "remix-debug": "0.3.1", + "remix-analyzer": "0.3.1", + "remix-lib": "0.4.1", + "remix-solidity": "0.3.1", + "remix-tests": "0.1.1", "remixd": "git+https://github.com/ethereum/remixd.git", "request": "^2.83.0", "rimraf": "^2.6.1", diff --git a/src/app.js b/src/app.js index fe3f6b1c08..773352f089 100644 --- a/src/app.js +++ b/src/app.js @@ -7,7 +7,7 @@ var async = require('async') var request = require('request') var remixLib = require('remix-lib') var remixTests = require('remix-tests') -var EventManager = remixLib.EventManager +var EventManager = require('./lib/events') var registry = require('./global/registry') var UniversalDApp = require('./universal-dapp.js') diff --git a/src/app/debugger/debugger/VmDebugger.js b/src/app/debugger/debugger/VmDebugger.js deleted file mode 100644 index ae6bbe902a..0000000000 --- a/src/app/debugger/debugger/VmDebugger.js +++ /dev/null @@ -1,240 +0,0 @@ -var remixDebug = require('remix-debug') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager -var ui = remixLib.helpers.ui -var StorageResolver = remixDebug.storage.StorageResolver -var StorageViewer = remixDebug.storage.StorageViewer - -var DebuggerSolidityState = require('./solidityState') -var DebuggerSolidityLocals = require('./solidityLocals') - -class VmDebuggerLogic { - - constructor (_debugger, tx, _stepManager, _traceManager, _codeManager, _solidityProxy, _callTree) { - this.event = new EventManager() - this.debugger = _debugger - this.stepManager = _stepManager - this._traceManager = _traceManager - this._codeManager = _codeManager - this._solidityProxy = _solidityProxy - this._callTree = _callTree - this.storageResolver = null - this.tx = tx - - this.debuggerSolidityState = new DebuggerSolidityState(tx, _stepManager, _traceManager, _codeManager, _solidityProxy) - this.debuggerSolidityLocals = new DebuggerSolidityLocals(tx, _stepManager, _traceManager, _callTree) - } - - start () { - this.listenToEvents() - this.listenToCodeManagerEvents() - this.listenToTraceManagerEvents() - this.listenToFullStorageChanges() - this.listenToNewChanges() - - this.listenToSolidityStateEvents() - this.listenToSolidityLocalsEvents() - } - - listenToEvents () { - const self = this - this.debugger.event.register('traceUnloaded', function () { - self.event.trigger('traceUnloaded') - }) - - this.debugger.event.register('newTraceLoaded', function () { - self.event.trigger('newTraceLoaded') - }) - } - - listenToCodeManagerEvents () { - const self = this - this._codeManager.event.register('changed', function (code, address, index) { - self.event.trigger('codeManagerChanged', [code, address, index]) - }) - } - - listenToTraceManagerEvents () { - const self = this - - this.event.register('indexChanged', this, function (index) { - if (index < 0) return - if (self.stepManager.currentStepIndex !== index) return - - self.event.trigger('indexUpdate', [index]) - - self._traceManager.getCallDataAt(index, function (error, calldata) { - if (error) { - console.log(error) - self.event.trigger('traceManagerCallDataUpdate', [{}]) - } else if (self.stepManager.currentStepIndex === index) { - self.event.trigger('traceManagerCallDataUpdate', [calldata]) - } - }) - - self._traceManager.getMemoryAt(index, function (error, memory) { - if (error) { - console.log(error) - self.event.trigger('traceManagerMemoryUpdate', [{}]) - } else if (self.stepManager.currentStepIndex === index) { - self.event.trigger('traceManagerMemoryUpdate', [ui.formatMemory(memory, 16)]) - } - }) - - self._traceManager.getCallStackAt(index, function (error, callstack) { - if (error) { - console.log(error) - self.event.trigger('traceManagerCallStackUpdate', [{}]) - } else if (self.stepManager.currentStepIndex === index) { - self.event.trigger('traceManagerCallStackUpdate', [callstack]) - } - }) - - self._traceManager.getStackAt(index, function (error, callstack) { - if (error) { - console.log(error) - self.event.trigger('traceManagerStackUpdate', [{}]) - } else if (self.stepManager.currentStepIndex === index) { - self.event.trigger('traceManagerStackUpdate', [callstack]) - } - }) - - self._traceManager.getCurrentCalledAddressAt(index, (error, address) => { - if (error) return - if (!self.storageResolver) return - - var storageViewer = new StorageViewer({ stepIndex: self.stepManager.currentStepIndex, tx: self.tx, address: address }, self.storageResolver, self._traceManager) - - storageViewer.storageRange((error, storage) => { - if (error) { - console.log(error) - self.event.trigger('traceManagerStorageUpdate', [{}]) - } else if (self.stepManager.currentStepIndex === index) { - var header = storageViewer.isComplete(address) ? 'completely loaded' : 'partially loaded...' - self.event.trigger('traceManagerStorageUpdate', [storage, header]) - } - }) - }) - - self._traceManager.getCurrentStep(index, function (error, step) { - self.event.trigger('traceCurrentStepUpdate', [error, step]) - }) - - self._traceManager.getMemExpand(index, function (error, addmem) { - self.event.trigger('traceMemExpandUpdate', [error, addmem]) - }) - - self._traceManager.getStepCost(index, function (error, gas) { - self.event.trigger('traceStepCostUpdate', [error, gas]) - }) - - self._traceManager.getCurrentCalledAddressAt(index, function (error, address) { - self.event.trigger('traceCurrentCalledAddressAtUpdate', [error, address]) - }) - - self._traceManager.getRemainingGas(index, function (error, remaining) { - self.event.trigger('traceRemainingGasUpdate', [error, remaining]) - }) - - self._traceManager.getReturnValue(index, function (error, returnValue) { - if (error) { - self.event.trigger('traceReturnValueUpdate', [[error]]) - } else if (self.stepManager.currentStepIndex === index) { - self.event.trigger('traceReturnValueUpdate', [[returnValue]]) - } - }) - }) - } - - listenToFullStorageChanges () { - const self = this - - this.address = [] - this.traceLength = 0 - - self.debugger.event.register('newTraceLoaded', function (length) { - self._traceManager.getAddresses(function (error, addresses) { - if (error) return - self.event.trigger('traceAddressesUpdate', [addresses]) - self.addresses = addresses - }) - - self._traceManager.getLength(function (error, length) { - if (error) return - self.event.trigger('traceLengthUpdate', [length]) - self.traceLength = length - }) - }) - - self.event.register('indexChanged', this, function (index) { - if (index < 0) return - if (self.stepManager.currentStepIndex !== index) return - if (!self.storageResolver) return - - // Full storage changes are queried for each step (not only at the end of the trace as it was before) - let storageJSON = {} - for (var k in self.addresses) { - let address = self.addresses[k] - let storage = {} - self._traceManager.accumulateStorageChanges(self.stepManager.currentStepIndex, address, storage, (error, result) => { - if (!error) { - storageJSON[address] = result - self.event.trigger('traceStorageUpdate', [storageJSON]) - } - }) - } - }) - } - - listenToNewChanges () { - const self = this - self.debugger.event.register('newTraceLoaded', this, function () { - self.storageResolver = new StorageResolver({web3: self.debugger.web3}) - self.debuggerSolidityState.storageResolver = self.storageResolver - self.debuggerSolidityLocals.storageResolver = self.storageResolver - self.event.trigger('newTrace', []) - }) - - self.debugger.event.register('callTreeReady', this, function () { - if (self.debugger.callTree.reducedTrace.length) { - return self.event.trigger('newCallTree', []) - } - }) - } - - listenToSolidityStateEvents () { - const self = this - this.event.register('indexChanged', this.debuggerSolidityState.init.bind(this.debuggerSolidityState)) - this.debuggerSolidityState.event.register('solidityState', function (state) { - self.event.trigger('solidityState', [state]) - }) - this.debuggerSolidityState.event.register('solidityStateMessage', function (message) { - self.event.trigger('solidityStateMessage', [message]) - }) - this.debuggerSolidityState.event.register('solidityStateUpdating', function () { - self.event.trigger('solidityStateUpdating', []) - }) - this.event.register('traceUnloaded', this.debuggerSolidityState.reset.bind(this.debuggerSolidityState)) - this.event.register('newTraceLoaded', this.debuggerSolidityState.reset.bind(this.debuggerSolidityState)) - } - - listenToSolidityLocalsEvents () { - const self = this - this.event.register('sourceLocationChanged', this.debuggerSolidityLocals.init.bind(this.debuggerSolidityLocals)) - this.debuggerSolidityLocals.event.register('solidityLocals', function (state) { - self.event.trigger('solidityLocals', [state]) - }) - this.debuggerSolidityLocals.event.register('solidityLocalsMessage', function (message) { - self.event.trigger('solidityLocalsMessage', [message]) - }) - this.debuggerSolidityLocals.event.register('solidityLocalsUpdating', function () { - self.event.trigger('solidityLocalsUpdating', []) - }) - this.debuggerSolidityLocals.event.register('traceReturnValueUpdate', function (data, header) { - self.event.trigger('traceReturnValueUpdate', [data, header]) - }) - } - -} - -module.exports = VmDebuggerLogic diff --git a/src/app/debugger/debugger/debugger.js b/src/app/debugger/debugger/debugger.js deleted file mode 100644 index 3e6d5cdce0..0000000000 --- a/src/app/debugger/debugger/debugger.js +++ /dev/null @@ -1,144 +0,0 @@ -'use strict' -var Ethdebugger = require('remix-debug').EthDebugger -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager -var traceHelper = remixLib.helpers.trace - -var StepManager = require('./stepManager') -var VmDebuggerLogic = require('./VmDebugger') - -function Debugger (options) { - var self = this - this.event = new EventManager() - - this.executionContext = options.executionContext - // dependencies - this.offsetToLineColumnConverter = options.offsetToLineColumnConverter - this.compilersArtefacts = options.compilersArtefacts - - this.debugger = new Ethdebugger({ - executionContext: options.executionContext, - compilationResult: () => { - if (this.compilersArtefacts['__last']) return this.compilersArtefacts['__last'].getData() - return null - } - }) - - this.breakPointManager = new remixLib.code.BreakpointManager(this.debugger, (sourceLocation) => { - if (!this.compilersArtefacts['__last']) return null - let compilationData = this.compilersArtefacts['__last'].getData() - if (!compilationData) return null - return self.offsetToLineColumnConverter.offsetToLineColumn(sourceLocation, sourceLocation.file, compilationData.sources, compilationData.sources) - }, (step) => { - self.event.trigger('breakpointStep', [step]) - }) - - this.debugger.setBreakpointManager(this.breakPointManager) - - this.executionContext.event.register('contextChanged', this, function (context) { - self.debugger.switchProvider(context) - }) - - this.debugger.event.register('newTraceLoaded', this, function () { - self.event.trigger('debuggerStatus', [true]) - }) - - this.debugger.event.register('traceUnloaded', this, function () { - self.event.trigger('debuggerStatus', [false]) - }) - - this.event.register('breakpointStep', function (step) { - self.step_manager.jumpTo(step) - }) - - this.debugger.addProvider('vm', this.executionContext.vm()) - this.debugger.addProvider('injected', this.executionContext.internalWeb3()) - this.debugger.addProvider('web3', this.executionContext.internalWeb3()) - this.debugger.switchProvider(this.executionContext.getProvider()) -} - -Debugger.prototype.registerAndHighlightCodeItem = function (index) { - const self = this - // register selected code item, highlight the corresponding source location - if (!self.compilersArtefacts['__last']) { - self.event.trigger('newSourceLocation', [null]) - return - } - var compilerData = self.compilersArtefacts['__last'].getData() - self.debugger.traceManager.getCurrentCalledAddressAt(index, (error, address) => { - if (error) return console.log(error) - self.debugger.callTree.sourceLocationTracker.getSourceLocationFromVMTraceIndex(address, index, compilerData.contracts, function (error, rawLocation) { - if (!error) { - var lineColumnPos = self.offsetToLineColumnConverter.offsetToLineColumn(rawLocation, rawLocation.file, compilerData.sources, compilerData.sources) - self.event.trigger('newSourceLocation', [lineColumnPos, rawLocation]) - } else { - self.event.trigger('newSourceLocation', [null]) - } - }) - }) -} - -Debugger.prototype.debug = function (blockNumber, txNumber, tx, loadingCb) { - const self = this - let web3 = this.executionContext.web3() - - if (this.debugger.traceManager.isLoading) { - return - } - - self.debugger.solidityProxy.reset({}) - - if (tx) { - if (!tx.to) { - tx.to = traceHelper.contractCreationToken('0') - } - return self.debugTx(tx, loadingCb) - } - - try { - if (txNumber.indexOf('0x') !== -1) { - return web3.eth.getTransaction(txNumber, function (_error, result) { - let tx = result - self.debugTx(tx, loadingCb) - }) - } - web3.eth.getTransactionFromBlock(blockNumber, txNumber, function (_error, result) { - let tx = result - self.debugTx(tx, loadingCb) - }) - } catch (e) { - console.error(e.message) - } -} - -Debugger.prototype.debugTx = function (tx, loadingCb) { - const self = this - this.step_manager = new StepManager(this.debugger, this.debugger.traceManager) - - this.debugger.codeManager.event.register('changed', this, (code, address, instIndex) => { - self.debugger.callTree.sourceLocationTracker.getSourceLocationFromVMTraceIndex(address, this.step_manager.currentStepIndex, this.debugger.solidityProxy.contracts, (error, sourceLocation) => { - if (!error) { - self.vmDebuggerLogic.event.trigger('sourceLocationChanged', [sourceLocation]) - } - }) - }) - - this.vmDebuggerLogic = new VmDebuggerLogic(this.debugger, tx, this.step_manager, this.debugger.traceManager, this.debugger.codeManager, this.debugger.solidityProxy, this.debugger.callTree) - - this.step_manager.event.register('stepChanged', this, function (stepIndex) { - self.debugger.codeManager.resolveStep(stepIndex, tx) - self.step_manager.event.trigger('indexChanged', [stepIndex]) - self.vmDebuggerLogic.event.trigger('indexChanged', [stepIndex]) - self.registerAndHighlightCodeItem(stepIndex) - }) - - loadingCb() - this.debugger.debug(tx) -} - -Debugger.prototype.unload = function () { - this.debugger.unLoad() - this.event.trigger('debuggerUnloaded') -} - -module.exports = Debugger diff --git a/src/app/debugger/debugger/solidityLocals.js b/src/app/debugger/debugger/solidityLocals.js deleted file mode 100644 index 7560770bb2..0000000000 --- a/src/app/debugger/debugger/solidityLocals.js +++ /dev/null @@ -1,65 +0,0 @@ -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager -var remixDebug = require('remix-debug') -var localDecoder = remixDebug.SolidityDecoder.localDecoder -var StorageViewer = remixDebug.storage.StorageViewer - -class DebuggerSolidityLocals { - - constructor (tx, _stepManager, _traceManager, _internalTreeCall) { - this.event = new EventManager() - this.stepManager = _stepManager - this.internalTreeCall = _internalTreeCall - this.storageResolver = null - this.traceManager = _traceManager - this.tx = tx - } - - init (sourceLocation) { - const self = this - var decodeTimeout = null - if (!this.storageResolver) { - return self.event.trigger('solidityLocalsMessage', ['storage not ready']) - } - if (decodeTimeout) { - window.clearTimeout(decodeTimeout) - } - self.event.trigger('solidityLocalsUpdating') - decodeTimeout = setTimeout(function () { - self.decode(sourceLocation) - }, 500) - } - - decode (sourceLocation) { - const self = this - self.event.trigger('solidityLocalsMessage', ['']) - self.traceManager.waterfall([ - self.traceManager.getStackAt, - self.traceManager.getMemoryAt, - self.traceManager.getCurrentCalledAddressAt], - self.stepManager.currentStepIndex, - (error, result) => { - if (error) { - return console.log(error) - } - var stack = result[0].value - var memory = result[1].value - try { - var storageViewer = new StorageViewer({ stepIndex: self.stepManager.currentStepIndex, tx: self.tx, address: result[2].value }, self.storageResolver, self.traceManager) - localDecoder.solidityLocals(self.stepManager.currentStepIndex, self.internalTreeCall, stack, memory, storageViewer, sourceLocation).then((locals) => { - if (!locals.error) { - self.event.trigger('solidityLocals', [locals]) - } - if (!Object.keys(locals).length) { - self.event.trigger('solidityLocalsMessage', ['no locals']) - } - }) - } catch (e) { - self.event.trigger('solidityLocalsMessage', [e.message]) - } - }) - } - -} - -module.exports = DebuggerSolidityLocals diff --git a/src/app/debugger/debugger/solidityState.js b/src/app/debugger/debugger/solidityState.js deleted file mode 100644 index 5b5ceed16c..0000000000 --- a/src/app/debugger/debugger/solidityState.js +++ /dev/null @@ -1,81 +0,0 @@ -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager -var remixDebug = require('remix-debug') -var stateDecoder = remixDebug.SolidityDecoder.stateDecoder -var StorageViewer = remixDebug.storage.StorageViewer - -class DebuggerSolidityState { - - constructor (tx, _stepManager, _traceManager, _codeManager, _solidityProxy) { - this.event = new EventManager() - this.storageResolver = null - this.stepManager = _stepManager - this.traceManager = _traceManager - this.codeManager = _codeManager - this.solidityProxy = _solidityProxy - this.stateVariablesByAddresses = {} - this.tx = tx - } - - init (index) { - var self = this - var decodeTimeout = null - if (index < 0) { - return self.event.trigger('solidityStateMessage', ['invalid step index']) - } - - if (self.stepManager.currentStepIndex !== index) return - if (!self.solidityProxy.loaded()) { - return self.event.trigger('solidityStateMessage', ['invalid step index']) - } - - if (!self.storageResolver) { - return - } - if (decodeTimeout) { - window.clearTimeout(decodeTimeout) - } - self.event.trigger('solidityStateUpdating') - decodeTimeout = setTimeout(function () { - self.decode(index) - }, 500) - } - - reset () { - this.stateVariablesByAddresses = {} - } - - decode (index) { - const self = this - self.traceManager.getCurrentCalledAddressAt(self.stepManager.currentStepIndex, function (error, address) { - if (error) { - return self.event.trigger('solidityState', [{}]) - } - if (self.stateVariablesByAddresses[address]) { - return self.extractStateVariables(self.stateVariablesByAddresses[address], address) - } - self.solidityProxy.extractStateVariablesAt(index, function (error, stateVars) { - if (error) { - return self.event.trigger('solidityState', [{}]) - } - self.stateVariablesByAddresses[address] = stateVars - self.extractStateVariables(stateVars, address) - }) - }) - } - - extractStateVariables (stateVars, address) { - const self = this - var storageViewer = new StorageViewer({ stepIndex: self.stepManager.currentStepIndex, tx: self.tx, address: address }, self.storageResolver, self.traceManager) - stateDecoder.decodeState(stateVars, storageViewer).then((result) => { - self.event.trigger('solidityStateMessage', ['']) - if (result.error) { - return self.event.trigger('solidityStateMessage', [result.error]) - } - self.event.trigger('solidityState', [result]) - }) - } - -} - -module.exports = DebuggerSolidityState diff --git a/src/app/debugger/debugger/stepManager.js b/src/app/debugger/debugger/stepManager.js deleted file mode 100644 index 26e48ecd4b..0000000000 --- a/src/app/debugger/debugger/stepManager.js +++ /dev/null @@ -1,145 +0,0 @@ -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager - -class DebuggerStepManager { - - constructor (_debugger, traceManager) { - this.event = new EventManager() - this.debugger = _debugger - this.traceManager = traceManager - this.currentStepIndex = 0 - this.traceLength = 0 - this.revertionPoint = null - - this.listenToEvents() - } - - listenToEvents () { - const self = this - - this.debugger.event.register('newTraceLoaded', this, function () { - self.traceManager.getLength(function (error, newLength) { - if (error) { - return console.log(error) - } - if (self.traceLength !== newLength) { - self.event.trigger('traceLengthChanged', [newLength]) - self.traceLength = newLength - } - self.jumpTo(0) - }) - }) - - this.debugger.callTree.event.register('callTreeReady', () => { - if (self.debugger.callTree.functionCallStack.length) { - self.jumpTo(self.debugger.callTree.functionCallStack[0]) - } - }) - - this.event.register('indexChanged', this, (index) => { - if (index < 0) return - if (self.currentStepIndex !== index) return - - self.traceManager.buildCallPath(index, (error, callsPath) => { - if (error) { - console.log(error) - return self.event.trigger('revertWarning', ['']) - } - self.currentCall = callsPath[callsPath.length - 1] - if (self.currentCall.reverted) { - let revertedReason = self.currentCall.outofgas ? 'outofgas' : '' - self.revertionPoint = self.currentCall.return - return self.event.trigger('revertWarning', [revertedReason]) - } - for (var k = callsPath.length - 2; k >= 0; k--) { - var parent = callsPath[k] - if (!parent.reverted) continue - self.revertionPoint = parent.return - self.event.trigger('revertWarning', ['parenthasthrown']) - } - self.event.trigger('revertWarning', ['']) - }) - }) - } - - triggerStepChanged (step) { - const self = this - this.traceManager.getLength(function (error, length) { - let stepState = 'valid' - - if (error) { - stepState = 'invalid' - } else if (step <= 0) { - stepState = 'initial' - } else if (step >= length - 1) { - stepState = 'end' - } - - let jumpOutDisabled = (step === self.traceManager.findStepOut(step)) - - self.event.trigger('stepChanged', [step, stepState, jumpOutDisabled]) - }) - } - - stepIntoBack () { - if (!this.traceManager.isLoaded()) return - var step = this.currentStepIndex - 1 - this.currentStepIndex = step - if (!this.traceManager.inRange(step)) { - return - } - this.event.trigger('stepChanged', [step]) - } - - stepIntoForward () { - if (!this.traceManager.isLoaded()) return - var step = this.currentStepIndex + 1 - this.currentStepIndex = step - if (!this.traceManager.inRange(step)) { - return - } - this.event.trigger('stepChanged', [step]) - } - - stepOverBack () { - if (!this.traceManager.isLoaded()) return - var step = this.traceManager.findStepOverBack(this.currentStepIndex) - this.currentStepIndex = step - this.event.trigger('stepChanged', [step]) - } - - stepOverForward () { - if (!this.traceManager.isLoaded()) return - var step = this.traceManager.findStepOverForward(this.currentStepIndex) - this.currentStepIndex = step - this.event.trigger('stepChanged', [step]) - } - - jumpOut () { - if (!this.traceManager.isLoaded()) return - var step = this.traceManager.findStepOut(this.currentStepIndex) - this.currentStepIndex = step - this.event.trigger('stepChanged', [step]) - } - - jumpTo (step) { - if (!this.traceManager.inRange(step)) return - this.currentStepIndex = step - this.event.trigger('stepChanged', [step]) - } - - jumpToException () { - this.jumpTo(this.revertionPoint) - } - - jumpNextBreakpoint () { - this.debugger.breakpointManager.jumpNextBreakpoint(this.currentStepIndex, true) - } - - jumpPreviousBreakpoint () { - this.debugger.breakpointManager.jumpPreviousBreakpoint(this.currentStepIndex, true) - } - -} - -module.exports = DebuggerStepManager diff --git a/src/app/debugger/debuggerUI.js b/src/app/debugger/debuggerUI.js index 2c1369d5c7..3aeeb47509 100644 --- a/src/app/debugger/debuggerUI.js +++ b/src/app/debugger/debuggerUI.js @@ -2,16 +2,21 @@ var TxBrowser = require('./debuggerUI/TxBrowser') var StepManagerUI = require('./debuggerUI/StepManager') var VmDebugger = require('./debuggerUI/VmDebugger') -var Debugger = require('./debugger/debugger') +var Debugger = require('remix-debug').TransactionDebugger var SourceHighlighter = require('../editor/sourceHighlighter') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var executionContext = require('../../execution-context') var globalRegistry = require('../../global/registry') +var remixLib = require('remix-lib') +var Web3Providers = remixLib.vm.Web3Providers +var DummyProvider = remixLib.vm.DummyProvider + +var init = remixLib.init + var yo = require('yo-yo') var csjs = require('csjs-inject') @@ -25,17 +30,76 @@ var css = csjs` } ` +class ContextManager { + constructor () { + this.executionContext = executionContext + this.web3 = this.executionContext.web3() + this.event = new EventManager() + } + + initProviders () { + this.web3Providers = new Web3Providers() + this.addProvider('DUMMYWEB3', new DummyProvider()) + this.switchProvider('DUMMYWEB3') + + this.addProvider('vm', this.executionContext.vm()) + this.addProvider('injected', this.executionContext.internalWeb3()) + this.addProvider('web3', this.executionContext.internalWeb3()) + this.switchProvider(this.executionContext.getProvider()) + } + + getWeb3 () { + return this.web3 + } + + addProvider (type, obj) { + this.web3Providers.addProvider(type, obj) + this.event.trigger('providerAdded', [type]) + } + + switchProvider (type) { + var self = this + this.web3Providers.get(type, function (error, obj) { + if (error) { + console.log('provider ' + type + ' not defined') + } else { + self.web3 = obj + self.executionContext.detectNetwork((error, network) => { + if (error || !network) { + self.web3 = obj + } else { + var webDebugNode = init.web3DebugNode(network.name) + self.web3 = (!webDebugNode ? obj : webDebugNode) + } + self.event.trigger('providerChanged', [type, self.web3]) + }) + self.event.trigger('providerChanged', [type, self.web3]) + } + }) + } + +} + class DebuggerUI { constructor (container) { this.registry = globalRegistry this.event = new EventManager() + this.executionContext = executionContext + + this.contextManager = new ContextManager() + this.debugger = new Debugger({ - executionContext: executionContext, + web3: this.contextManager.getWeb3(), offsetToLineColumnConverter: this.registry.get('offsettolinecolumnconverter').api, - compiler: this.registry.get('compiler').api, - compilersArtefacts: this.registry.get('compilersartefacts').api + compiler: this.registry.get('compiler').api + }) + + this.contextManager.initProviders() + + this.contextManager.event.register('providerChanged', () => { + this.debugger.updateWeb3(this.contextManager.getWeb3()) }) this.isActive = false @@ -108,6 +172,7 @@ class DebuggerUI { startDebugging (blockNumber, txNumber, tx) { const self = this + this.debugger.debugger.updateWeb3(this.executionContext.web3()) this.debugger.debug(blockNumber, txNumber, tx, () => { self.stepManager = new StepManagerUI(this.debugger.step_manager) self.vmDebugger = new VmDebugger(this.debugger.vmDebuggerLogic) diff --git a/src/app/debugger/debuggerUI/ButtonNavigator.js b/src/app/debugger/debuggerUI/ButtonNavigator.js index dd665b31a2..86719dc41b 100644 --- a/src/app/debugger/debuggerUI/ButtonNavigator.js +++ b/src/app/debugger/debuggerUI/ButtonNavigator.js @@ -1,6 +1,5 @@ 'use strict' -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../../lib/events') var yo = require('yo-yo') var csjs = require('csjs-inject') diff --git a/src/app/debugger/debuggerUI/Slider.js b/src/app/debugger/debuggerUI/Slider.js index ddf0dcfbb5..b5b8c2bb6e 100644 --- a/src/app/debugger/debuggerUI/Slider.js +++ b/src/app/debugger/debuggerUI/Slider.js @@ -1,6 +1,5 @@ 'use strict' -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../../lib/events') var yo = require('yo-yo') class Slider { diff --git a/src/app/debugger/debuggerUI/StepManager.js b/src/app/debugger/debuggerUI/StepManager.js index 6c7186871c..db19c48164 100644 --- a/src/app/debugger/debuggerUI/StepManager.js +++ b/src/app/debugger/debuggerUI/StepManager.js @@ -1,5 +1,4 @@ -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../../lib/events') var yo = require('yo-yo') var ButtonNavigator = require('./ButtonNavigator') diff --git a/src/app/debugger/debuggerUI/TxBrowser.js b/src/app/debugger/debuggerUI/TxBrowser.js index 1f4fb2e9fb..382775b1cc 100644 --- a/src/app/debugger/debuggerUI/TxBrowser.js +++ b/src/app/debugger/debuggerUI/TxBrowser.js @@ -1,5 +1,4 @@ -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../../lib/events') var yo = require('yo-yo') var csjs = require('csjs-inject') var styleGuide = require('../../ui/styles-guide/theme-chooser') diff --git a/src/app/debugger/debuggerUI/vmDebugger/CodeListView.js b/src/app/debugger/debuggerUI/vmDebugger/CodeListView.js index 505302cc8a..76f3cc0f34 100644 --- a/src/app/debugger/debuggerUI/vmDebugger/CodeListView.js +++ b/src/app/debugger/debuggerUI/vmDebugger/CodeListView.js @@ -1,9 +1,8 @@ 'use strict' var style = require('../styles/basicStyles') var yo = require('yo-yo') -var remixLib = require('remix-lib') var DropdownPanel = require('./DropdownPanel') -var EventManager = remixLib.EventManager +var EventManager = require('../../../../lib/events') var csjs = require('csjs-inject') var styleGuide = require('../../../ui/styles-guide/theme-chooser') var styles = styleGuide.chooser() diff --git a/src/app/debugger/debuggerUI/vmDebugger/DropdownPanel.js b/src/app/debugger/debuggerUI/vmDebugger/DropdownPanel.js index 2997c6d816..282a5bd34d 100644 --- a/src/app/debugger/debuggerUI/vmDebugger/DropdownPanel.js +++ b/src/app/debugger/debuggerUI/vmDebugger/DropdownPanel.js @@ -1,8 +1,7 @@ 'use strict' var yo = require('yo-yo') const copy = require('clipboard-copy') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../../../lib/events') var TreeView = require('../../../ui/TreeView') // TODO setup a direct reference to the UI components var csjs = require('csjs-inject') diff --git a/src/app/debugger/debuggerUI/vmDebugger/SolidityLocals.js b/src/app/debugger/debuggerUI/vmDebugger/SolidityLocals.js index c4ca8d956b..e844f55dc0 100644 --- a/src/app/debugger/debuggerUI/vmDebugger/SolidityLocals.js +++ b/src/app/debugger/debuggerUI/vmDebugger/SolidityLocals.js @@ -1,6 +1,5 @@ 'use strict' -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../../../lib/events') var DropdownPanel = require('./DropdownPanel') var solidityTypeFormatter = require('./utils/SolidityTypeFormatter') var yo = require('yo-yo') diff --git a/src/app/editor/contextualListener.js b/src/app/editor/contextualListener.js index 0b6848b3b4..bd7e6e2b46 100644 --- a/src/app/editor/contextualListener.js +++ b/src/app/editor/contextualListener.js @@ -2,7 +2,7 @@ var remixLib = require('remix-lib') var SourceMappingDecoder = remixLib.SourceMappingDecoder var AstWalker = remixLib.AstWalker -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var globalRegistry = require('../../global/registry') /* diff --git a/src/app/editor/editor.js b/src/app/editor/editor.js index 9066ffef3f..e2d27838c4 100644 --- a/src/app/editor/editor.js +++ b/src/app/editor/editor.js @@ -1,6 +1,5 @@ 'use strict' -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var yo = require('yo-yo') var csjs = require('csjs-inject') var ace = require('brace') diff --git a/src/app/execution/txLogger.js b/src/app/execution/txLogger.js index 7558c869a9..bae928b8d8 100644 --- a/src/app/execution/txLogger.js +++ b/src/app/execution/txLogger.js @@ -8,7 +8,7 @@ var remixLib = require('remix-lib') var styleGuide = require('../ui/styles-guide/theme-chooser') var styles = styleGuide.chooser() -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var helper = require('../../lib/helper') var executionContext = require('../../execution-context') var modalDialog = require('../ui/modal-dialog-custom') diff --git a/src/app/files/basicReadOnlyExplorer.js b/src/app/files/basicReadOnlyExplorer.js index 5baf5c790e..df4f17c11c 100644 --- a/src/app/files/basicReadOnlyExplorer.js +++ b/src/app/files/basicReadOnlyExplorer.js @@ -1,5 +1,5 @@ 'use strict' -var EventManager = require('remix-lib').EventManager +var EventManager = require('../../lib/events') class BasicReadOnlyExplorer { constructor (type) { diff --git a/src/app/files/browser-files-tree.js b/src/app/files/browser-files-tree.js index 16ce5a60c2..bc434e0561 100644 --- a/src/app/files/browser-files-tree.js +++ b/src/app/files/browser-files-tree.js @@ -1,6 +1,6 @@ 'use strict' -var EventManager = require('remix-lib').EventManager +var EventManager = require('../../lib/events') function FilesTree (name, storage) { var self = this diff --git a/src/app/files/browser-files.js b/src/app/files/browser-files.js index 8179622f02..de84eb664f 100644 --- a/src/app/files/browser-files.js +++ b/src/app/files/browser-files.js @@ -1,6 +1,6 @@ 'use strict' -var EventManager = require('remix-lib').EventManager +var EventManager = require('../../lib/events') function Files (storage) { var event = new EventManager() diff --git a/src/app/files/file-explorer.js b/src/app/files/file-explorer.js index 730797076c..d0c23595e6 100644 --- a/src/app/files/file-explorer.js +++ b/src/app/files/file-explorer.js @@ -2,8 +2,7 @@ var yo = require('yo-yo') var Treeview = require('../ui/TreeView') var modalDialog = require('../ui/modaldialog') var modalDialogCustom = require('../ui/modal-dialog-custom') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var contextMenu = require('../ui/contextMenu') var addTooltip = require('../ui/tooltip') var helper = require('../../lib/helper') diff --git a/src/app/files/fileManager.js b/src/app/files/fileManager.js index 5fe8f15846..3cb159bafc 100644 --- a/src/app/files/fileManager.js +++ b/src/app/files/fileManager.js @@ -1,9 +1,8 @@ 'use strict' var $ = require('jquery') -var remixLib = require('remix-lib') var yo = require('yo-yo') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var globalRegistry = require('../../global/registry') /* diff --git a/src/app/files/shared-folder.js b/src/app/files/shared-folder.js index 98b833a67c..0b712e8c78 100644 --- a/src/app/files/shared-folder.js +++ b/src/app/files/shared-folder.js @@ -1,5 +1,5 @@ 'use strict' -var EventManager = require('remix-lib').EventManager +var EventManager = require('../../lib/events') var pathtool = require('path') module.exports = class SharedFolder { diff --git a/src/app/panels/editor-panel.js b/src/app/panels/editor-panel.js index afe06259f7..7dd62e0d12 100644 --- a/src/app/panels/editor-panel.js +++ b/src/app/panels/editor-panel.js @@ -1,6 +1,5 @@ var yo = require('yo-yo') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var $ = require('jquery') var Terminal = require('./terminal') diff --git a/src/app/panels/file-panel.js b/src/app/panels/file-panel.js index b6f38b763c..ee3806a74f 100644 --- a/src/app/panels/file-panel.js +++ b/src/app/panels/file-panel.js @@ -3,9 +3,8 @@ var async = require('async') var $ = require('jquery') var yo = require('yo-yo') var CompilerMetadata = require('../files/compiler-metadata') -var remixLib = require('remix-lib') +var EventManager = require('../../lib/events') var Gists = require('gists') -var EventManager = remixLib.EventManager var FileExplorer = require('../files/file-explorer') var modalDialog = require('../ui/modaldialog') var modalDialogCustom = require('../ui/modal-dialog-custom') diff --git a/src/app/panels/righthand-panel.js b/src/app/panels/righthand-panel.js index a6cdc458fc..e81f841108 100644 --- a/src/app/panels/righthand-panel.js +++ b/src/app/panels/righthand-panel.js @@ -1,6 +1,6 @@ const yo = require('yo-yo') const csjs = require('csjs-inject') -const remixLib = require('remix-lib') +const EventManager = require('../../lib/events') var globalRegistry = require('../../global/registry') @@ -17,7 +17,6 @@ const TestTab = require('../tabs/test-tab') const RunTab = require('../tabs/run-tab') const DraggableContent = require('../ui/draggableContent') -const EventManager = remixLib.EventManager const styles = styleguide.chooser() module.exports = class RighthandPanel { diff --git a/src/app/panels/terminal.js b/src/app/panels/terminal.js index a5cb7ea3e7..70e876a355 100644 --- a/src/app/panels/terminal.js +++ b/src/app/panels/terminal.js @@ -5,8 +5,7 @@ var jsbeautify = require('js-beautify') var ethers = require('ethers') var type = require('component-type') var vm = require('vm') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var Web3 = require('web3') var swarmgw = require('swarmgw')() diff --git a/src/app/staticanalysis/staticAnalysisView.js b/src/app/staticanalysis/staticAnalysisView.js index 9303ea0084..6e9eb28d23 100644 --- a/src/app/staticanalysis/staticAnalysisView.js +++ b/src/app/staticanalysis/staticAnalysisView.js @@ -11,7 +11,7 @@ var styles = styleGuide.chooser() var css = require('./styles/staticAnalysisView-styles') var globlalRegistry = require('../../global/registry') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') function staticAnalysisView (localRegistry) { var self = this diff --git a/src/app/tabs/analysis-tab.js b/src/app/tabs/analysis-tab.js index f7a28c60a8..3a16661ea7 100644 --- a/src/app/tabs/analysis-tab.js +++ b/src/app/tabs/analysis-tab.js @@ -1,10 +1,9 @@ var yo = require('yo-yo') var csjs = require('csjs-inject') -var remixLib = require('remix-lib') var StaticAnalysis = require('../staticanalysis/staticAnalysisView') var globalRegistry = require('../../global/registry') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') module.exports = class AnalysisTab { constructor (localRegistry) { diff --git a/src/app/tabs/debugger-tab.js b/src/app/tabs/debugger-tab.js index fad957216c..94737cec03 100644 --- a/src/app/tabs/debugger-tab.js +++ b/src/app/tabs/debugger-tab.js @@ -1,11 +1,10 @@ var yo = require('yo-yo') var csjs = require('csjs-inject') -var remixLib = require('remix-lib') var DebuggerUI = require('../debugger/debuggerUI') var globalRegistry = require('../../global/registry') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var styles = require('../ui/styles-guide/theme-chooser').chooser() const css = csjs` diff --git a/src/app/tabs/plugin-tab.js b/src/app/tabs/plugin-tab.js index ae5360792e..0cadf517f4 100644 --- a/src/app/tabs/plugin-tab.js +++ b/src/app/tabs/plugin-tab.js @@ -1,9 +1,8 @@ var yo = require('yo-yo') var csjs = require('csjs-inject') -var remixLib = require('remix-lib') var globalRegistry = require('../../global/registry') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') module.exports = class plugintab { constructor (json, localRegistry) { diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index 87c54e8c55..03e9f4f1c3 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -7,7 +7,7 @@ var csjs = require('csjs-inject') var txExecution = remixLib.execution.txExecution var txFormat = remixLib.execution.txFormat var txHelper = remixLib.execution.txHelper -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') var globlalRegistry = require('../../global/registry') var helper = require('../../lib/helper.js') var executionContext = require('../../execution-context') diff --git a/src/app/tabs/settings-tab.js b/src/app/tabs/settings-tab.js index f17afde956..cb00efc797 100644 --- a/src/app/tabs/settings-tab.js +++ b/src/app/tabs/settings-tab.js @@ -9,7 +9,7 @@ var copyToClipboard = require('../ui/copy-to-clipboard') var styleGuide = require('../ui/styles-guide/theme-chooser') var styles = styleGuide.chooser() var Storage = remixLib.Storage -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') module.exports = class SettingsTab { constructor (localRegistry) { diff --git a/src/app/tabs/support-tab.js b/src/app/tabs/support-tab.js index 2db66c79db..ea7367d71a 100644 --- a/src/app/tabs/support-tab.js +++ b/src/app/tabs/support-tab.js @@ -1,11 +1,10 @@ const yo = require('yo-yo') const csjs = require('csjs-inject') -const remixLib = require('remix-lib') var globalRegistry = require('../../global/registry') const styles = require('../ui/styles-guide/theme-chooser').chooser() -const EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') module.exports = class SupportTab { constructor (localRegistry) { diff --git a/src/app/tabs/tabbed-menu.js b/src/app/tabs/tabbed-menu.js index 69a1b2aa5b..52dbf614bb 100644 --- a/src/app/tabs/tabbed-menu.js +++ b/src/app/tabs/tabbed-menu.js @@ -1,12 +1,11 @@ var yo = require('yo-yo') var csjs = require('csjs-inject') -var remixLib = require('remix-lib') var globalRegistry = require('../../global/registry') var helper = require('../../lib/helper') var styles = require('../ui/styles-guide/theme-chooser').chooser() -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') module.exports = class TabbedMenu { constructor (localRegistry) { diff --git a/src/app/ui/TreeView.js b/src/app/ui/TreeView.js index 8396a37854..427731140c 100644 --- a/src/app/ui/TreeView.js +++ b/src/app/ui/TreeView.js @@ -29,8 +29,7 @@ var css = csjs` } ` -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') /** * TreeView diff --git a/src/app/ui/card.js b/src/app/ui/card.js index 2c372c12f5..c3ca4f259d 100644 --- a/src/app/ui/card.js +++ b/src/app/ui/card.js @@ -2,8 +2,7 @@ var yo = require('yo-yo') var csjs = require('csjs-inject') var styleGuide = require('./styles-guide/theme-chooser') var styles = styleGuide.chooser() -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') module.exports = class Card { constructor (api, events, opts) { diff --git a/src/app/ui/dropdown.js b/src/app/ui/dropdown.js index 3afbfc4ff9..6a684962ba 100644 --- a/src/app/ui/dropdown.js +++ b/src/app/ui/dropdown.js @@ -1,6 +1,6 @@ var yo = require('yo-yo') -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../../lib/events') + // -------------- styling ---------------------- var css = require('./styles/dropdown-styles') diff --git a/src/app/ui/styles-guide/theme-chooser.js b/src/app/ui/styles-guide/theme-chooser.js index 31060993d9..abcb32ade6 100644 --- a/src/app/ui/styles-guide/theme-chooser.js +++ b/src/app/ui/styles-guide/theme-chooser.js @@ -1,4 +1,3 @@ -// var remixLib = require('remix-lib') var styleGuideLight = require('./style-guide') var styleGuideDark = require('./styleGuideDark') var Storage = require('remix-lib').Storage diff --git a/src/lib/cmdInterpreterAPI.js b/src/lib/cmdInterpreterAPI.js index 5013a23554..0c9b7b6cac 100644 --- a/src/lib/cmdInterpreterAPI.js +++ b/src/lib/cmdInterpreterAPI.js @@ -2,7 +2,7 @@ var yo = require('yo-yo') var async = require('async') var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('../lib/events') var executionContext = require('../execution-context') var toolTip = require('../app/ui/tooltip') diff --git a/src/lib/events.js b/src/lib/events.js new file mode 100644 index 0000000000..882da1893a --- /dev/null +++ b/src/lib/events.js @@ -0,0 +1,4 @@ +var remixLib = require('remix-lib') +var EventManager = remixLib.EventManager + +module.exports = EventManager diff --git a/src/lib/remixd.js b/src/lib/remixd.js index 47e92582e2..8fc1b82f05 100644 --- a/src/lib/remixd.js +++ b/src/lib/remixd.js @@ -1,5 +1,5 @@ 'use strict' -var EventManager = require('remix-lib').EventManager +var EventManager = require('../lib/events') var modalDialog = require('../app/ui/modaldialog') var yo = require('yo-yo') diff --git a/src/recorder.js b/src/recorder.js index 030ae9cbb7..32ac7b648e 100644 --- a/src/recorder.js +++ b/src/recorder.js @@ -1,5 +1,5 @@ var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('./lib/events') var ethutil = require('ethereumjs-util') var executionContext = require('./execution-context') var format = remixLib.execution.txFormat diff --git a/src/universal-dapp.js b/src/universal-dapp.js index ee595c079c..66c98fef19 100644 --- a/src/universal-dapp.js +++ b/src/universal-dapp.js @@ -6,7 +6,7 @@ var async = require('async') var ethJSUtil = require('ethereumjs-util') var BN = ethJSUtil.BN var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager +var EventManager = require('./lib/events') var crypto = require('crypto') var TxRunner = remixLib.execution.txRunner var txExecution = remixLib.execution.txExecution