@drift-labs/sdk 0.1.8 → 0.1.12

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 (73) hide show
  1. package/.eslintrc.json +36 -0
  2. package/.prettierignore +1 -0
  3. package/.prettierrc.js +9 -0
  4. package/lib/accounts/defaultClearingHouseAccountSubscriber.d.ts +1 -0
  5. package/lib/accounts/defaultClearingHouseAccountSubscriber.d.ts.map +1 -0
  6. package/lib/accounts/defaultHistoryAccountSubscriber.d.ts +1 -0
  7. package/lib/accounts/defaultHistoryAccountSubscriber.d.ts.map +1 -0
  8. package/lib/accounts/defaultUserAccountSubscriber.d.ts +1 -0
  9. package/lib/accounts/defaultUserAccountSubscriber.d.ts.map +1 -0
  10. package/lib/accounts/types.d.ts +1 -0
  11. package/lib/accounts/types.d.ts.map +1 -0
  12. package/lib/accounts/webSocketAccountSubscriber.d.ts +1 -0
  13. package/lib/accounts/webSocketAccountSubscriber.d.ts.map +1 -0
  14. package/lib/addresses.d.ts +1 -0
  15. package/lib/addresses.d.ts.map +1 -0
  16. package/lib/admin.d.ts +1 -0
  17. package/lib/admin.d.ts.map +1 -0
  18. package/lib/assert/assert.d.ts +1 -0
  19. package/lib/assert/assert.d.ts.map +1 -0
  20. package/lib/clearingHouse.d.ts +1 -0
  21. package/lib/clearingHouse.d.ts.map +1 -0
  22. package/lib/clearingHouseUser.d.ts +3 -2
  23. package/lib/clearingHouseUser.d.ts.map +1 -0
  24. package/lib/clearingHouseUser.js +12 -32
  25. package/lib/config.d.ts +1 -0
  26. package/lib/config.d.ts.map +1 -0
  27. package/lib/constants/markets.d.ts +1 -0
  28. package/lib/constants/markets.d.ts.map +1 -0
  29. package/lib/constants/markets.js +21 -7
  30. package/lib/constants/numericConstants.d.ts +1 -0
  31. package/lib/constants/numericConstants.d.ts.map +1 -0
  32. package/lib/examples/makeTradeExample.d.ts +1 -0
  33. package/lib/examples/makeTradeExample.d.ts.map +1 -0
  34. package/lib/idl/clearing_house.json +6 -2
  35. package/lib/index.d.ts +1 -0
  36. package/lib/index.d.ts.map +1 -0
  37. package/lib/math/amm.d.ts +1 -0
  38. package/lib/math/amm.d.ts.map +1 -0
  39. package/lib/math/conversion.d.ts +1 -0
  40. package/lib/math/conversion.d.ts.map +1 -0
  41. package/lib/math/funding.d.ts +11 -1
  42. package/lib/math/funding.d.ts.map +1 -0
  43. package/lib/math/funding.js +85 -19
  44. package/lib/math/market.d.ts +1 -0
  45. package/lib/math/market.d.ts.map +1 -0
  46. package/lib/math/position.d.ts +7 -0
  47. package/lib/math/position.d.ts.map +1 -0
  48. package/lib/math/position.js +17 -1
  49. package/lib/math/trade.d.ts +2 -1
  50. package/lib/math/trade.d.ts.map +1 -0
  51. package/lib/math/utils.d.ts +1 -0
  52. package/lib/math/utils.d.ts.map +1 -0
  53. package/lib/mockUSDCFaucet.d.ts +1 -0
  54. package/lib/mockUSDCFaucet.d.ts.map +1 -0
  55. package/lib/pythClient.d.ts +1 -0
  56. package/lib/pythClient.d.ts.map +1 -0
  57. package/lib/tx/defaultTxSender.d.ts +1 -0
  58. package/lib/tx/defaultTxSender.d.ts.map +1 -0
  59. package/lib/tx/types.d.ts +1 -0
  60. package/lib/tx/types.d.ts.map +1 -0
  61. package/lib/tx/utils.d.ts +1 -0
  62. package/lib/tx/utils.d.ts.map +1 -0
  63. package/lib/types.d.ts +13 -41
  64. package/lib/types.d.ts.map +1 -0
  65. package/package.json +12 -2
  66. package/src/clearingHouseUser.ts +26 -46
  67. package/src/constants/markets.ts +21 -7
  68. package/src/idl/clearing_house.json +6 -2
  69. package/src/math/funding.ts +143 -60
  70. package/src/math/position.ts +19 -0
  71. package/src/math/trade.ts +4 -3
  72. package/src/types.ts +12 -44
  73. package/tsconfig.json +2 -1
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.calculateFundingPool = exports.calculateLongShortFundingRate = exports.calculateEstimatedFundingRate = exports.calculateAllEstimatedFundingRate = void 0;
12
+ exports.calculateFundingPool = exports.calculateLongShortFundingRateAndLiveTwaps = exports.calculateLongShortFundingRate = exports.calculateEstimatedFundingRate = exports.calculateAllEstimatedFundingRate = void 0;
13
13
  const anchor_1 = require("@project-serum/anchor");
