@drift-labs/sdk 0.1.6 → 0.1.10

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 +39 -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 +34 -1
  44. package/lib/math/funding.d.ts.map +1 -0
  45. package/lib/math/funding.js +152 -15
  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 +1 -0
  49. package/lib/math/position.d.ts.map +1 -0
  50. package/lib/math/trade.d.ts +5 -3
  51. package/lib/math/trade.d.ts.map +1 -0
  52. package/lib/math/trade.js +5 -4
  53. package/lib/math/utils.d.ts +1 -0
  54. package/lib/math/utils.d.ts.map +1 -0
  55. package/lib/mockUSDCFaucet.d.ts +1 -0
  56. package/lib/mockUSDCFaucet.d.ts.map +1 -0
  57. package/lib/pythClient.d.ts +1 -0
  58. package/lib/pythClient.d.ts.map +1 -0
  59. package/lib/tx/defaultTxSender.d.ts +1 -0
  60. package/lib/tx/defaultTxSender.d.ts.map +1 -0
  61. package/lib/tx/types.d.ts +1 -0
  62. package/lib/tx/types.d.ts.map +1 -0
  63. package/lib/tx/utils.d.ts +1 -0
  64. package/lib/tx/utils.d.ts.map +1 -0
  65. package/lib/types.d.ts +11 -1
  66. package/lib/types.d.ts.map +1 -0
  67. package/package.json +12 -2
  68. package/src/admin.ts +4 -4
  69. package/src/clearingHouse.ts +12 -12
  70. package/src/clearingHouseUser.ts +27 -4
  71. package/src/config.ts +1 -2
  72. package/src/constants/markets.ts +28 -21
  73. package/src/idl/clearing_house.json +39 -30
  74. package/src/math/funding.ts +189 -29
  75. package/src/math/position.ts +3 -3
  76. package/src/math/trade.ts +14 -8
  77. package/src/types.ts +10 -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.calculateEstimatedFundingRate = 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");
@@ -18,10 +18,9 @@ const market_1 = require("./market");
18
18
  * @param market
19
19
  * @param pythClient
20
20
  * @param periodAdjustment
21
- * @param estimationMethod
22
21
  * @returns Estimated funding rate. : Precision //TODO-PRECISION
23
22
  */
24
- function calculateEstimatedFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1), estimationMethod) {
23
+ function calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
25
24
  return __awaiter(this, void 0, void 0, function* () {
26
25
  // periodAdjustment
27
26
  // 1: hourly
@@ -30,40 +29,178 @@ function calculateEstimatedFundingRate(market, pythClient, periodAdjustment = ne
30
29
  const secondsInHour = new anchor_1.BN(3600);
31
30
  const hoursInDay = new anchor_1.BN(24);
32
31
  if (!market.initialized) {
33
- return new anchor_1.BN(0);
32
+ return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
34
33
  }
35
34
  const payFreq = new anchor_1.BN(market.amm.fundingPeriod);
36
- const oraclePriceData = yield pythClient.getPriceData(market.amm.oracle);
37
- const oracleTwapWithMantissa = new anchor_1.BN(oraclePriceData.twap.value * numericConstants_1.MARK_PRICE_PRECISION.toNumber());
35
+ // todo: sufficiently differs from blockchain timestamp?
38
36
  const now = new anchor_1.BN((Date.now() / 1000).toFixed(0));
39
37
  const timeSinceLastUpdate = now.sub(market.amm.lastFundingRateTs);
38
+ // calculate real-time mark twap
40
39
  const lastMarkTwapWithMantissa = market.amm.lastMarkPriceTwap;
41
40
  const lastMarkPriceTwapTs = market.amm.lastMarkPriceTwapTs;
42
41
  const timeSinceLastMarkChange = now.sub(lastMarkPriceTwapTs);
43
- const markTwapTimeSinceLastUpdate = lastMarkPriceTwapTs.sub(market.amm.lastFundingRateTs);
42
+ const markTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastMarkChange));
44
43
  const baseAssetPriceWithMantissa = market_1.calculateMarkPrice(market);
45
44
  const markTwapWithMantissa = markTwapTimeSinceLastUpdate
46
45
  .mul(lastMarkTwapWithMantissa)
47
46
  .add(timeSinceLastMarkChange.mul(baseAssetPriceWithMantissa))
48
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));
49
60
  const twapSpread = markTwapWithMantissa.sub(oracleTwapWithMantissa);
50
61
  const twapSpreadPct = twapSpread
51
62
  .mul(numericConstants_1.MARK_PRICE_PRECISION)
52
63
  .mul(new anchor_1.BN(100))
53
64
  .div(oracleTwapWithMantissa);
