115 lines
2.7 KiB
TypeScript
115 lines
2.7 KiB
TypeScript
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<T>(argument: T | undefined): argument is T {
|
|
return argument !== undefined
|
|
}
|