export function calculateSpread(
amm: AMM,
oraclePriceData: OraclePriceData,
now?: BN,
reservePrice?: BN
): [number, number] {
if (amm.baseSpread == 0 || amm.curveUpdateIntensity == 0) {
return [amm.baseSpread / 2, amm.baseSpread / 2];
}
const reservePrice = calculatePrice(
amm.baseAssetReserve,
amm.quoteAssetReserve,
amm.pegMultiplier
);
const targetPrice = oraclePriceData?.price || reservePrice;
const targetMarkSpreadPct = reservePrice
.sub(targetPrice)
.mul(BID_ASK_SPREAD_PRECISION)
.div(reservePrice);
const confIntervalPct = getNewOracleConfPct(
amm,
oraclePriceData,
reservePrice,
now
);
const [longSpread, shortSpread] = calculateSpreadBN(
amm.baseSpread,
targetMarkSpreadPct,
confIntervalPct,
amm.maxSpread,
// ... more parameters
);
return [longSpread, shortSpread];
}