@drift-labs/sdk 2.135.0-beta.6 → 2.135.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 2.135.0-beta.6
1
+ 2.135.0-beta.7
@@ -43,12 +43,13 @@ export declare const MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS: BN[];
43
43
  export declare function getL2GeneratorFromDLOBNodes(dlobNodes: Generator<DLOBNode>, oraclePriceData: OraclePriceData, slot: number): Generator<L2Level>;
44
44
  export declare function mergeL2LevelGenerators(l2LevelGenerators: Generator<L2Level>[], compare: (a: L2Level, b: L2Level) => boolean): Generator<L2Level>;
45
45
  export declare function createL2Levels(generator: Generator<L2Level>, depth: number): L2Level[];
46
- export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, }: {
46
+ export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, latestSlot, }: {
47
47
  marketAccount: PerpMarketAccount;
48
48
  mmOraclePriceData: MMOraclePriceData;
49
49
  numOrders: number;
50
50
  now?: BN;
51
51
  topOfBookQuoteAmounts?: BN[];
52
+ latestSlot?: BN;
52
53
  }): L2OrderBookGenerator;
53
54
  export declare function groupL2(l2: L2OrderBook, grouping: BN, depth: number): L2OrderBook;
54
55
  /**
@@ -101,7 +101,7 @@ function createL2Levels(generator, depth) {
101
101
  return levels;
102
102
  }
103
103
  exports.createL2Levels = createL2Levels;
104
- function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], }) {
104
+ function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], latestSlot, }) {
105
105
  const updatedAmm = (0, amm_1.calculateUpdatedAMM)(marketAccount.amm, mmOraclePriceData);
106
106
  const paused = (0, exchangeStatus_1.isOperationPaused)(marketAccount.pausedOperations, types_1.PerpOperation.AMM_FILL);
107
107
  let [openBids, openAsks] = paused
@@ -111,7 +111,7 @@ function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now =
111
111
  openBids = numericConstants_1.ZERO;
112
112
  if (openAsks.abs().lt(marketAccount.amm.minOrderSize.muln(2)))
113
113
  openAsks = numericConstants_1.ZERO;
114
- const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'));
114
+ const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'), latestSlot);
115
115
  const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
116
116
  const commonOpts = {
117
117
  numOrders,
@@ -6,13 +6,13 @@ export declare function calculatePegFromTargetPrice(targetPrice: BN, baseAssetRe
6
6
  export declare function calculateOptimalPegAndBudget(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, boolean];
7
7
  export declare function calculateNewAmm(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, BN];
8
8
  export declare function calculateUpdatedAMM(amm: AMM, mmOraclePriceData: MMOraclePriceData): AMM;
9
- export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean): {
9
+ export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean, latestSlot?: BN): {
10
10
  baseAssetReserve: BN;
11
11
  quoteAssetReserve: BN;
12
12
  sqrtK: BN;
13
13
  newPeg: BN;
14
14
  };
15
- export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean): [BN, BN];
15
+ export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean, latestSlot?: BN): [BN, BN];
16
16
  /**
17
17
  * Calculates a price given an arbitrary base and quote amount (they must have the same precision)
18
18
  *
@@ -65,7 +65,7 @@ export declare function calculateSpreadBN(baseSpread: number, lastOracleReserveP
65
65
  };
66
66
  export declare function calculateSpread(amm: AMM, oraclePriceData: OraclePriceData, now?: BN, reservePrice?: BN): [number, number];
67
67
  export declare function getQuoteAssetReservePredictionMarketBounds(amm: AMM, direction: PositionDirection): [BN, BN];
68
- export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean): {
68
+ export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean, latestSlot?: BN): {
69
69
  baseAssetReserve: any;
70
70
  quoteAssetReserve: any;
71
71
  }[];
@@ -104,9 +104,9 @@ function calculateUpdatedAMM(amm, mmOraclePriceData) {
104
104
  return newAmm;
105
105
  }
106
106
  exports.calculateUpdatedAMM = calculateUpdatedAMM;
107
- function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false) {
107
+ function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false, latestSlot) {
108
108
  const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
109
- const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
109
+ const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
110
110
  const dirReserves = (0, types_1.isVariant)(direction, 'long')
111
111
  ? longReserves
112
112
  : shortReserves;
@@ -119,7 +119,7 @@ function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, is
119
119
  return result;
120
120
  }
121
121
  exports.calculateUpdatedAMMSpreadReserves = calculateUpdatedAMMSpreadReserves;
122
- function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false) {
122
+ function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false, latestSlot) {
123
123
  let newAmm;
124
124
  if (withUpdate) {
125
125
  newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
@@ -127,7 +127,7 @@ function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPredi
127
127
  else {
128
128
  newAmm = amm;
129
129
  }
130
- const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
130
+ const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
131
131
  const askPrice = calculatePrice(askReserves.baseAssetReserve, askReserves.quoteAssetReserve, newAmm.pegMultiplier);
132
132
  const bidPrice = calculatePrice(bidReserves.baseAssetReserve, bidReserves.quoteAssetReserve, newAmm.pegMultiplier);
133
133
  return [bidPrice, askPrice];
@@ -488,7 +488,7 @@ function getQuoteAssetReservePredictionMarketBounds(amm, direction) {
488
488
  return [quoteAssetReserveLowerBound, quoteAssetReserveUpperBound];
489
489
  }
490
490
  exports.getQuoteAssetReservePredictionMarketBounds = getQuoteAssetReservePredictionMarketBounds;
491
- function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false) {
491
+ function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false, latestSlot) {
492
492
  function calculateSpreadReserve(spread, direction, amm) {
493
493
  if (spread === 0) {
494
494
  return {
@@ -534,22 +534,22 @@ function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = fal
534
534
  const doReferencePricOffsetSmooth = Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
535
535
  amm.curveUpdateIntensity > 100;
536
536
  if (doReferencePricOffsetSmooth) {
537
- if (mmOraclePriceData.slot !== amm.lastUpdateSlot) {
538
- const slotsPassed = mmOraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
539
- const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
540
- const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
541
- const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
542
- const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
543
- const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
544
- referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
545
- if (referencePriceDelta < 0) {
546
- longSpread += Math.abs(referencePriceDelta);
547
- shortSpread += Math.abs(referencePriceOffset);
548
- }
549
- else {
550
- shortSpread += Math.abs(referencePriceDelta);
551
- longSpread += Math.abs(referencePriceOffset);
552
- }
537
+ const slotsPassed = latestSlot != null
538
+ ? anchor_1.BN.max(latestSlot.sub(amm.lastUpdateSlot), numericConstants_1.ZERO).toNumber()
539
+ : 0;
540
+ const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
541
+ const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
542
+ const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
543
+ const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
544
+ const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
545
+ referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
546
+ if (referencePriceDelta < 0) {
547
+ longSpread += Math.abs(referencePriceDelta);
548
+ shortSpread += Math.abs(referencePriceOffset);
549
+ }
550
+ else {
551
+ shortSpread += Math.abs(referencePriceDelta);
552
+ longSpread += Math.abs(referencePriceOffset);
553
553
  }
554
554
  }
555
555
  const askReserves = calculateSpreadReserve(longSpread + referencePriceOffset, types_1.PositionDirection.LONG, amm);
@@ -16,14 +16,14 @@ export declare function calculateReservePrice(market: PerpMarketAccount, mmOracl
16
16
  * @param market
17
17
  * @return bidPrice : Precision PRICE_PRECISION
18
18
  */
