From 56c8e62d28dca305a669a839ca846657061b284e Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 16 Apr 2016 23:16:30 +0100 Subject: [PATCH 1/6] Display raw result as well as decoded output separately --- assets/js/universal-dapp.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/assets/js/universal-dapp.js b/assets/js/universal-dapp.js index 3f6cfde624..7740c48472 100644 --- a/assets/js/universal-dapp.js +++ b/assets/js/universal-dapp.js @@ -264,6 +264,14 @@ UniversalDApp.prototype.getCallButton = function(args) { return $gasUsed; } + var getDecodedOutput = function (result) { + var $decoded = $('
    '); + for (var i = 0; i < result.length; i++) { + $decoded.append($('
  1. ').text(result[i])); + } + return $('
    ').html('Decoded: ').append($decoded); + } + var getOutput = function() { var $result = $('
    '); var $close = $('
    '); @@ -340,20 +348,21 @@ UniversalDApp.prototype.getCallButton = function(args) { replaceOutput($result, getGasUsedOutput(result)); args.appendFunctions(result.createdAddress); } else if (self.options.vm){ - var outputObj; + var outputObj = '0x' + result.vm.return.toString('hex'); + clearOutput($result); + $result.append(getReturnOutput(outputObj)).append(getGasUsedOutput(result.vm)); try { var outputTypes = []; for (var i = 0; i < args.abi.outputs.length; i++) { outputTypes.push(args.abi.outputs[i].type); } - outputObj = EthJS.ABI.rawDecode(null, null, outputTypes, result.vm.return); + + var decodedObj = EthJS.ABI.rawDecode(null, null, outputTypes, result.vm.return); + + $result.append(getDecodedOutput(decodedObj)); } catch (e) { - outputObj = '0x' + result.vm.return.toString('hex'); } - - clearOutput($result); - $result.append(getReturnOutput(outputObj)).append(getGasUsedOutput(result.vm)); } else if (args.abi.constant && !isConstructor) { replaceOutput($result, getReturnOutput(result)); } else { From bbd07fd7eec4e3231a54a16724c8c6d29e98c3a4 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sat, 16 Apr 2016 23:16:51 +0100 Subject: [PATCH 2/6] Format decoded output more nicely (include type and stringify properly) --- assets/js/universal-dapp.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/assets/js/universal-dapp.js b/assets/js/universal-dapp.js index 7740c48472..f104b9aa8c 100644 --- a/assets/js/universal-dapp.js +++ b/assets/js/universal-dapp.js @@ -358,8 +358,15 @@ UniversalDApp.prototype.getCallButton = function(args) { outputTypes.push(args.abi.outputs[i].type); } + // decode data var decodedObj = EthJS.ABI.rawDecode(null, null, outputTypes, result.vm.return); + // format decoded data + decodedObj = EthJS.ABI.stringify(outputTypes, decodedObj); + for (var i = 0; i < outputTypes.length; i++) { + decodedObj[i] = outputTypes[i] + ': ' + decodedObj[i]; + } + $result.append(getDecodedOutput(decodedObj)); } catch (e) { } From 2af1a92096d7af2b4eced619550ff12cdb1d09b0 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 18 Apr 2016 18:35:55 +0100 Subject: [PATCH 3/6] Decode response ABI only if there supposed to be return values --- assets/js/universal-dapp.js | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/assets/js/universal-dapp.js b/assets/js/universal-dapp.js index f104b9aa8c..8ec6e455d8 100644 --- a/assets/js/universal-dapp.js +++ b/assets/js/universal-dapp.js @@ -352,23 +352,26 @@ UniversalDApp.prototype.getCallButton = function(args) { clearOutput($result); $result.append(getReturnOutput(outputObj)).append(getGasUsedOutput(result.vm)); - try { - var outputTypes = []; - for (var i = 0; i < args.abi.outputs.length; i++) { - outputTypes.push(args.abi.outputs[i].type); + // Only decode if there supposed to be fields + if (args.abi.outputs.length > 0) { + try { + var outputTypes = []; + for (var i = 0; i < args.abi.outputs.length; i++) { + outputTypes.push(args.abi.outputs[i].type); + } + + // decode data + var decodedObj = EthJS.ABI.rawDecode(null, null, outputTypes, result.vm.return); + + // format decoded data + decodedObj = EthJS.ABI.stringify(outputTypes, decodedObj); + for (var i = 0; i < outputTypes.length; i++) { + decodedObj[i] = outputTypes[i] + ': ' + decodedObj[i]; + } + + $result.append(getDecodedOutput(decodedObj)); + } catch (e) { } - - // decode data - var decodedObj = EthJS.ABI.rawDecode(null, null, outputTypes, result.vm.return); - - // format decoded data - decodedObj = EthJS.ABI.stringify(outputTypes, decodedObj); - for (var i = 0; i < outputTypes.length; i++) { - decodedObj[i] = outputTypes[i] + ': ' + decodedObj[i]; - } - - $result.append(getDecodedOutput(decodedObj)); - } catch (e) { } } else if (args.abi.constant && !isConstructor) { replaceOutput($result, getReturnOutput(result)); From bb60db97c639cfa04ca13c8e6edc344dd9695bd2 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 18 Apr 2016 18:36:36 +0100 Subject: [PATCH 4/6] Display errors properly during ABI decoding --- assets/js/universal-dapp.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/assets/js/universal-dapp.js b/assets/js/universal-dapp.js index 8ec6e455d8..d98015a8c3 100644 --- a/assets/js/universal-dapp.js +++ b/assets/js/universal-dapp.js @@ -265,9 +265,14 @@ UniversalDApp.prototype.getCallButton = function(args) { } var getDecodedOutput = function (result) { - var $decoded = $('
      '); - for (var i = 0; i < result.length; i++) { - $decoded.append($('
    1. ').text(result[i])); + var $decoded; + if (Array.isArray(result)) { + $decoded = $('
        '); + for (var i = 0; i < result.length; i++) { + $decoded.append($('
      1. ').text(result[i])); + } + } else { + $decoded = result; } return $('
        ').html('Decoded: ').append($decoded); } @@ -371,6 +376,7 @@ UniversalDApp.prototype.getCallButton = function(args) { $result.append(getDecodedOutput(decodedObj)); } catch (e) { + $result.append(getDecodedOutput('Failed to decode output: ' + e)); } } } else if (args.abi.constant && !isConstructor) { From ce97097a9166e02f990b81d65390af3c5b6f775f Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Thu, 21 Apr 2016 13:23:09 +0100 Subject: [PATCH 5/6] Display the names of named output while decoding --- assets/js/universal-dapp.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/assets/js/universal-dapp.js b/assets/js/universal-dapp.js index d98015a8c3..9b0ef16c32 100644 --- a/assets/js/universal-dapp.js +++ b/assets/js/universal-dapp.js @@ -371,7 +371,12 @@ UniversalDApp.prototype.getCallButton = function(args) { // format decoded data decodedObj = EthJS.ABI.stringify(outputTypes, decodedObj); for (var i = 0; i < outputTypes.length; i++) { - decodedObj[i] = outputTypes[i] + ': ' + decodedObj[i]; + var name = args.abi.outputs[i].name; + if (name.length > 0) { + decodedObj[i] = outputTypes[i] + ' ' + name + ': ' + decodedObj[i]; + } else { + decodedObj[i] = outputTypes[i] + ': ' + decodedObj[i]; + } } $result.append(getDecodedOutput(decodedObj)); From 65530a82bc6b76807bb26b5dd878b1f29811a1bc Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Tue, 26 Apr 2016 02:08:09 +0100 Subject: [PATCH 6/6] Update to support ethereumjs-abi 0.6.0 --- assets/js/universal-dapp.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/universal-dapp.js b/assets/js/universal-dapp.js index 9b0ef16c32..7d6ed9cee9 100644 --- a/assets/js/universal-dapp.js +++ b/assets/js/universal-dapp.js @@ -366,7 +366,7 @@ UniversalDApp.prototype.getCallButton = function(args) { } // decode data - var decodedObj = EthJS.ABI.rawDecode(null, null, outputTypes, result.vm.return); + var decodedObj = EthJS.ABI.rawDecode(outputTypes, result.vm.return); // format decoded data decodedObj = EthJS.ABI.stringify(outputTypes, decodedObj);