@quartz-labs/sdk 0.1.0 → 0.1.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 (40) hide show
  1. package/README.md +17 -0
  2. package/dist/client.d.ts +3 -5
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +11 -11
  5. package/dist/client.js.map +1 -1
  6. package/dist/config/constants.d.ts +6 -2
  7. package/dist/config/constants.d.ts.map +1 -1
  8. package/dist/config/constants.js +5 -1
  9. package/dist/config/constants.js.map +1 -1
  10. package/dist/index.d.ts +6 -3
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +8 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/services/driftClientService.js +1 -1
  15. package/dist/services/driftClientService.js.map +1 -1
  16. package/dist/types/classes/driftUser.class.d.ts +35 -0
  17. package/dist/types/classes/driftUser.class.d.ts.map +1 -0
  18. package/dist/types/classes/driftUser.class.js +608 -0
  19. package/dist/types/classes/driftUser.class.js.map +1 -0
  20. package/dist/types/classes/dummyWallet.class.d.ts +9 -0
  21. package/dist/types/classes/dummyWallet.class.d.ts.map +1 -0
  22. package/dist/types/classes/dummyWallet.class.js +15 -0
  23. package/dist/types/classes/dummyWallet.class.js.map +1 -0
  24. package/dist/types/idl/quartz.d.ts +648 -0
  25. package/dist/types/idl/quartz.d.ts.map +1 -0
  26. package/dist/types/idl/quartz.js +647 -0
  27. package/dist/types/idl/quartz.js.map +1 -0
  28. package/dist/types/interfaces/remainingAccount.interface.d.ts +6 -0
  29. package/dist/types/interfaces/remainingAccount.interface.d.ts.map +1 -0
  30. package/dist/types/interfaces/remainingAccount.interface.js +2 -0
  31. package/dist/types/interfaces/remainingAccount.interface.js.map +1 -0
  32. package/dist/user.d.ts +1 -1
  33. package/dist/user.d.ts.map +1 -1
  34. package/dist/user.js +36 -33
  35. package/dist/user.js.map +1 -1
  36. package/dist/utils/helpers.d.ts +6 -2
  37. package/dist/utils/helpers.d.ts.map +1 -1
  38. package/dist/utils/helpers.js +8 -2
  39. package/dist/utils/helpers.js.map +1 -1
  40. package/package.json +3 -2
