Commit 774e9d24 authored by Marek Kotewicz's avatar Marek Kotewicz

abi.js rounds down floating point input

parent 9a264a42
...@@ -29,6 +29,8 @@ if ("build" !== 'build') {/* ...@@ -29,6 +29,8 @@ if ("build" !== 'build') {/*
var web3 = require('./web3'); // jshint ignore:line var web3 = require('./web3'); // jshint ignore:line
BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_DOWN });
// TODO: make these be actually accurate instead of falling back onto JS's doubles. // TODO: make these be actually accurate instead of falling back onto JS's doubles.
var hexToDec = function (hex) { var hexToDec = function (hex) {
return parseInt(hex, 16).toString(); return parseInt(hex, 16).toString();
...@@ -88,25 +90,23 @@ var setupInputTypes = function () { ...@@ -88,25 +90,23 @@ var setupInputTypes = function () {
/// Formats input value to byte representation of int /// Formats input value to byte representation of int
/// If value is negative, return it's two's complement /// If value is negative, return it's two's complement
/// If the value is floating point, it rounds it down
/// @returns right-aligned byte representation of int /// @returns right-aligned byte representation of int
var formatInt = function (value) { var formatInt = function (value) {
var padding = 32 * 2; var padding = 32 * 2;
if (value instanceof BigNumber) { if (value instanceof BigNumber || typeof value === 'number') {
if (typeof value === 'number')
value = new BigNumber(value);
value = value.round();
if (value.lessThan(0)) if (value.lessThan(0))
value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1).toString(16); value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1);
else value = value.toString(16);
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);
} }
else if (value.indexOf('0x') === 0) else if (value.indexOf('0x') === 0)
value = value.substr(2); value = value.substr(2);
else if (typeof value === 'string') else if (typeof value === 'string')
value = new BigNumber(value).toString(16); value = formatInt(new BigNumber(value));
else else
value = (+value).toString(16); value = (+value).toString(16);
return padLeft(value, padding); return padLeft(value, padding);
......
This diff is collapsed.
This diff is collapsed.
...@@ -28,6 +28,8 @@ if (process.env.NODE_ENV !== 'build') { ...@@ -28,6 +28,8 @@ if (process.env.NODE_ENV !== 'build') {
var web3 = require('./web3'); // jshint ignore:line var web3 = require('./web3'); // jshint ignore:line
BigNumber.config({ ROUNDING_MODE: BigNumber.ROUND_DOWN });
// TODO: make these be actually accurate instead of falling back onto JS's doubles. // TODO: make these be actually accurate instead of falling back onto JS's doubles.
var hexToDec = function (hex) { var hexToDec = function (hex) {
return parseInt(hex, 16).toString(); return parseInt(hex, 16).toString();
...@@ -87,25 +89,23 @@ var setupInputTypes = function () { ...@@ -87,25 +89,23 @@ var setupInputTypes = function () {
/// Formats input value to byte representation of int /// Formats input value to byte representation of int
/// If value is negative, return it's two's complement /// If value is negative, return it's two's complement
/// If the value is floating point, it rounds it down
/// @returns right-aligned byte representation of int /// @returns right-aligned byte representation of int
var formatInt = function (value) { var formatInt = function (value) {
var padding = 32 * 2; var padding = 32 * 2;
if (value instanceof BigNumber) { if (value instanceof BigNumber || typeof value === 'number') {
if (typeof value === 'number')
value = new BigNumber(value);
value = value.round();
if (value.lessThan(0)) if (value.lessThan(0))
value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1).toString(16); value = new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(value).plus(1);
else value = value.toString(16);
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);
} }
else if (value.indexOf('0x') === 0) else if (value.indexOf('0x') === 0)
value = value.substr(2); value = value.substr(2);
else if (typeof value === 'string') else if (typeof value === 'string')
value = new BigNumber(value).toString(16); value = formatInt(new BigNumber(value));
else else
value = (+value).toString(16); value = (+value).toString(16);
return padLeft(value, padding); return padLeft(value, padding);
......
...@@ -43,6 +43,11 @@ describe('abi', function() { ...@@ -43,6 +43,11 @@ describe('abi', function() {
parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
); );
assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003");
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
}); });
...@@ -69,6 +74,10 @@ describe('abi', function() { ...@@ -69,6 +74,10 @@ describe('abi', function() {
parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
); );
assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003");
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
}); });
...@@ -95,6 +104,10 @@ describe('abi', function() { ...@@ -95,6 +104,10 @@ describe('abi', function() {
parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
); );
assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003");
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
}); });
...@@ -124,6 +137,10 @@ describe('abi', function() { ...@@ -124,6 +137,10 @@ describe('abi', function() {
parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
); );
assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003");
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
}); });
it('should parse input int128', function() { it('should parse input int128', function() {
...@@ -152,6 +169,10 @@ describe('abi', function() { ...@@ -152,6 +169,10 @@ describe('abi', function() {
parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
); );
assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003");
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
}); });
...@@ -181,6 +202,10 @@ describe('abi', function() { ...@@ -181,6 +202,10 @@ describe('abi', function() {
parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)), parser.test(new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16)),
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
); );
assert.equal(parser.test(0.1), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test(3.9), "0000000000000000000000000000000000000000000000000000000000000003");
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment