import { PublicKey } from '@solana/web3.js' import BN from 'bn.js' export function isValidPublicKey(key) { if (!key) { return false } try { new PublicKey(key) return true } catch { return false } } export async function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)) } export const percentFormat = new Intl.NumberFormat(undefined, { style: 'percent', minimumFractionDigits: 2, maximumFractionDigits: 2, }) export function floorToDecimal( value: number, decimals: number | undefined | null ) { return decimals ? Math.floor(value * 10 ** decimals) / 10 ** decimals : Math.floor(value) } export function roundToDecimal( value: number, decimals: number | undefined | null ) { return decimals ? Math.round(value * 10 ** decimals) / 10 ** decimals : value } export function getDecimalCount(value): number { if ( !isNaN(value) && Math.floor(value) !== value && value.toString().includes('.') ) return value.toString().split('.')[1].length || 0 if ( !isNaN(value) && Math.floor(value) !== value && value.toString().includes('e') ) return parseInt(value.toString().split('e-')[1] || '0') return 0 } export function divideBnToNumber(numerator: BN, denominator: BN): number { const quotient = numerator.div(denominator).toNumber() const rem = numerator.umod(denominator) const gcd = rem.gcd(denominator) return quotient + rem.div(gcd).toNumber() / denominator.div(gcd).toNumber() } export const formatBalanceDisplay = (balance, fixedDecimals) => { // Get the deciamal part const dPart = balance - Math.trunc(balance) return ( Math.trunc(balance) + Math.floor(dPart * Math.pow(10, fixedDecimals)) / Math.pow(10, fixedDecimals) ) } export function getTokenMultiplierFromDecimals(decimals: number): BN { return new BN(10).pow(new BN(decimals)) } export function abbreviateAddress(address: PublicKey, size = 4) { const base58 = address.toBase58() return base58.slice(0, size) + '…' + base58.slice(-size) } export function isEqual(obj1, obj2, keys) { if (!keys && Object.keys(obj1).length !== Object.keys(obj2).length) { return false } keys = keys || Object.keys(obj1) for (const k of keys) { if (obj1[k] !== obj2[k]) { // shallow comparison return false } } return true } export function groupBy(list, keyGetter) { const map = new Map() list.forEach((item) => { const key = keyGetter(item) const collection = map.get(key) if (!collection) { map.set(key, [item]) } else { collection.push(item) } }) return map } export function isDefined(argument: T | undefined): argument is T { return argument !== undefined }