scaled-number
v2.2.0
Published
A class for managing large numbers with a decimal scale, useful for web3 development
Maintainers
Readme
Scaled Number
A class for managing large numbers with a decimal scale, useful for web3 development.
Install
yarn add scaled-numberBasic Usage
import { ScaledNumber } from 'scaled-number';
const scaledNumber = ScaledNumber.fromUnscaled(123);
console.log(scaledNumber.mul(10).toString());Example Web3 Usage
import { ScaledNumber } from 'scaled-number';
import { getTokenDecimals, getContract, getPrice } from "helpers";
export interface Pool {
symbol: string;
tvl: ScaledNumber;
apy: ScaledNumber;
}
// Returns some key info about a Pool
export const getPoolInfo = async (poolAddress: string): Pool => {
const pool = getContract(poolAddress);
// Getting Pool info
const [
underlyingAddress,
tvlBN,
apyBN
] = await Promise.all([
pool.underlyingAddress(),
pool.tvl(),
pool.apy(),
]);
// Getting the underlying info
const underlying = getContract(underlyingAddress);
const [
decimals,
symbol
] = await Promise.all([
underlying.decimals(),
underlying.symbol()
]);
// Getting the TVL as a Scaled Number (using the underlying decimals)
const tvl = new ScaledNumber(tvlBN, decimals);
// Getting the APY as a Scaled Number (uses default 18 decimals)
const apy = new ScaledNumber(apyBN);
return {
symbol
tvl,
apy
}
}
// Logs key information about a pool
export const logPoolInfo = async (pool: Pool): void => {
// Getting the price of the underlying
const price = await getPrice(pool.symbol);
console.log(`Underlying Balance: ${pool.tvl.toCryptoString()} ${pool.symbol}`);
// Output: `Underlying Balance: 12,456.87 ETH`
console.log(`TVL: ${pool.tvl.toCompactUsdValue(price)}`);
// Output: `TVL: $13.4m`
console.log(pool.apy.toPercent())
// Output: `24.34%`
}Creating Scaled Number
From bigint
new ScaledNumber(bigInt: bigint, decimals?: number);import { ScaledNumber } from 'scaled-number';
const scaledNumber = new ScaledNumber(BigInt(123));From BigNumber
new ScaledNumber(bigNumber: BigNumber, decimals?: number);import { ScaledNumber } from 'scaled-number';
import { BigNumber } from '@ethersproject/bignumber';
const scaledNumber = new ScaledNumber(BigNumber.from(123));From Unscaled
fromUnscaled(value: number | string = 0, decimals = 18)import { ScaledNumber } from 'scaled-number';
const scaledNumber = ScaledNumber.fromUnscaled(123, 8);From Plain
fromPlain(value: PlainScaledNumber)import { ScaledNumber } from 'scaled-number';
const scaledNumber = ScaledNumber.fromPlain({
value: '123000000',
decimals: 6,
});Manipulate
Add
add(other: ScaledNumber)const one = ScaledNumber.fromUnscaled(1);
const two = ScaledNumber.fromUnscaled(2);
const three = one.add(two);
console.log(three.toString()); // 3Subtract
sub(other: ScaledNumber)const three = ScaledNumber.fromUnscaled(3);
const two = ScaledNumber.fromUnscaled(2);
const one = three.sub(two);
console.log(one.toString()); // 1Maximum
max(other: ScaledNumber)const three = ScaledNumber.fromUnscaled(3);
const two = ScaledNumber.fromUnscaled(2);
const max = three.max(two);
console.log(max.toString()); // 3Mimimum
min(other: ScaledNumber)const three = ScaledNumber.fromUnscaled(3);
const two = ScaledNumber.fromUnscaled(2);
const min = three.min(two);
console.log(min.toString()); // 2Multiply
mul(value: number | string | ScaledNumber)const three = ScaledNumber.fromUnscaled(3);
const six = three.mul(2);
console.log(six.toString()); // 6Divide
div(value: number | string | ScaledNumber)const six = ScaledNumber.fromUnscaled(3);
const three = three.div(2);
console.log(three.toString()); // 3Display
String
toString(): stringconst sn = ScaledNumber.fromUnscaled(1.234);
console.log(sn.toString()); // 1.234Number
toNumber(): numberconst sn = ScaledNumber.fromUnscaled(1.234);
console.log(sn.toNumber()); // 1.234Crypto String
toCryptoString(): stringconst sn = ScaledNumber.fromUnscaled('12345678.12345678');
console.log(sn.toCryptoString()); // 12,345,678const sn = ScaledNumber.fromUnscaled('12.12345678');
console.log(sn.toCryptoString()); // 12.123const sn = ScaledNumber.fromUnscaled('0.0000000123');
console.log(sn.toCryptoString()); // 0.0000000123Crypto String
toCryptoString(): stringconst sn = ScaledNumber.fromUnscaled('12345678.12345678');
console.log(sn.toCryptoString()); // 12,345,678const sn = ScaledNumber.fromUnscaled('12.12345678');
console.log(sn.toCryptoString()); // 12.123const sn = ScaledNumber.fromUnscaled('0.0000000123');
console.log(sn.toCryptoString()); // 0.0000000123USD Value
toUsdValue(price: number): stringconst sn = ScaledNumber.fromUnscaled('12345678.12345678');
console.log(sn.toUsdValue(7)); // $86,419,746.86Compact USD Value
toCompactUsdValue(price: number): stringconst sn = ScaledNumber.fromUnscaled('12345678.12345678');
console.log(sn.toCompactUsdValue(7)); // $86,4mPercent
toPercent(): stringconst sn = ScaledNumber.fromUnscaled('0.12345678');
console.log(sn.toPercent()); // 12.34%Query
Value
value: bigint;const sn = ScaledNumber.fromUnscaled('0.123', 5);
console.log(sn.value.toString()); // 12300Decimals
decimals: number;const sn = ScaledNumber.fromUnscaled('0.123', 5);
console.log(sn.decimals); // 5toPlain
toPlain(): PlainScaledNumberconst sn = ScaledNumber.fromUnscaled('0.123', 5);
console.log(sn.toPlain()); // { value: "12300", decimals: 5 }Is Zero
isZero(): booleanconst sn = ScaledNumber.fromUnscaled('0.123', 5);
console.log(sn.isZero()); // falseconst sn = ScaledNumber.fromUnscaled();
console.log(sn.isZero()); // trueIs Negative
isNegative(): booleanconst sn = ScaledNumber.fromUnscaled('0.123', 5);
console.log(sn.isNegative()); // falseconst sn = ScaledNumber.fromUnscaled('-0.123', 5);
console.log(sn.isNegative()); // trueEqual
eq(): booleanconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(2);
console.log(first.eq(second)); // falseconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(1);
console.log(first.eq(second)); // trueGreater Than
gt(): booleanconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(2);
console.log(first.gt(second)); // falseGreater Than or Equal
gte(): booleanconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(1);
console.log(first.gte(second)); // trueLess Than
lt(): booleanconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(2);
console.log(first.lt(second)); // trueLess Than or Equal
lte(): booleanconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(1);
console.log(first.lte(second)); // trueLess Than or Equal
lte(): booleanconst first = ScaledNumber.fromUnscaled(1);
const second = ScaledNumber.fromUnscaled(1);
console.log(first.lte(second)); // true