@drift-labs/sdk 2.0.16 → 2.0.18

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.
@@ -0,0 +1,245 @@
1
+ {
2
+ "version": "2.0.0",
3
+ "name": "dlob",
4
+ "instructions": [],
5
+ "accounts": [],
6
+ "types": [
7
+ {
8
+ "name": "DLOBOrders",
9
+ "type": {
10
+ "vec": {
11
+ "defined": "DLOBOrder"
12
+ }
13
+ }
14
+ },
15
+ {
16
+ "name": "DLOBOrder",
17
+ "type": {
18
+ "kind": "struct",
19
+ "fields": [
20
+ {
21
+ "name": "user",
22
+ "type": "publicKey"
23
+ },
24
+ {
25
+ "name": "order",
26
+ "type": {
27
+ "defined": "Order"
28
+ }
29
+ }
30
+ ]
31
+ }
32
+ },
33
+ {
34
+ "name": "Order",
35
+ "type": {
36
+ "kind": "struct",
37
+ "fields": [
38
+ {
39
+ "name": "slot",
40
+ "type": "u64"
41
+ },
42
+ {
43
+ "name": "price",
44
+ "type": "u64"
45
+ },
46
+ {
47
+ "name": "baseAssetAmount",
48
+ "type": "u64"
49
+ },
50
+ {
51
+ "name": "baseAssetAmountFilled",
52
+ "type": "u64"
53
+ },
54
+ {
55
+ "name": "quoteAssetAmountFilled",
56
+ "type": "u64"
57
+ },
58
+ {
59
+ "name": "triggerPrice",
60
+ "type": "u64"
61
+ },
62
+ {
63
+ "name": "auctionStartPrice",
64
+ "type": "u64"
65
+ },
66
+ {
67
+ "name": "auctionEndPrice",
68
+ "type": "u64"
69
+ },
70
+ {
71
+ "name": "maxTs",
72
+ "type": "i64"
73
+ },
74
+ {
75
+ "name": "oraclePriceOffset",
76
+ "type": "i32"
77
+ },
78
+ {
79
+ "name": "orderId",
80
+ "type": "u32"
81
+ },
82
+ {
83
+ "name": "marketIndex",
84
+ "type": "u16"
85
+ },
86
+ {
87
+ "name": "status",
88
+ "type": {
89
+ "defined": "OrderStatus"
90
+ }
91
+ },
92
+ {
93
+ "name": "orderType",
94
+ "type": {
95
+ "defined": "OrderType"
96
+ }
97
+ },
98
+ {
99
+ "name": "marketType",
100
+ "type": {
101
+ "defined": "MarketType"
102
+ }
103
+ },
104
+ {
105
+ "name": "userOrderId",
106
+ "type": "u8"
107
+ },
108
+ {
109
+ "name": "existingPositionDirection",
110
+ "type": {
111
+ "defined": "PositionDirection"
112
+ }
113
+ },
114
+ {
115
+ "name": "direction",
116
+ "type": {
117
+ "defined": "PositionDirection"
118
+ }
119
+ },
120
+ {
121
+ "name": "reduceOnly",
122
+ "type": "bool"
123
+ },
124
+ {
125
+ "name": "postOnly",
126
+ "type": "bool"
127
+ },
128
+ {
129
+ "name": "immediateOrCancel",
130
+ "type": "bool"
131
+ },
132
+ {
133
+ "name": "triggerCondition",
134
+ "type": {
135
+ "defined": "OrderTriggerCondition"
136
+ }
137
+ },
138
+ {
139
+ "name": "auctionDuration",
140
+ "type": "u8"
141
+ },
142
+ {
143
+ "name": "padding",
144
+ "type": {
145
+ "array": [
146
+ "u8",
147
+ 3
148
+ ]
149
+ }
150
+ }
151
+ ]
152
+ }
153
+ },
154
+ {
155
+ "name": "OrderStatus",
156
+ "type": {
157
+ "kind": "enum",
158
+ "variants": [
159
+ {
160
+ "name": "Init"
161
+ },
162
+ {
163
+ "name": "Open"
164
+ },
165
+ {
166
+ "name": "Filled"
167
+ },
168
+ {
169
+ "name": "Canceled"
170
+ }
171
+ ]
172
+ }
173
+ },
174
+ {
175
+ "name": "OrderType",
176
+ "type": {
177
+ "kind": "enum",
178
+ "variants": [
179
+ {
180
+ "name": "Market"
181
+ },
182
+ {
183
+ "name": "Limit"
184
+ },
185
+ {
186
+ "name": "TriggerMarket"
187
+ },
188
+ {
189
+ "name": "TriggerLimit"
190
+ }
191
+ ]
192
+ }
193
+ },
194
+ {
195
+ "name": "OrderTriggerCondition",
196
+ "type": {
197
+ "kind": "enum",
198
+ "variants": [
199
+ {
200
+ "name": "Above"
201
+ },
202
+ {
203
+ "name": "Below"
204
+ },
205
+ {
206
+ "name": "TriggeredAbove"
207
+ },
208
+ {
209
+ "name": "TriggeredBelow"
210
+ }
211
+ ]
212
+ }
213
+ },
214
+ {
215
+ "name": "MarketType",
216
+ "type": {
217
+ "kind": "enum",
218
+ "variants": [
219
+ {
220
+ "name": "Spot"
221
+ },
222
+ {
223
+ "name": "Perp"
224
+ }
225
+ ]
226
+ }
227
+ },
228
+ {
229
+ "name": "PositionDirection",
230
+ "type": {
231
+ "kind": "enum",
232
+ "variants": [
233
+ {
234
+ "name": "Long"
235
+ },
236
+ {
237
+ "name": "Short"
238
+ }
239
+ ]
240
+ }
241
+ }
242
+ ],
243
+ "events": [],
244
+ "errors": []
245
+ }
@@ -8519,6 +8519,11 @@
8519
8519
  "code": 6221,
