forked from cerc-io/plugeth
abi.js rounds down floating point input
This commit is contained in:
parent
9a264a4284
commit
774e9d24a1
20
dist/ethereum.js
vendored
20
dist/ethereum.js
vendored
@ -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 () {
|
|||||||
|
|
||||||
/// 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);
|
||||||
|
2
dist/ethereum.js.map
vendored
2
dist/ethereum.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/ethereum.min.js
vendored
2
dist/ethereum.min.js
vendored
File diff suppressed because one or more lines are too long
20
lib/abi.js
20
lib/abi.js
@ -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 () {
|
|||||||
|
|
||||||
/// 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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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() {
|
|||||||
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");
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user