Crypto utilities for formatting tokens and fractions.
Check out the other Uniswap and crypto libraries, that depend on this library:
💰 @thanpolas/univ3prices for calculating Uniswap V3 Prices.
☎️ @thanpolas/uniswap-chain-queries for fetching on-chain data for ERC20 tokens, Uniswap V2 (and clones) and Uniswap V3.
- Get Liquidity Pool ratios of Tokens.
 - Get crypto token values in human readable format.
 - Get fraction value in human readable format.
 - Get percentage and remainters of bigint numbers.
 
Install the module using NPM:
npm install @thanpolas/crypto-utils --save
const { tokenToAuto } = require('@thanpolas/crypto-utils');
const tokenQuantity = '2083278970151697065687';
const decimals = 18;
const value = tokenToAuto(tokenQuantity, decimals);
console.log(value);
// "2083.27897"Calculates the ratio between the reserves of two tokens in a liquidity pool.
- poolFraction 
{Array<string|bigint>}The tuple fraction, an Array with two items representing the liquidity pool token reserves. - decimalFraction 
{Array<string|number>}An Array tuple with two items representing the decimal places of token0 and token1 as defined in the "poolFraction" argument. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { poolTokensToAuto } = require('@thanpolas/crypto-utils');
// 3236.0404424781496715 - Reversed: 0.00030901962375791667205
const dai_weth_pool_str = [
  '124393780771528474299654469',
  '38440119331842498607318',
];
const dai_weth_decimals_str = ['18', '18'];
const value = poolTokensToAuto(dai_weth_pool_str, dai_weth_decimals_str);
console.log(value);
// "3236.04044"
const opts {
    reverse: true;
}
const value = poolTokensToAuto(dai_weth_pool_str, dai_weth_decimals_str, opts);
console.log(value);
// "0.00030902"Calculates the value of token quantity to significant digits, default of significant digits is 5.
tokenToSignificant() is better suited for values that are bellow 1.
- tokenQuantity 
{number|string|bigint}The quantity of tokens to be formatted. - tokenDecimals 
{number|string}How many decimals this token has. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { tokenToSignificant } = require('@thanpolas/crypto-utils');
const tokenQuantity = '2083278970151697065687';
const decimals = 18;
const value = tokenToSignificant(tokenQuantity, decimals);
console.log(value);
// "2083.3"
const opts = { decimalPlaces: 7 };
const value = tokenToSignificant(tokenQuantity, decimals, opts);
console.log(value);
// "2083.279"Calculates the value of token quantity with fixed decimal digits, default of decimal digits is 5.
tokenToFixed() is better suited for values that are above 1.
- tokenQuantity 
{number|string|bigint}The quantity of tokens to be formatted. - tokenDecimals 
{number|string}How many decimals this token has. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { tokenToFixed } = require('@thanpolas/crypto-utils');
const tokenQuantity = '2083278970151697065687';
const decimals = 18;
const value = tokenToFixed(tokenQuantity, decimals);
console.log(value);
// "2083.27897"
const opts = { decimalPlaces: 7 };
const value = tokenToFixed(tokenQuantity, decimals, opts);
console.log(value);
// "2083.2789702"Will automatically use toFixed() if the value is above 1 or use toSignificant() if the value is bellow 1.
- tokenQuantity 
{number|string|bigint}The quantity of tokens to be formatted. - tokenDecimals 
{number|string}How many decimals this token has. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { tokenToAuto } = require('@thanpolas/crypto-utils');
const tokenQuantity = '2083278970151697065687';
const decimals = 18;
const value = tokenToAuto(tokenQuantity, decimals);
console.log(value);
// "2083.27897"
const opts = { decimalPlaces: 7 };
const value = tokenToAuto(tokenQuantity, decimals, opts;
console.log(value);
// "2083.2789701"
//
// Use a quantity that's bellow 1
//
const tokenSmallQuantity = '278970151697065687';
const value = tokenToAuto(tokenSmallQuantity, decimals);
console.log(value);
// "0.27897"
const opts = { decimalPlaces: 7 };
const value = tokenToAuto(tokenSmallQuantity, decimals, opts);
console.log(value);
// "0.2789702"Underlying function that calculates to significant digits of a fraction.
- fraction 
{Array<number|string|bigint>}The tuple fraction, an Array with two items representing the numerator and denominator. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { toSignificant } = require('@thanpolas/crypto-utils');
const fraction = [1000000, 21]; // 47619.047619047619
console.log(toSignificant(fraction));
// "47619"
const opts = { decimalPlaces: 7 };
console.log(toSignificant(fraction, opts));
// "47619.05"
const opts = { decimalPlaces: 7, format: true };
console.log(toSignificant(fraction, opts));
// "47,619.05"Underlying function that calculates to fixed decimals of a fraction.
- fraction 
{Array<number|string|bigint>}The tuple fraction, an Array with two items representing the numerator and denominator. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { toFixed } = require('@thanpolas/crypto-utils');
const fraction = [1000000, 21]; // 47619.047619047619
console.log(toFixed(fraction));
// "47619.04762"
const opts = { decimalPlaces: 7 };
console.log(toFixed(fraction, opts));
// "47619.0476190"
const opts = { decimalPlaces: 7, format: true };
console.log(toFixed(fraction, opts));
// "47,619.0476190"Underlying function that does automatic decimal calculation and applies appropriate function. If result is above 1 then toFixed() is applied, if under 1 then toSignificant() is applied.
Tuple array items can be of type string, number or bigint.
- fraction 
{Array<number|string|bigint>}The tuple fraction, an Array with two items representing the numerator and denominator. - optOptions 
{Object=}An object with calculation options, read more about available options here. - Returns 
{string}Formatted token. 
const { toAuto } = require('@thanpolas/crypto-utils');
// A fraction that has a result of above 1.
const fractionAbove1 = [1000000, 21]; // 47619.047619047619
console.log(toAuto(fractionAbove1));
// "47619.05"
const opts = { decimalPlaces: 7 };
console.log(toAuto(fractionAbove1, opts));
// "47619.0476190"
const opts = { format: true };
console.log(toAuto(fractionAbove1, opts));
// "47,619.04762"
//
// A fraction that has a result of below 1.
//
const fractionBelow1 = [21, 49]; // 0.428571428571429
const value = toAuto(fractionBelow1, decimals);
console.log(value);
// "0.42857"
const opts = { decimalPlaces: 7 };
const value = toAuto(fractionBelow1, decimals, opts);
console.log(value);
// "0.4285714"The following options are available on all functions:
- decimalPlaces 
{string|number}Define how many decimal places you want the result to be. When the calculation function is "toSignificant()" then this parameter gets translated to how many significant digits should be returned. - reverse 
{boolean}Set to true to reverse the fraction before the calculation. - format 
{boolean|Array}Format the output, see next section about formatting. - rounding 
{number}Value for rounding function, defaultRounding.ROUND_HALF_UP, see Roudning. 
Rounding is an enumeration of constants from Decimal.js:
| Property | Value | Description | 
|---|---|---|
| ROUND_UP | 0 | Rounds away from zero | 
| ROUND_DOWN | 1 | Rounds towards zero | 
| ROUND_CEIL | 2 | Rounds towards Infinity | 
| ROUND_FLOOR | 3 | Rounds towards -Infinity | 
| ROUND_HALF_UP | 4 | Rounds towards nearest neighbour. If equidistant, rounds away from zero | 
| ROUND_HALF_DOWN | 5 | Rounds towards nearest neighbour. If equidistant, rounds towards zero | 
| ROUND_HALF_EVEN | 6 | Rounds towards nearest neighbour. If equidistant, rounds towards even neighbour | 
| ROUND_HALF_CEIL | 7 | Rounds towards nearest neighbour. If equidistant, rounds towards Infinity | 
| ROUND_HALF_FLOOR | 8 | Rounds towards nearest neighbour. If equidistant, rounds towards -Infinity | 
const { toFixed } = require('@thanpolas/crypto-utils');
const fraction = [21, 49]; // 0.428571428571429
//
// Default Rounding
//
const opts = {
    decimalPlaces: 3,
};
toFixed(fraction, opts);
// 0.429 - Default rounding is ROUND_HALF_UP
//
// ROUND_FLOOR Rounding
//
const opts = {
    decimalPlaces: 3,
    rounding: Rounding.ROUND_FLOOR,
};
toFixed(fraction, opts);
// 0.428 - Override rounding to ROUND_FLOORThe Crypto Utilities package uses the Intl.NumberFormat function to format the output when desired. By default, no formatting will be applied. Let's have a look at the formatting argument one more time:
- optFormatting 
{boolean|Array=}Number formatting, read more on Formatting. 
When a boolean true is used, the default formatting is applied:
- Locale: 
en-US. - Options: Either 
maximumSignificantDigitswhen toSignificant() function is used, ormaximumFractionDigitswhen toFixed() function is used. The value passed to this option is the decimal parts. 
const { toFixed } = require('@thanpolas/crypto-utils');
const fraction = [1000000, 21]; // 47619.047619047619
const opts = { decimalPlaces: 7, format: true };
console.log(toFixed(fraction, opts));
// '47,619.0476190'When an array is used, then you can provide one or both arguments of the Intl.NumberFormat function.
Note: Custom formatting options will override the decimal places argument.
const { toFixed } = require('@thanpolas/crypto-utils');
const fraction = [1000000, 21]; // 47619.047619047619
const opts = { decimalPlaces: 7, format: ['en-US'] };
console.log(toFixed(fraction, opts));
// '47,619.048' -- decimal places (7) gets overriden by Intl.NumberFormat!
const opts = {
    decimalPlaces: 7,
    format: ['en-US', { style: 'currency', currency: 'USD' }],
};
console.log(toFixed(fraction, opts));
// '$47,619.05' -- decimal places (7) gets overriden by Intl.NumberFormat!
const opts = {
    decimalPlaces: 7,
    format: [
        'en-US',
        { style: 'currency', currency: 'USD', maximumFractionDigits: 3 },
    ],
};
console.log(toFixed(fraction, opts));
// '$47,619.048' -- decimal places (7) gets overriden by Intl.NumberFormat!Percentage functions use native BigInt type.
Calculates the percentage of a bigint number (i.e. for 100 and 5% returns 5).
- biNum 
{bigint}The big integer number to calculate the percentage for. - basisPoints 
{number|string}Percent expressed with a precision of 10000 (i.e. 1% = 100). - optPrecision 
{number|string=}The precision of the percentage, default 10000. - Returns 
{bigint}The percentage number. 
const { percentage } = require('@thanpolas/crypto-utils');
const biNum = BigInt(100);
const percentageRes = percentage(biNum, 500);
console.log(value);
// 5n
const percentageRes = percentage(biNum, 50);
console.log(value); // Bigints have no decimals
// 0nCalculates the percent remainder of a bigint number (i.e. for 100 and 5% returns 95).
- biNum 
{bigint}The big integer number to calculate the percentage for. - basisPoints 
{number|string}Percent expressed with a precision of 10000 (i.e. 1% = 100). - optPrecision 
{number|string=}The precision of the percentage, default 10000. - Returns 
{bigint}The percentage number. 
const { percentRemainder } = require('@thanpolas/crypto-utils');
const biNum = BigInt(100);
const percentRemainderRes = percentRemainder(biNum, 500);
console.log(value);
// 95n
const percentRemainderRes = percentRemainder(biNum, 50);
console.log(value); // Bigints have no decimals
// 100nThe crypto-utils exposes a few utility functions for more low-level calculations:
expDecs(decimals)Will return the exponent of the given decimals number.biConv(value)Will safely convert any value to JSBI and not touch values that are of JSBI type.
When a new node version is available you need to updated it in the following:
/package.json/.nvmrc/.circleci/config.yml
- Update the changelog bellow ("Release History").
 - Ensure you are on master and your repository is clean.
 - Type: 
npm run releasefor patch version jump.npm run release:minorfor minor version jump.npm run release:majorfor major major jump.
 
- v0.4.1, 20 Oct 2021
- Fixed typo of 
percentRemainder()function (was "percentRemainter"), thanks vfat. 
 - Fixed typo of 
 - v0.4.0, 20 Oct 2021
- Added percentage functions.
 - Updated all dependencies to latest.
 
 - v0.3.1, 22 Aug 2021
- Expose the 
Roundingenumeration for Rounding constants. 
 - Expose the 
 - v0.3.0, 21 Aug 2021
- Implemented the new 
poolTokensToAuto()to calculate pooled tokens ratios. - Breaking Moved all options in an object argument.
 - Introduced the 
reverseoption to reverse numerator and denominator in fractions before division. - Forgot to add documentation for 
toAuto(), now done. - Changed default decimal places on auto functions to 
5for both toFixed and toSignificant calls. 
 - Implemented the new 
 - v0.2.0, 18 Aug 2021
- Breaking renamed 
tokenAutototokenToAuto. - Added formatting argument on all methods.
 - Created 
toAuto()function for fractions. - More tests, especially for fractions.
 - More lax node engine setting (set to 
>=12). 
 - Breaking renamed 
 - v0.1.1, 17 Aug 2021
- Fixed and tweaked README badges.
 
 - v0.1.0, 17 Aug 2021
- Big Bang
 
 
This library was inspired from Uniswap SDK core.
Copyright © Thanos Polychronakis and Authors, Licensed under ISC.