// const Decimal = require('decimal.js'); import Decimal from 'decimal.js-light'; Decimal.set({ precision: 40 }); export function getAmountFromUNI(amount): string { return new Decimal(amount).times(new Decimal(10).pow(-18)).toFixed(); } export function getAmountToUNI(amount): string { return new Decimal(amount).times(new Decimal(10).pow(18)).toFixed(0); } export function calculateSaleReturn({ volume, reserve, crr, inputSellAmount }): Decimal | number { const decimalReserve = new Decimal(reserve); const sellAmount = new Decimal(inputSellAmount); if (decimalReserve.isZero()) { return 0; } if (sellAmount.eq(volume)) { return decimalReserve; } if (crr === 100) { return new Decimal(1).mul(decimalReserve).mul(sellAmount).div(volume); } let res = sellAmount.div(volume); // sellAmount / supply res = new Decimal(1).minus(res); // 1 - sellAmount / supply const pow = new Decimal(100).div(crr); // 100 / crr res = res.toPower(pow); // (1 - sellAmount / supply) ^ (100 / crr) res = new Decimal(1).minus(res); // 1 - (1 - sellAmount / supply) ^ (100 / crr) res = decimalReserve.mul(res); // reserve * (1 - (1 - sellAmount / supply) ^ (100 / crr)) return res; } export function getDelegationPrice({ volume, reserve, crr, delegated }, shifted = false): string { const returnAmount = calculateSaleReturn({ crr, volume, reserve, inputSellAmount: delegated, }); const price = new Decimal(returnAmount).div(delegated); return shifted ? getAmountToUNI(price) : price.toFixed(); } export function getCoinPrice({ volume, reserve, crr }, shifted = false): string { const price = calculateSaleReturn({ crr, volume, reserve, inputSellAmount: '1', }); return shifted ? getAmountToUNI(price) : price.toFixed(); }