@drift-labs/sdk 2.52.0-beta.0 → 2.52.0-beta.2

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.
Files changed (60) hide show
  1. package/VERSION +1 -1
  2. package/lib/accounts/basicUserAccountSubscriber.d.ts +4 -0
  3. package/lib/accounts/basicUserAccountSubscriber.js +4 -0
  4. package/lib/accounts/bulkAccountLoader.js +7 -1
  5. package/lib/accounts/oneShotUserAccountSubscriber.d.ts +17 -0
  6. package/lib/accounts/oneShotUserAccountSubscriber.js +48 -0
  7. package/lib/accounts/pollingInsuranceFundStakeAccountSubscriber.js +1 -0
  8. package/lib/accounts/webSocketAccountSubscriber.d.ts +1 -1
  9. package/lib/accounts/webSocketAccountSubscriber.js +7 -4
  10. package/lib/accounts/webSocketProgramAccountSubscriber.d.ts +1 -1
  11. package/lib/accounts/webSocketProgramAccountSubscriber.js +7 -4
  12. package/lib/adminClient.d.ts +1 -0
  13. package/lib/adminClient.js +9 -0
  14. package/lib/constants/numericConstants.d.ts +3 -0
  15. package/lib/constants/numericConstants.js +4 -1
  16. package/lib/dlob/orderBookLevels.d.ts +22 -0
  17. package/lib/dlob/orderBookLevels.js +115 -1
  18. package/lib/driftClient.d.ts +1 -0
  19. package/lib/driftClient.js +14 -5
  20. package/lib/events/webSocketLogProvider.js +3 -3
  21. package/lib/factory/bigNum.d.ts +1 -1
  22. package/lib/factory/bigNum.js +5 -2
  23. package/lib/idl/drift.json +13 -1
  24. package/lib/index.d.ts +1 -0
  25. package/lib/index.js +1 -0
  26. package/lib/math/amm.d.ts +5 -1
  27. package/lib/math/amm.js +62 -13
  28. package/lib/phoenix/phoenixSubscriber.js +2 -2
  29. package/lib/slot/SlotSubscriber.d.ts +11 -3
  30. package/lib/slot/SlotSubscriber.js +40 -4
  31. package/lib/types.d.ts +1 -1
  32. package/lib/userMap/userMap.d.ts +3 -0
  33. package/lib/userMap/userMap.js +10 -1
  34. package/lib/userStats.d.ts +1 -0
  35. package/lib/userStats.js +3 -0
  36. package/package.json +1 -1
  37. package/src/accounts/basicUserAccountSubscriber.ts +4 -0
  38. package/src/accounts/bulkAccountLoader.ts +10 -3
  39. package/src/accounts/oneShotUserAccountSubscriber.ts +64 -0
  40. package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +1 -0
  41. package/src/accounts/webSocketAccountSubscriber.ts +7 -4
  42. package/src/accounts/webSocketProgramAccountSubscriber.ts +7 -4
  43. package/src/adminClient.ts +13 -0
  44. package/src/constants/numericConstants.ts +4 -0
  45. package/src/dlob/orderBookLevels.ts +136 -0
  46. package/src/driftClient.ts +21 -10
  47. package/src/events/webSocketLogProvider.ts +3 -3
  48. package/src/factory/bigNum.ts +11 -2
  49. package/src/idl/drift.json +13 -1
  50. package/src/index.ts +1 -0
  51. package/src/math/amm.ts +159 -25
  52. package/src/phoenix/phoenixSubscriber.ts +2 -2
  53. package/src/slot/SlotSubscriber.ts +52 -5
  54. package/src/types.ts +1 -1
  55. package/src/userMap/userMap.ts +17 -3
  56. package/src/userStats.ts +8 -0
  57. package/tests/amm/test.ts +219 -11
  58. package/tests/bn/test.ts +27 -0
  59. package/tests/dlob/helpers.ts +1 -1
  60. package/tests/dlob/test.ts +372 -2