@@ -0,0 +1,608 @@
1
+ import { AMM_RESERVE_PRECISION, AMM_RESERVE_PRECISION_EXP, BN, calculateAssetWeight, calculateLiabilityWeight, calculateLiveOracleTwap, calculateMarketMarginRatio, calculateMarketOpenBidAsk, calculatePerpLiabilityValue, calculatePositionPNL, calculateUnrealizedAssetWeight, calculateUnsettledFundingPnl, calculateWithdrawLimit, calculateWorstCasePerpLiabilityValue, FIVE_MINUTE, getSignedTokenAmount, getStrictTokenValue, getTokenAmount, getWorstCaseTokenAmounts, isSpotPositionAvailable, isVariant, MARGIN_PRECISION, ONE, OPEN_ORDER_MARGIN_REQUIREMENT, PRICE_PRECISION, QUOTE_PRECISION, QUOTE_SPOT_MARKET_INDEX, SPOT_MARKET_WEIGHT_PRECISION, SpotBalanceType, StrictOraclePrice, UserStatus, ZERO, TEN, divCeil } from "@drift-labs/sdk";
2
+ import { getDriftUserPublicKey, getDriftUserStatsPublicKey } from "../../utils/helpers.js";
3
+ import { QUARTZ_HEALTH_BUFFER } from "../../config/constants.js";
4
+ export class DriftUser {
5
+ authority;
6
+ connection;
7
+ driftClient;
8
+ userAccount;
9
+ pubkey;
10
+ statsPubkey;
11
+ constructor(authority, connection, driftClient, userAccount) {
12
+ this.authority = authority;
13
+ this.connection = connection;
14
+ this.driftClient = driftClient;
15
+ this.pubkey = getDriftUserPublicKey(this.authority);
16
+ this.statsPubkey = getDriftUserStatsPublicKey(this.authority);
17
+ this.userAccount = userAccount;
18
+ }
19
+ getDriftUserAccount() {
20
+ if (!this.userAccount)
21
+ throw new Error("DriftUser not initialized");
22
+ return this.userAccount;
23
+ }
24
+ getHealth() {
25
+ if (this.isBeingLiquidated())
26
+ return 0;
27
+ const totalCollateral = this.getTotalCollateralValue('Maintenance');
28
+ const maintenanceMarginReq = this.getMaintenanceMarginRequirement();
29
+ if (maintenanceMarginReq.eq(ZERO) && totalCollateral.gte(ZERO)) {
30
+ return 100;
31
+ }
32
+ if (totalCollateral.lte(ZERO)) {
33
+ return 0;
34
+ }
35
+ return Math.round(Math.min(100, Math.max(0, (1 - maintenanceMarginReq.toNumber() / totalCollateral.toNumber()) * 100)));
36
+ }
37
+ getTokenAmount(marketIndex) {
38
+ if (!this.userAccount)
39
+ throw new Error("DriftUser not initialized");
40
+ const spotPosition = this.userAccount.spotPositions.find((position) => position.marketIndex === marketIndex);
41
+ if (spotPosition === undefined) {
42
+ return ZERO;
43
+ }
44
+ const spotMarket = this.driftClient.getSpotMarketAccount(marketIndex);
45
+ if (!spotMarket)
46
+ throw new Error("Spot market not found");
47
+ return getSignedTokenAmount(getTokenAmount(spotPosition.scaledBalance, spotMarket, spotPosition.balanceType), spotPosition.balanceType);
48
+ }
49
+ getWithdrawalLimit(marketIndex, reduceOnly, preventcollateralRepay = false) {
50
+ const nowTs = new BN(Math.floor(Date.now() / 1000));
51
+ const spotMarket = this.driftClient.getSpotMarketAccount(marketIndex);
52
+ if (!spotMarket)
53
+ throw new Error("Spot market not found");
54
+ // eslint-disable-next-line prefer-const
55
+ let { borrowLimit, withdrawLimit } = calculateWithdrawLimit(spotMarket, nowTs);
56
+ const freeCollateral = this.getFreeCollateral("Initial", preventcollateralRepay);
57
+ const initialMarginRequirement = this.getMarginRequirement('Initial', undefined, false, true, preventcollateralRepay);
58
+ const oracleData = this.driftClient.getOracleDataForSpotMarket(marketIndex);
59
+ const precisionIncrease = TEN.pow(new BN(spotMarket.decimals - 6));
60
+ const { canBypass, depositAmount: userDepositAmount } = this.canBypassWithdrawLimits(marketIndex);
61
+ if (canBypass) {
62
+ withdrawLimit = BN.max(withdrawLimit, userDepositAmount);
63
+ }
64
+ const assetWeight = calculateAssetWeight(userDepositAmount, oracleData.price, spotMarket, 'Initial');
65
+ let amountWithdrawable;
66
+ if (assetWeight.eq(ZERO)) {
67
+ amountWithdrawable = userDepositAmount;
68
+ }
69
+ else if (initialMarginRequirement.eq(ZERO)) {
70
+ amountWithdrawable = userDepositAmount;
71
+ }
72
+ else {
73
+ amountWithdrawable = divCeil(divCeil(freeCollateral.mul(MARGIN_PRECISION), assetWeight).mul(PRICE_PRECISION), oracleData.price).mul(precisionIncrease);
74
+ }
75
+ const maxWithdrawValue = BN.min(BN.min(amountWithdrawable, userDepositAmount), withdrawLimit.abs());
76
+ if (reduceOnly)
77
+ return BN.max(maxWithdrawValue, ZERO);
78
+ const weightedAssetValue = this.getSpotMarketAssetValue('Initial', marketIndex, false);
79
+ const freeCollatAfterWithdraw = userDepositAmount.gt(ZERO)
80
+ ? freeCollateral.sub(weightedAssetValue)
81
+ : freeCollateral;
82
+ const maxLiabilityAllowed = freeCollatAfterWithdraw
83
+ .mul(MARGIN_PRECISION)
84
+ .div(new BN(spotMarket.initialLiabilityWeight))
85
+ .mul(PRICE_PRECISION)
86
+ .div(oracleData.price)
87
+ .mul(precisionIncrease);
88
+ const maxBorrowValue = BN.min(maxWithdrawValue.add(maxLiabilityAllowed), borrowLimit.abs());
89
+ return BN.max(maxBorrowValue, ZERO);
90
+ }
91
+ getFreeCollateral(marginCategory = 'Initial', preventcollateralRepay = false) {
92
+ const totalCollateral = this.getTotalCollateralValue(marginCategory, true);
93
+ const marginRequirement = marginCategory === 'Initial'
94
+ ? this.getMarginRequirement('Initial', undefined, false, true, preventcollateralRepay)
95
+ : this.getMaintenanceMarginRequirement();
96
+ const freeCollateral = totalCollateral.sub(marginRequirement);
97
+ return freeCollateral.gte(ZERO) ? freeCollateral : ZERO;
98
+ }
99
+ canBypassWithdrawLimits(marketIndex) {
100
+ if (!this.userAccount)
101
+ throw new Error("DriftUser not initialized");
102
+ const spotMarket = this.driftClient.getSpotMarketAccount(marketIndex);
103
+ if (!spotMarket)
104
+ throw new Error("Spot market not found");
105
+ const maxDepositAmount = spotMarket.withdrawGuardThreshold.div(new BN(10));
106
+ const position = this.userAccount.spotPositions.find((position) => position.marketIndex === marketIndex);
107
+ const netDeposits = this.userAccount.totalDeposits.sub(this.userAccount.totalWithdraws);
108
+ if (!position) {
109
+ return {
110
+ canBypass: false,
111
+ maxDepositAmount,
112
+ depositAmount: ZERO,
113
+ netDeposits,
114
+ };
115
+ }
116
+ if (isVariant(position.balanceType, 'borrow')) {
117
+ return {
118
+ canBypass: false,
119
+ maxDepositAmount,
120
+ netDeposits,
121
+ depositAmount: ZERO,
122
+ };
123
+ }
124
+ const depositAmount = getTokenAmount(position.scaledBalance, spotMarket, SpotBalanceType.DEPOSIT);
125
+ if (netDeposits.lt(ZERO)) {
126
+ return {
127
+ canBypass: false,
128
+ maxDepositAmount,
129
+ depositAmount,
130
+ netDeposits,
131
+ };
132
+ }
133
+ return {
134
+ canBypass: depositAmount.lt(maxDepositAmount),
135
+ maxDepositAmount,
136
+ netDeposits,
137
+ depositAmount,
138
+ };
139
+ }
140
+ isBeingLiquidated() {
141
+ if (!this.userAccount)
142
+ throw new Error("DriftUser not initialized");
143
+ return ((this.userAccount.status &
144
+ (UserStatus.BEING_LIQUIDATED | UserStatus.BANKRUPT)) >
145
+ 0);
146
+ }
147
+ getTotalCollateralValue(marginCategory, strict = false, includeOpenOrders = true) {
148
+ if (!this.userAccount)
149
+ throw new Error("DriftUser not initialized");
150
+ return this.getSpotMarketAssetValue(marginCategory, undefined, includeOpenOrders, strict).add(this.getUnrealizedPNL(true, undefined, marginCategory, strict));
151
+ }
152
+ getSpotMarketAssetValue(marginCategory, marketIndex, includeOpenOrders, strict = false, now) {
153
+ const { totalAssetValue } = this.getSpotMarketAssetAndLiabilityValue(marginCategory, marketIndex, undefined, includeOpenOrders, strict, now);
154
+ return totalAssetValue;
155
+ }
156
+ getSpotMarketAssetAndLiabilityValue(marginCategory, marketIndex, liquidationBuffer, includeOpenOrders, strict = false, now = new BN(new Date().getTime() / 1000)) {
157
+ if (!this.userAccount)
158
+ throw new Error("DriftUser not initialized");
159
+ let netQuoteValue = ZERO;
160
+ let totalAssetValue = ZERO;
161
+ let totalLiabilityValue = ZERO;
162
+ for (const spotPosition of this.userAccount.spotPositions) {
163
+ const countForBase = marketIndex === undefined || spotPosition.marketIndex === marketIndex;
164
+ const countForQuote = marketIndex === undefined ||
165
+ marketIndex === QUOTE_SPOT_MARKET_INDEX ||
166
+ (includeOpenOrders && spotPosition.openOrders !== 0);
167
+ if (isSpotPositionAvailable(spotPosition) ||
168
+ (!countForBase && !countForQuote)) {
169
+ continue;
170
+ }
171
+ const spotMarketAccount = this.driftClient.getSpotMarketAccount(spotPosition.marketIndex);
172
+ if (!spotMarketAccount)
173
+ throw new Error("Spot market not found");
174
+ const oraclePriceData = this.driftClient.getOracleDataForSpotMarket(spotPosition.marketIndex);
175
+ let twap5min;
176
+ if (strict) {
177
+ twap5min = calculateLiveOracleTwap(spotMarketAccount.historicalOracleData, oraclePriceData, now, FIVE_MINUTE // 5MIN
178
+ );
179
+ }
180
+ const strictOraclePrice = new StrictOraclePrice(oraclePriceData.price, twap5min);
181
+ if (spotPosition.marketIndex === QUOTE_SPOT_MARKET_INDEX &&
182
+ countForQuote) {
183
+ const tokenAmount = getSignedTokenAmount(getTokenAmount(spotPosition.scaledBalance, spotMarketAccount, spotPosition.balanceType), spotPosition.balanceType);
184
+ if (isVariant(spotPosition.balanceType, 'borrow')) {
185
+ const weightedTokenValue = this.getSpotLiabilityValue(tokenAmount, strictOraclePrice, spotMarketAccount, marginCategory, liquidationBuffer).abs();
186
+ netQuoteValue = netQuoteValue.sub(weightedTokenValue);
187
+ }
188
+ else {
189
+ const weightedTokenValue = this.getSpotAssetValue(tokenAmount, strictOraclePrice, spotMarketAccount, marginCategory);
190
+ netQuoteValue = netQuoteValue.add(weightedTokenValue);
191
+ }
192
+ continue;
193
+ }
194
+ if (!includeOpenOrders && countForBase) {
195
+ if (isVariant(spotPosition.balanceType, 'borrow')) {
196
+ const tokenAmount = getSignedTokenAmount(getTokenAmount(spotPosition.scaledBalance, spotMarketAccount, spotPosition.balanceType), SpotBalanceType.BORROW);
197
+ const liabilityValue = this.getSpotLiabilityValue(tokenAmount, strictOraclePrice, spotMarketAccount, marginCategory, liquidationBuffer).abs();
198
+ totalLiabilityValue = totalLiabilityValue.add(liabilityValue);
199
+ continue;
200
+ }
201
+ const tokenAmount = getTokenAmount(spotPosition.scaledBalance, spotMarketAccount, spotPosition.balanceType);
202
+ const assetValue = this.getSpotAssetValue(tokenAmount, strictOraclePrice, spotMarketAccount, marginCategory);
203
+ totalAssetValue = totalAssetValue.add(assetValue);
204
+ continue;
205
+ }
206
+ const { tokenAmount: worstCaseTokenAmount, ordersValue: worstCaseQuoteTokenAmount, } = getWorstCaseTokenAmounts(spotPosition, spotMarketAccount, strictOraclePrice, marginCategory ?? "Initial", this.userAccount.maxMarginRatio);
207
+ if (worstCaseTokenAmount.gt(ZERO) && countForBase) {
208
+ const baseAssetValue = this.getSpotAssetValue(worstCaseTokenAmount, strictOraclePrice, spotMarketAccount, marginCategory);
209
+ totalAssetValue = totalAssetValue.add(baseAssetValue);
210
+ }
211
+ if (worstCaseTokenAmount.lt(ZERO) && countForBase) {
212
+ const baseLiabilityValue = this.getSpotLiabilityValue(worstCaseTokenAmount, strictOraclePrice, spotMarketAccount, marginCategory, liquidationBuffer).abs();
213
+ totalLiabilityValue = totalLiabilityValue.add(baseLiabilityValue);
214
+ }
215
+ if (worstCaseQuoteTokenAmount.gt(ZERO) && countForQuote) {
216
+ netQuoteValue = netQuoteValue.add(worstCaseQuoteTokenAmount);
217
+ }
218
+ if (worstCaseQuoteTokenAmount.lt(ZERO) && countForQuote) {
219
+ let weight = SPOT_MARKET_WEIGHT_PRECISION;
220
+ if (marginCategory === 'Initial') {
221
+ weight = BN.max(weight, new BN(this.userAccount.maxMarginRatio));
222
+ }
223
+ const weightedTokenValue = worstCaseQuoteTokenAmount
224
+ .abs()
225
+ .mul(weight)
226
+ .div(SPOT_MARKET_WEIGHT_PRECISION);
227
+ netQuoteValue = netQuoteValue.sub(weightedTokenValue);
228
+ }
229
+ totalLiabilityValue = totalLiabilityValue.add(new BN(spotPosition.openOrders).mul(OPEN_ORDER_MARGIN_REQUIREMENT));
230
+ }
231
+ if (marketIndex === undefined || marketIndex === QUOTE_SPOT_MARKET_INDEX) {
232
+ if (netQuoteValue.gt(ZERO)) {
233
+ totalAssetValue = totalAssetValue.add(netQuoteValue);
234
+ }
235
+ else {
236
+ totalLiabilityValue = totalLiabilityValue.add(netQuoteValue.abs());
237
+ }
238
+ }
239
+ return { totalAssetValue, totalLiabilityValue };
240
+ }
241
+ getSpotLiabilityValue(tokenAmount, strictOraclePrice, spotMarketAccount, marginCategory, liquidationBuffer) {
242
+ if (!this.userAccount)
243
+ throw new Error("DriftUser not initialized");
244
+ let liabilityValue = getStrictTokenValue(tokenAmount, spotMarketAccount.decimals, strictOraclePrice);
245
+ if (marginCategory !== undefined) {
246
+ let weight = calculateLiabilityWeight(tokenAmount, spotMarketAccount, marginCategory);
247
+ if (marginCategory === 'Initial' &&
248
+ spotMarketAccount.marketIndex !== QUOTE_SPOT_MARKET_INDEX) {
249
+ weight = BN.max(weight, SPOT_MARKET_WEIGHT_PRECISION.addn(this.userAccount.maxMarginRatio));
250
+ }
251
+ if (liquidationBuffer !== undefined) {
252
+ weight = weight.add(liquidationBuffer);
253
+ }
254
+ liabilityValue = liabilityValue
255
+ .mul(weight)
256
+ .div(SPOT_MARKET_WEIGHT_PRECISION);
257
+ }
258
+ return liabilityValue;
259
+ }
260
+ getSpotAssetValue(tokenAmount, strictOraclePrice, spotMarketAccount, marginCategory) {
261
+ if (!this.userAccount)
262
+ throw new Error("DriftUser not initialized");
263
+ let assetValue = getStrictTokenValue(tokenAmount, spotMarketAccount.decimals, strictOraclePrice);
264
+ if (marginCategory !== undefined) {
265
+ let weight = calculateAssetWeight(tokenAmount, strictOraclePrice.current, spotMarketAccount, marginCategory);
266
+ if (marginCategory === 'Initial' &&
267
+ spotMarketAccount.marketIndex !== QUOTE_SPOT_MARKET_INDEX) {
268
+ const userCustomAssetWeight = BN.max(ZERO, SPOT_MARKET_WEIGHT_PRECISION.subn(this.userAccount.maxMarginRatio));
269
+ weight = BN.min(weight, userCustomAssetWeight);
270
+ }
271
+ assetValue = assetValue.mul(weight).div(SPOT_MARKET_WEIGHT_PRECISION);
272
+ }
273
+ return assetValue;
274
+ }
275
+ getUnrealizedPNL(withFunding, marketIndex, withWeightMarginCategory, strict = false) {
276
+ return this.getActivePerpPositions()
277
+ .filter((pos) => marketIndex !== undefined ? pos.marketIndex === marketIndex : true)
278
+ .reduce((unrealizedPnl, perpPosition) => {
279
+ const market = this.driftClient.getPerpMarketAccount(perpPosition.marketIndex);
280
+ if (!market)
281
+ throw new Error("Perp market not found");
282
+ const oraclePriceData = this.driftClient.getOracleDataForPerpMarket(market.marketIndex);
283
+ const quoteSpotMarket = this.driftClient.getSpotMarketAccount(market.quoteSpotMarketIndex);
284
+ if (!quoteSpotMarket)
285
+ throw new Error("Quote spot market not found");
286
+ const quoteOraclePriceData = this.driftClient.getOracleDataForSpotMarket(market.quoteSpotMarketIndex);
287
+ if (perpPosition.lpShares.gt(ZERO)) {
288
+ perpPosition = this.getPerpPositionWithLPSettle(perpPosition.marketIndex, undefined, !!withWeightMarginCategory)[0];
289
+ }
290
+ let positionUnrealizedPnl = calculatePositionPNL(market, perpPosition, withFunding, oraclePriceData);
291
+ let quotePrice;
292
+ if (strict && positionUnrealizedPnl.gt(ZERO)) {
293
+ quotePrice = BN.min(quoteOraclePriceData.price, quoteSpotMarket.historicalOracleData.lastOraclePriceTwap5Min);
294
+ }
295
+ else if (strict && positionUnrealizedPnl.lt(ZERO)) {
296
+ quotePrice = BN.max(quoteOraclePriceData.price, quoteSpotMarket.historicalOracleData.lastOraclePriceTwap5Min);
297
+ }
298
+ else {
299
+ quotePrice = quoteOraclePriceData.price;
300
+ }
301
+ positionUnrealizedPnl = positionUnrealizedPnl
302
+ .mul(quotePrice)
303
+ .div(PRICE_PRECISION);
304
+ if (withWeightMarginCategory !== undefined) {
305
+ if (positionUnrealizedPnl.gt(ZERO)) {
306
+ positionUnrealizedPnl = positionUnrealizedPnl
307
+ .mul(calculateUnrealizedAssetWeight(market, quoteSpotMarket, positionUnrealizedPnl, withWeightMarginCategory, oraclePriceData))
308
+ .div(new BN(SPOT_MARKET_WEIGHT_PRECISION));
309
+ }
310
+ }
311
+ return unrealizedPnl.add(positionUnrealizedPnl);
312
+ }, ZERO);
313
+ }
314
+ getActivePerpPositions() {
315
+ if (!this.userAccount)
316
+ throw new Error("DriftUser not initialized");
317
+ return this.userAccount.perpPositions.filter((pos) => !pos.baseAssetAmount.eq(ZERO) ||
318
+ !pos.quoteAssetAmount.eq(ZERO) ||
319
+ !(pos.openOrders === 0) ||
320
+ !pos.lpShares.eq(ZERO));
321
+ }
322
+ getPerpPositionWithLPSettle(marketIndex, originalPosition, burnLpShares = false, includeRemainderInBaseAmount = false) {
323
+ originalPosition =
324
+ originalPosition ??
325
+ this.getPerpPosition(marketIndex) ??
326
+ this.getEmptyPosition(marketIndex);
327
+ if (originalPosition.lpShares.eq(ZERO)) {
328
+ return [originalPosition, ZERO, ZERO];
329
+ }
330
+ const position = this.getClonedPosition(originalPosition);
331
+ const market = this.driftClient.getPerpMarketAccount(position.marketIndex);
332
+ if (!market)
333
+ throw new Error("Perp market not found");
334
+ if (market.amm.perLpBase !== position.perLpBase) {
335
+ // perLpBase = 1 => per 10 LP shares, perLpBase = -1 => per 0.1 LP shares
336
+ const expoDiff = market.amm.perLpBase - position.perLpBase;
337
+ const marketPerLpRebaseScalar = new BN(10 ** Math.abs(expoDiff));
338
+ if (expoDiff > 0) {
339
+ position.lastBaseAssetAmountPerLp =
340
+ position.lastBaseAssetAmountPerLp.mul(marketPerLpRebaseScalar);
341
+ position.lastQuoteAssetAmountPerLp =
342
+ position.lastQuoteAssetAmountPerLp.mul(marketPerLpRebaseScalar);
343
+ }
344
+ else {
345
+ position.lastBaseAssetAmountPerLp =
346
+ position.lastBaseAssetAmountPerLp.div(marketPerLpRebaseScalar);
347
+ position.lastQuoteAssetAmountPerLp =
348
+ position.lastQuoteAssetAmountPerLp.div(marketPerLpRebaseScalar);
349
+ }
350
+ position.perLpBase = position.perLpBase + expoDiff;
351
+ }
352
+ const nShares = position.lpShares;
353
+ // incorp unsettled funding on pre settled position
354
+ const quoteFundingPnl = calculateUnsettledFundingPnl(market, position);
355
+ let baseUnit = AMM_RESERVE_PRECISION;
356
+ if (market.amm.perLpBase === position.perLpBase) {
357
+ if (position.perLpBase >= 0 &&
358
+ position.perLpBase <= AMM_RESERVE_PRECISION_EXP.toNumber()) {
359
+ const marketPerLpRebase = new BN(10 ** market.amm.perLpBase);
360
+ baseUnit = baseUnit.mul(marketPerLpRebase);
361
+ }
362
+ else if (position.perLpBase < 0 &&
363
+ position.perLpBase >= -AMM_RESERVE_PRECISION_EXP.toNumber()) {
364
+ const marketPerLpRebase = new BN(10 ** Math.abs(market.amm.perLpBase));
365
+ baseUnit = baseUnit.div(marketPerLpRebase);
366
+ }
367
+ else {
368
+ throw 'cannot calc';
369
+ }
370
+ }
371
+ else {
372
+ throw 'market.amm.perLpBase != position.perLpBase';
373
+ }
374
+ const deltaBaa = market.amm.baseAssetAmountPerLp
375
+ .sub(position.lastBaseAssetAmountPerLp)
376
+ .mul(nShares)
377
+ .div(baseUnit);
378
+ const deltaQaa = market.amm.quoteAssetAmountPerLp
379
+ .sub(position.lastQuoteAssetAmountPerLp)
380
+ .mul(nShares)
381
+ .div(baseUnit);
382
+ function sign(v) {
383
+ return v.isNeg() ? new BN(-1) : new BN(1);
384
+ }
385
+ function standardize(amount, stepSize) {
386
+ const remainder = amount.abs().mod(stepSize).mul(sign(amount));
387
+ const standardizedAmount = amount.sub(remainder);
388
+ return [standardizedAmount, remainder];
389
+ }
390
+ const [standardizedBaa, remainderBaa] = standardize(deltaBaa, market.amm.orderStepSize);
391
+ if (standardizedBaa === undefined)
392
+ throw new Error("Standardized BAA is undefined");
393
+ if (remainderBaa === undefined)
394
+ throw new Error("Remainder BAA is undefined");
395
+ position.remainderBaseAssetAmount += remainderBaa.toNumber();
396
+ if (Math.abs(position.remainderBaseAssetAmount) >
397
+ market.amm.orderStepSize.toNumber()) {
398
+ const [newStandardizedBaa, newRemainderBaa] = standardize(new BN(position.remainderBaseAssetAmount), market.amm.orderStepSize);
399
+ if (newStandardizedBaa === undefined)
400
+ throw new Error("New standardized BAA is undefined");
401
+ if (newRemainderBaa === undefined)
402
+ throw new Error("New remainder BAA is undefined");
403
+ position.baseAssetAmount =
404
+ position.baseAssetAmount.add(newStandardizedBaa);
405
+ position.remainderBaseAssetAmount = newRemainderBaa.toNumber();
406
+ }
407
+ let dustBaseAssetValue = ZERO;
408
+ if (burnLpShares && position.remainderBaseAssetAmount !== 0) {
409
+ const oraclePriceData = this.driftClient.getOracleDataForPerpMarket(position.marketIndex);
410
+ dustBaseAssetValue = new BN(Math.abs(position.remainderBaseAssetAmount))
411
+ .mul(oraclePriceData.price)
412
+ .div(AMM_RESERVE_PRECISION)
413
+ .add(ONE);
414
+ }
415
+ let updateType;
416
+ if (position.baseAssetAmount.eq(ZERO)) {
417
+ updateType = 'open';
418
+ }
419
+ else if (sign(position.baseAssetAmount).eq(sign(deltaBaa))) {
420
+ updateType = 'increase';
421
+ }
422
+ else if (position.baseAssetAmount.abs().gt(deltaBaa.abs())) {
423
+ updateType = 'reduce';
424
+ }
425
+ else if (position.baseAssetAmount.abs().eq(deltaBaa.abs())) {
426
+ updateType = 'close';
427
+ }
428
+ else {
429
+ updateType = 'flip';
430
+ }
431
+ let newQuoteEntry;
432
+ let pnl;
433
+ if (updateType === 'open' || updateType === 'increase') {
434
+ newQuoteEntry = position.quoteEntryAmount.add(deltaQaa);
435
+ pnl = ZERO;
436
+ }
437
+ else if (updateType === 'reduce' || updateType === 'close') {
438
+ newQuoteEntry = position.quoteEntryAmount.sub(position.quoteEntryAmount
439
+ .mul(deltaBaa.abs())
440
+ .div(position.baseAssetAmount.abs()));
441
+ pnl = position.quoteEntryAmount.sub(newQuoteEntry).add(deltaQaa);
442
+ }
443
+ else {
444
+ newQuoteEntry = deltaQaa.sub(deltaQaa.mul(position.baseAssetAmount.abs()).div(deltaBaa.abs()));
445
+ pnl = position.quoteEntryAmount.add(deltaQaa.sub(newQuoteEntry));
446
+ }
447
+ position.quoteEntryAmount = newQuoteEntry;
448
+ position.baseAssetAmount = position.baseAssetAmount.add(standardizedBaa);
449
+ position.quoteAssetAmount = position.quoteAssetAmount
450
+ .add(deltaQaa)
451
+ .add(quoteFundingPnl)
452
+ .sub(dustBaseAssetValue);
453
+ position.quoteBreakEvenAmount = position.quoteBreakEvenAmount
454
+ .add(deltaQaa)
455
+ .add(quoteFundingPnl)
456
+ .sub(dustBaseAssetValue);
457
+ // update open bids/asks
458
+ const [marketOpenBids, marketOpenAsks] = calculateMarketOpenBidAsk(market.amm.baseAssetReserve, market.amm.minBaseAssetReserve, market.amm.maxBaseAssetReserve, market.amm.orderStepSize);
459
+ const lpOpenBids = marketOpenBids
460
+ .mul(position.lpShares)
461
+ .div(market.amm.sqrtK);
462
+ const lpOpenAsks = marketOpenAsks
463
+ .mul(position.lpShares)
464
+ .div(market.amm.sqrtK);
465
+ position.openBids = lpOpenBids.add(position.openBids);
466
+ position.openAsks = lpOpenAsks.add(position.openAsks);
467
+ // eliminate counting funding on settled position
468
+ if (position.baseAssetAmount.gt(ZERO)) {
469
+ position.lastCumulativeFundingRate = market.amm.cumulativeFundingRateLong;
470
+ }
471
+ else if (position.baseAssetAmount.lt(ZERO)) {
472
+ position.lastCumulativeFundingRate =
473
+ market.amm.cumulativeFundingRateShort;
474
+ }
475
+ else {
476
+ position.lastCumulativeFundingRate = ZERO;
477
+ }
478
+ const remainderBeforeRemoval = new BN(position.remainderBaseAssetAmount);
479
+ if (includeRemainderInBaseAmount) {
480
+ position.baseAssetAmount = position.baseAssetAmount.add(remainderBeforeRemoval);
481
+ position.remainderBaseAssetAmount = 0;
482
+ }
483
+ return [position, remainderBeforeRemoval, pnl];
484
+ }
485
+ getPerpPosition(marketIndex) {
486
+ if (!this.userAccount)
487
+ throw new Error("DriftUser not initialized");
488
+ const activePositions = this.userAccount.perpPositions.filter((pos) => !pos.baseAssetAmount.eq(ZERO) ||
489
+ !pos.quoteAssetAmount.eq(ZERO) ||
490
+ !(pos.openOrders === 0) ||
491
+ !pos.lpShares.eq(ZERO));
492
+ return activePositions.find((position) => position.marketIndex === marketIndex);
493
+ }
494
+ getEmptyPosition(marketIndex) {
495
+ return {
496
+ baseAssetAmount: ZERO,
497
+ remainderBaseAssetAmount: 0,
498
+ lastCumulativeFundingRate: ZERO,
499
+ marketIndex,
500
+ quoteAssetAmount: ZERO,
501
+ quoteEntryAmount: ZERO,
502
+ quoteBreakEvenAmount: ZERO,
503
+ openOrders: 0,
504
+ openBids: ZERO,
505
+ openAsks: ZERO,
506
+ settledPnl: ZERO,
507
+ lpShares: ZERO,
508
+ lastBaseAssetAmountPerLp: ZERO,
509
+ lastQuoteAssetAmountPerLp: ZERO,
510
+ perLpBase: 0,
511
+ };
512
+ }
513
+ getClonedPosition(position) {
514
+ const clonedPosition = Object.assign({}, position);
515
+ return clonedPosition;
516
+ }
517
+ getMaintenanceMarginRequirement() {
518
+ if (!this.userAccount)
519
+ throw new Error("DriftUser not initialized");
520
+ // if user being liq'd, can continue to be liq'd until total collateral above the margin requirement plus buffer
521
+ let liquidationBuffer = undefined;
522
+ if (this.isBeingLiquidated()) {
523
+ liquidationBuffer = new BN(this.driftClient.getStateAccount().liquidationMarginBufferRatio);
524
+ }
525
+ return this.getMarginRequirement('Maintenance', liquidationBuffer);
526
+ }
527
+ getMarginRequirement(marginCategory, liquidationBuffer, strict = false, includeOpenOrders = true, preventcollateralRepay = false) {
528
+ const driftMarginRequirement = this.getTotalPerpPositionLiability(marginCategory, liquidationBuffer, includeOpenOrders, strict).add(this.getSpotMarketLiabilityValue(marginCategory, undefined, liquidationBuffer, includeOpenOrders, strict));
529
+ if (preventcollateralRepay) {
530
+ const adjusted = driftMarginRequirement.mul(new BN(100)).div(new BN(100 - (QUARTZ_HEALTH_BUFFER * 100)));
531
+ return adjusted;
532
+ }
533
+ return driftMarginRequirement;
534
+ }
535
+ getTotalPerpPositionLiability(marginCategory, liquidationBuffer, includeOpenOrders, strict = false) {
536
+ return this.getActivePerpPositions().reduce((totalPerpValue, perpPosition) => {
537
+ const baseAssetValue = this.calculateWeightedPerpPositionLiability(perpPosition, marginCategory, liquidationBuffer, includeOpenOrders, strict);
538
+ return totalPerpValue.add(baseAssetValue);
539
+ }, ZERO);
540
+ }
541
+ calculateWeightedPerpPositionLiability(perpPosition, marginCategory, liquidationBuffer, includeOpenOrders, strict = false) {
542
+ if (!this.userAccount)
543
+ throw new Error("DriftUser not initialized");
544
+ const market = this.driftClient.getPerpMarketAccount(perpPosition.marketIndex);
545
+ if (!market)
546
+ throw new Error("Perp market not found");
547
+ if (perpPosition.lpShares.gt(ZERO)) {
548
+ // is an lp, clone so we dont mutate the position
549
+ perpPosition = this.getPerpPositionWithLPSettle(market.marketIndex, this.getClonedPosition(perpPosition), !!marginCategory)[0];
550
+ }
551
+ let valuationPrice = this.driftClient.getOracleDataForPerpMarket(market.marketIndex).price;
552
+ if (isVariant(market.status, 'settlement')) {
553
+ valuationPrice = market.expiryPrice;
554
+ }
555
+ let baseAssetAmount;
556
+ let liabilityValue;
557
+ if (includeOpenOrders) {
558
+ const { worstCaseBaseAssetAmount, worstCaseLiabilityValue } = calculateWorstCasePerpLiabilityValue(perpPosition, market, valuationPrice);
559
+ baseAssetAmount = worstCaseBaseAssetAmount;
560
+ liabilityValue = worstCaseLiabilityValue;
561
+ }
562
+ else {
563
+ baseAssetAmount = perpPosition.baseAssetAmount;
564
+ liabilityValue = calculatePerpLiabilityValue(baseAssetAmount, valuationPrice, isVariant(market.contractType, 'prediction'));
565
+ }
566
+ if (marginCategory) {
567
+ let marginRatio = new BN(calculateMarketMarginRatio(market, baseAssetAmount.abs(), marginCategory, this.userAccount.maxMarginRatio, isVariant(this.userAccount.marginMode, 'highLeverage')));
568
+ if (liquidationBuffer !== undefined) {
569
+ marginRatio = marginRatio.add(liquidationBuffer);
570
+ }
571
+ if (isVariant(market.status, 'settlement')) {
572
+ marginRatio = ZERO;
573
+ }
574
+ const quoteSpotMarket = this.driftClient.getSpotMarketAccount(market.quoteSpotMarketIndex);
575
+ if (!quoteSpotMarket)
576
+ throw new Error("Quote spot market not found");
577
+ const quoteOraclePriceData = this.driftClient.getOracleDataForSpotMarket(QUOTE_SPOT_MARKET_INDEX);
578
+ let quotePrice;
579
+ if (strict) {
580
+ quotePrice = BN.max(quoteOraclePriceData.price, quoteSpotMarket.historicalOracleData.lastOraclePriceTwap5Min);
581
+ }
582
+ else {
583
+ quotePrice = quoteOraclePriceData.price;
584
+ }
585
+ liabilityValue = liabilityValue
586
+ .mul(quotePrice)
587
+ .div(PRICE_PRECISION)
588
+ .mul(marginRatio)
589
+ .div(MARGIN_PRECISION);
590
+ if (includeOpenOrders) {
591
+ liabilityValue = liabilityValue.add(new BN(perpPosition.openOrders).mul(OPEN_ORDER_MARGIN_REQUIREMENT));
592
+ if (perpPosition.lpShares.gt(ZERO)) {
593
+ liabilityValue = liabilityValue.add(BN.max(QUOTE_PRECISION, valuationPrice
594
+ .mul(market.amm.orderStepSize)
595
+ .mul(QUOTE_PRECISION)
596
+ .div(AMM_RESERVE_PRECISION)
597
+ .div(PRICE_PRECISION)));
598
+ }
599
+ }
600
+ }
601
+ return liabilityValue;
602
+ }
603
+ getSpotMarketLiabilityValue(marginCategory, marketIndex, liquidationBuffer, includeOpenOrders, strict = false, now) {
604
+ const { totalLiabilityValue } = this.getSpotMarketAssetAndLiabilityValue(marginCategory, marketIndex, liquidationBuffer, includeOpenOrders, strict, now);
605
+ return totalLiabilityValue;
606
+ }
607
+ }
608
+ //# sourceMappingURL=driftUser.class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driftUser.class.js","sourceRoot":"","sources":["../../../src/types/classes/driftUser.class.ts"],"names":[],"mappings":"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"}