@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.
- package/VERSION +1 -1
- package/lib/accounts/basicUserAccountSubscriber.d.ts +4 -0
- package/lib/accounts/basicUserAccountSubscriber.js +4 -0
- package/lib/accounts/bulkAccountLoader.js +7 -1
- package/lib/accounts/oneShotUserAccountSubscriber.d.ts +17 -0
- package/lib/accounts/oneShotUserAccountSubscriber.js +48 -0
- package/lib/accounts/pollingInsuranceFundStakeAccountSubscriber.js +1 -0
- package/lib/accounts/webSocketAccountSubscriber.d.ts +1 -1
- package/lib/accounts/webSocketAccountSubscriber.js +7 -4
- package/lib/accounts/webSocketProgramAccountSubscriber.d.ts +1 -1
- package/lib/accounts/webSocketProgramAccountSubscriber.js +7 -4
- package/lib/adminClient.d.ts +1 -0
- package/lib/adminClient.js +9 -0
- package/lib/constants/numericConstants.d.ts +3 -0
- package/lib/constants/numericConstants.js +4 -1
- package/lib/dlob/orderBookLevels.d.ts +22 -0
- package/lib/dlob/orderBookLevels.js +115 -1
- package/lib/driftClient.d.ts +1 -0
- package/lib/driftClient.js +14 -5
- package/lib/events/webSocketLogProvider.js +3 -3
- package/lib/factory/bigNum.d.ts +1 -1
- package/lib/factory/bigNum.js +5 -2
- package/lib/idl/drift.json +13 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/math/amm.d.ts +5 -1
- package/lib/math/amm.js +62 -13
- package/lib/phoenix/phoenixSubscriber.js +2 -2
- package/lib/slot/SlotSubscriber.d.ts +11 -3
- package/lib/slot/SlotSubscriber.js +40 -4
- package/lib/types.d.ts +1 -1
- package/lib/userMap/userMap.d.ts +3 -0
- package/lib/userMap/userMap.js +10 -1
- package/lib/userStats.d.ts +1 -0
- package/lib/userStats.js +3 -0
- package/package.json +1 -1
- package/src/accounts/basicUserAccountSubscriber.ts +4 -0
- package/src/accounts/bulkAccountLoader.ts +10 -3
- package/src/accounts/oneShotUserAccountSubscriber.ts +64 -0
- package/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +1 -0
- package/src/accounts/webSocketAccountSubscriber.ts +7 -4
- package/src/accounts/webSocketProgramAccountSubscriber.ts +7 -4
- package/src/adminClient.ts +13 -0
- package/src/constants/numericConstants.ts +4 -0
- package/src/dlob/orderBookLevels.ts +136 -0
- package/src/driftClient.ts +21 -10
- package/src/events/webSocketLogProvider.ts +3 -3
- package/src/factory/bigNum.ts +11 -2
- package/src/idl/drift.json +13 -1
- package/src/index.ts +1 -0
- package/src/math/amm.ts +159 -25
- package/src/phoenix/phoenixSubscriber.ts +2 -2
- package/src/slot/SlotSubscriber.ts +52 -5
- package/src/types.ts +1 -1
- package/src/userMap/userMap.ts +17 -3
- package/src/userStats.ts +8 -0
- package/tests/amm/test.ts +219 -11
- package/tests/bn/test.ts +27 -0
- package/tests/dlob/helpers.ts +1 -1
- package/tests/dlob/test.ts +372 -2
package/tests/dlob/test.ts
CHANGED
|
@@ -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(
|
|
2744
|
-
expect(
|
|
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
|
+
});
|