rewrite txlogger (make it a class)

pull/1/head
yann300 8 years ago
parent 7ed940c048
commit 41e49d8c8a
  1. 37
      src/app.js
  2. 76
      src/app/execution/txLogger.js

@ -32,7 +32,7 @@ var RighthandPanel = require('./app/panels/righthand-panel')
var examples = require('./app/editor/example-contracts') var examples = require('./app/editor/example-contracts')
var modalDialogCustom = require('./app/ui/modal-dialog-custom') var modalDialogCustom = require('./app/ui/modal-dialog-custom')
var Txlistener = require('./app/execution/txListener') var Txlistener = require('./app/execution/txListener')
var txLogger = require('./app/execution/txLogger') var TxLogger = require('./app/execution/txLogger')
var EventsDecoder = require('./app/execution/eventsDecoder') var EventsDecoder = require('./app/execution/eventsDecoder')
var Web3VMProvider = remix.web3.web3VMProvider var Web3VMProvider = remix.web3.web3VMProvider
@ -813,33 +813,9 @@ function run () {
txlistener.startListening() txlistener.startListening()
self._components.editorpanel.registerType('knownTransaction', function (data) { var txLogger = new TxLogger({
var tx = data[0]
var resolvedTransaction = data[1]
self._components.editorpanel.log(tx)
self._components.editorpanel.log(resolvedTransaction)
console.error('TERMINAL: ', {tx, resolvedTransaction})
return yo`<span style="color:green;"><code>knownTransaction</code> was logged</span>`
})
self._components.editorpanel.registerType('unknownTransaction', function (data) {
var tx = data[0]
self._components.editorpanel.log(tx)
console.error('TERMINAL: ', {tx})
return yo`<span style="color:yellow;"><code>unknownTransaction</code> was logged</span>`
})
txLogger({
api: { api: {
/** editorpanel: self._components.editorpanel,
* log the given transaction.
*
* @param {Object} tx - DOM element representing the transaction
*/
log: function (tx) {
var data = JSON.parse(tx)
if (data.length === 2) data = { type: 'knownTransaction', value: data }
if (data.length === 1) data = { type: 'unknownTransaction', value: data }
self._components.editorpanel.log(data)
},
resolvedTransaction: function (hash) { resolvedTransaction: function (hash) {
return txlistener.resolvedTransaction(hash) return txlistener.resolvedTransaction(hash)
}, },
@ -848,6 +824,9 @@ function run () {
}, },
compiledContracts: function () { compiledContracts: function () {
return compiledContracts() return compiledContracts()
},
context: function () {
return executionContext.getProvider()
} }
}, },
events: { events: {
@ -855,6 +834,10 @@ function run () {
} }
}) })
txLogger.event.register('debugRequested', (hash) => {
startdebugging(hash)
})
// ----------------- autoCompile ----------------- // ----------------- autoCompile -----------------
var autoCompile = document.querySelector('#autoCompile').checked var autoCompile = document.querySelector('#autoCompile').checked
if (config.exists('autoCompile')) { if (config.exists('autoCompile')) {

@ -1,35 +1,89 @@
'use strict' 'use strict'
var yo = require('yo-yo')
var remix = require('ethereum-remix')
var EventManager = remix.lib.EventManager
var helper = require('../../lib/helper')
var ethJSUtil = require('ethereumjs-util')
var BN = ethJSUtil.BN
/** /**
* This just export a function that register to `newTransaction` and forward them to the logger. * This just export a function that register to `newTransaction` and forward them to the logger.
* Emit debugRequested
* *
*/ */
module.exports = (opts = {}) => { class TxLogger {
constructor (opts = {}) {
this.event = new EventManager()
this.opts = opts
opts.api.editorpanel.registerType('knownTransaction', (data) => {
return renderKnownTransaction(this, data)
})
opts.api.editorpanel.registerType('unknownTransaction', (data) => {
return renderUnknownTransaction(this, data)
})
opts.events.txListener.register('newTransaction', (tx) => { opts.events.txListener.register('newTransaction', (tx) => {
log(tx, opts.api) log(this, tx, opts.api)
}) })
} }
}
function log (tx, api) { function log (self, tx, api) {
var resolvedTransaction = api.resolvedTransaction(tx.hash) var resolvedTransaction = api.resolvedTransaction(tx.hash)
if (resolvedTransaction) { if (resolvedTransaction) {
api.parseLogs(tx, resolvedTransaction.contractName, api.compiledContracts(), (error, logs) => { api.parseLogs(tx, resolvedTransaction.contractName, api.compiledContracts(), (error, logs) => {
if (!error) { if (!error) {
api.log(renderResolvedTransaction(tx, resolvedTransaction, logs)) api.editorpanel.log({type: 'knownTransaction', value: { tx: tx, resolvedData: resolvedTransaction, logs: logs }})
} }
}) })
} else { } else {
// contract unknown - just displaying raw tx. // contract unknown - just displaying raw tx.
api.log(renderTransaction(tx)) api.editorpanel.log({ type: 'unknownTransaction', value: { tx: tx } })
} }
} }
function renderResolvedTransaction (tx, resolvedTransaction, logs) { function renderKnownTransaction (self, data) {
console.log([tx, resolvedTransaction]) var to = data.tx.to
return JSON.stringify([tx, resolvedTransaction]) if (to) to = helper.shortenAddress(data.tx.to)
function debug () {
self.event.trigger('debugRequested', [data.tx.hash])
}
function detail () {
// @TODO here should open a modal containing some info (e.g input params, logs, ...)
}
return yo`<span>${context(self, data.tx)}: from:${helper.shortenAddress(data.tx.from)}, to:${to}, ${data.resolvedData.contractName}.${data.resolvedData.fn}, value:${value(data.tx.value)} wei, data:${helper.shortenHexData(data.tx.input)}, ${data.logs.length} logs, hash:${helper.shortenHexData((data.tx.hash))},<button onclick=${detail}>Details</button> <button onclick=${debug}>Debug</button></span>`
} }
function renderTransaction (tx) { function renderUnknownTransaction (self, data) {
console.log(tx) var to = data.tx.to
return JSON.stringify(tx) if (to) to = helper.shortenAddress(data.tx.to)
function debug () {
self.event.trigger('debugRequested', [data.tx.hash])
} }
function detail () {
// @TODO here should open a modal containing some info (e.g input params, logs, ...)
}
return yo`<span>${context(self, data.tx)}: from:${helper.shortenAddress(data.tx.from)}, to:${to}, value:${value(data.tx.value)} wei, data:${helper.shortenHexData((data.tx.input))}, hash:${helper.shortenHexData((data.tx.hash))}, <button onclick=${detail}>Details</button> <button onclick=${debug}>Debug</button></span>`
}
function context (self, tx) {
if (self.opts.api.context() === 'vm') {
return yo`<span>(vm)</span>`
} else {
return yo`<span>block:${tx.blockNumber}, txIndex:${tx.transactionIndex}`
}
}
function value (v) {
try {
if (v.indexOf && v.indexOf('0x') === 0) {
return (new BN(v.replace('0x', ''), 12)).toString(10)
} else {
return v.toString(10)
}
} catch (e) {
console.log(e)
return v
}
}
module.exports = TxLogger

Loading…
Cancel
Save