@drift-labs/sdk 0.1.7 → 0.1.11

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 (78) 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 +2 -1
  17. package/lib/admin.d.ts.map +1 -0
  18. package/lib/admin.js +2 -2
  19. package/lib/assert/assert.d.ts +1 -0
  20. package/lib/assert/assert.d.ts.map +1 -0
  21. package/lib/clearingHouse.d.ts +1 -0
  22. package/lib/clearingHouse.d.ts.map +1 -0
  23. package/lib/clearingHouseUser.d.ts +2 -1
  24. package/lib/clearingHouseUser.d.ts.map +1 -0
  25. package/lib/clearingHouseUser.js +20 -3
  26. package/lib/config.d.ts +1 -0
  27. package/lib/config.d.ts.map +1 -0
  28. package/lib/config.js +1 -1
  29. package/lib/constants/markets.d.ts +1 -0
  30. package/lib/constants/markets.d.ts.map +1 -0
  31. package/lib/constants/markets.js +28 -21
  32. package/lib/constants/numericConstants.d.ts +1 -0
  33. package/lib/constants/numericConstants.d.ts.map +1 -0
  34. package/lib/examples/makeTradeExample.d.ts +1 -0
  35. package/lib/examples/makeTradeExample.d.ts.map +1 -0
  36. package/lib/idl/clearing_house.json +34 -30
  37. package/lib/index.d.ts +1 -0
  38. package/lib/index.d.ts.map +1 -0
  39. package/lib/math/amm.d.ts +1 -0
  40. package/lib/math/amm.d.ts.map +1 -0
  41. package/lib/math/conversion.d.ts +1 -0
  42. package/lib/math/conversion.d.ts.map +1 -0
  43. package/lib/math/funding.d.ts +11 -1
  44. package/lib/math/funding.d.ts.map +1 -0
  45. package/lib/math/funding.js +84 -19
  46. package/lib/math/market.d.ts +1 -0
  47. package/lib/math/market.d.ts.map +1 -0
  48. package/lib/math/position.d.ts +7 -0
  49. package/lib/math/position.d.ts.map +1 -0
  50. package/lib/math/position.js +17 -1
  51. package/lib/math/trade.d.ts +5 -3
  52. package/lib/math/trade.d.ts.map +1 -0
  53. package/lib/math/trade.js +4 -4
  54. package/lib/math/utils.d.ts +1 -0
  55. package/lib/math/utils.d.ts.map +1 -0
  56. package/lib/mockUSDCFaucet.d.ts +1 -0
  57. package/lib/mockUSDCFaucet.d.ts.map +1 -0
  58. package/lib/pythClient.d.ts +1 -0
  59. package/lib/pythClient.d.ts.map +1 -0
  60. package/lib/tx/defaultTxSender.d.ts +1 -0
  61. package/lib/tx/defaultTxSender.d.ts.map +1 -0
  62. package/lib/tx/types.d.ts +1 -0
  63. package/lib/tx/types.d.ts.map +1 -0
  64. package/lib/tx/utils.d.ts +1 -0
  65. package/lib/tx/utils.d.ts.map +1 -0
  66. package/lib/types.d.ts +10 -1
  67. package/lib/types.d.ts.map +1 -0
  68. package/package.json +12 -2
  69. package/src/admin.ts +4 -4
  70. package/src/clearingHouseUser.ts +27 -4
  71. package/src/config.ts +1 -1
  72. package/src/constants/markets.ts +28 -21
  73. package/src/idl/clearing_house.json +34 -30
  74. package/src/math/funding.ts +120 -48
  75. package/src/math/position.ts +19 -0
  76. package/src/math/trade.ts +11 -6
  77. package/src/types.ts +9 -1
  78. 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,34 @@ 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) * numericConstants_1.MARK_PRICE_PRECISION.toNumber());
56
+ const oracleTwapWithMantissa = oracleTwapTimeSinceLastUpdate
57
+ .mul(lastOracleTwapWithMantissa)
58
+ .add(timeSinceLastMarkChange.mul(oraclePriceStableWithMantissa))
59
+ .div(timeSinceLastOracleTwapUpdate.add(oracleTwapTimeSinceLastUpdate));
48
60
  const twapSpread = markTwapWithMantissa.sub(oracleTwapWithMantissa);
49
61
  const twapSpreadPct = twapSpread
50
62
  .mul(numericConstants_1.MARK_PRICE_PRECISION)
@@ -58,26 +70,55 @@ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment =
58
70
  .div(secondsInHour)
59
71
  .div(hoursInDay);
60
72
  const interpEst = twapSpreadPct.mul(periodAdjustment).div(hoursInDay);