14
14
  const numericConstants_1 = require("../constants/numericConstants");
15
15
  const market_1 = require("./market");
@@ -29,22 +29,35 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
29
29
  const secondsInHour = new anchor_1.BN(3600);
30
30
  const hoursInDay = new anchor_1.BN(24);
31
31
  if (!market.initialized) {
32
- return [new anchor_1.BN(0), new anchor_1.BN(0), new anchor_1.BN(0)];
32
+ return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
33
33
  }
34
34
  const payFreq = new anchor_1.BN(market.amm.fundingPeriod);
35
- const oraclePriceData = yield pythClient.getPriceData(market.amm.oracle);
36
- const oracleTwapWithMantissa = new anchor_1.BN(oraclePriceData.twap.value * numericConstants_1.MARK_PRICE_PRECISION.toNumber());
35
+ // todo: sufficiently differs from blockchain timestamp?
37
36
  const now = new anchor_1.BN((Date.now() / 1000).toFixed(0));
38
37
  const timeSinceLastUpdate = now.sub(market.amm.lastFundingRateTs);
38
+ // calculate real-time mark twap
39
39
  const lastMarkTwapWithMantissa = market.amm.lastMarkPriceTwap;
40
40
  const lastMarkPriceTwapTs = market.amm.lastMarkPriceTwapTs;
41
41
  const timeSinceLastMarkChange = now.sub(lastMarkPriceTwapTs);
42
- const markTwapTimeSinceLastUpdate = lastMarkPriceTwapTs.sub(market.amm.lastFundingRateTs);
42
+ const markTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastMarkChange));
43
43
  const baseAssetPriceWithMantissa = market_1.calculateMarkPrice(market);
44
44
  const markTwapWithMantissa = markTwapTimeSinceLastUpdate
45
45
  .mul(lastMarkTwapWithMantissa)
46
46
  .add(timeSinceLastMarkChange.mul(baseAssetPriceWithMantissa))
47
47
  .div(timeSinceLastMarkChange.add(markTwapTimeSinceLastUpdate));
48
+ // calculate real-time (predicted) oracle twap
49
+ // note: oracle twap depends on `when the chord is struck` (market is trade)
50
+ const lastOracleTwapWithMantissa = market.amm.lastOraclePriceTwap;
51
+ const lastOraclePriceTwapTs = market.amm.lastOraclePriceTwapTs;
52
+ const timeSinceLastOracleTwapUpdate = now.sub(lastOraclePriceTwapTs);
53
+ const oracleTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastOracleTwapUpdate));
54
+ const oraclePriceData = yield pythClient.getPriceData(market.amm.oracle);
55
+ const oraclePriceStableWithMantissa = new anchor_1.BN(((oraclePriceData.price + oraclePriceData.previousPrice) / 2) *
56
+ numericConstants_1.MARK_PRICE_PRECISION.toNumber());
57
+ const oracleTwapWithMantissa = oracleTwapTimeSinceLastUpdate
58
+ .mul(lastOracleTwapWithMantissa)
59
+ .add(timeSinceLastMarkChange.mul(oraclePriceStableWithMantissa))
60
+ .div(timeSinceLastOracleTwapUpdate.add(oracleTwapTimeSinceLastUpdate));
48
61
  const twapSpread = markTwapWithMantissa.sub(oracleTwapWithMantissa);
49
62
  const twapSpreadPct = twapSpread
50
63
  .mul(numericConstants_1.MARK_PRICE_PRECISION)
@@ -58,7 +71,9 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
58
71
  .div(secondsInHour)
59
72
  .div(hoursInDay);
60
73
  const interpEst = twapSpreadPct.mul(periodAdjustment).div(hoursInDay);
61
- const interpRateQuote = twapSpreadPct.mul(periodAdjustment).div(hoursInDay)
74
+ const interpRateQuote = twapSpreadPct
75
+ .mul(periodAdjustment)
76
+ .div(hoursInDay)
62
77
  .div(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION));
63
78
  let feePoolSize = calculateFundingPool(market);