8520
8520
  "name": "SpotFulfillmentConfigDisabled",
8521
8521
  "msg": "Spot Fulfullment Config Disabled"
8522
+ },
8523
+ {
8524
+ "code": 6222,
8525
+ "name": "InvalidMaker",
8526
+ "msg": "Invalid Maker"
8522
8527
  }
8523
8528
  ]
8524
8529
  }
package/lib/index.d.ts CHANGED
@@ -62,6 +62,7 @@ export * from './constants/spotMarkets';
62
62
  export * from './driftClientConfig';
63
63
  export * from './dlob/DLOB';
64
64
  export * from './dlob/DLOBNode';
65
+ export * from './dlob/DLOBOrders';
65
66
  export * from './dlob/NodeList';
66
67
  export * from './userMap/userMap';
67
68
  export * from './userMap/userStatsMap';
package/lib/index.js CHANGED
@@ -85,6 +85,7 @@ __exportStar(require("./constants/spotMarkets"), exports);
85
85
  __exportStar(require("./driftClientConfig"), exports);
86
86
  __exportStar(require("./dlob/DLOB"), exports);
87
87
  __exportStar(require("./dlob/DLOBNode"), exports);
88
+ __exportStar(require("./dlob/DLOBOrders"), exports);
88
89
  __exportStar(require("./dlob/NodeList"), exports);
89
90
  __exportStar(require("./userMap/userMap"), exports);
90
91
  __exportStar(require("./userMap/userStatsMap"), exports);
