diff options
author | Marek Kotewicz <marek.kotewicz@gmail.com> | 2015-01-17 09:14:40 +0800 |
---|---|---|
committer | Marek Kotewicz <marek.kotewicz@gmail.com> | 2015-01-17 09:14:40 +0800 |
commit | b457e88cd0fbc5724cbca68ecebf5e829c65bf98 (patch) | |
tree | b97c0deac182ee29be57481f551733f298fb6137 /dist/ethereum.js | |
parent | 2d8383d3c8be80dab644fc67c47327872a87f50d (diff) | |
download | go-tangerine-b457e88cd0fbc5724cbca68ecebf5e829c65bf98.tar.gz go-tangerine-b457e88cd0fbc5724cbca68ecebf5e829c65bf98.tar.zst go-tangerine-b457e88cd0fbc5724cbca68ecebf5e829c65bf98.zip |
support for int array types[]
Diffstat (limited to 'dist/ethereum.js')
-rw-r--r-- | dist/ethereum.js | 127 |
1 files changed, 71 insertions, 56 deletions
diff --git a/dist/ethereum.js b/dist/ethereum.js index e7e96d472..8a396c21f 100644 --- a/dist/ethereum.js +++ b/dist/ethereum.js @@ -33,15 +33,6 @@ BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_DOWN }); var ETH_PADDING = 32; -// TODO: make these be actually accurate instead of falling back onto JS's doubles. -var hexToDec = function (hex) { - return parseInt(hex, 16).toString(); -}; - -var decToHex = function (dec) { - return parseInt(dec).toString(16); -}; - /// Finds first index of array element matching pattern /// @param array /// @param callback pattern @@ -86,55 +77,66 @@ var namedType = function (name) { }; }; +var arrayType = function (type) { + return type.slice(-2) === '[]'; +}; + +/// Formats input value to byte representation of int +/// If value is negative, return it's two's complement +/// If the value is floating point, round it down +/// @returns right-aligned byte representation of int +var formatInputInt = function (value) { + var padding = ETH_PADDING * 2; + if (value instanceof BigNumber || typeof value === 'number') { + if (typeof value === 'number') + value = new BigNumber(value); + value = value.round(); + + if (value.lessThan(0)) + value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1); + value = value.toString(16); + } + else if (value.indexOf('0x') === 0) + value = value.substr(2); + else if (typeof value === 'string') + value = formatInputInt(new BigNumber(value)); + else + value = (+value).toString(16); + return padLeft(value, padding); +}; + +/// Formats input value to byte representation of string +/// @returns left-algined byte representation of string +var formatInputString = function (value) { + return web3.fromAscii(value, ETH_PADDING).substr(2); +}; + +/// Formats input value to byte representation of bool +/// @returns right-aligned byte representation bool +var formatInputBool = function (value) { + return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0'); +}; + +var dynamicTypeBytes = function (type, value) { + // TODO: decide what to do with array of strings + if (arrayType(type) || prefixedType('string')(type)) + return formatInputInt(value.length); + return ""; +}; + /// Setups input formatters for solidity types /// @returns an array of input formatters var setupInputTypes = function () { - /// Formats input value to byte representation of int - /// If value is negative, return it's two's complement - /// If the value is floating point, round it down - /// @returns right-aligned byte representation of int - var formatInt = function (value) { - var padding = ETH_PADDING * 2; - if (value instanceof BigNumber || typeof value === 'number') { - if (typeof value === 'number') - value = new BigNumber(value); - value = value.round(); - - if (value.lessThan(0)) - value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1); - value = value.toString(16); - } - else if (value.indexOf('0x') === 0) - value = value.substr(2); - else if (typeof value === 'string') - value = formatInt(new BigNumber(value)); - else - value = (+value).toString(16); - return padLeft(value, padding); - }; - - /// Formats input value to byte representation of string - /// @returns left-algined byte representation of string - var formatString = function (value) { - return web3.fromAscii(value, ETH_PADDING).substr(2); - }; - - /// Formats input value to byte representation of bool - /// @returns right-aligned byte representation bool - var formatBool = function (value) { - return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0'); - }; - return [ - { type: prefixedType('uint'), format: formatInt }, - { type: prefixedType('int'), format: formatInt }, - { type: prefixedType('hash'), format: formatInt }, - { type: prefixedType('string'), format: formatString }, - { type: prefixedType('real'), format: formatInt }, - { type: prefixedType('ureal'), format: formatInt }, - { type: namedType('address'), format: formatInt }, - { type: namedType('bool'), format: formatBool } + { type: prefixedType('uint'), format: formatInputInt }, + { type: prefixedType('int'), format: formatInputInt }, + { type: prefixedType('hash'), format: formatInputInt }, + { type: prefixedType('string'), format: formatInputString }, + { type: prefixedType('real'), format: formatInputInt }, + { type: prefixedType('ureal'), format: formatInputInt }, + { type: namedType('address'), format: formatInputInt }, + { type: namedType('bool'), format: formatInputBool } ]; }; @@ -156,7 +158,11 @@ var toAbiInput = function (json, methodName, params) { var method = json[index]; var padding = ETH_PADDING * 2; - for (var i = 0; i < method.inputs.length; i++) { + method.inputs.forEach(function (input, index) { + bytes += dynamicTypeBytes(input.type, params[index]); + }); + + method.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]); @@ -166,8 +172,17 @@ var toAbiInput = function (json, methodName, params) { } var formatter = inputTypes[j - 1].format; - bytes += (formatter ? formatter(params[i]) : params[i]); - } + var toAppend = ""; + + if (arrayType(method.inputs[i].type)) + toAppend = params[i].reduce(function (acc, curr) { + return acc + formatter(curr); + }, ""); + else + toAppend = formatter(params[i]); + + bytes += toAppend; + }); return bytes; }; |