64
79
  if (interpRateQuote.lt(new anchor_1.BN(0))) {
@@ -67,32 +82,54 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
67
82
  let cappedAltEst;
68
83
  let largerSide;
69
84
  let smallerSide;
70
- if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
85
+ if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
71
86
  largerSide = market.baseAssetAmountLong.abs();
72
87
  smallerSide = market.baseAssetAmountShort.abs();
73
88
  if (twapSpread.gt(new anchor_1.BN(0))) {
74
- return [lowerboundEst, interpEst, interpEst];
89
+ return [
90
+ markTwapWithMantissa,
91
+ oracleTwapWithMantissa,
92
+ lowerboundEst,
93
+ interpEst,
94
+ interpEst,
95
+ ];
75
96
  }
76
97
  }
77
- else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort)) {
98
+ else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
78
99
  largerSide = market.baseAssetAmountShort.abs();
79
100
  smallerSide = market.baseAssetAmountLong.abs();
80
101
  if (twapSpread.lt(new anchor_1.BN(0))) {
81
- return [lowerboundEst, interpEst, interpEst];
102
+ return [
103
+ markTwapWithMantissa,
104
+ oracleTwapWithMantissa,
105
+ lowerboundEst,
106
+ interpEst,
107
+ interpEst,
108
+ ];
82
109
  }
83
110
  }
84
111
  else {
85
- return [lowerboundEst, interpEst, interpEst];
112
+ return [
113
+ markTwapWithMantissa,
114
+ oracleTwapWithMantissa,
115
+ lowerboundEst,
116
+ interpEst,
117
+ interpEst,
118
+ ];
86
119
  }
87
120
  if (largerSide.gt(numericConstants_1.ZERO)) {
88
121
  cappedAltEst = smallerSide.mul(twapSpread).div(largerSide);
89
- const feePoolTopOff = feePoolSize.mul(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION))
90
- .mul(numericConstants_1.AMM_RESERVE_PRECISION).div(largerSide);
122
+ const feePoolTopOff = feePoolSize
123
+ .mul(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION))
124
+ .mul(numericConstants_1.AMM_RESERVE_PRECISION)
125
+ .div(largerSide);
91
126
  cappedAltEst = cappedAltEst.add(feePoolTopOff);
92
- cappedAltEst = cappedAltEst.mul(numericConstants_1.MARK_PRICE_PRECISION)
127
+ cappedAltEst = cappedAltEst
128
+ .mul(numericConstants_1.MARK_PRICE_PRECISION)
93
129
  .mul(new anchor_1.BN(100))
94
130
  .div(oracleTwapWithMantissa)
95
- .mul(periodAdjustment).div(hoursInDay);
131
+ .mul(periodAdjustment)
132
+ .div(hoursInDay);
96
133
  if (cappedAltEst.abs().gt(interpEst.abs())) {
97
134
  cappedAltEst = interpEst;
98
135
  }
@@ -100,7 +137,13 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
100
137
  else {
101
138
  cappedAltEst = interpEst;
102
139
  }
103
- return [lowerboundEst, cappedAltEst, interpEst];
140
+ return [
141
+ markTwapWithMantissa,
142
+ oracleTwapWithMantissa,
143
+ lowerboundEst,
144
+ cappedAltEst,
145
+ interpEst,
146
+ ];
104
147
  });
105
148
  }
106
149
  exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
@@ -114,7 +157,7 @@ exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
114
157
  */
