@chain-registry/utils
Version:
Chain Registry Utils
87 lines (86 loc) • 3.95 kB
JavaScript
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);
};