UNPKG

@chain-registry/utils

Version:
87 lines (86 loc) 3.95 kB
import BigNumber from 'bignumber.js'; import { getAssetByDenom, getAssetBySymbol, getDenomsByCoinGeckoId, getExponentByDenomFromAsset, getExponentFromAsset } from './assets'; export const mapCoinGeckoPricesToDenoms = (assets, prices) => { return Object.keys(prices).reduce((res, geckoId) => { const denoms = getDenomsByCoinGeckoId(assets, geckoId); if (!denoms.length) { throw new Error(`No denom found for CoinGecko ID: ${geckoId}`); } // some tokens list same coingeckoId denoms.forEach(d => { res[d] = prices[geckoId].usd; }); return res; }, {}); }; export const roundDown = (value) => { return new BigNumber(value).decimalPlaces(0, BigNumber.ROUND_DOWN).toString(); }; const getAssetInfo = (assets, symbol, chainName) => { const asset = getAssetBySymbol(assets, symbol, chainName); const denom = asset?.base; const exponent = asset ? getExponentFromAsset(asset) : undefined; if (!denom || exponent === undefined) { throw new Error(`No denom or exponent found for symbol: ${symbol}`); } return { denom, exponent }; }; const getAssetInfoByDenom = (assets, denom, chainName) => { const asset = getAssetByDenom(assets, denom, chainName); const exponent = asset ? getExponentByDenomFromAsset(asset, denom) : undefined; if (exponent === undefined) { throw new Error(`No denom or exponent found for denom: ${denom}`); } return { denom, exponent }; }; const shiftDecimalPlaces = (amount, exponent, direction = 1) => { return new BigNumber(amount).shiftedBy(exponent * direction).toString(); }; export const convertBaseUnitToDollarValue = (assets, prices, symbol, amount, chainName) => { const { denom, exponent } = getAssetInfo(assets, symbol, chainName); const baseAmount = shiftDecimalPlaces(amount, exponent, -1); return new BigNumber(baseAmount).multipliedBy(prices[denom]).toString(); }; export const convertBaseUnitToDollarValueByDenom = (assets, prices, denom, amount, chainName) => { const asset = getAssetByDenom(assets, denom, chainName); if (!asset) { throw new Error(`no asset found from denom:${denom}`); } const assetBase = asset.base; const assetDisplay = asset.display; if (!(assetBase in prices)) { console.warn(`no price found from denom:${denom}`); return '0'; } const exponent = getExponentByDenomFromAsset(asset, assetDisplay); if (exponent === undefined) { throw new Error(`No exponent found for denom: ${denom}`); } const baseAmount = shiftDecimalPlaces(amount, exponent, -1); return new BigNumber(baseAmount).multipliedBy(prices[assetBase]).toString(); }; export const convertDollarValueToBaseUnit = (assets, prices, symbol, value, chainName) => { const { denom, exponent } = getAssetInfo(assets, symbol, chainName); const baseAmount = new BigNumber(value).dividedBy(prices[denom]).toString(); return shiftDecimalPlaces(baseAmount, exponent); }; export const convertBaseUnitToDisplayUnit = (assets, symbol, amount, chainName) => { const { exponent } = getAssetInfo(assets, symbol, chainName); return shiftDecimalPlaces(amount, exponent, -1); }; export const convertBaseUnitToDisplayUnitByDenom = (assets, denom, amount, chainName) => { const asset = getAssetByDenom(assets, denom, chainName); if (!asset) { throw new Error(`no asset found from denom:${denom}`); } const assetDisplay = asset.display; const exponent = getExponentByDenomFromAsset(asset, assetDisplay); if (exponent === undefined) { throw new Error(`No exponent found for denom: ${denom}`); } return shiftDecimalPlaces(amount, exponent, -1); }; export const convertDisplayUnitToBaseUnit = (assets, symbol, amount, chainName) => { const { exponent } = getAssetInfo(assets, symbol, chainName); return shiftDecimalPlaces(amount, exponent); };