@drift-labs/sdk 2.1.0 → 2.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.
package/lib/math/amm.js CHANGED
@@ -213,7 +213,7 @@ function calculateInventoryScale(baseAssetAmountWithAmm, baseAssetReserve, minBa
213
213
  }
214
214
  exports.calculateInventoryScale = calculateInventoryScale;
215
215
  function calculateEffectiveLeverage(baseSpread, quoteAssetReserve, terminalQuoteAssetReserve, pegMultiplier, netBaseAssetAmount, reservePrice, totalFeeMinusDistributions) {
216
- // inventory skew
216
+ // vAMM skew
217
217
  const netBaseAssetValue = quoteAssetReserve
218
218
  .sub(terminalQuoteAssetReserve)
219
219
  .mul(pegMultiplier)
@@ -221,8 +221,8 @@ function calculateEffectiveLeverage(baseSpread, quoteAssetReserve, terminalQuote
221
221
  const localBaseAssetValue = netBaseAssetAmount
222
222
  .mul(reservePrice)
223
223
  .div(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO.mul(numericConstants_1.PRICE_PRECISION));
224
- const effectiveLeverage = localBaseAssetValue.sub(netBaseAssetValue).toNumber() /
225
- (Math.max(0, totalFeeMinusDistributions.toNumber()) + 1) +
224
+ const effectiveGap = Math.max(0, localBaseAssetValue.sub(netBaseAssetValue).toNumber());
225
+ const effectiveLeverage = effectiveGap / (Math.max(0, totalFeeMinusDistributions.toNumber()) + 1) +
226
226
  1 / numericConstants_1.QUOTE_PRECISION.toNumber();
227
227
  return effectiveLeverage;
228
228
  }
@@ -309,7 +309,7 @@ function calculateSpreadBN(baseSpread, lastOracleReservePriceSpreadPct, lastOrac
309
309
  spreadTerms.effectiveLeverageCapped = spreadScale;
310
310
  if (baseAssetAmountWithAmm.gt(numericConstants_1.ZERO)) {
311
311
  longSpread *= spreadScale;
312
- shortSpread = Math.floor(longSpread);
312
+ longSpread = Math.floor(longSpread);
313
313
  }
314
314
  else {
315
315
  shortSpread *= spreadScale;
@@ -324,7 +324,7 @@ function calculateSpreadBN(baseSpread, lastOracleReservePriceSpreadPct, lastOrac
324
324
  spreadTerms.shortSpreadwEL = shortSpread;
325
325
  if (netRevenueSinceLastFunding.lt(numericConstants_1.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT)) {
326
326
  const revenueRetreatAmount = Math.min(maxTargetSpread / 10, Math.floor((baseSpread * netRevenueSinceLastFunding.abs().toNumber()) /
327
- numericConstants_1.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT.toNumber()));
327
+ numericConstants_1.DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT.abs().toNumber()));
328
328
  const halfRevenueRetreatAmount = Math.floor(revenueRetreatAmount / 2);
329
329
  spreadTerms.revenueRetreatAmount = revenueRetreatAmount;
330
330
  spreadTerms.halfRevenueRetreatAmount = halfRevenueRetreatAmount;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "2.1.0",
3
+ "version": "2.1.2",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",
package/src/math/amm.ts CHANGED
@@ -392,7 +392,7 @@ export function calculateEffectiveLeverage(
392
392
  reservePrice: BN,
393
393
  totalFeeMinusDistributions: BN
394
394
  ): number {
395
- // inventory skew
395
+ // vAMM skew
396
396
  const netBaseAssetValue = quoteAssetReserve
397
397
  .sub(terminalQuoteAssetReserve)
398
398
  .mul(pegMultiplier)
@@ -402,9 +402,13 @@ export function calculateEffectiveLeverage(
402
402
  .mul(reservePrice)
403
403
  .div(AMM_TO_QUOTE_PRECISION_RATIO.mul(PRICE_PRECISION));
404
404
 
405
+ const effectiveGap = Math.max(
406
+ 0,
407
+ localBaseAssetValue.sub(netBaseAssetValue).toNumber()
408
+ );
409
+
405
410
  const effectiveLeverage =
406
- localBaseAssetValue.sub(netBaseAssetValue).toNumber() /
407
- (Math.max(0, totalFeeMinusDistributions.toNumber()) + 1) +
411
+ effectiveGap / (Math.max(0, totalFeeMinusDistributions.toNumber()) + 1) +
408
412
  1 / QUOTE_PRECISION.toNumber();
409
413
 
410
414
  return effectiveLeverage;
@@ -580,7 +584,7 @@ export function calculateSpreadBN(
580
584
 
581
585
  if (baseAssetAmountWithAmm.gt(ZERO)) {
582
586
  longSpread *= spreadScale;
583
- shortSpread = Math.floor(longSpread);
587
+ longSpread = Math.floor(longSpread);
584
588
  } else {
585
589
  shortSpread *= spreadScale;
586
590
  shortSpread = Math.floor(shortSpread);
@@ -602,7 +606,7 @@ export function calculateSpreadBN(
602
606
  maxTargetSpread / 10,
603
607
  Math.floor(
604
608
  (baseSpread * netRevenueSinceLastFunding.abs().toNumber()) /
605
- DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT.toNumber()
609
+ DEFAULT_REVENUE_SINCE_LAST_FUNDING_SPREAD_RETREAT.abs().toNumber()
606
610
  )
607
611
  );
608
612
  const halfRevenueRetreatAmount = Math.floor(revenueRetreatAmount / 2);
package/tests/amm/test.ts CHANGED
@@ -149,6 +149,41 @@ describe('AMM Tests', () => {
149
149
 
150
150
  });
151
151
 
152
+ it('Corner Case Spreads', () => {
153
+
154
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
155
+ // @ts-ignore
156
+ const terms2: AMMSpreadTerms = calculateSpreadBN(
157
+ 1000,
158
+ new BN(5555),
159
+ new BN(1131),
160
+ 20000,
161
+ new BN(1009967115003047),
162
+ new BN(1009811402660255),
163
+ new BN(13460124),
164
+ new BN(15328930153),
165
+ new BN(13667686),
166
+ new BN(1235066973),
167
+ new BN(88540713),
168
+ new BN(994097717724176),
169
+ new BN(974077854655784),
170
+ new BN(1014841945381208),
171
+ new BN(103320),
172
+ new BN(59975),
173
+ new BN(768323534),
174
+ new BN(243875031),
175
+ new BN(130017761029),
176
+ true
177
+ );
178
+
179
+ console.log(terms2);
180
+ assert(terms2.effectiveLeverageCapped<=1.000001);
181
+ assert(terms2.inventorySpreadScale==1.117371);
182
+ assert(terms2.longSpread==1263);
183
+ assert(terms2.shortSpread==6686);
184
+ });
185
+
186
+
152
187
  it('live update functions', () => {
153
188
 
154
189
  const mockAmm = mockPerpMarkets[0].amm;