UNPKG

remix-debugger

Version:

Ethereum IDE and tools for the web

212 lines (195 loc) 6.24 kB
var remixLib = require('remix-lib') var global = remixLib.global var EventManager = remixLib.EventManager var traceHelper = remixLib.helpers.trace var yo = require('yo-yo') var init = remixLib.init var DropdownPanel = require('./DropdownPanel') var csjs = require('csjs-inject') var styleGuide = remixLib.ui.themeChooser var styles = styleGuide.chooser() var css = csjs` .container { display: flex; flex-direction: column; } .txContainer { display: flex; flex-direction: column; } .txinputs { width: 100%; display: flex; justify-content: center; } .txinput { ${styles.rightPanel.debuggerTab.input_Debugger} min-width: 30px; margin: 3px; } .txbuttons { width: 100%; display: flex; justify-content: center; } .txbutton { ${styles.rightPanel.debuggerTab.button_Debugger} } .txbutton:hover { color: ${styles.rightPanel.debuggerTab.button_Debugger_icon_HoverColor}; } .txinfo { margin-top: 5px; } .vmargin { margin-top: 10px; margin-bottom: 10px; } ` function TxBrowser (_parent) { this.event = new EventManager() this.blockNumber this.txNumber this.view this.displayConnectionSetting = true this.basicPanel = new DropdownPanel('Transaction', {json: true}) this.basicPanel.data = {} var self = this _parent.event.register('providerChanged', this, function (provider) { self.displayConnectionSetting = provider === 'INTERNAL' self.setDefaultValues() if (self.view) { yo.update(self.view, self.render()) } }) } // creation 0xa9619e1d0a35b2c1d686f5b661b3abd87f998d2844e8e9cc905edb57fc9ce349 // invokation 0x71a6d583d16d142c5c3e8903060e8a4ee5a5016348a9448df6c3e63b68076ec4 0xcda2b2835add61af54cf83bd076664d98d7908c6cd98d86423b3b48d8b8e51ff // test: // creation: 0x72908de76f99fca476f9e3a3b5d352f350a98cd77d09cebfc59ffe32a6ecaa0b // invokation: 0x20ef65b8b186ca942fcccd634f37074dde49b541c27994fc7596740ef44cfd51 TxBrowser.prototype.setDefaultValues = function () { this.connectInfo = '' this.basicPanel.update({}) this.basicPanel.hide() if (this.view) { yo.update(this.view, this.render()) } } TxBrowser.prototype.submit = function () { if (!this.txNumber) { return } this.event.trigger('newTxLoading', [this.blockNumber, this.txNumber]) try { var self = this if (this.txNumber.indexOf('0x') !== -1) { global.web3.eth.getTransaction(this.txNumber, function (error, result) { self.update(error, result) }) } else { global.web3.eth.getTransactionFromBlock(this.blockNumber, this.txNumber, function (error, result) { self.update(error, result) }) } } catch (e) { self.update(e.message) } } TxBrowser.prototype.update = function (error, tx) { var info = {} if (error) { this.view.querySelector('#error').innerHTML = error } else { if (tx) { this.view.querySelector('#error').innerHTML = '' if (!tx.to) { tx.to = traceHelper.contractCreationToken('0') } info.from = tx.from info.to = tx.to info.hash = tx.hash this.event.trigger('newTraceRequested', [this.blockNumber, this.txNumber, tx]) } else { var mes = '<not found>' info.from = mes info.to = mes info.hash = mes this.view.querySelector('#error').innerHTML = 'Cannot find transaction with reference. Block number: ' + this.blockNumber + '. Transaction index/hash: ' + this.txNumber } } this.basicPanel.update(info) } TxBrowser.prototype.updateWeb3Url = function (newhost) { init.setProvider(global.web3, newhost) var self = this this.checkWeb3(function (error, block) { if (!error) { self.connectInfo = 'Connected to ' + global.web3.currentProvider.host + '. Current block number: ' + block } else { self.connectInfo = 'Unable to connect to ' + global.web3.currentProvider.host + '. ' + error.message } yo.update(self.view, self.render()) }) } TxBrowser.prototype.checkWeb3 = function (callback) { try { global.web3.eth.getBlockNumber(function (error, block) { callback(error, block) }) } catch (e) { console.log(e) callback(e.message, null) } } TxBrowser.prototype.updateBlockN = function (ev) { this.blockNumber = ev.target.value } TxBrowser.prototype.updateTxN = function (ev) { this.txNumber = ev.target.value } TxBrowser.prototype.load = function (txHash) { this.txNumber = txHash this.submit() } TxBrowser.prototype.unload = function (txHash) { this.event.trigger('unloadRequested') this.init() } TxBrowser.prototype.init = function (ev) { this.setDefaultValues() } TxBrowser.prototype.connectionSetting = function () { if (this.displayConnectionSetting) { var self = this return yo`<div class="${css.vmargin}"><span>Node URL: </span><input onkeyup=${function () { self.updateWeb3Url(arguments[0].target.value) }} value=${global.web3.currentProvider ? global.web3.currentProvider.host : ' - none - '} type='text' /> <span>${this.connectInfo}</span></div>` } else { return '' } } TxBrowser.prototype.render = function () { var self = this var view = yo`<div class="${css.container}"> ${this.connectionSetting()} <div class="${css.txContainer}"> <div class="${css.txinputs}"> <input class="${css.txinput}" onkeyup=${function () { self.updateBlockN(arguments[0]) }} type='text' placeholder=${'Block number'} /> <input class="${css.txinput}" id='txinput' onkeyup=${function () { self.updateTxN(arguments[0]) }} type='text' placeholder=${'Transaction index or hash'} /> </div> <div class="${css.txbuttons}"> <button id='load' class='fa fa-play ${css.txbutton}' title='start debugging' onclick=${function () { self.submit() }}></button> <button id='unload' class='fa fa-stop ${css.txbutton}' title='stop debugging' onclick=${function () { self.unload() }}></button> </div> </div> <span id='error'></span> <div style=${css.txinfo} id='txinfo'> ${this.basicPanel.render()} </div> </div>` if (!this.view) { this.view = view } return view } module.exports = TxBrowser