37 lines
1.2 KiB
TypeScript
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;
|
|
}
|