package/lib/math/amm.d.ts CHANGED
@@ -38,7 +38,27 @@ export declare function calculateInventoryScale(baseAssetAmountWithAmm: BN, base
38
38
  export declare function calculateEffectiveLeverage(baseSpread: number, quoteAssetReserve: BN, terminalQuoteAssetReserve: BN, pegMultiplier: BN, netBaseAssetAmount: BN, reservePrice: BN, totalFeeMinusDistributions: BN): number;
39
39
  export declare function calculateMaxSpread(marginRatioInitial: number): number;
40
40
  export declare function calculateVolSpreadBN(lastOracleConfPct: BN, reservePrice: BN, markStd: BN, oracleStd: BN, longIntensity: BN, shortIntensity: BN, volume24H: BN): [BN, BN];
41
- export declare function calculateSpreadBN(baseSpread: number, lastOracleReservePriceSpreadPct: BN, lastOracleConfPct: BN, maxSpread: number, quoteAssetReserve: BN, terminalQuoteAssetReserve: BN, pegMultiplier: BN, baseAssetAmountWithAmm: BN, reservePrice: BN, totalFeeMinusDistributions: BN, netRevenueSinceLastFunding: BN, baseAssetReserve: BN, minBaseAssetReserve: BN, maxBaseAssetReserve: BN, markStd: BN, oracleStd: BN, longIntensity: BN, shortIntensity: BN, volume24H: BN): [number, number];
41
+ export declare function calculateSpreadBN(baseSpread: number, lastOracleReservePriceSpreadPct: BN, lastOracleConfPct: BN, maxSpread: number, quoteAssetReserve: BN, terminalQuoteAssetReserve: BN, pegMultiplier: BN, baseAssetAmountWithAmm: BN, reservePrice: BN, totalFeeMinusDistributions: BN, netRevenueSinceLastFunding: BN, baseAssetReserve: BN, minBaseAssetReserve: BN, maxBaseAssetReserve: BN, markStd: BN, oracleStd: BN, longIntensity: BN, shortIntensity: BN, volume24H: BN, returnTerms?: boolean): number[] | {
42
+ longVolSpread: number;
43
+ shortVolSpread: number;
44
+ longSpreadwPS: number;
45
+ shortSpreadwPS: number;
46
+ maxTargetSpread: number;
47
+ inventorySpreadScale: number;
48
+ longSpreadwInvScale: number;
49
+ shortSpreadwInvScale: number;
50
+ effectiveLeverage: number;
51
+ effectiveLeverageCapped: number;
52
+ longSpreadwEL: number;
53
+ shortSpreadwEL: number;
54
+ revenueRetreatAmount: number;
55
+ halfRevenueRetreatAmount: number;
56
+ longSpreadwRevRetreat: number;
57
+ shortSpreadwRevRetreat: number;
58
+ totalSpread: number;
59
+ longSpread: number;
60
+ shortSpread: number;
61
+ };
42
62
  export declare function calculateSpread(amm: AMM, oraclePriceData: OraclePriceData): [number, number];
43
63
  export declare function calculateSpreadReserves(amm: AMM, oraclePriceData: OraclePriceData): {
44
64
  baseAssetReserve: any;
package/lib/math/amm.js CHANGED
@@ -250,8 +250,33 @@ function calculateVolSpreadBN(lastOracleConfPct, reservePrice, markStd, oracleSt
250
250
  return [longVolSpread, shortVolSpread];
251
251
  }
252
252
  exports.calculateVolSpreadBN = calculateVolSpreadBN;
253
- function calculateSpreadBN(baseSpread, lastOracleReservePriceSpreadPct, lastOracleConfPct, maxSpread, quoteAssetReserve, terminalQuoteAssetReserve, pegMultiplier, baseAssetAmountWithAmm, reservePrice, totalFeeMinusDistributions, netRevenueSinceLastFunding, baseAssetReserve, minBaseAssetReserve, maxBaseAssetReserve, markStd, oracleStd, longIntensity, shortIntensity, volume24H) {
253
+ function calculateSpreadBN(baseSpread, lastOracleReservePriceSpreadPct, lastOracleConfPct, maxSpread, quoteAssetReserve, terminalQuoteAssetReserve, pegMultiplier, baseAssetAmountWithAmm, reservePrice, totalFeeMinusDistributions, netRevenueSinceLastFunding, baseAssetReserve, minBaseAssetReserve, maxBaseAssetReserve, markStd, oracleStd, longIntensity, shortIntensity, volume24H, returnTerms = false) {
254
+ (0, assert_1.assert)(Number.isInteger(baseSpread));
255
+ (0, assert_1.assert)(Number.isInteger(maxSpread));
256
+ const spreadTerms = {
257
+ longVolSpread: 0,
258
+ shortVolSpread: 0,
259
+ longSpreadwPS: 0,
260
+ shortSpreadwPS: 0,
261
+ maxTargetSpread: 0,
262
+ inventorySpreadScale: 0,
263
+ longSpreadwInvScale: 0,
264
+ shortSpreadwInvScale: 0,
265
+ effectiveLeverage: 0,
266
+ effectiveLeverageCapped: 0,
267
+ longSpreadwEL: 0,
268
+ shortSpreadwEL: 0,
269
+ revenueRetreatAmount: 0,
270
+ halfRevenueRetreatAmount: 0,
271
+ longSpreadwRevRetreat: 0,
272
+ shortSpreadwRevRetreat: 0,
273
+ totalSpread: 0,
274
+ longSpread: 0,
275
+ shortSpread: 0,
276
+ };
254
277
  const [longVolSpread, shortVolSpread] = calculateVolSpreadBN(lastOracleConfPct, reservePrice, markStd, oracleStd, longIntensity, shortIntensity, volume24H);
278
+ spreadTerms.longVolSpread = longVolSpread.toNumber();
279
+ spreadTerms.shortVolSpread = shortVolSpread.toNumber();
255
280
  let longSpread = Math.max(baseSpread / 2, longVolSpread.toNumber());
256
281
  let shortSpread = Math.max(baseSpread / 2, shortVolSpread.toNumber());
257
282
  if (lastOracleReservePriceSpreadPct.gt(numericConstants_1.ZERO)) {
@@ -262,7 +287,9 @@ function calculateSpreadBN(baseSpread, lastOracleReservePriceSpreadPct, lastOrac
262
287
  longSpread = Math.max(longSpread, lastOracleReservePriceSpreadPct.abs().toNumber() +
263
288
  longVolSpread.toNumber());
264
289
  }
265
- const maxTargetSpread = Math.max(maxSpread, lastOracleReservePriceSpreadPct.abs().toNumber());
290
+ spreadTerms.longSpreadwPS = longSpread;
291
+ spreadTerms.shortSpreadwPS = shortSpread;
292
+ const maxTargetSpread = Math.floor(Math.max(maxSpread, lastOracleReservePriceSpreadPct.abs().toNumber()));
266
293
  const inventorySpreadScale = calculateInventoryScale(baseAssetAmountWithAmm, baseAssetReserve, minBaseAssetReserve, maxBaseAssetReserve, baseAssetAmountWithAmm.gt(numericConstants_1.ZERO) ? longSpread : shortSpread, maxTargetSpread);
267
294
  if (baseAssetAmountWithAmm.gt(numericConstants_1.ZERO)) {
268
295
  longSpread *= inventorySpreadScale;
@@ -270,49 +297,69 @@ function calculateSpreadBN(baseSpread, lastOracleReservePriceSpreadPct, lastOrac
270
297
  else if (baseAssetAmountWithAmm.lt(numericConstants_1.ZERO)) {
271
298
  shortSpread *= inventorySpreadScale;
272
299
  }
300
+ spreadTerms.maxTargetSpread = maxTargetSpread;
301
+ spreadTerms.inventorySpreadScale = inventorySpreadScale;
302
+ spreadTerms.longSpreadwInvScale = longSpread;
303
+ spreadTerms.shortSpreadwInvScale = shortSpread;
273
304
  const MAX_SPREAD_SCALE = 10;
274
305
  if (totalFeeMinusDistributions.gt(numericConstants_1.ZERO)) {
275
306
  const effectiveLeverage = calculateEffectiveLeverage(baseSpread, quoteAssetReserve, terminalQuoteAssetReserve, pegMultiplier, baseAssetAmountWithAmm, reservePrice, totalFeeMinusDistributions);
307
+ spreadTerms.effectiveLeverage = effectiveLeverage;
276
308
  const spreadScale = Math.min(MAX_SPREAD_SCALE, 1 + effectiveLeverage);
309
+ spreadTerms.effectiveLeverageCapped = spreadScale;
277
310
  if (baseAssetAmountWithAmm.gt(numericConstants_1.ZERO)) {
278
311
  longSpread *= spreadScale;
312
+ shortSpread = Math.floor(longSpread);
279
313
  }
280
314
  else {
281
315
  shortSpread *= spreadScale;
316
+ shortSpread = Math.floor(shortSpread);
282
317
  }
283
318
  }
284
319
  else {
285
320
  longSpread *= MAX_SPREAD_SCALE;
286
321
  shortSpread *= MAX_SPREAD_SCALE;
287
322
  }
323
+ spreadTerms.longSpreadwEL = longSpread;
324
+ spreadTerms.shortSpreadwEL = shortSpread;
288
325
  if (netRevenueSinceLastFunding.lt(numericConstants_1.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT)) {
289
- const retreatAmount = Math.min(maxTargetSpread / 10, Math.floor((baseSpread * netRevenueSinceLastFunding.abs().toNumber()) /
326
+ const revenueRetreatAmount = Math.min(maxTargetSpread / 10, Math.floor((baseSpread * netRevenueSinceLastFunding.abs().toNumber()) /
290
327
  numericConstants_1.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT.toNumber()));
291
- const halfRetreatAmount = Math.floor(retreatAmount / 2);
328
+ const halfRevenueRetreatAmount = Math.floor(revenueRetreatAmount / 2);
329
+ spreadTerms.revenueRetreatAmount = revenueRetreatAmount;
330
+ spreadTerms.halfRevenueRetreatAmount = halfRevenueRetreatAmount;
292
331
  if (baseAssetAmountWithAmm.gt(numericConstants_1.ZERO)) {
293
- longSpread += retreatAmount;
294
- shortSpread += halfRetreatAmount;
332
+ longSpread += revenueRetreatAmount;
333
+ shortSpread += halfRevenueRetreatAmount;
295
334
  }
296
335
  else if (baseAssetAmountWithAmm.lt(numericConstants_1.ZERO)) {
297
- longSpread += halfRetreatAmount;
298
- shortSpread += retreatAmount;
336
+ longSpread += halfRevenueRetreatAmount;
337
+ shortSpread += revenueRetreatAmount;
299
338
  }
300
339
  else {
301
- longSpread += halfRetreatAmount;
302
- shortSpread += halfRetreatAmount;
340
+ longSpread += halfRevenueRetreatAmount;
341
+ shortSpread += halfRevenueRetreatAmount;
303
342
  }
304
343
  }
344
+ spreadTerms.longSpreadwRevRetreat = longSpread;
345
+ spreadTerms.shortSpreadwRevRetreat = shortSpread;
305
346
  const totalSpread = longSpread + shortSpread;
306
347
  if (totalSpread > maxTargetSpread) {
307
348
  if (longSpread > shortSpread) {
308
349
  longSpread = Math.ceil((longSpread * maxTargetSpread) / totalSpread);
309
- shortSpread = maxTargetSpread - longSpread;
350
+ shortSpread = Math.floor(maxTargetSpread - longSpread);
310
351
  }
311
352
  else {
312
353
  shortSpread = Math.ceil((shortSpread * maxTargetSpread) / totalSpread);
313
- longSpread = maxTargetSpread - shortSpread;
354
+ longSpread = Math.floor(maxTargetSpread - shortSpread);
314
355
  }
315
356
  }
357
+ spreadTerms.totalSpread = totalSpread;
358
+ spreadTerms.longSpread = longSpread;
359
+ spreadTerms.shortSpread = shortSpread;
360
+ if (returnTerms) {
361
+ return spreadTerms;
362
+ }
316
363
  return [longSpread, shortSpread];
317
364
  }
318
365
  exports.calculateSpreadBN = calculateSpreadBN;
@@ -332,7 +379,9 @@ function calculateSpread(amm, oraclePriceData) {
332
379
  .div(reservePrice);
333
380
  const now = new anchor_1.BN(new Date().getTime() / 1000); //todo
334
381
  const liveOracleStd = (0, oracles_1.calculateLiveOracleStd)(amm, oraclePriceData, now);
335
- const [longSpread, shortSpread] = calculateSpreadBN(amm.baseSpread, targetMarkSpreadPct, confIntervalPct, amm.maxSpread, amm.quoteAssetReserve, amm.terminalQuoteAssetReserve, amm.pegMultiplier, amm.baseAssetAmountWithAmm, reservePrice, amm.totalFeeMinusDistributions, amm.netRevenueSinceLastFunding, amm.baseAssetReserve, amm.minBaseAssetReserve, amm.maxBaseAssetReserve, amm.markStd, liveOracleStd, amm.longIntensityVolume, amm.shortIntensityVolume, amm.volume24H);
382
+ const spreads = calculateSpreadBN(amm.baseSpread, targetMarkSpreadPct, confIntervalPct, amm.maxSpread, amm.quoteAssetReserve, amm.terminalQuoteAssetReserve, amm.pegMultiplier, amm.baseAssetAmountWithAmm, reservePrice, amm.totalFeeMinusDistributions, amm.netRevenueSinceLastFunding, amm.baseAssetReserve, amm.minBaseAssetReserve, amm.maxBaseAssetReserve, amm.markStd, liveOracleStd, amm.longIntensityVolume, amm.shortIntensityVolume, amm.volume24H);
383
+ const longSpread = spreads[0];
384
+ const shortSpread = spreads[1];
336
385
  return [longSpread, shortSpread];
337
386
  }
338
387
  exports.calculateSpread = calculateSpread;
@@ -59,8 +59,7 @@ function calculateLiveOracleTwap(amm, oraclePriceData, now) {
59
59
  const clampedOraclePrice = index_1.BN.min(amm.historicalOracleData.lastOraclePriceTwap.add(clampRange), index_1.BN.max(oraclePriceData.price, amm.historicalOracleData.lastOraclePriceTwap.sub(clampRange)));
60
60
  const newOracleTwap = amm.historicalOracleData.lastOraclePriceTwap
61
61
  .mul(sinceStart)
62
- .add(clampedOraclePrice)
63
- .mul(sinceLastUpdate)
62
+ .add(clampedOraclePrice.mul(sinceLastUpdate))
64
63
  .div(sinceStart.add(sinceLastUpdate));
65
64
  return newOracleTwap;
66
65
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.0.16",
3
+ "version": "2.0.18",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",