aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/abi.js67
1 files changed, 57 insertions, 10 deletions
diff --git a/lib/abi.js b/lib/abi.js
index 21607f140..5a4d64515 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();
@@ -49,17 +54,48 @@ 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 () {
- var prefixedType = function (prefix) {
+
+ 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;
+ var padding = calcPadding(type, expected);
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 +119,12 @@ var setupInputTypes = function () {
};
return [
- prefixedType('uint'),
- prefixedType('int'),
- prefixedType('hash'),
+ 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),
];
@@ -118,14 +157,15 @@ var toAbiInput = function (json, methodName, params) {
};
var setupOutputTypes = function () {
- var prefixedType = function (prefix) {
+
+ 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;
+ var padding = calcPadding(type, expected);
return padding * 2;
};
};
@@ -148,10 +188,17 @@ 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', 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 }
];