Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion sdk/src/dlob/orderBookLevels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,12 +182,14 @@ export function getVammL2Generator({
numOrders,
now = new BN(Math.floor(Date.now() / 1000)),
topOfBookQuoteAmounts = [],
latestSlot,
}: {
marketAccount: PerpMarketAccount;
mmOraclePriceData: MMOraclePriceData;
numOrders: number;
now?: BN;
topOfBookQuoteAmounts?: BN[];
latestSlot?: BN;
}): L2OrderBookGenerator {
const updatedAmm = calculateUpdatedAMM(marketAccount.amm, mmOraclePriceData);
const paused = isOperationPaused(
Expand All @@ -211,7 +213,8 @@ export function getVammL2Generator({
updatedAmm,
mmOraclePriceData,
now,
isVariant(marketAccount.contractType, 'prediction')
isVariant(marketAccount.contractType, 'prediction'),
latestSlot
);

const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
Expand Down
53 changes: 29 additions & 24 deletions sdk/src/math/amm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,14 +197,16 @@ export function calculateUpdatedAMMSpreadReserves(
amm: AMM,
direction: PositionDirection,
mmOraclePriceData: MMOraclePriceData,
isPrediction = false
isPrediction = false,
latestSlot?: BN
): { baseAssetReserve: BN; quoteAssetReserve: BN; sqrtK: BN; newPeg: BN } {
const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
const [shortReserves, longReserves] = calculateSpreadReserves(
newAmm,
mmOraclePriceData,
undefined,
isPrediction
isPrediction,
latestSlot
);

const dirReserves = isVariant(direction, 'long')
Expand All @@ -225,7 +227,8 @@ export function calculateBidAskPrice(
amm: AMM,
mmOraclePriceData: MMOraclePriceData,
withUpdate = true,
isPrediction = false
isPrediction = false,
latestSlot?: BN
): [BN, BN] {
let newAmm: AMM;
if (withUpdate) {
Expand All @@ -238,7 +241,8 @@ export function calculateBidAskPrice(
newAmm,
mmOraclePriceData,
undefined,
isPrediction
isPrediction,
latestSlot
);

const askPrice = calculatePrice(
Expand Down Expand Up @@ -939,7 +943,8 @@ export function calculateSpreadReserves(
amm: AMM,
mmOraclePriceData: MMOraclePriceData,
now?: BN,
isPrediction = false
isPrediction = false,
latestSlot?: BN
) {
function calculateSpreadReserve(
spread: number,
Expand Down Expand Up @@ -1041,28 +1046,28 @@ export function calculateSpreadReserves(
amm.curveUpdateIntensity > 100;

if (doReferencePricOffsetSmooth) {
if (mmOraclePriceData.slot !== amm.lastUpdateSlot) {
const slotsPassed =
mmOraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
const raw = Math.trunc(
Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10
);
const maxAllowed =
Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
const slotsPassed =
latestSlot != null
? BN.max(latestSlot.sub(amm.lastUpdateSlot), ZERO).toNumber()
: 0;
const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
const raw = Math.trunc(
Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10
);
const maxAllowed =
Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);

const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;

referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;

if (referencePriceDelta < 0) {
longSpread += Math.abs(referencePriceDelta);
shortSpread += Math.abs(referencePriceOffset);
} else {
shortSpread += Math.abs(referencePriceDelta);
longSpread += Math.abs(referencePriceOffset);
}
if (referencePriceDelta < 0) {
longSpread += Math.abs(referencePriceDelta);
shortSpread += Math.abs(referencePriceOffset);
} else {
shortSpread += Math.abs(referencePriceDelta);
longSpread += Math.abs(referencePriceOffset);
}
}

Expand Down
14 changes: 10 additions & 4 deletions sdk/src/math/market.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,16 @@ export function calculateReservePrice(
*/
export function calculateBidPrice(
market: PerpMarketAccount,
mmOraclePriceData: MMOraclePriceData
mmOraclePriceData: MMOraclePriceData,
latestSlot?: BN
): BN {
const { baseAssetReserve, quoteAssetReserve, newPeg } =
calculateUpdatedAMMSpreadReserves(
market.amm,
PositionDirection.SHORT,
mmOraclePriceData
mmOraclePriceData,
undefined,
latestSlot
);

return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
Expand All @@ -81,13 +84,16 @@ export function calculateBidPrice(
*/
export function calculateAskPrice(
market: PerpMarketAccount,
mmOraclePriceData: MMOraclePriceData
mmOraclePriceData: MMOraclePriceData,
latestSlot?: BN
): BN {
const { baseAssetReserve, quoteAssetReserve, newPeg } =
calculateUpdatedAMMSpreadReserves(
market.amm,
PositionDirection.LONG,
mmOraclePriceData
mmOraclePriceData,
undefined,
latestSlot
);

return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
Expand Down
7 changes: 5 additions & 2 deletions sdk/src/math/position.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,8 @@ export function calculateBaseAssetValue(
userPosition: PerpPosition,
mmOraclePriceData: MMOraclePriceData,
useSpread = true,
skipUpdate = false
skipUpdate = false,
latestSlot?: BN
): BN {
if (userPosition.baseAssetAmount.eq(ZERO)) {
return ZERO;
Expand All @@ -52,7 +53,9 @@ export function calculateBaseAssetValue(
calculateUpdatedAMMSpreadReserves(
market.amm,
directionToClose,
mmOraclePriceData
mmOraclePriceData,
undefined,
latestSlot
);
prepegAmm = {
baseAssetReserve,
Expand Down
29 changes: 22 additions & 7 deletions sdk/src/math/trade.ts
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,8 @@ export function calculateTradeSlippage(
market: PerpMarketAccount,
inputAssetType: AssetType = 'quote',
mmOraclePriceData: MMOraclePriceData,
useSpread = true
useSpread = true,
latestSlot?: BN
): [BN, BN, BN, BN] {
let oldPrice: BN;

Expand Down Expand Up @@ -115,7 +116,9 @@ export function calculateTradeSlippage(
calculateUpdatedAMMSpreadReserves(
market.amm,
direction,
mmOraclePriceData
mmOraclePriceData,
undefined,
latestSlot
);
amm = {
baseAssetReserve,
Expand Down Expand Up @@ -170,7 +173,8 @@ export function calculateTradeAcquiredAmounts(
market: PerpMarketAccount,
inputAssetType: AssetType = 'quote',
mmOraclePriceData: MMOraclePriceData,
useSpread = true
useSpread = true,
latestSlot?: BN
): [BN, BN, BN] {
if (amount.eq(ZERO)) {
return [ZERO, ZERO, ZERO];
Expand All @@ -184,7 +188,9 @@ export function calculateTradeAcquiredAmounts(
calculateUpdatedAMMSpreadReserves(
market.amm,
direction,
mmOraclePriceData
mmOraclePriceData,
undefined,
latestSlot
);
amm = {
baseAssetReserve,
Expand Down Expand Up @@ -236,7 +242,8 @@ export function calculateTargetPriceTrade(
pct: BN = MAXPCT,
outputAssetType: AssetType = 'quote',
mmOraclePriceData?: MMOraclePriceData,
useSpread = true
useSpread = true,
latestSlot?: BN
): [PositionDirection, BN, BN, BN] {
assert(market.amm.baseAssetReserve.gt(ZERO));
assert(targetPrice.gt(ZERO));
Expand Down Expand Up @@ -272,7 +279,9 @@ export function calculateTargetPriceTrade(
calculateUpdatedAMMSpreadReserves(
market.amm,
direction,
mmOraclePriceData
mmOraclePriceData,
undefined,
latestSlot
);
baseAssetReserveBefore = baseAssetReserve;
quoteAssetReserveBefore = quoteAssetReserve;
Expand Down Expand Up @@ -430,7 +439,13 @@ export function calculateEstimatedPerpEntryPrice(
const swapDirection = getSwapDirection(assetType, direction);

const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } =
calculateUpdatedAMMSpreadReserves(market.amm, direction, mmOraclePriceData);
calculateUpdatedAMMSpreadReserves(
market.amm,
direction,
mmOraclePriceData,
undefined,
new BN(slot)
);
const amm = {
baseAssetReserve,
quoteAssetReserve,
Expand Down
Loading