From c9ed9759db20e6b910fbbf99a034fbb1688171c5 Mon Sep 17 00:00:00 2001 From: 0xbigz <83473873+0xbigz@users.noreply.github.com> Date: Wed, 14 May 2025 17:18:27 -0400 Subject: [PATCH 1/3] sdk: getVammL2Generator-reduce-loc --- sdk/src/dlob/orderBookLevels.ts | 288 +++++++++----------------------- 1 file changed, 80 insertions(+), 208 deletions(-) diff --git a/sdk/src/dlob/orderBookLevels.ts b/sdk/src/dlob/orderBookLevels.ts index 25a79e7f88..7faaff7c7a 100644 --- a/sdk/src/dlob/orderBookLevels.ts +++ b/sdk/src/dlob/orderBookLevels.ts @@ -165,8 +165,8 @@ export function getVammL2Generator({ marketAccount, oraclePriceData, numOrders, - now, - topOfBookQuoteAmounts, + now = new BN(Math.floor(Date.now() / 1000)), + topOfBookQuoteAmounts = [], }: { marketAccount: PerpMarketAccount; oraclePriceData: OraclePriceData; @@ -174,20 +174,12 @@ export function getVammL2Generator({ now?: BN; topOfBookQuoteAmounts?: BN[]; }): L2OrderBookGenerator { - let numBaseOrders = numOrders; - if (topOfBookQuoteAmounts) { - numBaseOrders = numOrders - topOfBookQuoteAmounts.length; - assert(topOfBookQuoteAmounts.length < numOrders); - } - const updatedAmm = calculateUpdatedAMM(marketAccount.amm, oraclePriceData); - - const vammFillsDisabled = isOperationPaused( + const paused = isOperationPaused( marketAccount.pausedOperations, PerpOperation.AMM_FILL ); - - let [openBids, openAsks] = vammFillsDisabled + let [openBids, openAsks] = paused ? [ZERO, ZERO] : calculateMarketOpenBidAsk( updatedAmm.baseAssetReserve, @@ -196,16 +188,10 @@ export function getVammL2Generator({ updatedAmm.orderStepSize ); - const minOrderSize = marketAccount.amm.minOrderSize; - if (openBids.lt(minOrderSize.muln(2))) { - openBids = ZERO; - } - - if (openAsks.abs().lt(minOrderSize.muln(2))) { + if (openBids.lt(marketAccount.amm.minOrderSize.muln(2))) openBids = ZERO; + if (openAsks.abs().lt(marketAccount.amm.minOrderSize.muln(2))) openAsks = ZERO; - } - now = now ?? new BN(Date.now() / 1000); const [bidReserves, askReserves] = calculateSpreadReserves( updatedAmm, oraclePriceData, @@ -213,213 +199,99 @@ export function getVammL2Generator({ isVariant(marketAccount.contractType, 'prediction') ); - let numBids = 0; - - let topOfBookBidSize = ZERO; - let bidSize = openBids.div(new BN(numBaseOrders)); - const bidAmm = { - baseAssetReserve: bidReserves.baseAssetReserve, - quoteAssetReserve: bidReserves.quoteAssetReserve, - sqrtK: updatedAmm.sqrtK, + const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length); + const commonOpts = { + numOrders, + numBaseOrders, + oraclePriceData, + orderTickSize: marketAccount.amm.orderTickSize, + orderStepSize: marketAccount.amm.orderStepSize, pegMultiplier: updatedAmm.pegMultiplier, + sqrtK: updatedAmm.sqrtK, + topOfBookQuoteAmounts, }; - const getL2Bids = function* () { - while (numBids < numOrders && bidSize.gt(ZERO)) { - let quoteSwapped = ZERO; - let baseSwapped = ZERO; - let [afterSwapQuoteReserves, afterSwapBaseReserves] = [ZERO, ZERO]; - - if (topOfBookQuoteAmounts && numBids < topOfBookQuoteAmounts?.length) { - const remainingBaseLiquidity = openBids.sub(topOfBookBidSize); + const makeL2Gen = ({ + openLiquidity, + startReserves, + swapDir, + positionDir, + }: { + openLiquidity: BN; + startReserves: { baseAssetReserve: BN; quoteAssetReserve: BN }; + swapDir: SwapDirection; + positionDir: PositionDirection; + }) => { + return function* () { + let count = 0; + let topSize = ZERO; + let size = openLiquidity.abs().divn(commonOpts.numBaseOrders); + const amm = { + ...startReserves, + sqrtK: commonOpts.sqrtK, + pegMultiplier: commonOpts.pegMultiplier, + }; - baseSwapped = standardizeBaseAssetAmount( - topOfBookQuoteAmounts[numBids] + while (count < commonOpts.numOrders && size.gt(ZERO)) { + let baseSwap = size; + if (count < commonOpts.topOfBookQuoteAmounts.length) { + const raw = commonOpts.topOfBookQuoteAmounts[count] .mul(AMM_TO_QUOTE_PRECISION_RATIO) .mul(PRICE_PRECISION) - .div(oraclePriceData.price), - marketAccount.amm.orderStepSize - ); - - if (baseSwapped.eq(ZERO)) { - return; + .div(commonOpts.oraclePriceData.price); + baseSwap = standardizeBaseAssetAmount(raw, commonOpts.orderStepSize); + const remaining = openLiquidity.abs().sub(topSize); + if (remaining.lt(baseSwap)) baseSwap = remaining; } + if (baseSwap.isZero()) return; - [afterSwapQuoteReserves, afterSwapBaseReserves] = - calculateAmmReservesAfterSwap( - bidAmm, - 'base', - baseSwapped, - SwapDirection.ADD - ); - - quoteSwapped = calculateQuoteAssetAmountSwapped( - bidAmm.quoteAssetReserve.sub(afterSwapQuoteReserves).abs(), - bidAmm.pegMultiplier, - SwapDirection.ADD + const [newQuoteRes, newBaseRes] = calculateAmmReservesAfterSwap( + amm, + 'base', + baseSwap, + swapDir ); - if (remainingBaseLiquidity.lt(baseSwapped)) { - baseSwapped = remainingBaseLiquidity; - [afterSwapQuoteReserves, afterSwapBaseReserves] = - calculateAmmReservesAfterSwap( - bidAmm, - 'base', - baseSwapped, - SwapDirection.ADD - ); - - quoteSwapped = calculateQuoteAssetAmountSwapped( - bidAmm.quoteAssetReserve.sub(afterSwapQuoteReserves).abs(), - bidAmm.pegMultiplier, - SwapDirection.ADD - ); - } - topOfBookBidSize = topOfBookBidSize.add(baseSwapped); - bidSize = openBids.sub(topOfBookBidSize).div(new BN(numBaseOrders)); - } else { - baseSwapped = bidSize; - [afterSwapQuoteReserves, afterSwapBaseReserves] = - calculateAmmReservesAfterSwap( - bidAmm, - 'base', - baseSwapped, - SwapDirection.ADD - ); - - quoteSwapped = calculateQuoteAssetAmountSwapped( - bidAmm.quoteAssetReserve.sub(afterSwapQuoteReserves).abs(), - bidAmm.pegMultiplier, - SwapDirection.ADD + const quoteSwapped = calculateQuoteAssetAmountSwapped( + amm.quoteAssetReserve.sub(newQuoteRes).abs(), + amm.pegMultiplier, + swapDir ); - } - - const price = standardizePrice( - quoteSwapped.mul(BASE_PRECISION).div(baseSwapped), - marketAccount.amm.orderTickSize, - PositionDirection.LONG - ); - - bidAmm.baseAssetReserve = afterSwapBaseReserves; - bidAmm.quoteAssetReserve = afterSwapQuoteReserves; - - yield { - price, - size: baseSwapped, - sources: { vamm: baseSwapped }, - }; - - numBids++; - } - }; - - let numAsks = 0; - let topOfBookAskSize = ZERO; - let askSize = openAsks.abs().div(new BN(numBaseOrders)); - const askAmm = { - baseAssetReserve: askReserves.baseAssetReserve, - quoteAssetReserve: askReserves.quoteAssetReserve, - sqrtK: updatedAmm.sqrtK, - pegMultiplier: updatedAmm.pegMultiplier, - }; - - const getL2Asks = function* () { - while (numAsks < numOrders && askSize.gt(ZERO)) { - let quoteSwapped: BN = ZERO; - let baseSwapped: BN = ZERO; - let [afterSwapQuoteReserves, afterSwapBaseReserves] = [ZERO, ZERO]; - - if (topOfBookQuoteAmounts && numAsks < topOfBookQuoteAmounts?.length) { - const remainingBaseLiquidity = standardizeBaseAssetAmount( - openAsks.mul(new BN(-1)).sub(topOfBookAskSize), - marketAccount.amm.orderStepSize - ); - - baseSwapped = standardizeBaseAssetAmount( - topOfBookQuoteAmounts[numAsks] - .mul(AMM_TO_QUOTE_PRECISION_RATIO) - .mul(PRICE_PRECISION) - .div(oraclePriceData.price), - marketAccount.amm.orderStepSize + const price = standardizePrice( + quoteSwapped.mul(BASE_PRECISION).div(baseSwap), + commonOpts.orderTickSize, + positionDir ); - if (baseSwapped.eq(ZERO)) { - return; - } - - [afterSwapQuoteReserves, afterSwapBaseReserves] = - calculateAmmReservesAfterSwap( - askAmm, - 'base', - baseSwapped, - SwapDirection.REMOVE - ); - quoteSwapped = calculateQuoteAssetAmountSwapped( - askAmm.quoteAssetReserve.sub(afterSwapQuoteReserves).abs(), - askAmm.pegMultiplier, - SwapDirection.ADD - ); + amm.baseAssetReserve = newBaseRes; + amm.quoteAssetReserve = newQuoteRes; - if (remainingBaseLiquidity.lt(baseSwapped)) { - baseSwapped = remainingBaseLiquidity; - [afterSwapQuoteReserves, afterSwapBaseReserves] = - calculateAmmReservesAfterSwap( - askAmm, - 'base', - baseSwapped, - SwapDirection.REMOVE - ); - - quoteSwapped = calculateQuoteAssetAmountSwapped( - askAmm.quoteAssetReserve.sub(afterSwapQuoteReserves).abs(), - askAmm.pegMultiplier, - SwapDirection.REMOVE - ); + if (count < commonOpts.topOfBookQuoteAmounts.length) { + topSize = topSize.add(baseSwap); + size = openLiquidity + .abs() + .sub(topSize) + .divn(commonOpts.numBaseOrders); } - topOfBookAskSize = topOfBookAskSize.add(baseSwapped); - askSize = openAsks - .abs() - .sub(topOfBookAskSize) - .div(new BN(numBaseOrders)); - } else { - baseSwapped = askSize; - [afterSwapQuoteReserves, afterSwapBaseReserves] = - calculateAmmReservesAfterSwap( - askAmm, - 'base', - baseSwapped, - SwapDirection.REMOVE - ); - - quoteSwapped = calculateQuoteAssetAmountSwapped( - askAmm.quoteAssetReserve.sub(afterSwapQuoteReserves).abs(), - askAmm.pegMultiplier, - SwapDirection.REMOVE - ); + yield { price, size: baseSwap, sources: { vamm: baseSwap } }; + count++; } - - const price = standardizePrice( - quoteSwapped.mul(BASE_PRECISION).div(baseSwapped), - marketAccount.amm.orderTickSize, - PositionDirection.SHORT - ); - - askAmm.baseAssetReserve = afterSwapBaseReserves; - askAmm.quoteAssetReserve = afterSwapQuoteReserves; - - yield { - price, - size: baseSwapped, - sources: { vamm: baseSwapped }, - }; - - numAsks++; - } + }; }; return { - getL2Bids, - getL2Asks, + getL2Bids: makeL2Gen({ + openLiquidity: openBids, + startReserves: bidReserves, + swapDir: SwapDirection.ADD, + positionDir: PositionDirection.LONG, + }), + getL2Asks: makeL2Gen({ + openLiquidity: openAsks, + startReserves: askReserves, + swapDir: SwapDirection.REMOVE, + positionDir: PositionDirection.SHORT, + }), }; } From 45669db821c7a048a78c2ebe947acff461ad04d2 Mon Sep 17 00:00:00 2001 From: 0xbigz <83473873+0xbigz@users.noreply.github.com> Date: Tue, 10 Jun 2025 19:09:05 -0400 Subject: [PATCH 2/3] add MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS --- sdk/src/dlob/orderBookLevels.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/sdk/src/dlob/orderBookLevels.ts b/sdk/src/dlob/orderBookLevels.ts index 7faaff7c7a..41dbb73e00 100644 --- a/sdk/src/dlob/orderBookLevels.ts +++ b/sdk/src/dlob/orderBookLevels.ts @@ -69,6 +69,13 @@ export const DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS = [ new BN(5000).mul(QUOTE_PRECISION), ]; +export const MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS = [ + new BN(5000).mul(QUOTE_PRECISION), + new BN(10000).mul(QUOTE_PRECISION), + new BN(20000).mul(QUOTE_PRECISION), + new BN(50000).mul(QUOTE_PRECISION), +]; + /** * Get an {@link Generator} generator from a {@link Generator} * @param dlobNodes e.g. {@link DLOB#getRestingLimitAsks} or {@link DLOB#getRestingLimitBids} From 41a218958195167f526e85b93e3a98ca1f1f4a1a Mon Sep 17 00:00:00 2001 From: 0xbigz <83473873+0xbigz@users.noreply.github.com> Date: Tue, 10 Jun 2025 19:10:24 -0400 Subject: [PATCH 3/3] add marketindex check topOfBookAmounts --- sdk/src/dlob/DLOBSubscriber.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/src/dlob/DLOBSubscriber.ts b/sdk/src/dlob/DLOBSubscriber.ts index 4d21f93f8b..f36d394df0 100644 --- a/sdk/src/dlob/DLOBSubscriber.ts +++ b/sdk/src/dlob/DLOBSubscriber.ts @@ -12,6 +12,7 @@ import { DriftClient } from '../driftClient'; import { isVariant, MarketType } from '../types'; import { DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS, + MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS, getVammL2Generator, L2OrderBook, L2OrderBookGenerator, @@ -140,7 +141,7 @@ export class DLOBSubscriber { marketAccount: this.driftClient.getPerpMarketAccount(marketIndex), oraclePriceData, numOrders: numVammOrders ?? depth, - topOfBookQuoteAmounts: DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS, + topOfBookQuoteAmounts: marketIndex < 3 ? MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS : DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS, }), ]; }