19
- export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
19
+ export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
20
20
  /**
21
21
  * Calculates market ask price
22
22
  *
23
23
  * @param market
24
24
  * @return askPrice : Precision PRICE_PRECISION
25
25
  */
26
- export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
26
+ export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
27
27
  export declare function calculateNewMarketAfterTrade(baseAssetAmount: BN, direction: PositionDirection, market: PerpMarketAccount): PerpMarketAccount;
28
28
  export declare function calculateOracleReserveSpread(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
29
29
  export declare function calculateOracleSpread(price: BN, oraclePriceData: OraclePriceData): BN;
@@ -25,8 +25,8 @@ exports.calculateReservePrice = calculateReservePrice;
25
25
  * @param market
26
26
  * @return bidPrice : Precision PRICE_PRECISION
27
27
  */
28
- function calculateBidPrice(market, mmOraclePriceData) {
29
- const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData);
28
+ function calculateBidPrice(market, mmOraclePriceData, latestSlot) {
29
+ const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData, undefined, latestSlot);
30
30
  return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
31
31
  }
32
32
  exports.calculateBidPrice = calculateBidPrice;
@@ -36,8 +36,8 @@ exports.calculateBidPrice = calculateBidPrice;
36
36
  * @param market
37
37
  * @return askPrice : Precision PRICE_PRECISION
38
38
  */
39
- function calculateAskPrice(market, mmOraclePriceData) {
40
- const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData);
39
+ function calculateAskPrice(market, mmOraclePriceData, latestSlot) {
40
+ const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData, undefined, latestSlot);
41
41
  return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
42
42
  }
43
43
  exports.calculateAskPrice = calculateAskPrice;
@@ -10,7 +10,7 @@ import { PerpMarketAccount, PositionDirection, PerpPosition, SpotMarketAccount }
10
10
  * @param oraclePriceData
11
11
  * @returns Base Asset Value. : Precision QUOTE_PRECISION
12
12
  */
13
- export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean): BN;
13
+ export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean, latestSlot?: BN): BN;
14
14
  /**
15
15
  * calculatePositionPNL
16
16
  * = BaseAssetAmount * (Avg Exit Price - Avg Entry Price)
@@ -15,7 +15,7 @@ const market_1 = require("./market");
15
15
  * @param oraclePriceData
16
16
  * @returns Base Asset Value. : Precision QUOTE_PRECISION
17
17
  */
18
- function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false) {
18
+ function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false, latestSlot) {
19
19
  if (userPosition.baseAssetAmount.eq(numericConstants_1.ZERO)) {
20
20
  return numericConstants_1.ZERO;
21
21
  }
@@ -23,7 +23,7 @@ function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpr
23
23
  let prepegAmm;
24
24
  if (!skipUpdate) {
25
25
  if (market.amm.baseSpread > 0 && useSpread) {
26
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData);
26
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData, undefined, latestSlot);
27
27
  prepegAmm = {
28
28
  baseAssetReserve,
29
29
  quoteAssetReserve,
@@ -28,7 +28,7 @@ export type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceD
28
28
  *
29
29
  * 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
30
30
  */
31
- export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN, BN];
31
+ export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN, BN];
32
32
  /**
33
33
  * Calculates acquired amounts for trade executed
34
34
  * @param direction
@@ -40,7 +40,7 @@ export declare function calculateTradeSlippage(direction: PositionDirection, amo
40
40
  * | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
41
41
  * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
42
42
  */
43
- export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN];
43
+ export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN];
44
44
  /**
45
45
  * calculateTargetPriceTrade
46
46
  * simple function for finding arbitraging trades
@@ -61,7 +61,7 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
61
61
  * targetPrice => the target price PRICE_PRECISION
62
62
  * ]
63
63
  */
64
- export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean): [PositionDirection, BN, BN, BN];
64
+ export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [PositionDirection, BN, BN, BN];
65
65
  /**
66
66
  * Calculates the estimated entry price and price impact of order, in base or quote
67
67
  * Price impact is based on the difference between the entry price and the best bid/ask price (whether it's dlob or vamm)
@@ -30,7 +30,7 @@ const MAXPCT = new anchor_1.BN(1000); //percentage units are [0,1000] => [0,1]
30
30
  *
31
31
  * 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
32
32
  */
33
- function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
33
+ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
34
34
  let oldPrice;
