37 lines
1.2 KiB
TypeScript

import { BigNumber } from '@0x/utils';
import { EdpsWrapper } from '../../data_sources/dex_prices';
import { Slippage } from '../../entities';
/**
* Calculates slippage and returns Slippage entity.
*
* @param usdAmount Amount to buy/sell in USD.
* @param exchange Exchange where we are calculating slippage.
* @param buyEdps Ethereum DEX price service object for buy side.
* @param sellEdps Ethereum DEX price service object for sell side.
*
*/
export function calculateSlippage(
usdAmount: number,
exchange: string,
buyEdps: EdpsWrapper,
sellEdps: EdpsWrapper,
): Slippage {
const b = buyEdps[exchange];
const s = sellEdps[exchange];
const slippage = new Slippage();
if (b && s && b.avgPrice && s.avgPrice) {
slippage.observedTimestamp = b.timestamp;
slippage.symbol = b.tokenSymbol;
slippage.exchange = exchange;
slippage.usdAmount = new BigNumber(usdAmount);
slippage.tokenAmount = new BigNumber(Number(b.tokenAmount)); // API returns a string
slippage.avgPriceInEthBuy = new BigNumber(b.avgPrice);
slippage.avgPriceInEthSell = new BigNumber(s.avgPrice);
slippage.slippage = new BigNumber((b.avgPrice - s.avgPrice) / b.avgPrice);
}
return slippage;
}