115
158
  function calculateEstimatedFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1), estimationMethod) {
116
159
  return __awaiter(this, void 0, void 0, function* () {
117
- const [lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
160
+ const [_1, _2, lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
118
161
  if (estimationMethod == 'lowerbound') {
119
162
  //assuming remaining funding period has no gap
120
163
  return lowerboundEst;
@@ -138,7 +181,7 @@ exports.calculateEstimatedFundingRate = calculateEstimatedFundingRate;
138
181
  */
139
182
  function calculateLongShortFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
140
183
  return __awaiter(this, void 0, void 0, function* () {
141
- const [_, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
184
+ const [_1, _2, _, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
142
185
  if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
143
186
  return [cappedAltEst, interpEst];
144
187
  }
@@ -151,15 +194,38 @@ function calculateLongShortFundingRate(market, pythClient, periodAdjustment = ne
151
194
  });
152
195
  }
153
196
  exports.calculateLongShortFundingRate = calculateLongShortFundingRate;
197
+ /**
198
+ *
199
+ * @param market
200
+ * @param pythClient
201
+ * @param periodAdjustment
202
+ * @param estimationMethod
203
+ * @returns Estimated funding rate. : Precision //TODO-PRECISION
204
+ */
205
+ function calculateLongShortFundingRateAndLiveTwaps(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
206
+ return __awaiter(this, void 0, void 0, function* () {
207
+ const [markTwapLive, oracleTwapLive, _2, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
208
+ if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
209
+ return [markTwapLive, oracleTwapLive, cappedAltEst, interpEst];
210
+ }
211
+ else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
212
+ return [markTwapLive, oracleTwapLive, interpEst, cappedAltEst];
213
+ }
214
+ else {
215
+ return [markTwapLive, oracleTwapLive, interpEst, interpEst];
216
+ }
217
+ });
218
+ }
219
+ exports.calculateLongShortFundingRateAndLiveTwaps = calculateLongShortFundingRateAndLiveTwaps;
154
220
  /**
155
221
  *
156
222
  * @param market
157
223
  * @returns Estimated fee pool size
158
224
  */
159
225
  function calculateFundingPool(market) {
226
+ // todo
160
227
  const totalFeeLB = market.amm.totalFee.div(new anchor_1.BN(2));
161
228
  const feePool = market.amm.totalFeeMinusDistributions.sub(totalFeeLB);
162
- // return new BN(QUOTE_PRECISION.mul(new BN(2400)));
163
229
  return feePool;
164
230
  }
165
231
  exports.calculateFundingPool = calculateFundingPool;
@@ -8,3 +8,4 @@ import { Market } from '../types';
8
8
  * @return markPrice : Precision MARK_PRICE_PRECISION
9
9
  */
10
10
  export declare function calculateMarkPrice(market: Market): BN;
11
+ //# sourceMappingURL=market.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../../src/math/market.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAGlC;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAMrD"}
@@ -24,3 +24,10 @@ export declare function calculatePositionPNL(market: Market, marketPosition: Use
24
24
  * @returns // TODO-PRECISION
25
25
  */
26
26
  export declare function calculatePositionFundingPNL(market: Market, marketPosition: UserPosition): BN;
27
+ /**
28
+ *
29
+ * @param userPosition
30
+ * @returns Precision: MARK_PRICE_PRECISION (10^10)
31
+ */
32
+ export declare function calculateEntryPrice(userPosition: UserPosition): BN;
33
+ //# sourceMappingURL=position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/math/position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,YAAY,EAAE,MAAM,UAAU,CAAC;AAQnE,OAAO,EAAE,MAAM,OAAO,CAAC;AAQvB;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,GACxB,EAAE,CA+BJ;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,YAAY,EAC5B,WAAW,UAAQ,GACjB,EAAE,CAgCJ;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAC1C,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,YAAY,GAC1B,EAAE,CAoBJ;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,EAAE,CAUlE"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.calculatePositionFundingPNL = exports.calculatePositionPNL = exports.calculateBaseAssetValue = void 0;
6
+ exports.calculateEntryPrice = exports.calculatePositionFundingPNL = exports.calculatePositionPNL = exports.calculateBaseAssetValue = void 0;
7
7
  const types_1 = require("../types");
8
8
  const numericConstants_1 = require("../constants/numericConstants");
9
9
  const bn_js_1 = __importDefault(require("bn.js"));
@@ -98,3 +98,19 @@ function calculatePositionFundingPNL(market, marketPosition) {
98
98
  return perPositionFundingRate;
99
99
  }
100
100
  exports.calculatePositionFundingPNL = calculatePositionFundingPNL;
101
+ /**
102
+ *
103
+ * @param userPosition
104
+ * @returns Precision: MARK_PRICE_PRECISION (10^10)
105
+ */
106
+ function calculateEntryPrice(userPosition) {
107
+ if (userPosition.baseAssetAmount.eq(numericConstants_1.ZERO)) {
108
+ return numericConstants_1.ZERO;
109
+ }
110
+ return userPosition.quoteAssetAmount
111
+ .mul(numericConstants_1.MARK_PRICE_PRECISION)
112
+ .mul(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO)
113
+ .div(userPosition.baseAssetAmount)
114
+ .abs();
115
+ }
116
+ exports.calculateEntryPrice = calculateEntryPrice;
@@ -2,7 +2,7 @@
2
2
  import { Market, PositionDirection } from '../types';
3
3
  import { BN } from '@project-serum/anchor';
4
4
  import { AssetType } from './amm';
5
- export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceDeltaAsNumber' | 'pctAvg' | 'pctMax' | 'quoteAssetAmount' | 'quoteAssetAmountPeg' | 'acquiredBaseAssetAmount' | 'acquiredQuoteAssetAmount';
5
+ export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceDeltaAsNumber' | 'pctAvg' | 'pctMax' | 'quoteAssetAmount' | 'quoteAssetAmountPeg' | 'acquiredBaseAssetAmount' | 'acquiredQuoteAssetAmount' | 'all';
6
6
  /**
7
7
  * Calculates avg/max slippage (price impact) for candidate trade
8
8
  * @param direction
@@ -45,3 +45,4 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
45
45
  * ]
46
46
  */
47
47
  export declare function calculateTargetPriceTrade(market: Market, targetPrice: BN, pct?: BN): [PositionDirection, BN, BN, BN];
48
+ //# sourceMappingURL=trade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trade.d.ts","sourceRoot":"","sources":["../../src/math/trade.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,uBAAuB,CAAC;AAS3C,OAAO,EAIN,SAAS,EACT,MAAM,OAAO,CAAC;AAKf,oBAAY,eAAe,GACxB,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,oBAAoB,GACpB,QAAQ,GACR,QAAQ,GACR,kBAAkB,GAClB,qBAAqB,GACrB,yBAAyB,GACzB,0BAA0B,GAC1B,KAAK,CAAC;AAET;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,SAAmB,GACjC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CA0ClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC5C,SAAS,EAAE,iBAAiB,EAC5B,MAAM,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,EACd,cAAc,GAAE,SAAmB,GACjC,CAAC,EAAE,EAAE,EAAE,CAAC,CAiBV;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,yBAAyB,CACxC,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,EAAE,EACf,GAAG,GAAE,EAAW,GACd,CAAC,iBAAiB,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CA6GjC"}
@@ -1,2 +1,3 @@
1
1
  /// <reference types="bn.js" />
2
2
  export declare const squareRootBN: (n: any, closeness?: import("bn.js")) => any;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/math/utils.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,YAAY,8CA0BxB,CAAC"}
@@ -33,3 +33,4 @@ export declare class MockUSDCFaucet {
33
33
  callback: (accountInfo: AccountInfo) => void;
34
34
  }): Promise<boolean>;
35
35
  }
36
+ //# sourceMappingURL=mockUSDCFaucet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockUSDCFaucet.d.ts","sourceRoot":"","sources":["../src/mockUSDCFaucet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAO,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EACN,WAAW,EAKX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,cAAc,EACd,UAAU,EACV,SAAS,EAIT,sBAAsB,EACtB,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvB,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,qBAAa,cAAc;IAC1B,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,cAAc,CAAC;gBAGrB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,SAAS,EACpB,IAAI,CAAC,EAAE,cAAc;IAUT,uCAAuC,IAAI,OAAO,CAC9D;QAAC,SAAS;QAAE,MAAM;KAAC,CACnB;IAOD,4BAA4B,CAAC,EAAE,SAAS,CAAC;IAC5B,+BAA+B,IAAI,OAAO,CAAC,SAAS,CAAC;IAUrD,UAAU,IAAI,OAAO,CAAC,oBAAoB,CAAC;IA8C3C,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC;IAM1B,UAAU,CACtB,gBAAgB,EAAE,SAAS,EAC3B,MAAM,EAAE,EAAE,GACR,OAAO,CAAC,oBAAoB,CAAC;IAanB,qCAAqC,CACjD,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE,EAAE,GACR,OAAO,CAAC,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IAWhC,iDAAiD,CAC7D,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE,EAAE,GACR,OAAO,CAAC,CAAC,SAAS,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAC;IA8B1D,gCAAgC,CAAC,KAAK,EAAE;QACpD,UAAU,EAAE,SAAS,CAAC;KACtB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;IAWrB,mBAAmB,CAAC,KAAK,EAAE;QACvC,UAAU,EAAE,SAAS,CAAC;KACtB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBX,uBAAuB,CAAC,KAAK,EAAE;QAC3C,UAAU,EAAE,SAAS,CAAC;QACtB,QAAQ,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;KAC7C,GAAG,OAAO,CAAC,OAAO,CAAC;CAuBpB"}
@@ -5,3 +5,4 @@ export declare class PythClient {
5
5
  constructor(connection: Connection);
6
6
  getPriceData(pricePublicKey: PublicKey): Promise<PriceData>;
7
7
  }
8
+ //# sourceMappingURL=pythClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pythClient.d.ts","sourceRoot":"","sources":["../src/pythClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAExD,qBAAa,UAAU;IACtB,OAAO,CAAC,UAAU,CAAa;gBAEZ,UAAU,EAAE,UAAU;IAI5B,YAAY,CAAC,cAAc,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;CAIxE"}
@@ -6,3 +6,4 @@ export declare class DefaultTxSender implements TxSender {
6
6
  constructor(provider: Provider);
7
7
  send(tx: Transaction, additionalSigners?: Array<Signer>, opts?: ConfirmOptions): Promise<TransactionSignature>;
8
8
  }
9
+ //# sourceMappingURL=defaultTxSender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultTxSender.d.ts","sourceRoot":"","sources":["../../src/tx/defaultTxSender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EACN,cAAc,EACd,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,qBAAa,eAAgB,YAAW,QAAQ;IAC/C,QAAQ,EAAE,QAAQ,CAAC;gBAEA,QAAQ,EAAE,QAAQ;IAIrC,IAAI,CACH,EAAE,EAAE,WAAW,EACf,iBAAiB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EACjC,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC;CAGhC"}
package/lib/tx/types.d.ts CHANGED
@@ -2,3 +2,4 @@ import { ConfirmOptions, Signer, Transaction, TransactionSignature } from '@sola
2
2
  export interface TxSender {
3
3
  send(tx: Transaction, additionalSigners?: Array<Signer>, opts?: ConfirmOptions): Promise<TransactionSignature>;
4
4
  }
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tx/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,cAAc,EACd,MAAM,EACN,WAAW,EACX,oBAAoB,EACpB,MAAM,iBAAiB,CAAC;AAEzB,MAAM,WAAW,QAAQ;IACxB,IAAI,CACH,EAAE,EAAE,WAAW,EACf,iBAAiB,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,EACjC,IAAI,CAAC,EAAE,cAAc,GACnB,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACjC"}
package/lib/tx/utils.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  import { Transaction, TransactionInstruction } from '@solana/web3.js';
2
2
  export declare function wrapInTx(instruction: TransactionInstruction): Transaction;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/tx/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEtE,wBAAgB,QAAQ,CAAC,WAAW,EAAE,sBAAsB,GAAG,WAAW,CAEzE"}
package/lib/types.d.ts CHANGED
@@ -203,6 +203,8 @@ export declare type AMM = {
203
203
  lastFundingRateTs: BN;
204
204
  lastMarkPriceTwap: BN;
205
205
  lastMarkPriceTwapTs: BN;
206
+ lastOraclePriceTwap: BN;
207
+ lastOraclePriceTwapTs: BN;
206
208
  oracle: PublicKey;
207
209
  oracleSource: OracleSource;
208
210
  fundingPeriod: BN;
@@ -222,6 +224,9 @@ export declare type UserPosition = {
222
224
  lastCumulativeFundingRate: BN;
223
225
  marketIndex: BN;
224
226
  quoteAssetAmount: BN;
227
+ unrealizedPnl?: BN;
228
+ unrealizedFundingPnl?: BN;
229
+ baseAssetValue?: BN;
225
230
  };
226
231
  export declare type UserPositionsAccount = {
227
232
  positions: UserPosition[];
@@ -234,50 +239,16 @@ export declare type UserAccount = {
234
239
  positions: PublicKey;
235
240
  totalFeePaid: BN;
236
241
  };
237
- export interface Trade {
238
- price: number;
239
- beforePrice: number;
240
- afterPrice: number;
241
- side: TradeSide;
242
- size: number;
243
- ts: number;
244
- fee: number;
245
- marketIndex: number;
246
- chainTs: number;
247
- }
248
- export declare type Liquidation = {
249
- ts: number;
250
- chainTs: number;
251
- recordId: number;
242
+ export declare type UserSnapshotRecord = {
243
+ ts: BN;
252
244
  userAuthority: PublicKey;
253
245
  user: PublicKey;
254
- partial: boolean;
255
- baseAssetValue: number;
256
- baseAssetValueClosed: number;
257
- liquidationFee: number;
258
- feeToLiquidator: number;
259
- feeToInsuranceFund: number;
260
- liquidator: PublicKey;
261
- totalCollateral: number;
262
- collateral: number;
263
- unrealizedPnl: number;
264
- marginRatio: number;
265
- };
266
- export declare type Candle = {
267
- open: number;
268
- close: number;
269
- high: number;
270
- low: number;
271
- volume: number;
272
- start: number;
273
- end: number;
246
+ userPositions: UserPosition[];
247
+ userTotalRealizedPnl: BN;
248
+ userTotalUnrealizedPnl: BN;
249
+ userTotalUnrealizedFundingPnl: BN;
250
+ userCollateral: BN;
274
251
  };
275
- export interface FundingPayment {
276
- userPublicKey: string;
277
- ts: number;
278
- marketIndex: number;
279
- amount: string;
280
- }
281
252
  export interface IWallet {
282
253
  signTransaction(tx: Transaction): Promise<Transaction>;
283
254
  signAllTransactions(txs: Transaction[]): Promise<Transaction[]>;
@@ -327,3 +298,4 @@ export declare type OracleGuardRails = {
327
298
  };
328
299
  useForLiquidations: boolean;
329
300
  };
301
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@drift-labs/sdk",
3
- "version": "0.1.8",
3
+ "version": "0.1.12",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "author": "crispheaney",
@@ -12,7 +12,9 @@
12
12
  "scripts": {
13
13
  "build": "yarn clean && tsc",
14
14
  "clean": "rm -rf lib",
15
- "patch-and-pub": "npm version patch --force && npm publish"
15
+ "patch-and-pub": "npm version patch --force && npm publish",
16
+ "prettify": "prettier --write './src/**/*.{ts,tsx}'",
17
+ "lint": "eslint . --ext ts --ext tsx --ext js --quiet"
16
18
  },
17
19
  "keywords": [
18
20
  "drift-labs",
@@ -34,6 +36,14 @@
34
36
  "@types/bn.js": "^5.1.0",
35
37
  "strict-event-emitter-types": "^2.0.0"
36
38
  },
39
+ "devDependencies": {
40
+ "@typescript-eslint/eslint-plugin": "^4.28.0",
41
+ "@typescript-eslint/parser": "^4.28.0",
42
+ "eslint": "^7.29.0",
43
+ "eslint-config-prettier": "^8.3.0",
44
+ "eslint-plugin-prettier": "^3.4.0",
45
+ "prettier": "^2.4.1"
46
+ },
37
47
  "description": "SDK for Drift Protocol v1",
38
48
  "engines": {
39
49
  "node": ">=12"
@@ -145,30 +145,32 @@ export class ClearingHouseUser {
145
145
  * calculates unrealized position price pnl
146
146
  * @returns : Precision QUOTE_PRECISION
147
147
  */
148
- public getUnrealizedPNL(withFunding?: boolean): BN {
149
- return this.getUserPositionsAccount().positions.reduce(
150
- (pnl, marketPosition) => {
148
+ public getUnrealizedPNL(withFunding?: boolean, marketIndex?: BN): BN {
149
+ return this.getUserPositionsAccount()
150
+ .positions.filter((pos) =>
151
+ marketIndex ? pos.marketIndex === marketIndex : true
152
+ )
153
+ .reduce((pnl, marketPosition) => {
151
154
  const market = this.clearingHouse.getMarket(marketPosition.marketIndex);
152
155
  return pnl.add(
153
156
  calculatePositionPNL(market, marketPosition, withFunding)
154
157
  );
155
- },
156
- ZERO
157
- );
158
+ }, ZERO);
158
159
  }
159
160
 
160
161
  /**
161
162
  * calculates unrealized funding payment pnl
162
163
  * @returns : Precision QUOTE_PRECISION
163
164
  */
164
- public getUnrealizedFundingPNL(): BN {
165
- return this.getUserPositionsAccount().positions.reduce(
166
- (pnl, marketPosition) => {
165
+ public getUnrealizedFundingPNL(marketIndex?: BN): BN {
166
+ return this.getUserPositionsAccount()
167
+ .positions.filter((pos) =>
168
+ marketIndex ? pos.marketIndex === marketIndex : true
169
+ )
170
+ .reduce((pnl, marketPosition) => {
167
171
  const market = this.clearingHouse.getMarket(marketPosition.marketIndex);
168
172
  return pnl.add(calculatePositionFundingPNL(market, marketPosition));
169
- },
170
- ZERO
171
- );
173
+ }, ZERO);
172
174
  }
173
175
 
174
176
  /**
@@ -224,11 +226,14 @@ export class ClearingHouseUser {
224
226
  * calculates average exit price for closing 100% of position
225
227
  * @returns : Precision MARK_PRICE_PRECISION
226
228
  */
227
- public getPositionEstimatedExitPrice(position: UserPosition, amountToClose?: BN): BN {
229
+ public getPositionEstimatedExitPrice(
230
+ position: UserPosition,
231
+ amountToClose?: BN
232
+ ): BN {
228
233
  const market = this.clearingHouse.getMarket(position.marketIndex);
229
234
 
230
- if(amountToClose){
231
- if(amountToClose.eq(ZERO)){
235
+ if (amountToClose) {
236
+ if (amountToClose.eq(ZERO)) {
232
237
  return calculateMarkPrice(market);
233
238
  }
234
239
  position = {
@@ -408,23 +413,21 @@ export class ClearingHouseUser {
408
413
  );
409
414
 
410
415
  // if the position value after the trade is less than total collateral, there is no liq price
411
- if (targetTotalPositionValueUSDC.lte(totalCollateralUSDC)) {
416
+ if (
417
+ targetTotalPositionValueUSDC.lte(totalCollateralUSDC) &&
418
+ proposedMarketPosition.baseAssetAmount.gt(ZERO)
419
+ ) {
412
420
  return new BN(-1);
413
421
  }
414
422
 
415
- // proportion of proposed market position to overall position
416
- // const marketProportion = proposedMarketPositionValueUSDC
417
- // .mul(TEN_THOUSAND)
418
- // .div(targetTotalPositionValueUSDC);
419
-
420
423
  // get current margin ratio based on current collateral and proposed total position value
421
424
  let marginRatio;
422
- if (targetTotalPositionValueUSDC.eq(ZERO)) {
425
+ if (proposedMarketPositionValueUSDC.eq(ZERO)) {
423
426
  marginRatio = BN_MAX;
424
427
  } else {
425
428
  marginRatio = totalCollateralUSDC
426
429
  .mul(TEN_THOUSAND)
427
- .div(targetTotalPositionValueUSDC);
430
+ .div(proposedMarketPositionValueUSDC);
428
431
  }
429
432
 
430
433
  let liqRatio = FULL_LIQUIDATION_RATIO;
@@ -435,29 +438,6 @@ export class ClearingHouseUser {
435
438
  // sign of position in current market after the trade
436
439
  const baseAssetSignIsNeg = proposedMarketPosition.baseAssetAmount.isNeg();
437
440
 
438
- // console.log(
439
- // convertToNumber(currentPrice),
440
- // convertToNumber(liqRatio),
441
- // convertToNumber(marginRatio),
442
- // convertToNumber(marketProportion),
443
- // );
444
-
445
- // // if the user is long, then the liq price is the currentPrice multiplied by liqRatio/marginRatio (how many multiples lower does the current marginRatio have to go to reach the liqRatio), multiplied by the fraction of the proposed total position value that this market will take up
446
- // if (!baseAssetSignIsNeg) {
447
- // liqPrice = currentPrice
448
- // .mul(liqRatio)
449
- // .div(marginRatio)
450
- // .mul(marketProportion)
451
- // .div(TEN_THOUSAND);
452
- // } else {
453
- // // if the user is short, it's the reciprocal of the above
454
- // liqPrice = currentPrice
455
- // .mul(marginRatio)
456
- // .div(liqRatio)
457
- // .mul(TEN_THOUSAND)
458
- // .div(marketProportion);
459
- // }
460
-
461
441
  let pctChange = marginRatio.abs().sub(liqRatio);
462
442
  // if user is short, higher price is liq
463
443
  if (baseAssetSignIsNeg) {
@@ -30,11 +30,25 @@ export const Markets: Market[] = [
30
30
  devnetPythOracle: 'EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw',
31
31
  mainnetPythOracle: 'JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB',
32
32
  },
33
- // {
34
- // symbol: 'COPE-PERP',
35
- // baseAssetSymbol: 'COPE',
36
- // marketIndex: new BN(3),
37
- // devnetPythOracle: 'BAXDJUXtz6P5ARhHH1aPwgv4WENzHwzyhmLYK4daFwiM',
38
- // mainnetPythOracle: '9xYBiDWYsh2fHzpsz3aaCnNHCKWBNtfEDLtU6kS4aFD9',
39
- // },
33
+ {
34
+ symbol: 'LUNA-PERP',
35
+ baseAssetSymbol: 'LUNA',
36
+ marketIndex: new BN(3),
37
+ devnetPythOracle: '8PugCXTAHLM9kfLSQWe2njE5pzAgUdpPk3Nx5zSm7BD3',
38
+ mainnetPythOracle: '5bmWuR1dgP4avtGYMNKLuxumZTVKGgoN2BCMXWDNL9nY',
39
+ },
40
+ {
41
+ symbol: 'AVAX-PERP',
42
+ baseAssetSymbol: 'AVAX',
43
+ marketIndex: new BN(4),
44
+ devnetPythOracle: 'FVb5h1VmHPfVb1RfqZckchq18GxRv4iKt8T4eVTQAqdz',
45
+ mainnetPythOracle: 'Ax9ujW5B9oqcv59N8m6f1BpTBq2rGeGaBcpKjC5UYsXU',
46
+ },
47
+ {
48
+ symbol: 'BNB-PERP',
49
+ baseAssetSymbol: 'BNB',
50
+ marketIndex: new BN(5),
51
+ devnetPythOracle: 'GwzBgrXb4PG59zjce24SF2b9JXbLEjJJTBkmytuEZj1b',
52
+ mainnetPythOracle: '4CkQJBxhU8EZ2UjhigbtdaPbpTe6mqf811fipYBFbSYN',
53
+ },
40
54
  ];
@@ -2140,7 +2140,7 @@
2140
2140
  "type": "i64"
2141
2141
  },
2142
2142
  {
2143
- "name": "lastOracleMarkSpreadTwap",
2143
+ "name": "lastOraclePriceTwap",
2144
2144
  "type": "i128"
2145
2145
  },
2146
2146
  {
@@ -2175,9 +2175,13 @@
2175
2175
  "name": "minimumTradeSize",
2176
2176
  "type": "u128"
2177
2177
  },
2178
+ {
2179
+ "name": "lastOraclePriceTwapTs",
2180
+ "type": "i64"
2181
+ },
2178
2182
  {
2179
2183
  "name": "padding0",
2180
- "type": "u128"
2184
+ "type": "u64"
2181
2185
  },
2182
2186
  {
2183
2187
  "name": "padding1",