39 lines
1.8 KiB
JavaScript
39 lines
1.8 KiB
JavaScript
var BN = require('bn.js');
|
|
var stripHexPrefix = require('strip-hex-prefix');
|
|
|
|
/**
|
|
* Returns a BN object, converts a number value to a BN
|
|
* @param {String|Number|Object} `arg` input a string number, hex string number, number, BigNumber or BN object
|
|
* @return {Object} `output` BN object of the number
|
|
* @throws if the argument is not an array, object that isn't a bignumber, not a string number or number
|
|
*/
|
|
module.exports = function numberToBN(arg) {
|
|
if (typeof arg === 'string' || typeof arg === 'number') {
|
|
var multiplier = new BN(1); // eslint-disable-line
|
|
var formattedString = String(arg).toLowerCase().trim();
|
|
var isHexPrefixed = formattedString.substr(0, 2) === '0x' || formattedString.substr(0, 3) === '-0x';
|
|
var stringArg = stripHexPrefix(formattedString); // eslint-disable-line
|
|
if (stringArg.substr(0, 1) === '-') {
|
|
stringArg = stripHexPrefix(stringArg.slice(1));
|
|
multiplier = new BN(-1, 10);
|
|
}
|
|
stringArg = stringArg === '' ? '0' : stringArg;
|
|
|
|
if ((!stringArg.match(/^-?[0-9]+$/) && stringArg.match(/^[0-9A-Fa-f]+$/))
|
|
|| stringArg.match(/^[a-fA-F]+$/)
|
|
|| (isHexPrefixed === true && stringArg.match(/^[0-9A-Fa-f]+$/))) {
|
|
return new BN(stringArg, 16).mul(multiplier);
|
|
}
|
|
|
|
if ((stringArg.match(/^-?[0-9]+$/) || stringArg === '') && isHexPrefixed === false) {
|
|
return new BN(stringArg, 10).mul(multiplier);
|
|
}
|
|
} else if (typeof arg === 'object' && arg.toString && (!arg.pop && !arg.push)) {
|
|
if (arg.toString(10).match(/^-?[0-9]+$/) && (arg.mul || arg.dividedToIntegerBy)) {
|
|
return new BN(arg.toString(10), 10);
|
|
}
|
|
}
|
|
|
|
throw new Error('[number-to-bn] while converting number ' + JSON.stringify(arg) + ' to BN.js instance, error: invalid number value. Value must be an integer, hex string, BN or BigNumber instance. Note, decimals are not supported.');
|
|
}
|