61
- const interpRateQuote = twapSpreadPct.mul(periodAdjustment).div(hoursInDay)
73
+ const interpRateQuote = twapSpreadPct
74
+ .mul(periodAdjustment)
75
+ .div(hoursInDay)
62
76
  .div(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION));
63
- const feePoolSize = calculateFundingPool(market);
77
+ let feePoolSize = calculateFundingPool(market);
78
+ if (interpRateQuote.lt(new anchor_1.BN(0))) {
79
+ feePoolSize = feePoolSize.mul(new anchor_1.BN(-1));
80
+ }
64
81
  let cappedAltEst;
65
- if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
66
- const largerSide = market.baseAssetAmountLong;
67
- const smallerSide = market.baseAssetAmountShort;
68
- cappedAltEst = feePoolSize.add(smallerSide.mul(interpRateQuote).div(numericConstants_1.AMM_RESERVE_PRECISION))
69
- .div(largerSide);
82
+ let largerSide;
83
+ let smallerSide;
84
+ if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
85
+ largerSide = market.baseAssetAmountLong.abs();
86
+ smallerSide = market.baseAssetAmountShort.abs();
87
+ if (twapSpread.gt(new anchor_1.BN(0))) {
88
+ return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, interpEst, interpEst];
89
+ }
70
90
  }
71
- else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort)) {
72
- const largerSide = market.baseAssetAmountShort;
73
- const smallerSide = market.baseAssetAmountLong;
74
- cappedAltEst = feePoolSize.add(smallerSide.mul(interpRateQuote).div(numericConstants_1.AMM_RESERVE_PRECISION))
91
+ else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
92
+ largerSide = market.baseAssetAmountShort.abs();
93
+ smallerSide = market.baseAssetAmountLong.abs();
94
+ if (twapSpread.lt(new anchor_1.BN(0))) {
95
+ return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, interpEst, interpEst];
96
+ }
97
+ }
98
+ else {
99
+ return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, interpEst, interpEst];
100
+ }
101
+ if (largerSide.gt(numericConstants_1.ZERO)) {
102
+ cappedAltEst = smallerSide.mul(twapSpread).div(largerSide);
103
+ const feePoolTopOff = feePoolSize
104
+ .mul(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION))
105
+ .mul(numericConstants_1.AMM_RESERVE_PRECISION)
75
106
  .div(largerSide);
107
+ cappedAltEst = cappedAltEst.add(feePoolTopOff);
108
+ cappedAltEst = cappedAltEst
109
+ .mul(numericConstants_1.MARK_PRICE_PRECISION)
110
+ .mul(new anchor_1.BN(100))
111
+ .div(oracleTwapWithMantissa)
112
+ .mul(periodAdjustment)
113
+ .div(hoursInDay);
114
+ if (cappedAltEst.abs().gt(interpEst.abs())) {
115
+ cappedAltEst = interpEst;
116
+ }
76
117
  }
77
118
  else {
78
119
  cappedAltEst = interpEst;
79
120
  }
80
- return [lowerboundEst, cappedAltEst, interpEst];
121
+ return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, cappedAltEst, interpEst];
81
122
  });
82
123
  }
83
124
  exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
@@ -91,7 +132,7 @@ exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
91
132
  */