@@ -23,6 +23,7 @@ import {
23
23
  convertToNumber,
24
24
  QUOTE_PRECISION,
25
25
  isVariant,
26
+ uncrossL2,
26
27
  } from '../../src';
27
28
 
28
29
  import { mockPerpMarkets, mockSpotMarkets, mockStateAccount } from './helpers';
@@ -61,6 +62,7 @@ function insertOrderToDLOB(
61
62
  baseAssetAmount,
62
63
  baseAssetAmountFilled: new BN(0),
63
64
  quoteAssetAmountFilled: new BN(0),
65
+ quoteAssetAmount: new BN(0),
64
66
  direction,
65
67
  reduceOnly: false,
66
68
  triggerPrice: new BN(0),
@@ -111,6 +113,7 @@ function insertTriggerOrderToDLOB(
111
113
  baseAssetAmount,
112
114
  baseAssetAmountFilled: new BN(0),
113
115
  quoteAssetAmountFilled: new BN(0),
116
+ quoteAssetAmount: new BN(0),
114
117
  direction,
115
118
  reduceOnly: false,
116
119
  triggerPrice,
@@ -2740,8 +2743,13 @@ describe('DLOB Perp Tests', () => {
2740
2743
  );
2741
2744
  expect(takingBids.length).to.equal(1);
2742
2745
  const triggerLimitBid = takingBids[0];
2743
- expect(isAuctionComplete(triggerLimitBid.order!, slot)).to.equal(true);
2744
- expect(isRestingLimitOrder(triggerLimitBid.order!, slot)).to.equal(false);
2746
+ expect(triggerLimitBid !== undefined);
2747
+ expect(isAuctionComplete(triggerLimitBid.order as Order, slot)).to.equal(
2748
+ true
2749
+ );
2750
+ expect(isRestingLimitOrder(triggerLimitBid.order as Order, slot)).to.equal(
2751
+ false
2752
+ );
2745
2753
  });
2746
2754
 
2747
2755
  it('Test will return expired market orders to fill', () => {
@@ -6063,3 +6071,365 @@ describe('DLOB Spot Tests', () => {
6063
6071
  expect(quoteAmtOut === 82.72).to.be.true;
6064
6072
  });
6065
6073
  });
6074
+
6075
+ describe('Uncross L2', () => {
6076
+
6077
+ it('Bid crosses ask above oracle (no premium)', () => {
6078
+ const bids = [
6079
+ {
6080
+ price: new BN(104).mul(QUOTE_PRECISION),
6081
+ size: new BN(1).mul(BASE_PRECISION),
6082
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6083
+ },
6084
+ {
6085
+ price: new BN(103).mul(QUOTE_PRECISION),
6086
+ size: new BN(1).mul(BASE_PRECISION),
6087
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6088
+ },
6089
+ {
6090
+ price: new BN(102).mul(QUOTE_PRECISION),
6091
+ size: new BN(1).mul(BASE_PRECISION),
6092
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6093
+ },
6094
+ {
6095
+ price: new BN(100).mul(QUOTE_PRECISION),
6096
+ size: new BN(1).mul(BASE_PRECISION),
6097
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6098
+ }
6099
+ ];
6100
+
6101
+ const asks = [
6102
+ {
6103
+ price: new BN(101).mul(QUOTE_PRECISION),
6104
+ size: new BN(1).mul(BASE_PRECISION),
6105
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)},
6106
+ },
6107
+ {
6108
+ price: new BN(102).mul(QUOTE_PRECISION),
6109
+ size: new BN(1).mul(BASE_PRECISION),
6110
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)},
6111
+ },
6112
+ ];
6113
+
6114
+ const oraclePrice = new BN(100).mul(QUOTE_PRECISION);
6115
+ const oraclePrice5Min = new BN(100).mul(QUOTE_PRECISION);
6116
+ const markPrice5Min = new BN(100).mul(QUOTE_PRECISION);
6117
+
6118
+ const groupingSize = QUOTE_PRECISION.divn(10);
6119
+
6120
+ const { bids: newBids, asks: newAsks } = uncrossL2(bids, asks, oraclePrice, oraclePrice5Min, markPrice5Min, groupingSize, new Set<string>(), new Set<string>());
6121
+
6122
+ expect(newBids[0].price.toString()).to.equal(new BN(101).mul(QUOTE_PRECISION).sub(groupingSize).toString());
6123
+ expect(newBids[0].size.toString()).to.equal(new BN(3).mul(BASE_PRECISION).toString());
6124
+ expect(newBids[0].sources["vamm"].toString()).to.equal(new BN(2).mul(BASE_PRECISION).toString());
6125
+ expect(newBids[0].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6126
+
6127
+ expect(newBids[1].price.toString()).to.equal(new BN(100).mul(QUOTE_PRECISION).toString());
6128
+ expect(newBids[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6129
+ expect(newBids[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6130
+
6131
+ expect(newAsks[0].price.toString()).to.equal(new BN(101).mul(QUOTE_PRECISION).toString());
6132
+ expect(newAsks[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6133
+ expect(newAsks[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6134
+
6135
+ expect(newAsks[1].price.toString()).to.equal(new BN(102).mul(QUOTE_PRECISION).toString());
6136
+ expect(newAsks[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6137
+ expect(newAsks[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6138
+ });
6139
+
6140
+ it('Ask crosses ask below oracle, (new premium)', () => {
6141
+ const bids = [
6142
+ {
6143
+ price: new BN(99).mul(QUOTE_PRECISION),
6144
+ size: new BN(1).mul(BASE_PRECISION),
6145
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6146
+ },
6147
+ {
6148
+ price: new BN(98).mul(QUOTE_PRECISION),
6149
+ size: new BN(1).mul(BASE_PRECISION),
6150
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6151
+ },
6152
+ ];
6153
+
6154
+ const asks = [
6155
+ {
6156
+ price: new BN(96).mul(QUOTE_PRECISION),
6157
+ size: new BN(1).mul(BASE_PRECISION),
6158
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6159
+ },
6160
+ {
6161
+ price: new BN(97).mul(QUOTE_PRECISION),
6162
+ size: new BN(1).mul(BASE_PRECISION),
6163
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6164
+ },
6165
+ {
6166
+ price: new BN(98).mul(QUOTE_PRECISION),
6167
+ size: new BN(1).mul(BASE_PRECISION),
6168
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6169
+ },
6170
+ {
6171
+ price: new BN(100).mul(QUOTE_PRECISION),
6172
+ size: new BN(1).mul(BASE_PRECISION),
6173
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6174
+ }
6175
+ ];
6176
+
6177
+ const oraclePrice = new BN(100).mul(QUOTE_PRECISION);
6178
+ const oraclePrice5Min = new BN(100).mul(QUOTE_PRECISION);
6179
+ const markPrice5Min = new BN(100).mul(QUOTE_PRECISION);
6180
+
6181
+ const groupingSize = QUOTE_PRECISION.divn(10);
6182
+
6183
+ const { bids: newBids, asks: newAsks } = uncrossL2(bids, asks, oraclePrice, oraclePrice5Min, markPrice5Min, groupingSize, new Set<string>(), new Set<string>());
6184
+
6185
+ expect(newBids[0].price.toString()).to.equal(new BN(99).mul(QUOTE_PRECISION).toString());
6186
+ expect(newBids[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6187
+ expect(newBids[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6188
+
6189
+ expect(newBids[1].price.toString()).to.equal(new BN(98).mul(QUOTE_PRECISION).toString());
6190
+ expect(newBids[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6191
+ expect(newBids[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6192
+
6193
+ expect(newAsks[0].price.toString()).to.equal(new BN(99).mul(QUOTE_PRECISION).add(groupingSize).toString());
6194
+ expect(newAsks[0].size.toString()).to.equal(new BN(3).mul(BASE_PRECISION).toString());
6195
+ expect(newAsks[0].sources["vamm"].toString()).to.equal(new BN(2).mul(BASE_PRECISION).toString());
6196
+ expect(newAsks[0].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6197
+
6198
+ expect(newAsks[1].price.toString()).to.equal(new BN(100).mul(QUOTE_PRECISION).toString());
6199
+ expect(newAsks[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6200
+ expect(newAsks[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6201
+ });
6202
+
6203
+ it('No cross (no premium)', () => {
6204
+ const bids = [
6205
+ {
6206
+ price: new BN(99).mul(QUOTE_PRECISION),
6207
+ size: new BN(1).mul(BASE_PRECISION),
6208
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6209
+ },
6210
+ {
6211
+ price: new BN(98).mul(QUOTE_PRECISION),
6212
+ size: new BN(1).mul(BASE_PRECISION),
6213
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6214
+ },
6215
+ {
6216
+ price: new BN(97).mul(QUOTE_PRECISION),
6217
+ size: new BN(1).mul(BASE_PRECISION),
6218
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6219
+ },
6220
+ ];
6221
+
6222
+ const asks = [
6223
+ {
6224
+ price: new BN(101).mul(QUOTE_PRECISION),
6225
+ size: new BN(1).mul(BASE_PRECISION),
6226
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6227
+ },
6228
+ {
6229
+ price: new BN(102).mul(QUOTE_PRECISION),
6230
+ size: new BN(1).mul(BASE_PRECISION),
6231
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6232
+ },
6233
+ ];
6234
+
6235
+ const oraclePrice = new BN(100).mul(QUOTE_PRECISION);
6236
+ const oraclePrice5Min = new BN(100).mul(QUOTE_PRECISION);
6237
+ const markPrice5Min = new BN(100).mul(QUOTE_PRECISION);
6238
+
6239
+ const groupingSize = QUOTE_PRECISION.divn(10);
6240
+
6241
+ const { bids: newBids, asks: newAsks } = uncrossL2(bids, asks, oraclePrice, oraclePrice5Min, markPrice5Min, groupingSize, new Set<string>(), new Set<string>());
6242
+
6243
+ expect(newBids[0].price.toString()).to.equal(new BN(99).mul(QUOTE_PRECISION).toString());
6244
+ expect(newBids[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6245
+ expect(newBids[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6246
+
6247
+ expect(newBids[1].price.toString()).to.equal(new BN(98).mul(QUOTE_PRECISION).toString());
6248
+ expect(newBids[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6249
+ expect(newBids[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6250
+
6251
+ expect(newBids[2].price.toString()).to.equal(new BN(97).mul(QUOTE_PRECISION).toString());
6252
+ expect(newBids[2].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6253
+ expect(newBids[2].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6254
+
6255
+ expect(newAsks[0].price.toString()).to.equal(new BN(101).mul(QUOTE_PRECISION).toString());
6256
+ expect(newAsks[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6257
+ expect(newAsks[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6258
+
6259
+ expect(newAsks[1].price.toString()).to.equal(new BN(102).mul(QUOTE_PRECISION).toString());
6260
+ expect(newAsks[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6261
+ expect(newAsks[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6262
+ });
6263
+
6264
+ it('Crossed on opposite sides of reference price', () => {
6265
+ const bids = [
6266
+ {
6267
+ price: new BN(32).mul(QUOTE_PRECISION),
6268
+ size: new BN(1).mul(BASE_PRECISION),
6269
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6270
+ },
6271
+ ];
6272
+
6273
+ const asks = [
6274
+ {
6275
+ price: new BN(29).mul(QUOTE_PRECISION),
6276
+ size: new BN(1).mul(BASE_PRECISION),
6277
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6278
+ },
6279
+ ];
6280
+
6281
+ const oraclePrice = new BN("29250100");
6282
+ const oraclePrice5Min = new BN("29696597");
6283
+ const markPrice5Min = new BN("31747865");
6284
+
6285
+ const groupingSize = QUOTE_PRECISION.divn(10);
6286
+
6287
+ const { bids: newBids, asks: newAsks } = uncrossL2(bids, asks, oraclePrice, oraclePrice5Min, markPrice5Min, groupingSize, new Set<string>(), new Set<string>());
6288
+
6289
+ const referencePrice = oraclePrice.add(markPrice5Min.sub(oraclePrice5Min));
6290
+
6291
+ expect(newBids[0].price.toString()).to.equal(referencePrice.sub(groupingSize).toString());
6292
+ expect(newBids[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6293
+ expect(newBids[0].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6294
+
6295
+ expect(newAsks[0].price.toString()).to.equal(referencePrice.add(groupingSize).toString());
6296
+ expect(newAsks[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6297
+ expect(newAsks[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6298
+ });
6299
+
6300
+ it('Skip user with bid', () => {
6301
+ const bids = [
6302
+ {
6303
+ price: new BN(104).mul(QUOTE_PRECISION),
6304
+ size: new BN(1).mul(BASE_PRECISION),
6305
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6306
+ },
6307
+ {
6308
+ price: new BN(103).mul(QUOTE_PRECISION),
6309
+ size: new BN(1).mul(BASE_PRECISION),
6310
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6311
+ },
6312
+ {
6313
+ price: new BN(102).mul(QUOTE_PRECISION),
6314
+ size: new BN(1).mul(BASE_PRECISION),
6315
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6316
+ },
6317
+ {
6318
+ price: new BN(100).mul(QUOTE_PRECISION),
6319
+ size: new BN(1).mul(BASE_PRECISION),
6320
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6321
+ }
6322
+ ];
6323
+
6324
+ const asks = [
6325
+ {
6326
+ price: new BN(101).mul(QUOTE_PRECISION),
6327
+ size: new BN(1).mul(BASE_PRECISION),
6328
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)},
6329
+ },
6330
+ {
6331
+ price: new BN(102).mul(QUOTE_PRECISION),
6332
+ size: new BN(1).mul(BASE_PRECISION),
6333
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)},
6334
+ },
6335
+ ];
6336
+
6337
+ const oraclePrice = new BN(100).mul(QUOTE_PRECISION);
6338
+ const oraclePrice5Min = new BN(100).mul(QUOTE_PRECISION);
6339
+ const markPrice5Min = new BN(100).mul(QUOTE_PRECISION);
6340
+
6341
+ const groupingSize = QUOTE_PRECISION.divn(10);
6342
+
6343
+ const userBids = new Set<string>([new BN(104).mul(QUOTE_PRECISION).toString()]);
6344
+ const { bids: newBids, asks: newAsks } = uncrossL2(bids, asks, oraclePrice, oraclePrice5Min, markPrice5Min, groupingSize, userBids, new Set<string>());
6345
+
6346
+ expect(newBids[0].price.toString()).to.equal(new BN(104).mul(QUOTE_PRECISION).toString());
6347
+ expect(newBids[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6348
+ expect(newBids[0].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6349
+
6350
+ expect(newBids[1].price.toString()).to.equal(new BN(101).mul(QUOTE_PRECISION).sub(groupingSize).toString());
6351
+ expect(newBids[1].size.toString()).to.equal(new BN(2).mul(BASE_PRECISION).toString());
6352
+ expect(newBids[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6353
+ expect(newBids[1].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6354
+
6355
+ expect(newBids[2].price.toString()).to.equal(new BN(100).mul(QUOTE_PRECISION).toString());
6356
+ expect(newBids[2].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6357
+ expect(newBids[2].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6358
+
6359
+ expect(newAsks[0].price.toString()).to.equal(new BN(101).mul(QUOTE_PRECISION).toString());
6360
+ expect(newAsks[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6361
+ expect(newAsks[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6362
+
6363
+ expect(newAsks[1].price.toString()).to.equal(new BN(102).mul(QUOTE_PRECISION).toString());
6364
+ expect(newAsks[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6365
+ expect(newAsks[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6366
+ });
6367
+
6368
+ it('Skip user with ask', () => {
6369
+ const bids = [
6370
+ {
6371
+ price: new BN(99).mul(QUOTE_PRECISION),
6372
+ size: new BN(1).mul(BASE_PRECISION),
6373
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6374
+ },
6375
+ {
6376
+ price: new BN(98).mul(QUOTE_PRECISION),
6377
+ size: new BN(1).mul(BASE_PRECISION),
6378
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6379
+ },
6380
+ ];
6381
+
6382
+ const asks = [
6383
+ {
6384
+ price: new BN(96).mul(QUOTE_PRECISION),
6385
+ size: new BN(1).mul(BASE_PRECISION),
6386
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6387
+ },
6388
+ {
6389
+ price: new BN(97).mul(QUOTE_PRECISION),
6390
+ size: new BN(1).mul(BASE_PRECISION),
6391
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6392
+ },
6393
+ {
6394
+ price: new BN(98).mul(QUOTE_PRECISION),
6395
+ size: new BN(1).mul(BASE_PRECISION),
6396
+ sources: {"dlob": new BN(1).mul(BASE_PRECISION)}
6397
+ },
6398
+ {
6399
+ price: new BN(100).mul(QUOTE_PRECISION),
6400
+ size: new BN(1).mul(BASE_PRECISION),
6401
+ sources: {"vamm": new BN(1).mul(BASE_PRECISION)}
6402
+ }
6403
+ ];
6404
+
6405
+ const oraclePrice = new BN(100).mul(QUOTE_PRECISION);
6406
+ const oraclePrice5Min = new BN(100).mul(QUOTE_PRECISION);
6407
+ const markPrice5Min = new BN(100).mul(QUOTE_PRECISION);
6408
+
6409
+ const groupingSize = QUOTE_PRECISION.divn(10);
6410
+
6411
+ const userAsks = new Set<string>([new BN(96).mul(QUOTE_PRECISION).toString()]);
6412
+ const { bids: newBids, asks: newAsks } = uncrossL2(bids, asks, oraclePrice, oraclePrice5Min, markPrice5Min, groupingSize, new Set<string>(), userAsks);
6413
+
6414
+ expect(newBids[0].price.toString()).to.equal(new BN(99).mul(QUOTE_PRECISION).toString());
6415
+ expect(newBids[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6416
+ expect(newBids[0].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6417
+
6418
+ expect(newBids[1].price.toString()).to.equal(new BN(98).mul(QUOTE_PRECISION).toString());
6419
+ expect(newBids[1].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6420
+ expect(newBids[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6421
+
6422
+ expect(newAsks[0].price.toString()).to.equal(new BN(96).mul(QUOTE_PRECISION).toString());
6423
+ expect(newAsks[0].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6424
+ expect(newAsks[0].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6425
+
6426
+ expect(newAsks[1].price.toString()).to.equal(new BN(99).mul(QUOTE_PRECISION).add(groupingSize).toString());
6427
+ expect(newAsks[1].size.toString()).to.equal(new BN(2).mul(BASE_PRECISION).toString());
6428
+ expect(newAsks[1].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6429
+ expect(newAsks[1].sources["dlob"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6430
+
6431
+ expect(newAsks[2].price.toString()).to.equal(new BN(100).mul(QUOTE_PRECISION).toString());
6432
+ expect(newAsks[2].size.toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6433
+ expect(newAsks[2].sources["vamm"].toString()).to.equal(new BN(1).mul(BASE_PRECISION).toString());
6434
+ });
6435
+ });