numbers
This module provides comprehensive utilities for handling numeric operations, formatting, and conversions in the GMX protocol. It includes functions for working with BigInt values, formatting currencies and percentages, handling decimal precision, and converting between different numeric representations.
Types
Numeric: number | bigint- Union type for numeric valuesBigNumberish: string | Numeric- Union type for values that can be converted to BigInt
Constants
USD_DECIMALS: 30- Standard decimal precision for USD valuesBASIS_POINTS_DIVISOR: 10000- Divisor for basis points calculationsBASIS_POINTS_DIVISOR_BIGINT: 10000n- BigInt version of basis points divisorBASIS_POINTS_DECIMALS: 4- Decimal places for basis pointsPRECISION_DECIMALS: 30- Standard precision decimal placesPRECISION: bigint- Precision constant (10^30)BN_ZERO: 0n- BigInt zero constantBN_ONE: 1n- BigInt one constantBN_NEGATIVE_ONE: -1n- BigInt negative one constantMaxUint256: bigint- Maximum uint256 valuePERCENT_PRECISION_DECIMALS: 28- Decimal precision for percentagesTRIGGER_PREFIX_ABOVE: ">"- Prefix for values above thresholdTRIGGER_PREFIX_BELOW: "<"- Prefix for values below threshold
import { USD_DECIMALS, PRECISION, BN_ZERO } from "@gmx-ui/sdk/utils/numbers";
const usdValue = 1000n * 10n ** BigInt(USD_DECIMALS);
const calculation = (usdValue * PRECISION) / 100n;
Methods
expandDecimals
expandDecimals(n: BigNumberish, decimals: number): bigint
Expands a number by adding decimal places (multiplying by 10^decimals).
import { expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(100, 18); // 100 * 10^18
const usdAmount = expandDecimals(50, 30); // 50 * 10^30
basisPointsToFloat
basisPointsToFloat(basisPoints: bigint): bigint
Converts basis points to a float representation with precision scaling.
import { basisPointsToFloat } from "@gmx-ui/sdk/utils/numbers";
const bps = 250n; // 2.5%
const floatValue = basisPointsToFloat(bps);
getBasisPoints
getBasisPoints(numerator: bigint, denominator: bigint, shouldRoundUp?: boolean): bigint
Calculates basis points from numerator and denominator with optional rounding.
import { getBasisPoints } from "@gmx-ui/sdk/utils/numbers";
const fee = getBasisPoints(25n, 1000n); // 250 basis points (2.5%)
const feeRoundedUp = getBasisPoints(25n, 1000n, true);
roundUpMagnitudeDivision
roundUpMagnitudeDivision(a: bigint, b: bigint): bigint
Performs division with rounding up, handling negative values correctly.
import { roundUpMagnitudeDivision } from "@gmx-ui/sdk/utils/numbers";
const result = roundUpMagnitudeDivision(100n, 3n); // 34n
const negativeResult = roundUpMagnitudeDivision(-100n, 3n); // -33n
applyFactor
applyFactor(value: bigint, factor: bigint): bigint
Applies a factor to a value using precision scaling.
import { applyFactor, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const value = expandDecimals(1000, 30);
const factor = expandDecimals(15, 29); // 1.5x factor
const result = applyFactor(value, factor);
numberToBigint
numberToBigint(value: number, decimals: number): bigint
Converts a JavaScript number to BigInt with specified decimal places.
import { numberToBigint } from "@gmx-ui/sdk/utils/numbers";
const amount = numberToBigint(123.456, 18);
const negativeAmount = numberToBigint(-50.25, 6);
trimZeroDecimals
trimZeroDecimals(amount: string): string
Removes trailing zeros from decimal representation.
import { trimZeroDecimals } from "@gmx-ui/sdk/utils/numbers";
const trimmed = trimZeroDecimals("123.000"); // "123"
const unchanged = trimZeroDecimals("123.456"); // "123.456"
bigintToNumber
bigintToNumber(value: bigint, decimals: number): number
Converts a BigInt with decimals to a JavaScript number.
import { bigintToNumber, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const bigintValue = expandDecimals(123456, 18);
const numberValue = bigintToNumber(bigintValue, 18); // 123.456
adjustForDecimals
adjustForDecimals(amount: bigint, divDecimals: number, mulDecimals: number): bigint
Adjusts an amount from one decimal precision to another.
import { adjustForDecimals, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(100, 18);
const adjusted = adjustForDecimals(amount, 18, 6); // Convert from 18 to 6 decimals
formatUsd
formatUsd(usd?: bigint, opts?: object): string | undefined
Parameters
usd: bigint- USD amount to formatopts: object- Formatting options including fallbackToZero, displayDecimals, maxThreshold, minThreshold, displayPlus, visualMultiplier
Formats a USD amount with proper currency symbol and decimal places.
import { formatUsd, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const usdAmount = expandDecimals(1234567, 30);
const formatted = formatUsd(usdAmount); // "$1,234.57"
const withPlus = formatUsd(usdAmount, { displayPlus: true }); // "+$1,234.57"
formatBigUsd
formatBigUsd(amount: bigint, opts?: object): string
Parameters
amount: bigint- USD amount to formatopts: object- Options with displayDecimals property
Formats large USD amounts without threshold limits.
import { formatBigUsd, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const largeAmount = expandDecimals(999999999999, 30);
const formatted = formatBigUsd(largeAmount); // "$999,999,999,999"
formatDeltaUsd
formatDeltaUsd(deltaUsd?: bigint, percentage?: bigint, opts?: object): string | undefined
Parameters
deltaUsd: bigint- USD delta amountpercentage: bigint- Percentage changeopts: object- Options including fallbackToZero and showPlusForZero
Formats USD delta with percentage change.
import { formatDeltaUsd, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const delta = expandDecimals(150, 30);
const percentage = expandDecimals(5, 2); // 5%
const formatted = formatDeltaUsd(delta, percentage); // "+$150.00 (+5.00%)"
formatPercentage
formatPercentage(percentage?: bigint, opts?: object): string | undefined
Parameters
percentage: bigint- Percentage value to formatopts: object- Options including fallbackToZero, signed, displayDecimals, bps, showPlus
Formats percentage values with proper signs and decimal places.
import { formatPercentage } from "@gmx-ui/sdk/utils/numbers";
const percentage = 525n; // 5.25% in basis points
const formatted = formatPercentage(percentage); // "+5.25%"
const unsigned = formatPercentage(percentage, { signed: false }); // "5.25%"
formatTokenAmount
formatTokenAmount(amount?: bigint, tokenDecimals?: number, symbol?: string, opts?: object): string | undefined
Parameters
amount: bigint- Token amount to formattokenDecimals: number- Token decimal placessymbol: string- Token symbolopts: object- Formatting options including showAllSignificant, displayDecimals, fallbackToZero, useCommas, minThreshold, maxThreshold, displayPlus, isStable
Formats token amounts with symbol and proper decimal handling.
import { formatTokenAmount, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(1234567, 18);
const formatted = formatTokenAmount(amount, 18, "ETH"); // "1.2346 ETH"
const withCommas = formatTokenAmount(amount, 18, "ETH", { useCommas: true }); // "1.2346 ETH"
formatTokenAmountWithUsd
formatTokenAmountWithUsd(tokenAmount?: bigint, usdAmount?: bigint, tokenSymbol?: string, tokenDecimals?: number, opts?: object): string | undefined
Parameters
tokenAmount: bigint- Token amountusdAmount: bigint- USD equivalent amounttokenSymbol: string- Token symboltokenDecimals: number- Token decimal placesopts: object- Options including fallbackToZero, displayDecimals, displayPlus, isStable
Formats token amount with USD equivalent in parentheses.
import { formatTokenAmountWithUsd, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const tokenAmount = expandDecimals(1, 18);
const usdAmount = expandDecimals(2500, 30);
const formatted = formatTokenAmountWithUsd(tokenAmount, usdAmount, "ETH", 18);
// "1.0000 ETH ($2,500.00)"
formatRatePercentage
formatRatePercentage(rate?: bigint, opts?: object): string
Parameters
rate: bigint- Rate value to formatopts: object- Options with displayDecimals and signed properties
Formats rate as percentage with optional sign display.
import { formatRatePercentage, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const rate = expandDecimals(5, 28); // 0.05 (5%)
const formatted = formatRatePercentage(rate); // "+5.0000%"
const unsigned = formatRatePercentage(rate, { signed: false }); // "5.0000%"
formatUsdPrice
formatUsdPrice(price?: bigint, opts?: object): string | undefined
Parameters
price: bigint- Price to formatopts: object- Formatting options (same as formatUsd)
Formats USD price with dynamic decimal precision based on price magnitude.
import { formatUsdPrice, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const price = expandDecimals(2500, 30);
const formatted = formatUsdPrice(price); // "$2,500.00"
const smallPrice = expandDecimals(1, 27);
const formattedSmall = formatUsdPrice(smallPrice); // "$0.001000"
formatPercentageDisplay
formatPercentageDisplay(percentage: number, hideThreshold?: number): string
Formats percentage display with optional hiding threshold.
import { formatPercentageDisplay } from "@gmx-ui/sdk/utils/numbers";
const formatted = formatPercentageDisplay(5.25); // "5.25%"
const hidden = formatPercentageDisplay(0.5, 1); // ""
formatAmountHuman
formatAmountHuman(amount: BigNumberish | undefined, tokenDecimals: number, showDollar?: boolean, displayDecimals?: number): string
Formats amounts in human-readable format with k/m/b suffixes.
import { formatAmountHuman, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(1500000, 18);
const formatted = formatAmountHuman(amount, 18); // "1.5m"
const withDollar = formatAmountHuman(amount, 18, true); // "$1.5m"
formatBalanceAmount
formatBalanceAmount(amount: bigint, tokenDecimals: number, tokenSymbol?: string, opts?: object): string
Parameters
amount: bigint- Balance amount to formattokenDecimals: number- Token decimal placestokenSymbol: string- Token symbolopts: object- Options including showZero, toExponential, isStable, signed
Formats balance amounts with dynamic precision based on magnitude.
import { formatBalanceAmount, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const balance = expandDecimals(123, 15); // Very small amount
const formatted = formatBalanceAmount(balance, 18, "ETH"); // "0.000123 ETH"
const zero = formatBalanceAmount(0n, 18, "ETH"); // "-"
const showZero = formatBalanceAmount(0n, 18, "ETH", { showZero: true }); // "0.0000 ETH"
formatFactor
formatFactor(factor: bigint): string
Formats factor values with appropriate decimal precision.
import { formatFactor, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const factor = expandDecimals(15, 29); // 1.5x factor
const formatted = formatFactor(factor); // "1.5"
numberWithCommas
numberWithCommas(x: BigNumberish, opts?: object): string
Parameters
x: BigNumberish- Number to formatopts: object- Options with showDollar property
Adds comma separators to numbers.
import { numberWithCommas } from "@gmx-ui/sdk/utils/numbers";
const formatted = numberWithCommas(1234567); // "1,234,567"
const withDollar = numberWithCommas(1234567, { showDollar: true }); // "$1,234,567"
formatAmount
formatAmount(amount: BigNumberish | undefined, tokenDecimals: number, displayDecimals?: number, useCommas?: boolean, defaultValue?: string, visualMultiplier?: number): string
Core formatting function for amounts with customizable options.
import { formatAmount, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(1234567, 18);
const formatted = formatAmount(amount, 18, 4, true); // "1.2346"
const withCommas = formatAmount(amount, 18, 2, true); // "1.23"
formatKeyAmount
formatKeyAmount(map: object, key: keyof object, tokenDecimals: number, displayDecimals: number, useCommas?: boolean): string
Formats amount from object property.
import { formatKeyAmount } from "@gmx-ui/sdk/utils/numbers";
const data = { balance: 1234567890000000000n };
const formatted = formatKeyAmount(data, "balance", 18, 4); // "1.2346"
formatArrayAmount
formatArrayAmount(arr: any[], index: number, tokenDecimals: number, displayDecimals?: number, useCommas?: boolean): string
Formats amount from array element.
import { formatArrayAmount } from "@gmx-ui/sdk/utils/numbers";
const amounts = [1234567890000000000n, 9876543210000000000n];
const formatted = formatArrayAmount(amounts, 0, 18, 4); // "1.2346"
formatAmountFree
formatAmountFree(amount: BigNumberish, tokenDecimals: number, displayDecimals?: number): string
Formats amount without padding zeros.
import { formatAmountFree, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(123, 18);
const formatted = formatAmountFree(amount, 18, 6); // "0.000123"
getLimitedDisplay
getLimitedDisplay(amount: bigint, tokenDecimals: number, opts?: object): object
Parameters
amount: bigint- Amount to checktokenDecimals: number- Token decimal placesopts: object- Options with maxThreshold and minThreshold
Gets display information with threshold symbols.
import { getLimitedDisplay, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const amount = expandDecimals(1, 15); // Very small amount
const display = getLimitedDisplay(amount, 18);
// { symbol: "<", value: minThreshold }
limitDecimals
limitDecimals(amount: BigNumberish, maxDecimals?: number): string
Limits decimal places in string representation.
import { limitDecimals } from "@gmx-ui/sdk/utils/numbers";
const limited = limitDecimals("123.456789", 4); // "123.4567"
const noLimit = limitDecimals("123.456789"); // "123.456789"
padDecimals
padDecimals(amount: BigNumberish, minDecimals: number): string
Pads decimal places to minimum required.
import { padDecimals } from "@gmx-ui/sdk/utils/numbers";
const padded = padDecimals("123.4", 4); // "123.4000"
const integer = padDecimals("123", 2); // "123.00"
getPlusOrMinusSymbol
getPlusOrMinusSymbol(value?: bigint, opts?: object): string
Parameters
value: bigint- Value to get symbol foropts: object- Options with showPlusForZero property
Returns appropriate plus or minus symbol for a value.
import { getPlusOrMinusSymbol } from "@gmx-ui/sdk/utils/numbers";
const positive = getPlusOrMinusSymbol(100n); // "+"
const negative = getPlusOrMinusSymbol(-100n); // "-"
const zero = getPlusOrMinusSymbol(0n); // ""
const zeroWithPlus = getPlusOrMinusSymbol(0n, { showPlusForZero: true }); // "+"
roundWithDecimals
roundWithDecimals(value: BigNumberish, opts: object): bigint
Parameters
value: BigNumberish- Value to roundopts: object- Options with displayDecimals and decimals properties
Rounds value to specified decimal places.
import { roundWithDecimals } from "@gmx-ui/sdk/utils/numbers";
const rounded = roundWithDecimals(123456789n, { displayDecimals: 4, decimals: 8 });
toBigNumberWithDecimals
toBigNumberWithDecimals(value: string, decimals: number): bigint
Converts string value to BigInt with decimals.
import { toBigNumberWithDecimals } from "@gmx-ui/sdk/utils/numbers";
const bigint = toBigNumberWithDecimals("123.456", 18);
bigNumberify
bigNumberify(n?: BigNumberish | null | undefined): bigint | undefined
Safely converts value to BigInt.
import { bigNumberify } from "@gmx-ui/sdk/utils/numbers";
const safe = bigNumberify("123"); // 123n
const invalid = bigNumberify("invalid"); // undefined
parseValue
parseValue(value: string, tokenDecimals: number): bigint | undefined
Parses a string value to BigInt with specified decimals.
import { parseValue } from "@gmx-ui/sdk/utils/numbers";
const parsed = parseValue("123.456", 18);
const invalid = parseValue("invalid", 18); // undefined
roundUpDivision
roundUpDivision(a: bigint, b: bigint): bigint
Performs division with rounding up.
import { roundUpDivision } from "@gmx-ui/sdk/utils/numbers";
const result = roundUpDivision(100n, 3n); // 34n
roundToTwoDecimals
roundToTwoDecimals(n: number): number
Rounds number to two decimal places.
import { roundToTwoDecimals } from "@gmx-ui/sdk/utils/numbers";
const rounded = roundToTwoDecimals(123.456789); // 123.46
roundToOrder
roundToOrder(n: bigint, significantDigits?: number): bigint
Rounds to specified significant digits.
import { roundToOrder } from "@gmx-ui/sdk/utils/numbers";
const rounded = roundToOrder(123456789n, 3); // 123000000n
roundBigIntToDecimals
roundBigIntToDecimals(value: bigint, tokenDecimals: number, roundToDecimals: number): bigint
Rounds BigInt to specific decimal precision.
import { roundBigIntToDecimals } from "@gmx-ui/sdk/utils/numbers";
const rounded = roundBigIntToDecimals(123456789n, 18, 6);
minBigNumber
minBigNumber(...args: bigint[]): bigint | undefined
Returns minimum value from BigInt arguments.
import { minBigNumber } from "@gmx-ui/sdk/utils/numbers";
const min = minBigNumber(100n, 50n, 200n); // 50n
maxbigint
maxbigint(...args: bigint[]): bigint | undefined
Returns maximum value from BigInt arguments.
import { maxbigint } from "@gmx-ui/sdk/utils/numbers";
const max = maxbigint(100n, 50n, 200n); // 200n
removeTrailingZeros
removeTrailingZeros(amount: string | number): string | number
Removes trailing zeros from numeric string.
import { removeTrailingZeros } from "@gmx-ui/sdk/utils/numbers";
const cleaned = removeTrailingZeros("123.000"); // 123
serializeBigIntsInObject
serializeBigIntsInObject(obj: object): object
Serializes BigInt values in object for JSON compatibility.
import { serializeBigIntsInObject } from "@gmx-ui/sdk/utils/numbers";
const obj = { amount: 123n, name: "test" };
const serialized = serializeBigIntsInObject(obj);
deserializeBigIntsInObject
deserializeBigIntsInObject(obj: object): object
Deserializes BigInt values from serialized object.
import { deserializeBigIntsInObject } from "@gmx-ui/sdk/utils/numbers";
const serialized = { amount: { type: "bigint", value: "123" } };
const deserialized = deserializeBigIntsInObject(serialized);
calculateDisplayDecimals
calculateDisplayDecimals(price?: bigint, decimals?: number, visualMultiplier?: number, isStable?: boolean): number
Calculates appropriate number of decimal places to display based on price magnitude.
import { calculateDisplayDecimals, expandDecimals } from "@gmx-ui/sdk/utils/numbers";
const highPrice = expandDecimals(2500, 30);
const decimals = calculateDisplayDecimals(highPrice); // 2
const lowPrice = expandDecimals(1, 27);
const lowDecimals = calculateDisplayDecimals(lowPrice); // 6
clamp
clamp(value: number, min: number, max: number): number
Clamps value between minimum and maximum bounds.
import { clamp } from "@gmx-ui/sdk/utils/numbers";
const clamped = clamp(150, 0, 100); // 100
const inRange = clamp(50, 0, 100); // 50
absDiffBps
absDiffBps(value: bigint, base: bigint): bigint
Calculates absolute difference in basis points.
import { absDiffBps } from "@gmx-ui/sdk/utils/numbers";
const diff = absDiffBps(1050n, 1000n); // 500n (5%)