92
133
  function calculateEstimatedFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1), estimationMethod) {
93
134
  return __awaiter(this, void 0, void 0, function* () {
94
- const [lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
135
+ const [_1, _2, lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
95
136
  if (estimationMethod == 'lowerbound') {
96
137
  //assuming remaining funding period has no gap
97
138
  return lowerboundEst;
@@ -115,7 +156,7 @@ exports.calculateEstimatedFundingRate = calculateEstimatedFundingRate;
115
156
  */
116
157
  function calculateLongShortFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
117
158
  return __awaiter(this, void 0, void 0, function* () {
118
- const [_, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
159
+ const [_1, _2, _, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
119
160
  if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
120
161
  return [cappedAltEst, interpEst];
121
162
  }
@@ -128,12 +169,36 @@ function calculateLongShortFundingRate(market, pythClient, periodAdjustment = ne
128
169
  });
129
170
  }
130
171
  exports.calculateLongShortFundingRate = calculateLongShortFundingRate;
172
+ /**
173
+ *
174
+ * @param market
175
+ * @param pythClient
176
+ * @param periodAdjustment
177
+ * @param estimationMethod
178
+ * @returns Estimated funding rate. : Precision //TODO-PRECISION
179
+ */
180
+ function calculateLongShortFundingRateAndLiveTwaps(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
181
+ return __awaiter(this, void 0, void 0, function* () {
182
+ const [markTwapLive, oracleTwapLive, _2, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
183
+ if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
184
+ return [markTwapLive, oracleTwapLive, cappedAltEst, interpEst];
185
+ }
186
+ else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
187
+ return [markTwapLive, oracleTwapLive, interpEst, cappedAltEst];
188
+ }
189
+ else {
190
+ return [markTwapLive, oracleTwapLive, interpEst, interpEst];
191
+ }
192
+ });
193
+ }
194
+ exports.calculateLongShortFundingRateAndLiveTwaps = calculateLongShortFundingRateAndLiveTwaps;
131
195
  /**
132
196
  *
133
197
  * @param market
134
198
  * @returns Estimated fee pool size
135
199
  */
136
200
  function calculateFundingPool(market) {
201
+ // todo
137
202
  const totalFeeLB = market.amm.totalFee.div(new anchor_1.BN(2));
138
203
  const feePool = market.amm.totalFeeMinusDistributions.sub(totalFeeLB);
139
204
  return feePool;
@@ -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;
@@ -1,7 +1,8 @@
1
1
  /// <reference types="bn.js" />
2
2
  import { Market, PositionDirection } from '../types';
3
3
  import { BN } from '@project-serum/anchor';
4
- export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceDeltaAsNumber' | 'pctAvg' | 'pctMax' | 'quoteAssetAmount' | 'quoteAssetAmountPeg' | 'acquiredBaseAssetAmount' | 'acquiredQuoteAssetAmount';
4
+ import { AssetType } from './amm';
5
+ export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' | 'priceDeltaAsNumber' | 'pctAvg' | 'pctMax' | 'quoteAssetAmount' | 'quoteAssetAmountPeg' | 'acquiredBaseAssetAmount' | 'acquiredQuoteAssetAmount' | 'all';
5
6
  /**
6
7
  * Calculates avg/max slippage (price impact) for candidate trade
7
8
  * @param direction
@@ -17,7 +18,7 @@ export declare type PriceImpactUnit = 'entryPrice' | 'maxPrice' | 'priceDelta' |
17
18
  *
18
19
  * 'newPrice' => the price of the asset after the trade : Precision MARK_PRICE_PRECISION
19
20
  */
20
- export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: Market): [BN, BN, BN, BN];
21
+ export declare function calculateTradeSlippage(direction: PositionDirection, amount: BN, market: Market, inputAssetType?: AssetType): [BN, BN, BN, BN];
21
22
  /**
22
23
  * Calculates acquired amounts for trade executed
23
24
  * @param direction
@@ -27,7 +28,7 @@ export declare function calculateTradeSlippage(direction: PositionDirection, amo
27
28
  * | 'acquiredBase' => positive/negative change in user's base : BN TODO-PRECISION
28
29
  * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
29
30
  */
30
- export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: Market): [BN, BN];
31
+ export declare function calculateTradeAcquiredAmounts(direction: PositionDirection, amount: BN, market: Market, inputAssetType?: AssetType): [BN, BN];
31
32
  /**
32
33
  * calculateTargetPriceTrade
33
34
  * simple function for finding arbitraging trades
@@ -44,3 +45,4 @@ export declare function calculateTradeAcquiredAmounts(direction: PositionDirecti
44
45
  * ]
45
46
  */
46
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"}
package/lib/math/trade.js CHANGED
@@ -24,12 +24,12 @@ const MAXPCT = new anchor_1.BN(1000); //percentage units are [0,1000] => [0,1]
24
24
  *
25
25
  * 'newPrice' => the price of the asset after the trade : Precision MARK_PRICE_PRECISION
26
26
  */
27
- function calculateTradeSlippage(direction, amount, market) {
27
+ function calculateTradeSlippage(direction, amount, market, inputAssetType = 'quote') {
28
28
  const oldPrice = market_1.calculateMarkPrice(market);
29
29
  if (amount.eq(numericConstants_1.ZERO)) {
30
30
  return [numericConstants_1.ZERO, numericConstants_1.ZERO, oldPrice, oldPrice];
31
31
  }
32
- const [acquiredBase, acquiredQuote] = calculateTradeAcquiredAmounts(direction, amount, market);
32
+ const [acquiredBase, acquiredQuote] = calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType);
33
33
  const entryPrice = amm_1.calculatePrice(acquiredBase, acquiredQuote, market.amm.pegMultiplier).mul(new anchor_1.BN(-1));
34
34
  const newPrice = amm_1.calculatePrice(market.amm.baseAssetReserve.sub(acquiredBase), market.amm.quoteAssetReserve.sub(acquiredQuote), market.amm.pegMultiplier);
35
35
  if (direction == types_1.PositionDirection.SHORT) {
@@ -60,11 +60,11 @@ exports.calculateTradeSlippage = calculateTradeSlippage;
60
60
  * | 'acquiredBase' => positive/negative change in user's base : BN TODO-PRECISION
61
61
  * | 'acquiredQuote' => positive/negative change in user's quote : BN TODO-PRECISION
62
62
  */
63
- function calculateTradeAcquiredAmounts(direction, amount, market) {
63
+ function calculateTradeAcquiredAmounts(direction, amount, market, inputAssetType = 'quote') {
64
64
  if (amount.eq(numericConstants_1.ZERO)) {
65
65
  return [numericConstants_1.ZERO, numericConstants_1.ZERO];
66
66
  }
67
- const [newQuoteAssetReserve, newBaseAssetReserve] = amm_1.calculateAmmReservesAfterSwap(market.amm, 'quote', amount, amm_1.getSwapDirection('quote', direction));
67
+ const [newQuoteAssetReserve, newBaseAssetReserve] = amm_1.calculateAmmReservesAfterSwap(market.amm, inputAssetType, amount, amm_1.getSwapDirection(inputAssetType, direction));
68
68
  const acquiredBase = market.amm.baseAssetReserve.sub(newBaseAssetReserve);
69
69
  const acquiredQuote = market.amm.quoteAssetReserve.sub(newQuoteAssetReserve);
70
70
  return [acquiredBase, acquiredQuote];
@@ -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;
@@ -240,6 +242,7 @@ export interface Trade {
240
242
  afterPrice: number;
241
243
  side: TradeSide;
242
244
  size: number;
245
+ quoteSize: number;
243
246
  ts: number;
244
247
  fee: number;
245
248
  marketIndex: number;
@@ -274,9 +277,14 @@ export declare type Candle = {
274
277
  };
275
278
  export interface FundingPayment {
276
279
  userPublicKey: string;
277
- ts: number;
280
+ serverTs: number;
278
281
  marketIndex: number;
279
282
  amount: string;
283
+ blockchainTs: number;
284
+ baseAssetAmount: string;
285
+ userLastCumulativeFunding: string;
286
+ userLastFundingRateTs: string;
287
+ rate: number;
280
288
  }
281
289
  export interface IWallet {
282
290
  signTransaction(tx: Transaction): Promise<Transaction>;
@@ -327,3 +335,4 @@ export declare type OracleGuardRails = {
327
335
  };
328
336
  useForLiquidations: boolean;
329
337
  };
338
+ //# 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.7",
3
+ "version": "0.1.11",
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"
package/src/admin.ts CHANGED
@@ -178,8 +178,8 @@ export class Admin extends ClearingHouse {
178
178
  public async initializeMarket(
179
179
  marketIndex: BN,
180
180
  priceOracle: PublicKey,
181
- baseAmount: BN,
182
- quoteAmount: BN,
181
+ baseAssetReserve: BN,
182
+ quoteAssetReserve: BN,
183
183
  periodicity: BN,
184
184
  pegMultiplier: BN = PEG_PRECISION
185
185
  ): Promise<TransactionSignature> {
@@ -189,8 +189,8 @@ export class Admin extends ClearingHouse {
189
189
 
190
190
  const initializeMarketTx = await this.program.transaction.initializeMarket(
191
191
  marketIndex,
192
- baseAmount,
193
- quoteAmount,
192
+ baseAssetReserve,
193
+ quoteAssetReserve,
194
194
  periodicity,
195
195
  pegMultiplier,
196
196
  {
@@ -86,8 +86,15 @@ export class ClearingHouseUser {
86
86
  * @returns userPosition
87
87
  */
88
88
  public getUserPosition(marketIndex: BN): UserPosition {
89
- return this.getUserPositionsAccount().positions.find((position) =>
90
- position.marketIndex.eq(marketIndex)
89
+ return (
90
+ this.getUserPositionsAccount().positions.find((position) =>
91
+ position.marketIndex.eq(marketIndex)
92
+ ) ?? {
93
+ baseAssetAmount: ZERO,
94
+ lastCumulativeFundingRate: ZERO,
95
+ marketIndex,
96
+ quoteAssetAmount: ZERO,
97
+ }
91
98
  );
92
99
  }
93
100
 
@@ -217,8 +224,24 @@ export class ClearingHouseUser {
217
224
  * calculates average exit price for closing 100% of position
218
225
  * @returns : Precision MARK_PRICE_PRECISION
219
226
  */
220
- public getPositionEstimatedExitPrice(position: UserPosition): BN {
227
+ public getPositionEstimatedExitPrice(
228
+ position: UserPosition,
229
+ amountToClose?: BN
230
+ ): BN {
221
231
  const market = this.clearingHouse.getMarket(position.marketIndex);
232
+
233
+ if (amountToClose) {
234
+ if (amountToClose.eq(ZERO)) {
235
+ return calculateMarkPrice(market);
236
+ }
237
+ position = {
238
+ baseAssetAmount: amountToClose,
239
+ lastCumulativeFundingRate: position.lastCumulativeFundingRate,
240
+ marketIndex: position.marketIndex,
241
+ quoteAssetAmount: position.quoteAssetAmount,
242
+ } as UserPosition;
243
+ }
244
+
222
245
  const baseAssetValue = calculateBaseAssetValue(market, position);
223
246
  if (position.baseAssetAmount.eq(ZERO)) {
224
247
  return ZERO;
@@ -388,7 +411,7 @@ export class ClearingHouseUser {
388
411
  );
389
412
 
390
413
  // if the position value after the trade is less than total collateral, there is no liq price
391
- if (targetTotalPositionValueUSDC.lte(totalCollateralUSDC)) {
414
+ if (targetTotalPositionValueUSDC.lte(totalCollateralUSDC) && proposedMarketPosition.baseAssetAmount.gt(ZERO)) {
392
415
  return new BN(-1);
393
416
  }
394
417
 
package/src/config.ts CHANGED
@@ -11,7 +11,7 @@ export const configs: { [key in DriftEnv]: DriftConfig } = {
11
11
  devnet: {
12
12
  ENV: 'devnet',
13
13
  PYTH_ORACLE_MAPPING_ADDRESS: 'BmA9Z6FjioHJPpjT39QazZyhDRUdZy2ezwx4GiDdE2u2',
14
- CLEARING_HOUSE_PROGRAM_ID: 'tCyWBVHtN4iGtZWs2dkefWk38SyN4RGtED14KzUopK9',
14
+ CLEARING_HOUSE_PROGRAM_ID: 'AsW7LnXB9UA1uec9wi9MctYTgTz7YH9snhxd16GsFaGX',
15
15
  USDC_MINT_ADDRESS: '8zGuJQqwhZafTah7Uc7Z4tXRnguqkn5KLFAP8oV6PHe2',
16
16
  },
17
17
  'mainnet-beta': {
@@ -16,25 +16,32 @@ export const Markets: Market[] = [
16
16
  devnetPythOracle: 'J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix',
17
17
  mainnetPythOracle: 'H6ARHf6YXhGYeQfUzQNGk6rDNnLBQKrenN712K4AQJEG',
18
18
  },
19
- // {
20
- // symbol: 'BTC-PERP',
21
- // baseAssetSymbol: 'BTC',
22
- // marketIndex: new BN(1),
23
- // devnetPythOracle: 'HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J',
24
- // mainnetPythOracle: 'GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU',
25
- // },
26
- // {
27
- // symbol: 'ETH-PERP',
28
- // baseAssetSymbol: 'ETH',
29
- // marketIndex: new BN(2),
30
- // devnetPythOracle: 'EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw',
31
- // mainnetPythOracle: 'JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB',
32
- // },
33
- // {
34
- // symbol: 'COPE-PERP',
35
- // baseAssetSymbol: 'COPE',
36
- // marketIndex: new BN(3),
37
- // devnetPythOracle: 'BAXDJUXtz6P5ARhHH1aPwgv4WENzHwzyhmLYK4daFwiM',
38
- // mainnetPythOracle: '9xYBiDWYsh2fHzpsz3aaCnNHCKWBNtfEDLtU6kS4aFD9',
39
- // },
19
+ {
20
+ symbol: 'BTC-PERP',
21
+ baseAssetSymbol: 'BTC',
22
+ marketIndex: new BN(1),
23
+ devnetPythOracle: 'HovQMDrbAgAYPCmHVSrezcSmkMtXSSUsLDFANExrZh2J',
24
+ mainnetPythOracle: 'GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU',
25
+ },
26
+ {
27
+ symbol: 'ETH-PERP',
28
+ baseAssetSymbol: 'ETH',
29
+ marketIndex: new BN(2),
30
+ devnetPythOracle: 'EdVCmQ9FSPcVe5YySXDPCRmc8aDQLKJ9xvYBMZPie1Vw',
31
+ mainnetPythOracle: 'JBu1AL4obBcCMqKBBxhpWCNUt136ijcuMZLFvTP7iWdB',
32
+ },
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
+ },
40
47
  ];