@drift-labs/sdk 2.43.0-beta.5 → 2.43.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.43.0-beta.5
1
+ 2.43.0-beta.7
package/lib/dlob/DLOB.js CHANGED
@@ -956,6 +956,7 @@ class DLOB {
956
956
  return {
957
957
  bids,
958
958
  asks,
959
+ slot,
959
960
  };
960
961
  }
961
962
  /**
@@ -990,6 +991,7 @@ class DLOB {
990
991
  return {
991
992
  bids,
992
993
  asks,
994
+ slot,
993
995
  };
994
996
  }
995
997
  estimateFillExactBaseAmountInForSide(baseAmountIn, oraclePriceData, slot, dlobSide) {
@@ -12,6 +12,7 @@ export type L2Level = {
12
12
  export type L2OrderBook = {
13
13
  asks: L2Level[];
14
14
  bids: L2Level[];
15
+ slot?: number;
15
16
  };
16
17
  export interface L2OrderBookGenerator {
17
18
  getL2Asks(): Generator<L2Level>;
@@ -26,6 +27,7 @@ export type L3Level = {
26
27
  export type L3OrderBook = {
27
28
  asks: L3Level[];
28
29
  bids: L3Level[];
30
+ slot?: number;
29
31
  };
30
32
  export declare const DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS: BN[];
31
33
  /**
@@ -92,7 +92,14 @@ function getVammL2Generator({ marketAccount, oraclePriceData, numOrders, now, to
92
92
  (0, assert_1.assert)(topOfBookQuoteAmounts.length < numOrders);
93
93
  }
94
94
  const updatedAmm = (0, __1.calculateUpdatedAMM)(marketAccount.amm, oraclePriceData);
95
- const [openBids, openAsks] = (0, __1.calculateMarketOpenBidAsk)(updatedAmm.baseAssetReserve, updatedAmm.minBaseAssetReserve, updatedAmm.maxBaseAssetReserve, updatedAmm.orderStepSize);
95
+ let [openBids, openAsks] = (0, __1.calculateMarketOpenBidAsk)(updatedAmm.baseAssetReserve, updatedAmm.minBaseAssetReserve, updatedAmm.maxBaseAssetReserve, updatedAmm.orderStepSize);
96
+ const minOrderSize = marketAccount.amm.orderStepSize;
97
+ if (openBids.lt(minOrderSize.muln(2))) {
98
+ openBids = __1.ZERO;
99
+ }
100
+ if (openAsks.abs().lt(minOrderSize.muln(2))) {
101
+ openAsks = __1.ZERO;
102
+ }
96
103
  now = now !== null && now !== void 0 ? now : new __1.BN(Date.now() / 1000);
97
104
  const [bidReserves, askReserves] = (0, __1.calculateSpreadReserves)(updatedAmm, oraclePriceData, now);
98
105
  let numBids = 0;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.43.0-beta.5",
3
+ "version": "2.43.0-beta.7",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",
package/src/dlob/DLOB.ts CHANGED
@@ -1725,6 +1725,7 @@ export class DLOB {
1725
1725
  return {
1726
1726
  bids,
1727
1727
  asks,
1728
+ slot,
1728
1729
  };
1729
1730
  }
1730
1731
 
@@ -1785,6 +1786,7 @@ export class DLOB {
1785
1786
  return {
1786
1787
  bids,
1787
1788
  asks,
1789
+ slot,
1788
1790
  };
1789
1791
  }
1790
1792
 
@@ -29,6 +29,7 @@ export type L2Level = {
29
29
  export type L2OrderBook = {
30
30
  asks: L2Level[];
31
31
  bids: L2Level[];
32
+ slot?: number;
32
33
  };
33
34
 
34
35
  export interface L2OrderBookGenerator {
@@ -46,6 +47,7 @@ export type L3Level = {
46
47
  export type L3OrderBook = {
47
48
  asks: L3Level[];
48
49
  bids: L3Level[];
50
+ slot?: number;
49
51
  };
50
52
 
51
53
  export const DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS = [
@@ -164,13 +166,22 @@ export function getVammL2Generator({
164
166
 
165
167
  const updatedAmm = calculateUpdatedAMM(marketAccount.amm, oraclePriceData);
166
168
 
167
- const [openBids, openAsks] = calculateMarketOpenBidAsk(
169
+ let [openBids, openAsks] = calculateMarketOpenBidAsk(
168
170
  updatedAmm.baseAssetReserve,
169
171
  updatedAmm.minBaseAssetReserve,
170
172
  updatedAmm.maxBaseAssetReserve,
171
173
  updatedAmm.orderStepSize
172
174
  );
173
175
 
176
+ const minOrderSize = marketAccount.amm.orderStepSize;
177
+ if (openBids.lt(minOrderSize.muln(2))) {
178
+ openBids = ZERO;
179
+ }
180
+
181
+ if (openAsks.abs().lt(minOrderSize.muln(2))) {
182
+ openAsks = ZERO;
183
+ }
184
+
174
185
  now = now ?? new BN(Date.now() / 1000);
175
186
  const [bidReserves, askReserves] = calculateSpreadReserves(
176
187
  updatedAmm,
package/tests/amm/test.ts CHANGED
@@ -956,4 +956,82 @@ describe('AMM Tests', () => {
956
956
  );
957
957
  assert(totalAskSize.sub(openAsks.abs()).lte(new BN(5))); // only tiny rounding errors
958
958
  });
959
+
960
+ it('orderbook L2 gen (no topOfBookQuoteAmounts, 10 numOrders, no liquidity)', async () => {
961
+ const myMockPerpMarkets = _.cloneDeep(mockPerpMarkets);
962
+
963
+ const mockMarket1: PerpMarketAccount = myMockPerpMarkets[0];
964
+ const cc = 38104569;
965
+ mockMarket1.amm.baseAssetReserve = new BN(cc).mul(BASE_PRECISION);
966
+ mockMarket1.amm.minOrderSize = new BN(5);
967
+ mockMarket1.amm.maxBaseAssetReserve = mockMarket1.amm.baseAssetReserve.add(
968
+ new BN(9)
969
+ );
970
+ mockMarket1.amm.minBaseAssetReserve =
971
+ mockMarket1.amm.baseAssetReserve.sub(new BN(9));
972
+ mockMarket1.amm.quoteAssetReserve = new BN(cc).mul(BASE_PRECISION);
973
+ mockMarket1.amm.pegMultiplier = new BN(18.32 * PEG_PRECISION.toNumber());
974
+ mockMarket1.amm.sqrtK = new BN(cc).mul(BASE_PRECISION);
975
+
976
+ const now = new BN(1688881915);
977
+
978
+ const oraclePriceData: OraclePriceData = {
979
+ price: new BN(18.624 * PRICE_PRECISION.toNumber()),
980
+ slot: new BN(0),
981
+ confidence: new BN(1),
982
+ hasSufficientNumberOfDataPoints: true,
983
+ };
984
+ mockMarket1.amm.historicalOracleData.lastOraclePrice = new BN(
985
+ 18.5535 * PRICE_PRECISION.toNumber()
986
+ );
987
+
988
+ const updatedAmm = calculateUpdatedAMM(mockMarket1.amm, oraclePriceData);
989
+
990
+ const [openBids, openAsks] = calculateMarketOpenBidAsk(
991
+ updatedAmm.baseAssetReserve,
992
+ updatedAmm.minBaseAssetReserve,
993
+ updatedAmm.maxBaseAssetReserve,
994
+ updatedAmm.orderStepSize
995
+ );
996
+
997
+ const generator = getVammL2Generator({
998
+ marketAccount: mockMarket1,
999
+ oraclePriceData,
1000
+ numOrders: 10,
1001
+ now,
1002
+ topOfBookQuoteAmounts: [],
1003
+ });
1004
+
1005
+ const bids = Array.from(generator.getL2Bids());
1006
+ // console.log(bids);
1007
+
1008
+ const totalBidSize = bids.reduce((total: BN, order: L2Level) => {
1009
+ return total.add(order.size);
1010
+ }, ZERO);
1011
+
1012
+ console.log(
1013
+ 'totalBidSize:',
1014
+ totalBidSize.toString(),
1015
+ 'openBids:',
1016
+ openBids.toString()
1017
+ );
1018
+ assert(openBids.eq(new BN(9)));
1019
+ assert(totalBidSize.eq(ZERO));
1020
+
1021
+ const asks = Array.from(generator.getL2Asks());
1022
+ // console.log(asks);
1023
+
1024
+ const totalAskSize = asks.reduce((total: BN, order: L2Level) => {
1025
+ return total.add(order.size);
1026
+ }, ZERO);
1027
+ console.log(
1028
+ 'totalAskSize:',
1029
+ totalAskSize.toString(),
1030
+ 'openAsks:',
1031
+ openAsks.toString()
1032
+ );
1033
+
1034
+ assert(openAsks.eq(new BN(-9)));
1035
+ assert(totalAskSize.eq(ZERO));
1036
+ });
959
1037
  });