diff --git a/src/app/tabs/debugger-tab.js b/src/app/tabs/debugger-tab.js index 3aa37fde14..4d091524b0 100644 --- a/src/app/tabs/debugger-tab.js +++ b/src/app/tabs/debugger-tab.js @@ -9,7 +9,7 @@ import * as packageJson from '../../../package.json' const profile = { name: 'debugger', displayName: 'Debugger', - methods: ['debug'], + methods: ['debug', 'getTrace'], events: [], icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjk2IDk2MHEwIDI2LTE5IDQ1dC00NSAxOWgtMjI0cTAgMTcxLTY3IDI5MGwyMDggMjA5cTE5IDE5IDE5IDQ1dC0xOSA0NXEtMTggMTktNDUgMTl0LTQ1LTE5bC0xOTgtMTk3cS01IDUtMTUgMTN0LTQyIDI4LjUtNjUgMzYuNS04MiAyOS05NyAxM3YtODk2aC0xMjh2ODk2cS01MSAwLTEwMS41LTEzLjV0LTg3LTMzLTY2LTM5LTQzLjUtMzIuNWwtMTUtMTQtMTgzIDIwN3EtMjAgMjEtNDggMjEtMjQgMC00My0xNi0xOS0xOC0yMC41LTQ0LjV0MTUuNS00Ni41bDIwMi0yMjdxLTU4LTExNC01OC0yNzRoLTIyNHEtMjYgMC00NS0xOXQtMTktNDUgMTktNDUgNDUtMTloMjI0di0yOTRsLTE3My0xNzNxLTE5LTE5LTE5LTQ1dDE5LTQ1IDQ1LTE5IDQ1IDE5bDE3MyAxNzNoODQ0bDE3My0xNzNxMTktMTkgNDUtMTl0NDUgMTkgMTkgNDUtMTkgNDVsLTE3MyAxNzN2Mjk0aDIyNHEyNiAwIDQ1IDE5dDE5IDQ1em0tNDgwLTU3NmgtNjQwcTAtMTMzIDkzLjUtMjI2LjV0MjI2LjUtOTMuNSAyMjYuNSA5My41IDkzLjUgMjI2LjV6Ii8+PC9zdmc+', description: 'Debug transactions', @@ -38,7 +38,11 @@ class DebuggerTab extends ViewPlugin { } debug (hash) { - if (this.debugger) this.debuggerUI.debug(hash) + if (this.debuggerUI) this.debuggerUI.debug(hash) + } + + getTrace (hash) { + return this.debuggerUI.getTrace(hash) } debugger () { diff --git a/src/app/tabs/debugger/debuggerUI.js b/src/app/tabs/debugger/debuggerUI.js index 6662c699b9..bd2b8f9f15 100644 --- a/src/app/tabs/debugger/debuggerUI.js +++ b/src/app/tabs/debugger/debuggerUI.js @@ -103,38 +103,64 @@ class DebuggerUI { return this.isActive } - startDebugging (blockNumber, txNumber, tx) { - const self = this + getDebugWeb3 () { + return new Promise((resolve, reject) => { + executionContext.detectNetwork((error, network) => { + let web3 + if (error || !network) { + web3 = init.web3DebugNode(executionContext.web3()) + } else { + const webDebugNode = init.web3DebugNode(network.name) + web3 = !webDebugNode ? executionContext.web3() : webDebugNode + } + init.extendWeb3(web3) + resolve(web3) + }) + }) + } + + async startDebugging (blockNumber, txNumber, tx) { if (this.debugger) this.unLoad() let compilers = this.registry.get('compilersartefacts').api let lastCompilationResult if (compilers['__last']) lastCompilationResult = compilers['__last'] - executionContext.detectNetwork((error, network) => { - let web3 - if (error || !network) { - web3 = init.web3DebugNode(executionContext.web3()) - } else { - var webDebugNode = init.web3DebugNode(network.name) - web3 = (!webDebugNode ? executionContext.web3() : webDebugNode) - } - init.extendWeb3(web3) - this.debugger = new Debugger({ + let web3 = await this.getDebugWeb3() + this.debugger = new Debugger({ + web3, + offsetToLineColumnConverter: this.registry.get('offsettolinecolumnconverter').api, + compiler: { lastCompilationResult } + }) + + this.listenToEvents() + this.debugger.debug(blockNumber, txNumber, tx, () => { + this.stepManager = new StepManagerUI(this.debugger.step_manager) + this.vmDebugger = new VmDebugger(this.debugger.vmDebuggerLogic) + this.txBrowser.setState({ blockNumber, txNumber, debugging: true }) + this.renderDebugger() + }).catch((error) => { + toaster(error) + this.unLoad() + }) + } + + getTrace (hash) { + return new Promise(async (resolve, reject) => { + const compilers = this.registry.get('compilersartefacts').api + let lastCompilationResult + if (compilers['__last']) lastCompilationResult = compilers['__last'] + + const web3 = await this.getDebugWeb3() + + const debug = new Debugger({ web3, offsetToLineColumnConverter: this.registry.get('offsettolinecolumnconverter').api, compiler: { lastCompilationResult } }) - - this.listenToEvents() - this.debugger.debug(blockNumber, txNumber, tx, () => { - self.stepManager = new StepManagerUI(this.debugger.step_manager) - self.vmDebugger = new VmDebugger(this.debugger.vmDebuggerLogic) - self.txBrowser.setState({ blockNumber, txNumber, debugging: true }) - self.renderDebugger() - }).catch((error) => { - toaster(error) - this.unLoad() + debug.debugger.traceManager.traceRetriever.getTrace(hash, (error, trace) => { + if (error) return reject(error) + resolve(trace) }) }) }