UNPKG

@lifi/widget

Version:

LI.FI Widget for cross-chain bridging and swapping. It will drive your multi-chain strategy and attract new users from everywhere.

120 lines 3.86 kB
import { formatUnits } from 'viem'; /** * Format token amount to at least 6 decimals. * @param amount amount to format. * @returns formatted amount. */ export function formatTokenAmount(amount, decimals) { const formattedAmount = amount ? formatUnits(amount, decimals) : '0'; const parsedAmount = Number.parseFloat(formattedAmount); if (!parsedAmount || Number.isNaN(Number(formattedAmount))) { return '0'; } return formattedAmount; } export function formatSlippage(slippage = '', defaultValue = '', returnInitial = false) { if (!slippage) { return slippage; } const parsedSlippage = Number.parseFloat(slippage); if (Number.isNaN(Number(slippage)) && !Number.isNaN(parsedSlippage)) { return parsedSlippage.toString(); } if (Number.isNaN(parsedSlippage)) { return defaultValue; } if (parsedSlippage > 100) { return '100'; } if (parsedSlippage < 0) { return Math.abs(parsedSlippage).toString(); } if (returnInitial) { return slippage; } return parsedSlippage.toString(); } export function formatInputAmount(amount, decimals = null, returnInitial = false) { if (!amount) { return amount; } let formattedAmount = amount.trim().replaceAll(',', '.'); if (formattedAmount.startsWith('.')) { formattedAmount = `0${formattedAmount}`; } const parsedAmount = Number.parseFloat(formattedAmount); if (Number.isNaN(Number(formattedAmount)) && !Number.isNaN(parsedAmount)) { return parsedAmount.toString(); } if (Number.isNaN(Math.abs(Number(formattedAmount)))) { return ''; } if (returnInitial) { return formattedAmount; } let [integer, fraction = ''] = formattedAmount.split('.'); if (decimals !== null && fraction.length > decimals) { fraction = fraction.slice(0, decimals); } integer = integer.replace(/^0+|-/, ''); fraction = fraction.replace(/(0+)$/, ''); return `${integer || (fraction ? '0' : '')}${fraction ? `.${fraction}` : ''}`; } export function formatTokenPrice(amount, price, decimals) { if (!amount || !price) { return 0; } const formattedAmount = typeof amount === 'bigint' && decimals !== undefined ? formatUnits(amount, decimals) : amount.toString(); if (Number.isNaN(Number(formattedAmount)) || Number.isNaN(Number(price))) { return 0; } return Number.parseFloat(formattedAmount) * Number.parseFloat(price); } /** * Formatter for price value to token amount */ const formatter = new Intl.NumberFormat('en', { notation: 'standard', roundingPriority: 'morePrecision', maximumSignificantDigits: 21, maximumFractionDigits: 21, useGrouping: false, }); /** * Convert price value to token amount */ export function priceToTokenAmount(priceValue, priceUSD) { if (!priceValue || !priceUSD) { return '0'; } const numericPriceValue = Number.parseFloat(priceValue); const numericPrice = Number.parseFloat(priceUSD); if (Number.isNaN(numericPriceValue) || Number.isNaN(numericPrice) || !numericPrice) { return '0'; } return formatter.format(numericPriceValue / numericPrice); } const units = [ ['day', 86400], ['hour', 3600], ['minute', 60], ['second', 1], ]; export function formatDuration(seconds, locale) { const match = units.find(([, v]) => seconds >= v); const amount = match ? Math.floor(seconds / match[1]) : 0; const unit = match?.[0] ?? 'second'; return amount.toLocaleString(locale, { style: 'unit', unit, unitDisplay: 'narrow', }); } export function wrapLongWords(text) { return text.replace(/\S{32,}/g, (word) => `${word.slice(0, 8)}...${word.slice(-4)}`); } //# sourceMappingURL=format.js.map