Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.
Prev Previous commit
Next Next commit
Init utils.toNumber function
  • Loading branch information
spacesailor24 committed Jul 23, 2021
commit 989da0ca4cbb6add2d27d72c6fda1e1564d2fa7b
4 changes: 3 additions & 1 deletion packages/web3-utils/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -436,5 +436,7 @@ module.exports = {
isTopicInBloom: utils.isTopicInBloom,
isInBloom: utils.isInBloom,

compareBlockNumbers: compareBlockNumbers
compareBlockNumbers: compareBlockNumbers,

toNumber: utils.toNumber
};
14 changes: 13 additions & 1 deletion packages/web3-utils/src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,17 @@ var sha3Raw = function(value) {
return value;
};

/**
* Auto converts any given value into it's hex representation,
* then converts hex to number.
*
* @method toNumber
* @param {String|Number|BN} value
* @return {Number}
*/
var toNumber = function(value) {
return typeof value === 'number' ? value : hexToNumber(toHex(value));
}

module.exports = {
BN: BN,
Expand Down Expand Up @@ -550,5 +561,6 @@ module.exports = {
rightPad: rightPad,
toTwosComplement: toTwosComplement,
sha3: sha3,
sha3Raw: sha3Raw
sha3Raw: sha3Raw,
toNumber: toNumber
};
1 change: 1 addition & 0 deletions packages/web3-utils/types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ export interface Utils {
testTopic(bloom: string, topic: string): boolean;
getSignatureParameters(signature: string): {r: string; s: string; v: number};
stripHexPrefix(str: string): string;
toNumber(value: number | string | BN): number;
}

export interface Units {
Expand Down
44 changes: 44 additions & 0 deletions packages/web3-utils/types/tests/to-number-test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
This file is part of web3.js.

web3.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

web3.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file to-number-test.ts
* @author Josh Stevens <[email protected]>
* @date 2018
*/

import BN = require('bn.js');
import {toNumber} from 'web3-utils';

// $ExpectType number
toNumber('234');
// $ExpectType number
toNumber(234);
// $ExpectType number
toNumber(new BN(3));

// $ExpectError
toNumber(['string']);
// $ExpectError
toNumber(true);
// $ExpectError
toNumber([4]);
// $ExpectError
toNumber({});
// $ExpectError
toNumber(null);
// $ExpectError
toNumber(undefined);
70 changes: 54 additions & 16 deletions test/utils.toNumber.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,61 @@
var assert = require('assert');
var chai = require('chai');
var utils = require('../packages/web3-utils');

describe('lib/utils/utils', function () {
describe('hexToNumber', function () {
it('should return the correct value', function () {
var BigNumber = require('bignumber.js');
var BN = require('bn.js');

assert.equal(utils.hexToNumber("0x3e8"), 1000);
assert.equal(utils.hexToNumber('0x1f0fe294a36'), 2134567897654);
// allow compatiblity
assert.equal(utils.hexToNumber(100000), 100000);
});
var assert = chai.assert;

var tests = [
{ value: 1, expected: 1 },
{ value: '1', expected: 1 },
{ value: '0x1', expected: 1},
{ value: '15', expected: 15},
{ value: '0xf', expected: 15},
{ value: -1, expected: -1},
{ value: '-1', expected: -1},
{ value: '-0x1', expected: -1},
{ value: '-15', expected: -15},
{ value: '-0xf', expected: -15},
{ value: '0x657468657265756d', expected: '0x657468657265756d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: 0, expected: 0},
{ value: '0', expected: 0},
{ value: '0x0', expected: 0},
{ value: -0, expected: -0},
{ value: '-0', expected: -0},
{ value: '-0x0', expected: -0},
{ value: [1,2,3,{test: 'data'}], expected: '0x5b312c322c332c7b2274657374223a2264617461227d5d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: {test: 'test'}, expected: '0x7b2274657374223a2274657374227d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: '{"test": "test"}', expected: '0x7b2274657374223a202274657374227d', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: 'myString', expected: '0x6d79537472696e67', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: 'myString 34534!', expected: '0x6d79537472696e6720333435333421', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: new BN(15), expected: 15},
{ value: new BigNumber(15), expected: 15},
{ value: 'Heeäööä👅D34ɝɣ24Єͽ-.,äü+#/', expected: '0x486565c3a4c3b6c3b6c3a4f09f9185443334c99dc9a33234d084cdbd2d2e2cc3a4c3bc2b232f', error: true, errorMessage: 'Number can only safely store up to 53 bits'},
{ value: true, expected: 1},
{ value: false, expected: 0},
];

it('should validate hex strings', function() {
try {
utils.hexToNumber('100000');
assert.fail();
} catch (error){
assert(error.message.includes('is not a valid hex string'))
describe('lib/utils/utils', function () {
describe('toNumber', function () {
tests.forEach(function (test) {
if (test.error) {
it('should error with message', function () {
try {
utils.toNumber(test.value)
assert.fail();
} catch(err){
assert.strictEqual(err.message, test.errorMessage);
}
});
} else {
it('should turn ' + test.value + ' to ' + test.expected, function () {
assert.strictEqual(utils.toNumber(test.value), test.expected);
});
}
})
});
});
});