From 589c4fb30f2e68972b898c5ce084cda5b0831266 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Sat, 31 Jan 2015 15:48:49 +0100 Subject: formatInput && formatOutput simplified --- dist/ethereum.js | 50 ++++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 24 deletions(-) (limited to 'dist/ethereum.js') diff --git a/dist/ethereum.js b/dist/ethereum.js index 7efc7decc..4455058a8 100644 --- a/dist/ethereum.js +++ b/dist/ethereum.js @@ -28,6 +28,10 @@ var types = require('./types'); var c = require('./const'); var f = require('./formatters'); +var displayTypeError = function (type) { + console.error('parser does not support type: ' + type); +}; + /// This method should be called if we want to check if givent type is an array type /// @returns true if it is, otherwise false var arrayType = function (type) { @@ -44,31 +48,31 @@ var dynamicTypeBytes = function (type, value) { var inputTypes = types.inputTypes(); /// Formats input params to bytes -/// @param abi contract method +/// @param abi contract method inputs /// @param array of params that will be formatted to bytes /// @returns bytes representation of input params -var toAbiInput = function (method, params) { +var formatInput = function (inputs, params) { var bytes = ""; var padding = c.ETH_PADDING * 2; /// first we iterate in search for dynamic - method.inputs.forEach(function (input, index) { + inputs.forEach(function (input, index) { bytes += dynamicTypeBytes(input.type, params[index]); }); - method.inputs.forEach(function (input, i) { + inputs.forEach(function (input, i) { var typeMatch = false; for (var j = 0; j < inputTypes.length && !typeMatch; j++) { - typeMatch = inputTypes[j].type(method.inputs[i].type, params[i]); + typeMatch = inputTypes[j].type(inputs[i].type, params[i]); } if (!typeMatch) { - console.error('input parser does not support type: ' + method.inputs[i].type); + displayTypeError(inputs[i].type); } var formatter = inputTypes[j - 1].format; var toAppend = ""; - if (arrayType(method.inputs[i].type)) + if (arrayType(inputs[i].type)) toAppend = params[i].reduce(function (acc, curr) { return acc + formatter(curr); }, ""); @@ -89,34 +93,34 @@ var dynamicBytesLength = function (type) { var outputTypes = types.outputTypes(); /// Formats output bytes back to param list -/// @param contract abi method +/// @param contract abi method outputs /// @param bytes representtion of output /// @returns array of output params -var fromAbiOutput = function (method, output) { +var formatOutput = function (outs, output) { output = output.slice(2); var result = []; var padding = c.ETH_PADDING * 2; - var dynamicPartLength = method.outputs.reduce(function (acc, curr) { + var dynamicPartLength = outs.reduce(function (acc, curr) { return acc + dynamicBytesLength(curr.type); }, 0); var dynamicPart = output.slice(0, dynamicPartLength); output = output.slice(dynamicPartLength); - method.outputs.forEach(function (out, i) { + outs.forEach(function (out, i) { var typeMatch = false; for (var j = 0; j < outputTypes.length && !typeMatch; j++) { - typeMatch = outputTypes[j].type(method.outputs[i].type); + typeMatch = outputTypes[j].type(outs[i].type); } if (!typeMatch) { - console.error('output parser does not support type: ' + method.outputs[i].type); + displayTypeError(outs[i].type); } var formatter = outputTypes[j - 1].format; - if (arrayType(method.outputs[i].type)) { + if (arrayType(outs[i].type)) { var size = f.formatOutputUInt(dynamicPart.slice(0, padding)); dynamicPart = dynamicPart.slice(padding); var array = []; @@ -126,7 +130,7 @@ var fromAbiOutput = function (method, output) { } result.push(array); } - else if (types.prefixedType('string')(method.outputs[i].type)) { + else if (types.prefixedType('string')(outs[i].type)) { dynamicPart = dynamicPart.slice(padding); result.push(formatter(output.slice(0, padding))); output = output.slice(padding); @@ -150,7 +154,7 @@ var inputParser = function (json) { var impl = function () { var params = Array.prototype.slice.call(arguments); - return toAbiInput(method, params); + return formatInput(method.inputs, params); }; if (parser[displayName] === undefined) { @@ -173,7 +177,7 @@ var outputParser = function (json) { var typeName = utils.extractTypeName(method.name); var impl = function (output) { - return fromAbiOutput(method, output); + return formatOutput(method.outputs, output); }; if (parser[displayName] === undefined) { @@ -195,6 +199,8 @@ var signatureFromAscii = function (name) { module.exports = { inputParser: inputParser, outputParser: outputParser, + formatInput: formatInput, + formatOutput: formatOutput, signatureFromAscii: signatureFromAscii }; @@ -485,19 +491,15 @@ var inputWithName = function (inputs, name) { var indexedParamsToTopics = function (event, indexed) { // sort keys? return Object.keys(indexed).map(function (key) { - // TODO: simplify this! - var parser = abi.inputParser([{ - name: 'test', - inputs: [inputWithName(event.inputs, key)] - }]); + var inputs = [inputWithName(event.inputs, key)]; var value = indexed[key]; if (value instanceof Array) { return value.map(function (v) { - return parser.test(v); + return abi.formatInput(inputs, [v]); }); } - return parser.test(value); + return abi.formatInput(inputs, [value]); }); }; -- cgit v1.2.3