From fd078f900c19fbcc0e0ab6c366eab3010a9dd2aa Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:50:21 +0200 Subject: [PATCH 01/11] set transactionContextAPI only if not null --- src/universal-dapp.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/universal-dapp.js b/src/universal-dapp.js index 3ea912936a..157e9d73aa 100644 --- a/src/universal-dapp.js +++ b/src/universal-dapp.js @@ -121,7 +121,9 @@ function UniversalDApp (opts = {}) { UniversalDApp.prototype.reset = function (contracts, transactionContextAPI) { this.el.innerHTML = '' this.contracts = contracts + if (transactionContextAPI) { this.transactionContextAPI = transactionContextAPI + } this.accounts = {} if (executionContext.isVM()) { this._addAccount('3cd7232cd6f3fc66a57a6bedc1a8ed6c228fff0a327e169c2bcc5e869ed49511', '0x56BC75E2D63100000') From 5ad8e1825ccb0645df1060f31c640698917b9c9a Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:50:46 +0200 Subject: [PATCH 02/11] improve logging --- src/universal-dapp.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/src/universal-dapp.js b/src/universal-dapp.js index 157e9d73aa..13e7699951 100644 --- a/src/universal-dapp.js +++ b/src/universal-dapp.js @@ -13,7 +13,6 @@ var txFormat = require('./app/execution/txFormat') var txHelper = require('./app/execution/txHelper') var txExecution = require('./app/execution/txExecution') var helper = require('./lib/helper') -var modalDialogCustom = require('./app/ui/modal-dialog-custom') var executionContext = require('./execution-context') // copy to copyToClipboard @@ -313,13 +312,21 @@ UniversalDApp.prototype.getCallButton = function (args) { }) function call (isUserAction) { + var logMsg + if (isUserAction) { + if (!args.funABI.constant) { + logMsg = `transact to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` + } else { + logMsg = `call to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}` + } + } txFormat.buildData(args.contractAbi, self.contracts, false, args.funABI, inputField.val(), self, (error, data) => { if (!error) { if (isUserAction) { if (!args.funABI.constant) { - self._api.logMessage(`transact to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'} pending ... `) + self._api.logMessage(`${logMsg} pending ... `) } else { - self._api.logMessage(`call to ${args.contractName}.${(args.funABI.name) ? args.funABI.name : '(fallback)'}`) + self._api.logMessage(`${logMsg}`) } } txExecution.callFunction(args.address, data, args.funABI, self, (error, txResult) => { @@ -328,7 +335,7 @@ UniversalDApp.prototype.getCallButton = function (args) { if (isVM) { var vmError = txExecution.checkVMError(txResult) if (vmError.error) { - modalDialogCustom.alert(vmError.message) + self._api.logMessage(`${logMsg} errored: ${vmError.message} `) return } } @@ -337,11 +344,11 @@ UniversalDApp.prototype.getCallButton = function (args) { $outputOverride.html(decoded) } } else { - modalDialogCustom.alert(error) + self._api.logMessage(`${logMsg} errored: ${error} `) } }) } else { - modalDialogCustom.alert(error) + self._api.logMessage(`${logMsg} errored: ${error} `) } }) } From 0f0c4eaf13dcf6a39f1f53003bcb01bed88f45b3 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:52:19 +0200 Subject: [PATCH 03/11] parseLog: no logs if call --- src/app/execution/eventsDecoder.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/execution/eventsDecoder.js b/src/app/execution/eventsDecoder.js index e3e9a99ca5..902e6143d1 100644 --- a/src/app/execution/eventsDecoder.js +++ b/src/app/execution/eventsDecoder.js @@ -18,6 +18,7 @@ class EventsDecoder { * @param {Function} cb - callback */ parseLogs (tx, contractName, compiledContracts, cb) { + if (tx.isCall) return cb(null, []) this._api.resolveReceipt(tx, (error, receipt) => { if (error) cb(error) this._decodeLogs(tx, receipt, contractName, compiledContracts, cb) From 4ef065b30d127ce4bfe26fd2f236c11ecbce470d Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:53:01 +0200 Subject: [PATCH 04/11] improve logging --- src/app/tabs/run-tab.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index c36dd9e47d..b10c4acda3 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -317,11 +317,11 @@ function contractDropdown (appAPI, appEvents, instanceContainer) { var address = isVM ? txResult.result.createdAddress : txResult.result.contractAddress instanceContainer.appendChild(appAPI.udapp().renderInstance(contract, address, selectContractNames.value)) } else { - modalDialogCustom.alert(error) + appAPI.logMessage(`creation of ${contractName} errored: ` + error) } }) } else { - modalDialogCustom.alert(error) + appAPI.logMessage(`creation of ${contractName} errored: ` + error) } }) } From 8cd76ce2416fe2f958752d0e0707cc9f5be1c6a7 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:54:20 +0200 Subject: [PATCH 05/11] TxListener to trigger callExecuted --- src/app/execution/txListener.js | 32 +++++++++++++++++++++++++++++--- src/app/tabs/run-tab.js | 2 +- src/universal-dapp.js | 4 +++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/app/execution/txListener.js b/src/app/execution/txListener.js index 5d6bd19897..c3f80d89a8 100644 --- a/src/app/execution/txListener.js +++ b/src/app/execution/txListener.js @@ -20,6 +20,7 @@ class TxListener { this.event = new EventManager() this._api = opt.api this._resolvedTransactions = {} + this._resolvedCalls = {} this._resolvedContracts = {} this._isListening = false this._listenOnNetwork = false @@ -31,7 +32,33 @@ class TxListener { this.startListening() } }) - opt.event.udapp.register('transactionExecuted', (error, to, data, lookupOnly, txResult) => { + + opt.event.udapp.register('callExecuted', (error, from, to, data, lookupOnly, txResult) => { + if (error) return + // we go for that case if + // in VM mode + // in web3 mode && listen remix txs only + if (!this._isListening) return // we don't listen + if (this._loopId && executionContext.getProvider() !== 'vm') return // we seems to already listen on a "web3" network + + var call = { + from: from, + to: to, + input: data, + hash: txResult.transactionHash ? txResult.transactionHash : 'call' + from + to + data, + isCall: true, + output: txResult.result, + returnValue: executionContext.isVM() ? txResult.result.vm.return : ethJSUtil.toBuffer(txResult.result), + envMode: executionContext.getProvider() + } + this._resolveTx(call, (error, resolvedData) => { + if (!error) { + this.event.trigger('newCall', [call]) + } + }) + }) + + opt.event.udapp.register('transactionExecuted', (error, from, to, data, lookupOnly, txResult) => { if (error) return if (lookupOnly) return // we go for that case if @@ -42,7 +69,7 @@ class TxListener { executionContext.web3().eth.getTransaction(txResult.transactionHash, (error, tx) => { if (error) return console.log(error) if (txResult && txResult.result && txResult.result.vm) tx.returnValue = txResult.result.vm.return - + tx.envMode = executionContext.getProvider() this._resolve([tx], () => { }) }) @@ -174,7 +201,6 @@ class TxListener { } _resolveTx (tx, cb) { - console.log(tx) var contracts = this._api.contracts() if (!contracts) return cb() var contractName diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index b10c4acda3..a568c080a0 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -411,7 +411,7 @@ function settings (appAPI, appEvents) { ` // EVENTS - appEvents.udapp.register('transactionExecuted', (error, to, data, lookupOnly, txResult) => { + appEvents.udapp.register('transactionExecuted', (error, from, to, data, lookupOnly, txResult) => { if (error) return if (!lookupOnly) el.querySelector('#value').value = '0' }) diff --git a/src/universal-dapp.js b/src/universal-dapp.js index 13e7699951..cfcf4d97ae 100644 --- a/src/universal-dapp.js +++ b/src/universal-dapp.js @@ -468,7 +468,9 @@ UniversalDApp.prototype.runTx = function (args, cb) { function (callback) { self.txRunner.rawRun(tx, function (error, result) { if (!args.useCall) { - self.event.trigger('transactionExecuted', [error, args.to, args.data, false, result]) + self.event.trigger('transactionExecuted', [error, args.from, args.to, args.data, false, result]) + } else { + self.event.trigger('callExecuted', [error, args.from, args.to, args.data, true, result]) } if (error) { if (typeof (error) !== 'string') { From 1ab5aa383279979e2e89fe468ca6eccbde804743 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:54:40 +0200 Subject: [PATCH 06/11] add renderCall --- src/app/execution/txLogger.js | 45 +++++++++++++++++++++++++++++++---- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/app/execution/txLogger.js b/src/app/execution/txLogger.js index c9f668f6a6..e4b1d52057 100644 --- a/src/app/execution/txLogger.js +++ b/src/app/execution/txLogger.js @@ -13,6 +13,7 @@ var helper = require('../../lib/helper') var ethJSUtil = require('ethereumjs-util') var BN = ethJSUtil.BN var executionContext = require('../../execution-context') +var modalDialog = require('../ui/modal-dialog-custom') var css = csjs` .log { @@ -74,7 +75,12 @@ class TxLogger { this.opts = opts this.logKnownTX = opts.api.editorpanel.registerCommand('knownTransaction', (args, cmds, append) => { var data = args[0] - var el = renderKnownTransaction(this, data) + var el + if (data.tx.isCall) { + el = renderCall(this, data) + } else { + el = renderKnownTransaction(this, data) + } append(el) }, { activate: true }) @@ -115,6 +121,10 @@ class TxLogger { opts.events.txListener.register('newTransaction', (tx) => { log(this, tx, opts.api) }) + + opts.events.txListener.register('newCall', (tx) => { + log(this, tx, opts.api) + }) } } @@ -139,7 +149,7 @@ function renderKnownTransaction (self, data) { self.event.trigger('debugRequested', [data.tx.hash]) } var tx = yo` - +
${context(self, {from, to, data})}
@@ -175,6 +185,31 @@ function renderKnownTransaction (self, data) { return tx } +function renderCall (self, data) { + function debug () { + if (data.tx.envMode === 'vm') { + self.event.trigger('debugRequested', [data.tx.hash]) + } else { + modalDialog.alert('Cannot debug this call. Debugging calls is only possible in JavaScript VM mode.') + } + } + var to = data.resolvedData.contractName + '.' + data.resolvedData.fn + ' ' + helper.shortenHexData(data.tx.to) + var from = data.tx.from ? data.tx.from : ' - ' + var input = data.tx.input ? helper.shortenHexData(data.tx.input) : '' + var tx = yo` + +
+ [call] from:${from}, to:${to}, data:${input}, return: +
+ +
+
+
${JSON.stringify(value(data.resolvedData.decodedReturnValue), null, '\t')}
+
+ ` + return tx +} + function renderUnknownTransaction (self, data) { var from = data.tx.from var to = data.tx.to @@ -182,7 +217,7 @@ function renderUnknownTransaction (self, data) { self.event.trigger('debugRequested', [data.tx.hash]) } var tx = yo` - +
${context(self, {from, to, data})}
@@ -231,7 +266,7 @@ function context (self, opts) { if (executionContext.getProvider() === 'vm') { return yo`[vm] from:${from}, to:${to}, value:${value(val)} wei, data:${input}, ${logs} logs, hash:${hash}` } else if (executionContext.getProvider() !== 'vm' && data.resolvedData) { - return yo`[block:${block} txIndex:${i}] from:${from}, to:${to}, value:${value(val)} wei` + return yo`[block:${block} txIndex:${i}] from:${from}, to:${to}, value:${value(val)} wei, ${logs} logs, data:${input}, hash:${hash}` } else { to = helper.shortenHexData(to) hash = helper.shortenHexData(data.tx.blockHash) @@ -247,7 +282,7 @@ function value (v) { ret.push(value(v[k])) } return ret - } else if (BN.isBN(v)) { + } else if (BN.isBN(v) || (v.constructor && v.constructor.name === 'BigNumber')) { return v.toString(10) } else if (v.indexOf && v.indexOf('0x') === 0) { return (new BN(v.replace('0x', ''), 16)).toString(10) From a7622d308da5a5f6bbb9a86cb7d0cadfb8379977 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 15:55:00 +0200 Subject: [PATCH 07/11] fix standard --- src/universal-dapp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/universal-dapp.js b/src/universal-dapp.js index cfcf4d97ae..c5c0e74188 100644 --- a/src/universal-dapp.js +++ b/src/universal-dapp.js @@ -121,7 +121,7 @@ UniversalDApp.prototype.reset = function (contracts, transactionContextAPI) { this.el.innerHTML = '' this.contracts = contracts if (transactionContextAPI) { - this.transactionContextAPI = transactionContextAPI + this.transactionContextAPI = transactionContextAPI } this.accounts = {} if (executionContext.isVM()) { From b27ef5158b97c77d8cbba96261eee9790613761d Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 17:44:07 +0200 Subject: [PATCH 08/11] add raw logs to details --- src/app/execution/eventsDecoder.js | 2 +- src/app/execution/txLogger.js | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/execution/eventsDecoder.js b/src/app/execution/eventsDecoder.js index 902e6143d1..1735760d08 100644 --- a/src/app/execution/eventsDecoder.js +++ b/src/app/execution/eventsDecoder.js @@ -71,7 +71,7 @@ class EventsDecoder { } events.push({ event: event, args: decoded }) } - cb(null, events) + cb(null, { decoded: events, raw: logs }) } } diff --git a/src/app/execution/txLogger.js b/src/app/execution/txLogger.js index e4b1d52057..02318ceedc 100644 --- a/src/app/execution/txLogger.js +++ b/src/app/execution/txLogger.js @@ -175,7 +175,7 @@ function renderKnownTransaction (self, data) { input: data.tx.input, 'decoded input': data.resolvedData && data.resolvedData.params ? JSON.stringify(value(data.resolvedData.params), null, '\t') : ' - ', 'decoded output': data.resolvedData && data.resolvedData.decodedReturnValue ? JSON.stringify(value(data.resolvedData.decodedReturnValue), null, '\t') : ' - ', - logs: JSON.stringify(data.logs, null, '\t') || '0', + logs: data.logs, val: data.tx.value }) tx.appendChild(table) @@ -240,7 +240,7 @@ function renderUnknownTransaction (self, data) { input: data.tx.input, hash: data.tx.hash, gas: data.tx.gas, - logs: JSON.stringify(data.logs) || '0' + logs: data.logs }) tx.appendChild(table) } @@ -384,7 +384,9 @@ function createTable (opts) { var logs = yo` logs - ${opts.logs || '0'} + + + ${JSON.stringify(opts.logs.decoded || [], null, '\t')} ` if (opts.logs) table.appendChild(logs) From e3c7adb8a57ba77f9521a214f64354170c2a4c18 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 18:44:20 +0200 Subject: [PATCH 09/11] fix tests --- src/app/execution/txLogger.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/execution/txLogger.js b/src/app/execution/txLogger.js index 02318ceedc..f259463bed 100644 --- a/src/app/execution/txLogger.js +++ b/src/app/execution/txLogger.js @@ -260,7 +260,7 @@ function context (self, opts) { var val = data.tx.value var hash = data.tx.hash ? helper.shortenHexData(data.tx.hash) : '' var input = data.tx.input ? helper.shortenHexData(data.tx.input) : '' - var logs = data.logs ? data.logs.length : 0 + var logs = data.logs && data.logs.decoded ? data.logs.decoded.length : 0 var block = data.tx.blockNumber || '' var i = data.tx.transactionIndex if (executionContext.getProvider() === 'vm') { From 4dad408e5bd8a4a1d4ebff3de0cab0fda76d45c7 Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 21:49:02 +0200 Subject: [PATCH 10/11] fix event decoder return value --- src/app/execution/eventsDecoder.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/execution/eventsDecoder.js b/src/app/execution/eventsDecoder.js index 1735760d08..3164d4b2e6 100644 --- a/src/app/execution/eventsDecoder.js +++ b/src/app/execution/eventsDecoder.js @@ -18,9 +18,9 @@ class EventsDecoder { * @param {Function} cb - callback */ parseLogs (tx, contractName, compiledContracts, cb) { - if (tx.isCall) return cb(null, []) + if (tx.isCall) return cb(null, { decoded: [], raw: [] }) this._api.resolveReceipt(tx, (error, receipt) => { - if (error) cb(error) + if (error) return cb(error) this._decodeLogs(tx, receipt, contractName, compiledContracts, cb) }) } @@ -30,7 +30,7 @@ class EventsDecoder { return cb('cannot decode logs - contract or receipt not resolved ') } if (!receipt.logs) { - return cb(null, []) + return cb(null, { decoded: [], raw: [] }) } this._decodeEvents(tx, receipt.logs, contract, contracts, cb) } From eb73cb39b3667c602d4f64000e9046c7f165c8ab Mon Sep 17 00:00:00 2001 From: yann300 Date: Tue, 12 Sep 2017 22:31:20 +0200 Subject: [PATCH 11/11] clean code --- src/app/execution/txListener.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/execution/txListener.js b/src/app/execution/txListener.js index c3f80d89a8..93b5504f14 100644 --- a/src/app/execution/txListener.js +++ b/src/app/execution/txListener.js @@ -20,7 +20,6 @@ class TxListener { this.event = new EventManager() this._api = opt.api this._resolvedTransactions = {} - this._resolvedCalls = {} this._resolvedContracts = {} this._isListening = false this._listenOnNetwork = false