diff options
author | Marek Kotewicz <marek.kotewicz@gmail.com> | 2015-01-16 23:49:50 +0800 |
---|---|---|
committer | Marek Kotewicz <marek.kotewicz@gmail.com> | 2015-01-16 23:49:50 +0800 |
commit | 1c4d8f36e4c11944c4c819c822fdd44ff34f962b (patch) | |
tree | 45ff55da30674918efde7c35da7774a3e8946461 /lib/abi.js | |
parent | de4ea8e6f41459f1f3f44ee144381dd62671e866 (diff) | |
parent | e94da808cb2a9f0493b42e5e572f6aed78de5ee3 (diff) | |
download | dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.tar dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.tar.gz dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.tar.bz2 dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.tar.lz dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.tar.xz dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.tar.zst dexon-1c4d8f36e4c11944c4c819c822fdd44ff34f962b.zip |
Merge commit '29333fc213b62b27ef826616cf77430947fb6eab' into ethereumjs
Diffstat (limited to 'lib/abi.js')
-rw-r--r-- | lib/abi.js | 41 |
1 files changed, 23 insertions, 18 deletions
diff --git a/lib/abi.js b/lib/abi.js index 8af10c382..5a01f43fd 100644 --- a/lib/abi.js +++ b/lib/abi.js @@ -23,10 +23,14 @@ // TODO: is these line is supposed to be here? if (process.env.NODE_ENV !== 'build') { - var web3 = require('./web3'); // jshint ignore:line + var BigNumber = require('bignumber.js'); // jshint ignore:line } -var BigNumber = require('bignumber.js'); +var web3 = require('./web3'); // jshint ignore:line + +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) { @@ -87,25 +91,23 @@ 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 = 32 * 2; - if (value instanceof BigNumber) { + 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).toString(16); - else - value = value.toString(16); - } - else if (typeof value === 'number') { - if (value < 0) - value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1).toString(16); - else - value = new BigNumber(value).toString(16); + 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 = new BigNumber(value).toString(16); + value = formatInt(new BigNumber(value)); else value = (+value).toString(16); return padLeft(value, padding); @@ -114,7 +116,7 @@ var setupInputTypes = function () { /// Formats input value to byte representation of string /// @returns left-algined byte representation of string var formatString = function (value) { - return web3.fromAscii(value, 32).substr(2); + return web3.fromAscii(value, ETH_PADDING).substr(2); }; /// Formats input value to byte representation of bool @@ -151,7 +153,7 @@ var toAbiInput = function (json, methodName, params) { } var method = json[index]; - var padding = 32 * 2; + var padding = ETH_PADDING * 2; for (var i = 0; i < method.inputs.length; i++) { var typeMatch = false; @@ -177,12 +179,15 @@ var setupOutputTypes = function () { var formatInt = function (value) { // check if it's negative number // it it is, return two's complement - if (value.substr(0, 1).toLowerCase() === 'f') { + var firstBit = new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1); + if (firstBit === '1') { return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1); } return new BigNumber(value, 16); }; + /// Formats big right-aligned input bytes to uint + /// @returns right-aligned input bytes formatted to uint var formatUInt = function (value) { return new BigNumber(value, 16); }; @@ -237,7 +242,7 @@ var fromAbiOutput = function (json, methodName, output) { var result = []; var method = json[index]; - var padding = 32 * 2; + var padding = ETH_PADDING * 2; for (var i = 0; i < method.outputs.length; i++) { var typeMatch = false; for (var j = 0; j < outputTypes.length && !typeMatch; j++) { |