@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 +1 -1
- package/lib/dlob/DLOB.js +2 -0
- package/lib/dlob/orderBookLevels.d.ts +2 -0
- package/lib/dlob/orderBookLevels.js +8 -1
- package/package.json +1 -1
- package/src/dlob/DLOB.ts +2 -0
- package/src/dlob/orderBookLevels.ts +12 -1
- package/tests/amm/test.ts +78 -0
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.43.0-beta.
|
|
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
|
-
|
|
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
package/src/dlob/DLOB.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
});
|