54
- if (estimationMethod == 'lowerbound') {
55
- //assuming remaining funding period has no gap
56
- return twapSpreadPct
57
- .mul(payFreq)
58
- .mul(anchor_1.BN.min(secondsInHour, timeSinceLastUpdate))
65
+ const lowerboundEst = twapSpreadPct
66
+ .mul(payFreq)
67
+ .mul(anchor_1.BN.min(secondsInHour, timeSinceLastUpdate))
68
+ .mul(periodAdjustment)
69
+ .div(secondsInHour)
70
+ .div(secondsInHour)
71
+ .div(hoursInDay);
72
+ const interpEst = twapSpreadPct.mul(periodAdjustment).div(hoursInDay);
73
+ const interpRateQuote = twapSpreadPct
74
+ .mul(periodAdjustment)
75
+ .div(hoursInDay)
76
+ .div(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION));
77
+ let feePoolSize = calculateFundingPool(market);
78
+ if (interpRateQuote.lt(new anchor_1.BN(0))) {
79
+ feePoolSize = feePoolSize.mul(new anchor_1.BN(-1));
80
+ }
81
+ let cappedAltEst;
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
+ }
90
+ }
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)
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)
59
112
  .mul(periodAdjustment)
60
- .div(secondsInHour)
61
- .div(secondsInHour)
62
113
  .div(hoursInDay);
114
+ if (cappedAltEst.abs().gt(interpEst.abs())) {
115
+ cappedAltEst = interpEst;
116
+ }
117
+ }
118
+ else {
119
+ cappedAltEst = interpEst;
120
+ }
121
+ return [markTwapWithMantissa, oracleTwapWithMantissa, lowerboundEst, cappedAltEst, interpEst];
122
+ });
123
+ }
124
+ exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
125
+ /**
126
+ *
127
+ * @param market
128
+ * @param pythClient
129
+ * @param periodAdjustment
130
+ * @param estimationMethod
131
+ * @returns Estimated funding rate. : Precision //TODO-PRECISION
132
+ */
133
+ function calculateEstimatedFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1), estimationMethod) {
134
+ return __awaiter(this, void 0, void 0, function* () {
135
+ const [_1, _2, lowerboundEst, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
136
+ if (estimationMethod == 'lowerbound') {
137
+ //assuming remaining funding period has no gap
138
+ return lowerboundEst;
139
+ }
140
+ else if (estimationMethod == 'capped') {
141
+ return cappedAltEst;
63
142
  }
64
143
  else {
65
- return twapSpreadPct.mul(periodAdjustment).div(hoursInDay);
144
+ return interpEst;
66
145
  }
67
146
  });
68
147
  }
69
148
  exports.calculateEstimatedFundingRate = calculateEstimatedFundingRate;
149
+ /**
150
+ *
151
+ * @param market
152
+ * @param pythClient
153
+ * @param periodAdjustment
154
+ * @param estimationMethod
155
+ * @returns Estimated funding rate. : Precision //TODO-PRECISION
156
+ */
157
+ function calculateLongShortFundingRate(market, pythClient, periodAdjustment = new anchor_1.BN(1)) {
158
+ return __awaiter(this, void 0, void 0, function* () {
159
+ const [_1, _2, _, cappedAltEst, interpEst] = yield calculateAllEstimatedFundingRate(market, pythClient, periodAdjustment);
160
+ if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
161
+ return [cappedAltEst, interpEst];
162
+ }
163
+ else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort)) {
164
+ return [interpEst, cappedAltEst];
165
+ }
166
+ else {
167
+ return [interpEst, interpEst];
168
+ }
169
+ });
170
+ }
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;
195
+ /**
196
+ *
197
+ * @param market
198
+ * @returns Estimated fee pool size
199
+ */
200
+ function calculateFundingPool(market) {
201
+ // todo
202
+ const totalFeeLB = market.amm.totalFee.div(new anchor_1.BN(2));
203
+ const feePool = market.amm.totalFeeMinusDistributions.sub(totalFeeLB);
204
+ return feePool;
205
+ }
206
+ 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,4 @@ 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
+ //# 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;AAMnE,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"}
@@ -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];
@@ -158,6 +158,7 @@ function calculateTargetPriceTrade(market, targetPrice, pct = MAXPCT) {
158
158
  }
159
159
  const entryPrice = tradeSize
160
160
  .mul(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO)
161
+ .mul(numericConstants_1.MARK_PRICE_PRECISION)
161
162
  .div(baseSize.abs());
162
163
  assert_1.assert(tp1.sub(tp2).lte(originalDiff), 'Target Price Calculation incorrect');
