From 1d139f7a0b54cd3344e32245a06ed29d92f0ae0b Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Tue, 6 Jan 2015 18:29:38 +0100 Subject: solidity string support --- lib/abi.js | 38 ++++++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/abi.js b/lib/abi.js index 21607f140..e80406ef9 100644 --- a/lib/abi.js +++ b/lib/abi.js @@ -21,6 +21,11 @@ * @date 2014 */ +// TODO: is these line is supposed to be here? +if (process.env.NODE_ENV !== 'build') { + var web3 = require('./web3'); // jshint ignore:line +} + // TODO: make these be actually accurate instead of falling back onto JS's doubles. var hexToDec = function (hex) { return parseInt(hex, 16).toString(); @@ -50,16 +55,20 @@ var padLeft = function (string, chars) { }; var setupInputTypes = function () { - var prefixedType = function (prefix) { + // @param prefix is the string prefix of the type + // @param bitsInNumber is number of bits per number in type + var prefixedType = function (prefix, bitsInNumber) { return function (type, value) { var expected = prefix; if (type.indexOf(expected) !== 0) { return false; } - var padding = parseInt(type.slice(expected.length)) / 8; + var padding = parseInt(type.slice(expected.length)) / 8 * bitsInNumber; if (typeof value === "number") value = value.toString(16); + else if (typeof value === "string") + value = web3.toHex(value); else if (value.indexOf('0x') === 0) value = value.substr(2); else @@ -83,9 +92,10 @@ var setupInputTypes = function () { }; return [ - prefixedType('uint'), - prefixedType('int'), - prefixedType('hash'), + prefixedType('uint', 1), + prefixedType('int', 1), + prefixedType('hash', 1), + prefixedType('string', 8), namedType('address', 20), namedType('bool', 1, formatBool), ]; @@ -118,14 +128,17 @@ var toAbiInput = function (json, methodName, params) { }; var setupOutputTypes = function () { - var prefixedType = function (prefix) { + + // @param prefix is the string prefix of the type + // @param bitsInNumber is number of bits per number in type + var prefixedType = function (prefix, bitsInNumber) { return function (type) { var expected = prefix; if (type.indexOf(expected) !== 0) { return -1; } - var padding = parseInt(type.slice(expected.length)) / 8; + var padding = parseInt(type.slice(expected.length)) / 8 * bitsInNumber; return padding * 2; }; }; @@ -148,10 +161,15 @@ var setupOutputTypes = function () { return value === '1' ? true : false; }; + var formatString = function (value) { + return web3.toAscii(value); + }; + return [ - { padding: prefixedType('uint'), format: formatInt }, - { padding: prefixedType('int'), format: formatInt }, - { padding: prefixedType('hash'), format: formatHash }, + { padding: prefixedType('uint', 1), format: formatInt }, + { padding: prefixedType('int', 1), format: formatInt }, + { padding: prefixedType('hash', 1), format: formatHash }, + { padding: prefixedType('string', 8), format: formatString }, { padding: namedType('address', 20) }, { padding: namedType('bool', 1), format: formatBool } ]; -- cgit v1.2.3 From 210682b73454a13e82c9c04bb1b0ea94bcb65ca1 Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Tue, 6 Jan 2015 21:50:09 +0100 Subject: real, ureal paddings and implicit paddings for uint, int and hash --- lib/abi.js | 61 +++++++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 16 deletions(-) (limited to 'lib') diff --git a/lib/abi.js b/lib/abi.js index e80406ef9..5a4d64515 100644 --- a/lib/abi.js +++ b/lib/abi.js @@ -54,17 +54,44 @@ var padLeft = function (string, chars) { return new Array(chars - string.length + 1).join("0") + string; }; +var calcBitPadding = function (type, expected) { + var value = type.slice(expected.length); + if (value === "") { + return 32; + } + return parseInt(value) / 8; +}; + +var calcBytePadding = function (type, expected) { + var value = type.slice(expected.length); + if (value === "") { + return 32; + } + return parseInt(value); +}; + +var calcRealPadding = function (type, expected) { + var value = type.slice(expected.length); + if (value === "") { + return 32; + } + var sizes = value.split('x'); + for (var padding = 0, i = 0; i < sizes; i++) { + padding += (sizes[i] / 8); + } + return padding; +}; + var setupInputTypes = function () { - // @param prefix is the string prefix of the type - // @param bitsInNumber is number of bits per number in type - var prefixedType = function (prefix, bitsInNumber) { + + var prefixedType = function (prefix, calcPadding) { return function (type, value) { var expected = prefix; if (type.indexOf(expected) !== 0) { return false; } - var padding = parseInt(type.slice(expected.length)) / 8 * bitsInNumber; + var padding = calcPadding(type, expected); if (typeof value === "number") value = value.toString(16); else if (typeof value === "string") @@ -92,10 +119,12 @@ var setupInputTypes = function () { }; return [ - prefixedType('uint', 1), - prefixedType('int', 1), - prefixedType('hash', 1), - prefixedType('string', 8), + prefixedType('uint', calcBitPadding), + prefixedType('int', calcBitPadding), + prefixedType('hash', calcBitPadding), + prefixedType('string', calcBytePadding), + prefixedType('real', calcRealPadding), + prefixedType('ureal', calcRealPadding), namedType('address', 20), namedType('bool', 1, formatBool), ]; @@ -129,16 +158,14 @@ var toAbiInput = function (json, methodName, params) { var setupOutputTypes = function () { - // @param prefix is the string prefix of the type - // @param bitsInNumber is number of bits per number in type - var prefixedType = function (prefix, bitsInNumber) { + var prefixedType = function (prefix, calcPadding) { return function (type) { var expected = prefix; if (type.indexOf(expected) !== 0) { return -1; } - var padding = parseInt(type.slice(expected.length)) / 8 * bitsInNumber; + var padding = calcPadding(type, expected); return padding * 2; }; }; @@ -166,10 +193,12 @@ var setupOutputTypes = function () { }; return [ - { padding: prefixedType('uint', 1), format: formatInt }, - { padding: prefixedType('int', 1), format: formatInt }, - { padding: prefixedType('hash', 1), format: formatHash }, - { padding: prefixedType('string', 8), format: formatString }, + { padding: prefixedType('uint', calcBitPadding), format: formatInt }, + { padding: prefixedType('int', calcBitPadding), format: formatInt }, + { padding: prefixedType('hash', calcBitPadding), format: formatHash }, + { padding: prefixedType('string', calcBytePadding), format: formatString }, + { padding: prefixedType('real', calcRealPadding), format: formatInt }, + { padding: prefixedType('ureal', calcRealPadding), format: formatInt }, { padding: namedType('address', 20) }, { padding: namedType('bool', 1), format: formatBool } ]; -- cgit v1.2.3