35
35
  if (useSpread && market.amm.baseSpread > 0) {
36
36
  if ((0, types_2.isVariant)(direction, 'long')) {
@@ -53,7 +53,7 @@ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quo
53
53
  .div(acquiredBaseReserve.abs());
54
54
  let amm;
55
55
  if (useSpread && market.amm.baseSpread > 0) {
56
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
56
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
57
57
  amm = {
58
58
  baseAssetReserve,
59
59
  quoteAssetReserve,
@@ -95,14 +95,14 @@ exports.calculateTradeSlippage = calculateTradeSlippage;
95
95
  * | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
96
96
  * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
97
97
  */
98
- function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
98
+ function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
99
99
  if (amount.eq(numericConstants_1.ZERO)) {
100
100
  return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
101
101
  }
102
102
  const swapDirection = (0, amm_1.getSwapDirection)(inputAssetType, direction);
103
103
  let amm;
104
104
  if (useSpread && market.amm.baseSpread > 0) {
105
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
105
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
106
106
  amm = {
107
107
  baseAssetReserve,
108
108
  quoteAssetReserve,
@@ -140,7 +140,7 @@ exports.calculateTradeAcquiredAmounts = calculateTradeAcquiredAmounts;
140
140
  * targetPrice => the target price PRICE_PRECISION
141
141
  * ]
142
142
  */
143
- function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
143
+ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
144
144
  (0, assert_1.assert)(market.amm.baseAssetReserve.gt(numericConstants_1.ZERO));
145
145
  (0, assert_1.assert)(targetPrice.gt(numericConstants_1.ZERO));
146
146
  (0, assert_1.assert)(pct.lte(MAXPCT) && pct.gt(numericConstants_1.ZERO));
@@ -166,7 +166,7 @@ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAsse
166
166
  let quoteAssetReserveBefore;
167
167
  let peg = market.amm.pegMultiplier;
168
168
  if (useSpread && market.amm.baseSpread > 0) {
169
- const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
169
+ const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
170
170
  baseAssetReserveBefore = baseAssetReserve;
171
171
  quoteAssetReserveBefore = quoteAssetReserve;
172
172
  peg = newPeg;
@@ -280,7 +280,7 @@ function calculateEstimatedPerpEntryPrice(assetType, amount, direction, market,
280
280
  const takerIsLong = (0, types_2.isVariant)(direction, 'long');
281
281
  const limitOrders = dlob[takerIsLong ? 'getRestingLimitAsks' : 'getRestingLimitBids'](market.marketIndex, slot, types_1.MarketType.PERP, mmOraclePriceData);
282
282
  const swapDirection = (0, amm_1.getSwapDirection)(assetType, direction);
283
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
283
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, new anchor_1.BN(slot));
284
284
  const amm = {
285
285
  baseAssetReserve,
286
286
  quoteAssetReserve,
@@ -43,12 +43,13 @@ export declare const MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS: BN[];
43
43
  export declare function getL2GeneratorFromDLOBNodes(dlobNodes: Generator<DLOBNode>, oraclePriceData: OraclePriceData, slot: number): Generator<L2Level>;
44
44
  export declare function mergeL2LevelGenerators(l2LevelGenerators: Generator<L2Level>[], compare: (a: L2Level, b: L2Level) => boolean): Generator<L2Level>;
45
45
  export declare function createL2Levels(generator: Generator<L2Level>, depth: number): L2Level[];
46
- export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, }: {
46
+ export declare function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now, topOfBookQuoteAmounts, latestSlot, }: {
47
47
  marketAccount: PerpMarketAccount;
48
48
  mmOraclePriceData: MMOraclePriceData;
49
49
  numOrders: number;
50
50
  now?: BN;
51
51
  topOfBookQuoteAmounts?: BN[];
52
+ latestSlot?: BN;
52
53
  }): L2OrderBookGenerator;
53
54
  export declare function groupL2(l2: L2OrderBook, grouping: BN, depth: number): L2OrderBook;
54
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"orderBookLevels.d.ts","sourceRoot":"","sources":["../../../src/dlob/orderBookLevels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orderBookLevels.d.ts","sourceRoot":"","sources":["../../../src/dlob/orderBookLevels.ts"],"names":[],"mappings":"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"}
@@ -101,7 +101,7 @@ function createL2Levels(generator, depth) {
101
101
  return levels;
102
102
  }
103
103
  exports.createL2Levels = createL2Levels;
104
- function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], }) {
104
+ function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now = new anchor_1.BN(Math.floor(Date.now() / 1000)), topOfBookQuoteAmounts = [], latestSlot, }) {
105
105
  const updatedAmm = (0, amm_1.calculateUpdatedAMM)(marketAccount.amm, mmOraclePriceData);
106
106
  const paused = (0, exchangeStatus_1.isOperationPaused)(marketAccount.pausedOperations, types_1.PerpOperation.AMM_FILL);
107
107
  let [openBids, openAsks] = paused
@@ -111,7 +111,7 @@ function getVammL2Generator({ marketAccount, mmOraclePriceData, numOrders, now =
111
111
  openBids = numericConstants_1.ZERO;
112
112
  if (openAsks.abs().lt(marketAccount.amm.minOrderSize.muln(2)))
113
113
  openAsks = numericConstants_1.ZERO;
114
- const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'));
114
+ const [bidReserves, askReserves] = (0, amm_1.calculateSpreadReserves)(updatedAmm, mmOraclePriceData, now, (0, types_1.isVariant)(marketAccount.contractType, 'prediction'), latestSlot);
115
115
  const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
116
116
  const commonOpts = {
117
117
  numOrders,
@@ -6,13 +6,13 @@ export declare function calculatePegFromTargetPrice(targetPrice: BN, baseAssetRe
6
6
  export declare function calculateOptimalPegAndBudget(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, boolean];
7
7
  export declare function calculateNewAmm(amm: AMM, mmOraclePriceData: MMOraclePriceData): [BN, BN, BN, BN];
8
8
  export declare function calculateUpdatedAMM(amm: AMM, mmOraclePriceData: MMOraclePriceData): AMM;
9
- export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean): {
9
+ export declare function calculateUpdatedAMMSpreadReserves(amm: AMM, direction: PositionDirection, mmOraclePriceData: MMOraclePriceData, isPrediction?: boolean, latestSlot?: BN): {
10
10
  baseAssetReserve: BN;
11
11
  quoteAssetReserve: BN;
12
12
  sqrtK: BN;
13
13
  newPeg: BN;
14
14
  };
15
- export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean): [BN, BN];
15
+ export declare function calculateBidAskPrice(amm: AMM, mmOraclePriceData: MMOraclePriceData, withUpdate?: boolean, isPrediction?: boolean, latestSlot?: BN): [BN, BN];
16
16
  /**
17
17
  * Calculates a price given an arbitrary base and quote amount (they must have the same precision)
18
18
  *
@@ -65,7 +65,7 @@ export declare function calculateSpreadBN(baseSpread: number, lastOracleReserveP
65
65
  };
66
66
  export declare function calculateSpread(amm: AMM, oraclePriceData: OraclePriceData, now?: BN, reservePrice?: BN): [number, number];
67
67
  export declare function getQuoteAssetReservePredictionMarketBounds(amm: AMM, direction: PositionDirection): [BN, BN];
68
- export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean): {
68
+ export declare function calculateSpreadReserves(amm: AMM, mmOraclePriceData: MMOraclePriceData, now?: BN, isPrediction?: boolean, latestSlot?: BN): {
69
69
  baseAssetReserve: any;
70
70
  quoteAssetReserve: any;
71
71
  }[];
@@ -1 +1 @@
1
- {"version":3,"file":"amm.d.ts","sourceRoot":"","sources":["../../../src/math/amm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"amm.d.ts","sourceRoot":"","sources":["../../../src/math/amm.ts"],"names":[],"mappings":"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"}
@@ -104,9 +104,9 @@ function calculateUpdatedAMM(amm, mmOraclePriceData) {
104
104
  return newAmm;
105
105
  }
106
106
  exports.calculateUpdatedAMM = calculateUpdatedAMM;
107
- function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false) {
107
+ function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, isPrediction = false, latestSlot) {
108
108
  const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
109
- const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
109
+ const [shortReserves, longReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
110
110
  const dirReserves = (0, types_1.isVariant)(direction, 'long')
111
111
  ? longReserves
112
112
  : shortReserves;
@@ -119,7 +119,7 @@ function calculateUpdatedAMMSpreadReserves(amm, direction, mmOraclePriceData, is
119
119
  return result;
120
120
  }
121
121
  exports.calculateUpdatedAMMSpreadReserves = calculateUpdatedAMMSpreadReserves;
122
- function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false) {
122
+ function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPrediction = false, latestSlot) {
123
123
  let newAmm;
124
124
  if (withUpdate) {
125
125
  newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
@@ -127,7 +127,7 @@ function calculateBidAskPrice(amm, mmOraclePriceData, withUpdate = true, isPredi
127
127
  else {
128
128
  newAmm = amm;
129
129
  }
130
- const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction);
130
+ const [bidReserves, askReserves] = calculateSpreadReserves(newAmm, mmOraclePriceData, undefined, isPrediction, latestSlot);
131
131
  const askPrice = calculatePrice(askReserves.baseAssetReserve, askReserves.quoteAssetReserve, newAmm.pegMultiplier);
132
132
  const bidPrice = calculatePrice(bidReserves.baseAssetReserve, bidReserves.quoteAssetReserve, newAmm.pegMultiplier);
133
133
  return [bidPrice, askPrice];
@@ -488,7 +488,7 @@ function getQuoteAssetReservePredictionMarketBounds(amm, direction) {
488
488
  return [quoteAssetReserveLowerBound, quoteAssetReserveUpperBound];
489
489
  }
490
490
  exports.getQuoteAssetReservePredictionMarketBounds = getQuoteAssetReservePredictionMarketBounds;
491
- function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false) {
491
+ function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = false, latestSlot) {
492
492
  function calculateSpreadReserve(spread, direction, amm) {
493
493
  if (spread === 0) {
494
494
  return {
@@ -534,22 +534,22 @@ function calculateSpreadReserves(amm, mmOraclePriceData, now, isPrediction = fal
534
534
  const doReferencePricOffsetSmooth = Math.sign(referencePriceOffset) !== Math.sign(amm.referencePriceOffset) &&
535
535
  amm.curveUpdateIntensity > 100;
536
536
  if (doReferencePricOffsetSmooth) {
537
- if (mmOraclePriceData.slot !== amm.lastUpdateSlot) {
538
- const slotsPassed = mmOraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
539
- const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
540
- const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
541
- const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
542
- const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
543
- const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
544
- referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
545
- if (referencePriceDelta < 0) {
546
- longSpread += Math.abs(referencePriceDelta);
547
- shortSpread += Math.abs(referencePriceOffset);
548
- }
549
- else {
550
- shortSpread += Math.abs(referencePriceDelta);
551
- longSpread += Math.abs(referencePriceOffset);
552
- }
537
+ const slotsPassed = latestSlot != null
538
+ ? anchor_1.BN.max(latestSlot.sub(amm.lastUpdateSlot), numericConstants_1.ZERO).toNumber()
539
+ : 0;
540
+ const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
541
+ const raw = Math.trunc(Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10);
542
+ const maxAllowed = Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
543
+ const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
544
+ const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
545
+ referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
546
+ if (referencePriceDelta < 0) {
547
+ longSpread += Math.abs(referencePriceDelta);
548
+ shortSpread += Math.abs(referencePriceOffset);
549
+ }
550
+ else {
551
+ shortSpread += Math.abs(referencePriceDelta);
552
+ longSpread += Math.abs(referencePriceOffset);
553
553
  }
554
554
  }
555
555
  const askReserves = calculateSpreadReserve(longSpread + referencePriceOffset, types_1.PositionDirection.LONG, amm);
@@ -16,14 +16,14 @@ export declare function calculateReservePrice(market: PerpMarketAccount, mmOracl
16
16
  * @param market
17
17
  * @return bidPrice : Precision PRICE_PRECISION
18
18
  */
19
- export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
19
+ export declare function calculateBidPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
20
20
  /**
21
21
  * Calculates market ask price
22
22
  *
23
23
  * @param market
24
24
  * @return askPrice : Precision PRICE_PRECISION
25
25
  */
26
- export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
26
+ export declare function calculateAskPrice(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData, latestSlot?: BN): BN;
27
27
  export declare function calculateNewMarketAfterTrade(baseAssetAmount: BN, direction: PositionDirection, market: PerpMarketAccount): PerpMarketAccount;
28
28
  export declare function calculateOracleReserveSpread(market: PerpMarketAccount, mmOraclePriceData: MMOraclePriceData): BN;
29
29
  export declare function calculateOracleSpread(price: BN, oraclePriceData: OraclePriceData): BN;
@@ -1 +1 @@
1
- {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../../src/math/market.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAIjB,MAAM,UAAU,CAAC;AAalB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYtE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAOJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CASJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CASJ;AAED,wBAAgB,4BAA4B,CAC3C,eAAe,EAAE,EAAE,EACnB,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB,GACvB,iBAAiB,CAgBnB;AAED,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAGJ;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,EAAE,EACT,eAAe,EAAE,eAAe,GAC9B,EAAE,CAEJ;AAED,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,EAAE,EACR,cAAc,EAAE,cAAc,EAC9B,iBAAiB,SAAI,EACrB,oBAAoB,UAAQ,GAC1B,MAAM,CA2CR;AAED,wBAAgB,8BAA8B,CAC7C,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,iBAAiB,EAClC,aAAa,EAAE,EAAE,EACjB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CA+BJ;AAED,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,EAAE,CAMJ;AAED,wBAAgB,oCAAoC,CACnD,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,EAAE,CAcJ;AAED,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAcJ;AAED,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAC/C,oBAAoB,UAAO,GACzB,EAAE,CAoBJ;AAED,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,EAAE,CAAA;CAAE,CAoCxB;AAED,wBAAgB,oCAAoC,CACnD,MAAM,EAAE,iBAAiB,EACzB,oBAAoB,EAAE,OAAO,GAC3B,MAAM,CAWR;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,EAAE,EACf,GAAG,EAAE,EAAE,EACP,cAAc,EAAE,OAAO,GACrB,EAAE,CA2BJ"}
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../../src/math/market.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EAIjB,MAAM,UAAU,CAAC;AAalB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAYtE,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAOJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,CAAC,EAAE,EAAE,GACb,EAAE,CAWJ;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAChC,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,UAAU,CAAC,EAAE,EAAE,GACb,EAAE,CAWJ;AAED,wBAAgB,4BAA4B,CAC3C,eAAe,EAAE,EAAE,EACnB,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,iBAAiB,GACvB,iBAAiB,CAgBnB;AAED,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,GAClC,EAAE,CAGJ;AAED,wBAAgB,qBAAqB,CACpC,KAAK,EAAE,EAAE,EACT,eAAe,EAAE,eAAe,GAC9B,EAAE,CAEJ;AAED,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EACzB,IAAI,EAAE,EAAE,EACR,cAAc,EAAE,cAAc,EAC9B,iBAAiB,SAAI,EACrB,oBAAoB,UAAQ,GAC1B,MAAM,CA2CR;AAED,wBAAgB,8BAA8B,CAC7C,MAAM,EAAE,iBAAiB,EACzB,eAAe,EAAE,iBAAiB,EAClC,aAAa,EAAE,EAAE,EACjB,cAAc,EAAE,cAAc,EAC9B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CA+BJ;AAED,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,EAAE,CAMJ;AAED,wBAAgB,oCAAoC,CACnD,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,GAC3B,EAAE,CAcJ;AAED,wBAAgB,mBAAmB,CAClC,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAcJ;AAED,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,iBAAiB,EAC7B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,EAC/C,oBAAoB,UAAO,GACzB,EAAE,CAoBJ;AAED,wBAAgB,+BAA+B,CAC9C,MAAM,EAAE,iBAAiB,EACzB,iBAAiB,EAAE,iBAAiB,EACpC,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,EAAE,CAAC;IAAC,IAAI,EAAE,EAAE,CAAA;CAAE,CAoCxB;AAED,wBAAgB,oCAAoC,CACnD,MAAM,EAAE,iBAAiB,EACzB,oBAAoB,EAAE,OAAO,GAC3B,MAAM,CAWR;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC9B,MAAM,EAAE,iBAAiB,EACzB,WAAW,EAAE,EAAE,EACf,GAAG,EAAE,EAAE,EACP,cAAc,EAAE,OAAO,GACrB,EAAE,CA2BJ"}
@@ -25,8 +25,8 @@ exports.calculateReservePrice = calculateReservePrice;
25
25
  * @param market
26
26
  * @return bidPrice : Precision PRICE_PRECISION
27
27
  */
28
- function calculateBidPrice(market, mmOraclePriceData) {
29
- const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData);
28
+ function calculateBidPrice(market, mmOraclePriceData, latestSlot) {
29
+ const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.SHORT, mmOraclePriceData, undefined, latestSlot);
30
30
  return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
31
31
  }
32
32
  exports.calculateBidPrice = calculateBidPrice;
@@ -36,8 +36,8 @@ exports.calculateBidPrice = calculateBidPrice;
36
36
  * @param market
37
37
  * @return askPrice : Precision PRICE_PRECISION
38
38
  */
39
- function calculateAskPrice(market, mmOraclePriceData) {
40
- const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData);
39
+ function calculateAskPrice(market, mmOraclePriceData, latestSlot) {
40
+ const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, types_1.PositionDirection.LONG, mmOraclePriceData, undefined, latestSlot);
41
41
  return (0, amm_1.calculatePrice)(baseAssetReserve, quoteAssetReserve, newPeg);
42
42
  }
43
43
  exports.calculateAskPrice = calculateAskPrice;
@@ -10,7 +10,7 @@ import { PerpMarketAccount, PositionDirection, PerpPosition, SpotMarketAccount }
10
10
  * @param oraclePriceData
11
11
  * @returns Base Asset Value. : Precision QUOTE_PRECISION
12
12
  */
13
- export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean): BN;
13
+ export declare function calculateBaseAssetValue(market: PerpMarketAccount, userPosition: PerpPosition, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, skipUpdate?: boolean, latestSlot?: BN): BN;
14
14
  /**
15
15
  * calculatePositionPNL
16
16
  * = BaseAssetAmount * (Avg Exit Price - Avg Entry Price)
@@ -1 +1 @@
1
- {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/math/position.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAUvC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,MAAM,UAAU,CAAC;AAUlB;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,UAAO,EAChB,UAAU,UAAQ,GAChB,EAAE,CAkDJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,WAAW,SAAQ,EACnB,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAyBJ;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAyBJ;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,UAAO,GACrB,EAAE,CAeJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,GACxB,EAAE,CAoBJ;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,GACxB,EAAE,CAEJ;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAOnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,UAAQ,GACvB,EAAE,CAWJ;AAED,wBAAgB,oBAAoB,CACnC,YAAY,EAAE,YAAY,GACxB,iBAAiB,CAInB;AAED,wBAAgB,wBAAwB,CACvC,YAAY,EAAE,YAAY,GACxB,iBAAiB,CAInB;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEnE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAM7D"}
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../../src/math/position.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AAUvC,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACN,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,MAAM,UAAU,CAAC;AAUlB;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,UAAO,EAChB,UAAU,UAAQ,EAClB,UAAU,CAAC,EAAE,EAAE,GACb,EAAE,CAoDJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,WAAW,SAAQ,EACnB,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAyBJ;AAED,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,iBAAiB,EAC7B,YAAY,EAAE,YAAY,EAC1B,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,GAC7C,EAAE,CAyBJ;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACzC,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,EAC1B,gBAAgB,UAAO,GACrB,EAAE,CAeJ;AAED;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC3C,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,GACxB,EAAE,CAoBJ;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,iBAAiB,EACzB,YAAY,EAAE,YAAY,GACxB,EAAE,CAEJ;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAOnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUtE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUlE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CACjC,YAAY,EAAE,YAAY,EAC1B,iBAAiB,UAAQ,GACvB,EAAE,CAWJ;AAED,wBAAgB,oBAAoB,CACnC,YAAY,EAAE,YAAY,GACxB,iBAAiB,CAInB;AAED,wBAAgB,wBAAwB,CACvC,YAAY,EAAE,YAAY,GACxB,iBAAiB,CAInB;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAEnE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAM7D"}
@@ -15,7 +15,7 @@ const market_1 = require("./market");
15
15
  * @param oraclePriceData
16
16
  * @returns Base Asset Value. : Precision QUOTE_PRECISION
17
17
  */
18
- function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false) {
18
+ function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpread = true, skipUpdate = false, latestSlot) {
19
19
  if (userPosition.baseAssetAmount.eq(numericConstants_1.ZERO)) {
20
20
  return numericConstants_1.ZERO;
21
21
  }
@@ -23,7 +23,7 @@ function calculateBaseAssetValue(market, userPosition, mmOraclePriceData, useSpr
23
23
  let prepegAmm;
24
24
  if (!skipUpdate) {
25
25
  if (market.amm.baseSpread > 0 && useSpread) {
26
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData);
26
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, directionToClose, mmOraclePriceData, undefined, latestSlot);
27
27
  prepegAmm = {
28
28
  baseAssetReserve,
29
29
  quoteAssetReserve,
@@ -28,7 +28,7 @@ export type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceD
28
28
  *
29
29
  * 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
30
30
  */
31
- export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN, BN];
31
+ export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN, BN];
32
32
  /**
33
33
  * Calculates acquired amounts for trade executed
34
34
  * @param direction
@@ -40,7 +40,7 @@ export declare function calculateTradeSlippage(direction: PositionDirection, amo
40
40
  * | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
41
41
  * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
42
42
  */
43
- export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean): [BN, BN, BN];
43
+ export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: PerpMarketAccount, inputAssetType: AssetType, mmOraclePriceData: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [BN, BN, BN];
44
44
  /**
45
45
  * calculateTargetPriceTrade
46
46
  * simple function for finding arbitraging trades
@@ -61,7 +61,7 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
61
61
  * targetPrice => the target price PRICE_PRECISION
62
62
  * ]
63
63
  */
64
- export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean): [PositionDirection, BN, BN, BN];
64
+ export declare function calculateTargetPriceTrade(market: PerpMarketAccount, targetPrice: BN, pct?: BN, outputAssetType?: AssetType, mmOraclePriceData?: MMOraclePriceData, useSpread?: boolean, latestSlot?: BN): [PositionDirection, BN, BN, BN];
65
65
  /**
66
66
  * Calculates the estimated entry price and price impact of order, in base or quote
67
67
  * Price impact is based on the difference between the entry price and the best bid/ask price (whether it's dlob or vamm)
@@ -1 +1 @@
1
- {"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../../src/math/trade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../../src/math/trade.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,7 @@ const MAXPCT = new anchor_1.BN(1000); //percentage units are [0,1000] => [0,1]
30
30
  *
31
31
  * 'newPrice' => the price of the asset after the trade : Precision PRICE_PRECISION
32
32
  */
33
- function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
33
+ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
34
34
  let oldPrice;
35
35
  if (useSpread && market.amm.baseSpread > 0) {
36
36
  if ((0, types_2.isVariant)(direction, 'long')) {
@@ -53,7 +53,7 @@ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quo
53
53
  .div(acquiredBaseReserve.abs());
54
54
  let amm;
55
55
  if (useSpread && market.amm.baseSpread > 0) {
56
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
56
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
57
57
  amm = {
58
58
  baseAssetReserve,
59
59
  quoteAssetReserve,
@@ -95,14 +95,14 @@ exports.calculateTradeSlippage = calculateTradeSlippage;
95
95
  * | 'acquiredBase' => positive/negative change in user's base : BN AMM_RESERVE_PRECISION
96
96
  * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
97
97
  */
98
- function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
98
+ function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
99
99
  if (amount.eq(numericConstants_1.ZERO)) {
100
100
  return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
101
101
  }
102
102
  const swapDirection = (0, amm_1.getSwapDirection)(inputAssetType, direction);
103
103
  let amm;
104
104
  if (useSpread && market.amm.baseSpread > 0) {
105
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
105
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
106
106
  amm = {
107
107
  baseAssetReserve,
108
108
  quoteAssetReserve,
@@ -140,7 +140,7 @@ exports.calculateTradeAcquiredAmounts = calculateTradeAcquiredAmounts;
140
140
  * targetPrice => the target price PRICE_PRECISION
141
141
  * ]
142
142
  */
143
- function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true) {
143
+ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAssetType = 'quote', mmOraclePriceData, useSpread = true, latestSlot) {
144
144
  (0, assert_1.assert)(market.amm.baseAssetReserve.gt(numericConstants_1.ZERO));
145
145
  (0, assert_1.assert)(targetPrice.gt(numericConstants_1.ZERO));
146
146
  (0, assert_1.assert)(pct.lte(MAXPCT) && pct.gt(numericConstants_1.ZERO));
@@ -166,7 +166,7 @@ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT, outputAsse
166
166
  let quoteAssetReserveBefore;
167
167
  let peg = market.amm.pegMultiplier;
168
168
  if (useSpread && market.amm.baseSpread > 0) {
169
- const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
169
+ const { baseAssetReserve, quoteAssetReserve, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, latestSlot);
170
170
  baseAssetReserveBefore = baseAssetReserve;
171
171
  quoteAssetReserveBefore = quoteAssetReserve;
172
172
  peg = newPeg;
@@ -280,7 +280,7 @@ function calculateEstimatedPerpEntryPrice(assetType, amount, direction, market,
280
280
  const takerIsLong = (0, types_2.isVariant)(direction, 'long');
281
281
  const limitOrders = dlob[takerIsLong ? 'getRestingLimitAsks' : 'getRestingLimitBids'](market.marketIndex, slot, types_1.MarketType.PERP, mmOraclePriceData);
282
282
  const swapDirection = (0, amm_1.getSwapDirection)(assetType, direction);
283
- const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData);
283
+ const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } = (0, amm_1.calculateUpdatedAMMSpreadReserves)(market.amm, direction, mmOraclePriceData, undefined, new anchor_1.BN(slot));
284
284
  const amm = {
285
285
  baseAssetReserve,
286
286
  quoteAssetReserve,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.135.0-beta.6",
3
+ "version": "2.135.0-beta.7",
4
4
  "main": "lib/node/index.js",
5
5
  "types": "lib/node/index.d.ts",
6
6
  "browser": "./lib/browser/index.js",
@@ -182,12 +182,14 @@ export function getVammL2Generator({
182
182
  numOrders,
183
183
  now = new BN(Math.floor(Date.now() / 1000)),
184
184
  topOfBookQuoteAmounts = [],
185
+ latestSlot,
185
186
  }: {
186
187
  marketAccount: PerpMarketAccount;
187
188
  mmOraclePriceData: MMOraclePriceData;
188
189
  numOrders: number;
189
190
  now?: BN;
190
191
  topOfBookQuoteAmounts?: BN[];
192
+ latestSlot?: BN;
191
193
  }): L2OrderBookGenerator {
192
194
  const updatedAmm = calculateUpdatedAMM(marketAccount.amm, mmOraclePriceData);
193
195
  const paused = isOperationPaused(
@@ -211,7 +213,8 @@ export function getVammL2Generator({
211
213
  updatedAmm,
212
214
  mmOraclePriceData,
213
215
  now,
214
- isVariant(marketAccount.contractType, 'prediction')
216
+ isVariant(marketAccount.contractType, 'prediction'),
217
+ latestSlot
215
218
  );
216
219
 
217
220
  const numBaseOrders = Math.max(1, numOrders - topOfBookQuoteAmounts.length);
package/src/math/amm.ts CHANGED
@@ -197,14 +197,16 @@ export function calculateUpdatedAMMSpreadReserves(
197
197
  amm: AMM,
198
198
  direction: PositionDirection,
199
199
  mmOraclePriceData: MMOraclePriceData,
200
- isPrediction = false
200
+ isPrediction = false,
201
+ latestSlot?: BN
201
202
  ): { baseAssetReserve: BN; quoteAssetReserve: BN; sqrtK: BN; newPeg: BN } {
202
203
  const newAmm = calculateUpdatedAMM(amm, mmOraclePriceData);
203
204
  const [shortReserves, longReserves] = calculateSpreadReserves(
204
205
  newAmm,
205
206
  mmOraclePriceData,
206
207
  undefined,
207
- isPrediction
208
+ isPrediction,
209
+ latestSlot
208
210
  );
209
211
 
210
212
  const dirReserves = isVariant(direction, 'long')
@@ -225,7 +227,8 @@ export function calculateBidAskPrice(
225
227
  amm: AMM,
226
228
  mmOraclePriceData: MMOraclePriceData,
227
229
  withUpdate = true,
228
- isPrediction = false
230
+ isPrediction = false,
231
+ latestSlot?: BN
229
232
  ): [BN, BN] {
230
233
  let newAmm: AMM;
231
234
  if (withUpdate) {
@@ -238,7 +241,8 @@ export function calculateBidAskPrice(
238
241
  newAmm,
239
242
  mmOraclePriceData,
240
243
  undefined,
241
- isPrediction
244
+ isPrediction,
245
+ latestSlot
242
246
  );
243
247
 
244
248
  const askPrice = calculatePrice(
@@ -939,7 +943,8 @@ export function calculateSpreadReserves(
939
943
  amm: AMM,
940
944
  mmOraclePriceData: MMOraclePriceData,
941
945
  now?: BN,
942
- isPrediction = false
946
+ isPrediction = false,
947
+ latestSlot?: BN
943
948
  ) {
944
949
  function calculateSpreadReserve(
945
950
  spread: number,
@@ -1041,28 +1046,28 @@ export function calculateSpreadReserves(
1041
1046
  amm.curveUpdateIntensity > 100;
1042
1047
 
1043
1048
  if (doReferencePricOffsetSmooth) {
1044
- if (mmOraclePriceData.slot !== amm.lastUpdateSlot) {
1045
- const slotsPassed =
1046
- mmOraclePriceData.slot.toNumber() - amm.lastUpdateSlot.toNumber();
1047
- const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
1048
- const raw = Math.trunc(
1049
- Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10
1050
- );
1051
- const maxAllowed =
1052
- Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
1049
+ const slotsPassed =
1050
+ latestSlot != null
1051
+ ? BN.max(latestSlot.sub(amm.lastUpdateSlot), ZERO).toNumber()
1052
+ : 0;
1053
+ const fullOffsetDelta = referencePriceOffset - amm.referencePriceOffset;
1054
+ const raw = Math.trunc(
1055
+ Math.min(Math.abs(fullOffsetDelta), slotsPassed * 1000) / 10
1056
+ );
1057
+ const maxAllowed =
1058
+ Math.abs(amm.referencePriceOffset) || Math.abs(referencePriceOffset);
1053
1059
 
1054
- const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
1055
- const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
1060
+ const magnitude = Math.min(Math.max(raw, 10), maxAllowed);
1061
+ const referencePriceDelta = Math.sign(fullOffsetDelta) * magnitude;
1056
1062
 
1057
- referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
1063
+ referencePriceOffset = amm.referencePriceOffset + referencePriceDelta;
1058
1064
 
1059
- if (referencePriceDelta < 0) {
1060
- longSpread += Math.abs(referencePriceDelta);
1061
- shortSpread += Math.abs(referencePriceOffset);
1062
- } else {
1063
- shortSpread += Math.abs(referencePriceDelta);
1064
- longSpread += Math.abs(referencePriceOffset);
1065
- }
1065
+ if (referencePriceDelta < 0) {
1066
+ longSpread += Math.abs(referencePriceDelta);
1067
+ shortSpread += Math.abs(referencePriceOffset);
1068
+ } else {
1069
+ shortSpread += Math.abs(referencePriceDelta);
1070
+ longSpread += Math.abs(referencePriceOffset);
1066
1071
  }
1067
1072
  }
1068
1073
 
@@ -61,13 +61,16 @@ export function calculateReservePrice(
61
61
  */
62
62
  export function calculateBidPrice(
63
63
  market: PerpMarketAccount,
64
- mmOraclePriceData: MMOraclePriceData
64
+ mmOraclePriceData: MMOraclePriceData,
65
+ latestSlot?: BN
65
66
  ): BN {
66
67
  const { baseAssetReserve, quoteAssetReserve, newPeg } =
67
68
  calculateUpdatedAMMSpreadReserves(
68
69
  market.amm,
69
70
  PositionDirection.SHORT,
70
- mmOraclePriceData
71
+ mmOraclePriceData,
72
+ undefined,
73
+ latestSlot
71
74
  );
72
75
 
73
76
  return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
@@ -81,13 +84,16 @@ export function calculateBidPrice(
81
84
  */
82
85
  export function calculateAskPrice(
83
86
  market: PerpMarketAccount,
84
- mmOraclePriceData: MMOraclePriceData
87
+ mmOraclePriceData: MMOraclePriceData,
88
+ latestSlot?: BN
85
89
  ): BN {
86
90
  const { baseAssetReserve, quoteAssetReserve, newPeg } =
87
91
  calculateUpdatedAMMSpreadReserves(
88
92
  market.amm,
89
93
  PositionDirection.LONG,
90
- mmOraclePriceData
94
+ mmOraclePriceData,
95
+ undefined,
96
+ latestSlot
91
97
  );
92
98
 
93
99
  return calculatePrice(baseAssetReserve, quoteAssetReserve, newPeg);
@@ -37,7 +37,8 @@ export function calculateBaseAssetValue(
37
37
  userPosition: PerpPosition,
38
38
  mmOraclePriceData: MMOraclePriceData,
39
39
  useSpread = true,
40
- skipUpdate = false
40
+ skipUpdate = false,
41
+ latestSlot?: BN
41
42
  ): BN {
42
43
  if (userPosition.baseAssetAmount.eq(ZERO)) {
43
44
  return ZERO;
@@ -52,7 +53,9 @@ export function calculateBaseAssetValue(
52
53
  calculateUpdatedAMMSpreadReserves(
53
54
  market.amm,
54
55
  directionToClose,
55
- mmOraclePriceData
56
+ mmOraclePriceData,
57
+ undefined,
58
+ latestSlot
56
59
  );
57
60
  prepegAmm = {
58
61
  baseAssetReserve,
package/src/math/trade.ts CHANGED
@@ -78,7 +78,8 @@ export function calculateTradeSlippage(
78
78
  market: PerpMarketAccount,
79
79
  inputAssetType: AssetType = 'quote',
80
80
  mmOraclePriceData: MMOraclePriceData,
81
- useSpread = true
81
+ useSpread = true,
82
+ latestSlot?: BN
82
83
  ): [BN, BN, BN, BN] {
83
84
  let oldPrice: BN;
84
85
 
@@ -115,7 +116,9 @@ export function calculateTradeSlippage(
115
116
  calculateUpdatedAMMSpreadReserves(
116
117
  market.amm,
117
118
  direction,
118
- mmOraclePriceData
119
+ mmOraclePriceData,
120
+ undefined,
121
+ latestSlot
119
122
  );
120
123
  amm = {
121
124
  baseAssetReserve,
@@ -170,7 +173,8 @@ export function calculateTradeAcquiredAmounts(
170
173
  market: PerpMarketAccount,
171
174
  inputAssetType: AssetType = 'quote',
172
175
  mmOraclePriceData: MMOraclePriceData,
173
- useSpread = true
176
+ useSpread = true,
177
+ latestSlot?: BN
174
178
  ): [BN, BN, BN] {
175
179
  if (amount.eq(ZERO)) {
176
180
  return [ZERO, ZERO, ZERO];
@@ -184,7 +188,9 @@ export function calculateTradeAcquiredAmounts(
184
188
  calculateUpdatedAMMSpreadReserves(
185
189
  market.amm,
186
190
  direction,
187
- mmOraclePriceData
191
+ mmOraclePriceData,
192
+ undefined,
193
+ latestSlot
188
194
  );
189
195
  amm = {
190
196
  baseAssetReserve,
@@ -236,7 +242,8 @@ export function calculateTargetPriceTrade(
236
242
  pct: BN = MAXPCT,
237
243
  outputAssetType: AssetType = 'quote',
238
244
  mmOraclePriceData?: MMOraclePriceData,
239
- useSpread = true
245
+ useSpread = true,
246
+ latestSlot?: BN
240
247
  ): [PositionDirection, BN, BN, BN] {
241
248
  assert(market.amm.baseAssetReserve.gt(ZERO));
242
249
  assert(targetPrice.gt(ZERO));
@@ -272,7 +279,9 @@ export function calculateTargetPriceTrade(
272
279
  calculateUpdatedAMMSpreadReserves(
273
280
  market.amm,
274
281
  direction,
275
- mmOraclePriceData
282
+ mmOraclePriceData,
283
+ undefined,
284
+ latestSlot
276
285
  );
277
286
  baseAssetReserveBefore = baseAssetReserve;
278
287
  quoteAssetReserveBefore = quoteAssetReserve;
@@ -430,7 +439,13 @@ export function calculateEstimatedPerpEntryPrice(
430
439
  const swapDirection = getSwapDirection(assetType, direction);
431
440
 
432
441
  const { baseAssetReserve, quoteAssetReserve, sqrtK, newPeg } =
433
- calculateUpdatedAMMSpreadReserves(market.amm, direction, mmOraclePriceData);
442
+ calculateUpdatedAMMSpreadReserves(
443
+ market.amm,
444
+ direction,
445
+ mmOraclePriceData,
446
+ undefined,
447
+ new BN(slot)
448
+ );
434
449
  const amm = {
435
450
  baseAssetReserve,
436
451
  quoteAssetReserve,