163
164
  assert_1.assert(tp2.lte(tp1) || tp2.sub(tp1).abs() < 100000, 'Target Price Calculation incorrect' +
@@ -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,7 +242,9 @@ export interface Trade {
240
242
  afterPrice: number;
241
243
  side: TradeSide;
242
244
  size: number;
245
+ quoteSize: number;
243
246
  ts: number;
247
+ fee: number;
244
248
  marketIndex: number;
245
249
  chainTs: number;
246
250
  }
@@ -273,9 +277,14 @@ export declare type Candle = {
273
277
  };
274
278
  export interface FundingPayment {
275
279
  userPublicKey: string;
276
- ts: number;
280
+ serverTs: number;
277
281
  marketIndex: number;
278
282
  amount: string;
283
+ blockchainTs: number;
284
+ baseAssetAmount: string;
285
+ userLastCumulativeFunding: string;
286
+ userLastFundingRateTs: string;
287
+ rate: number;
279
288
  }
280
289
  export interface IWallet {
281
290
  signTransaction(tx: Transaction): Promise<Transaction>;
@@ -326,3 +335,4 @@ export declare type OracleGuardRails = {
326
335
  };
327
336
  useForLiquidations: boolean;
328
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.6",
3
+ "version": "0.1.10",
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
  {
@@ -52,10 +52,10 @@ import { wrapInTx } from './tx/utils';
52
52
 
53
53
  /**
54
54
  * # ClearingHouse
55
- * This class is the main way to interact with Drift Protocol. It allows you to subscribe to the various accounts where the Market's state is stored, as well as: opening positions, liquidating, settling funding, depositing & withdrawing, and more.
56
- *
55
+ * This class is the main way to interact with Drift Protocol. It allows you to subscribe to the various accounts where the Market's state is stored, as well as: opening positions, liquidating, settling funding, depositing & withdrawing, and more.
56
+ *
57
57
  * The default way to construct a ClearingHouse instance is using the {@link from} method. This will create an instance using the static {@link DefaultClearingHouseAccountSubscriber}, which will use a websocket for each state account subscription.
58
- * Alternatively, if you want to implement your own method of subscribing to the state accounts on the blockchain, you can implement a {@link ClearingHouseAccountSubscriber} and use it in the {@link ClearingHouse.constructor}
58
+ * Alternatively, if you want to implement your own method of subscribing to the state accounts on the blockchain, you can implement a {@link ClearingHouseAccountSubscriber} and use it in the {@link ClearingHouse.constructor}
59
59
  */
60
60
  export class ClearingHouse {
61
61
  connection: Connection;
@@ -200,7 +200,7 @@ export class ClearingHouse {
200
200
 
201
201
  /**
202
202
  * Update the wallet to use for clearing house transactions and linked user account
203
- * @param newWallet
203
+ * @param newWallet
204
204
  */
205
205
  public updateWallet(newWallet: IWallet): void {
206
206
  const newProvider = new Provider(this.connection, newWallet, this.opts);
@@ -290,7 +290,7 @@ export class ClearingHouse {
290
290
  userAccountPublicKey?: PublicKey;
291
291
  /**
292
292
  * Get the address for the Clearing House User's account. NOT the user's wallet address.
293
- * @returns
293
+ * @returns
294
294
  */
295
295
  public async getUserAccountPublicKey(): Promise<PublicKey> {
296
296
  if (this.userAccountPublicKey) {
@@ -361,9 +361,9 @@ export class ClearingHouse {
361
361
 
362
362
  /**
363
363
  * Creates the Clearing House User account for a user, and deposits some initial collateral
364
- * @param amount
365
- * @param collateralAccountPublicKey
366
- * @returns
364
+ * @param amount
365
+ * @param collateralAccountPublicKey
366
+ * @returns
367
367
  */
368
368
  public async initializeUserAccountAndDepositCollateral(
369
369
  amount: BN,
@@ -568,10 +568,10 @@ export class ClearingHouse {
568
568
 
569
569
  /**
570
570
  * Close an entire position. If you want to reduce a position, use the {@link openPosition} method in the opposite direction of the current position.
571
- * @param marketIndex
572
- * @param discountToken
573
- * @param referrer
574
- * @returns
571
+ * @param marketIndex
572
+ * @param discountToken
573
+ * @param referrer
574
+ * @returns
575
575
  */
576
576
  public async closePosition(
577
577
  marketIndex: BN,
@@ -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': {
@@ -37,7 +37,6 @@ export const initialize = (props: {
37
37
  env: DriftEnv;
38
38
  overrideEnv?: Partial<DriftConfig>;
39
39
  }): DriftConfig => {
40
-
41
40
  //@ts-ignore
42
41
  if (props.env === 'master')
43
42
  return { ...configs['devnet'], ...(props.overrideEnv ?? {}) };