@drift-labs/sdk 0.1.3 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.json +36 -0
- package/.prettierignore +1 -0
- package/.prettierrc.js +9 -0
- package/README.md +8 -5
- package/lib/accounts/defaultClearingHouseAccountSubscriber.d.ts +1 -0
- package/lib/accounts/defaultClearingHouseAccountSubscriber.d.ts.map +1 -0
- package/lib/accounts/defaultHistoryAccountSubscriber.d.ts +1 -0
- package/lib/accounts/defaultHistoryAccountSubscriber.d.ts.map +1 -0
- package/lib/accounts/defaultUserAccountSubscriber.d.ts +1 -0
- package/lib/accounts/defaultUserAccountSubscriber.d.ts.map +1 -0
- package/lib/accounts/types.d.ts +1 -0
- package/lib/accounts/types.d.ts.map +1 -0
- package/lib/accounts/webSocketAccountSubscriber.d.ts +1 -0
- package/lib/accounts/webSocketAccountSubscriber.d.ts.map +1 -0
- package/lib/addresses.d.ts +1 -0
- package/lib/addresses.d.ts.map +1 -0
- package/lib/admin.d.ts +2 -1
- package/lib/admin.d.ts.map +1 -0
- package/lib/admin.js +2 -2
- package/lib/assert/assert.d.ts +1 -0
- package/lib/assert/assert.d.ts.map +1 -0
- package/lib/clearingHouse.d.ts +1 -0
- package/lib/clearingHouse.d.ts.map +1 -0
- package/lib/clearingHouseUser.d.ts +2 -1
- package/lib/clearingHouseUser.d.ts.map +1 -0
- package/lib/clearingHouseUser.js +20 -3
- package/lib/config.d.ts +1 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +1 -1
- package/lib/constants/markets.d.ts +1 -0
- package/lib/constants/markets.d.ts.map +1 -0
- package/lib/constants/markets.js +21 -21
- package/lib/constants/numericConstants.d.ts +1 -0
- package/lib/constants/numericConstants.d.ts.map +1 -0
- package/lib/examples/makeTradeExample.d.ts +1 -0
- package/lib/examples/makeTradeExample.d.ts.map +1 -0
- package/lib/idl/clearing_house.json +39 -30
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/math/amm.d.ts +1 -0
- package/lib/math/amm.d.ts.map +1 -0
- package/lib/math/conversion.d.ts +1 -0
- package/lib/math/conversion.d.ts.map +1 -0
- package/lib/math/funding.d.ts +34 -1
- package/lib/math/funding.d.ts.map +1 -0
- package/lib/math/funding.js +152 -15
- package/lib/math/market.d.ts +1 -0
- package/lib/math/market.d.ts.map +1 -0
- package/lib/math/position.d.ts +1 -0
- package/lib/math/position.d.ts.map +1 -0
- package/lib/math/trade.d.ts +5 -3
- package/lib/math/trade.d.ts.map +1 -0
- package/lib/math/trade.js +5 -4
- package/lib/math/utils.d.ts +1 -0
- package/lib/math/utils.d.ts.map +1 -0
- package/lib/mockUSDCFaucet.d.ts +1 -0
- package/lib/mockUSDCFaucet.d.ts.map +1 -0
- package/lib/pythClient.d.ts +1 -0
- package/lib/pythClient.d.ts.map +1 -0
- package/lib/tx/defaultTxSender.d.ts +1 -0
- package/lib/tx/defaultTxSender.d.ts.map +1 -0
- package/lib/tx/types.d.ts +1 -0
- package/lib/tx/types.d.ts.map +1 -0
- package/lib/tx/utils.d.ts +1 -0
- package/lib/tx/utils.d.ts.map +1 -0
- package/lib/types.d.ts +11 -1
- package/lib/types.d.ts.map +1 -0
- package/package.json +16 -3
- package/src/admin.ts +4 -4
- package/src/clearingHouse.ts +12 -12
- package/src/clearingHouseUser.ts +27 -4
- package/src/config.ts +1 -2
- package/src/constants/markets.ts +21 -21
- package/src/idl/clearing_house.json +39 -30
- package/src/math/funding.ts +189 -29
- package/src/math/position.ts +3 -3
- package/src/math/trade.ts +14 -8
- package/src/types.ts +10 -1
- package/tsconfig.json +2 -1
package/lib/math/funding.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
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;
|
package/lib/math/market.d.ts
CHANGED
|
@@ -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"}
|
package/lib/math/position.d.ts
CHANGED
|
@@ -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"}
|
package/lib/math/trade.d.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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' +
|
package/lib/math/utils.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/math/utils.ts"],"names":[],"mappings":";AAEA,eAAO,MAAM,YAAY,8CA0BxB,CAAC"}
|
package/lib/mockUSDCFaucet.d.ts
CHANGED
|
@@ -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"}
|
package/lib/pythClient.d.ts
CHANGED
|
@@ -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"}
|
|
@@ -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
|
@@ -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
|
@@ -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
|
-
|
|
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":"AAAA,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,MAAM,OAAO,CAAC;AAGvB,qBAAa,aAAa;IACzB,MAAM,CAAC,QAAQ,CAAC,GAAG;;MAAe;IAClC,MAAM,CAAC,QAAQ,CAAC,MAAM;;MAAkB;CACxC;AACD,qBAAa,iBAAiB;IAC7B,MAAM,CAAC,QAAQ,CAAC,IAAI;;MAAgB;IACpC,MAAM,CAAC,QAAQ,CAAC,KAAK;;MAAiB;CACtC;AAED,qBAAa,YAAY;IACxB,MAAM,CAAC,QAAQ,CAAC,IAAI;;MAAgB;IACpC,MAAM,CAAC,QAAQ,CAAC,WAAW;;MAAuB;CAClD;AAED,oBAAY,SAAS;IACpB,IAAI,IAAI;IACR,GAAG,IAAI;IACP,IAAI,IAAI;CACR;AAED,oBAAY,gBAAgB,GACzB,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,KAAK,GACL,GAAG,GACH,GAAG,GACH,GAAG,CAAC;AAGP,oBAAY,mBAAmB,GAAG;IACjC,IAAI,EAAE,EAAE,CAAC;IACT,YAAY,EAAE,WAAW,EAAE,CAAC;CAC5B,CAAC;AAEF,oBAAY,qBAAqB,GAAG;IACnC,IAAI,EAAE,EAAE,CAAC;IACT,cAAc,EAAE,aAAa,EAAE,CAAC;CAChC,CAAC;AAEF,oBAAY,mBAAmB,GAAG;IACjC,IAAI,EAAE,EAAE,CAAC;IACT,YAAY,EAAE,WAAW,EAAE,CAAC;CAC5B,CAAC;AAEF,oBAAY,yBAAyB,GAAG;IACvC,IAAI,EAAE,EAAE,CAAC;IACT,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;CACxC,CAAC;AAEF,oBAAY,4BAA4B,GAAG;IAC1C,IAAI,EAAE,EAAE,CAAC;IACT,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;CAC9C,CAAC;AAEF,oBAAY,yBAAyB,GAAG;IACvC,IAAI,EAAE,EAAE,CAAC;IACT,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;CACxC,CAAC;AAEF,oBAAY,aAAa,GAAG;IAC3B,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE,CAAC;IACb,aAAa,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE;QACV,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,QAAQ,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IACF,gBAAgB,EAAE,EAAE,CAAC;IACrB,wBAAwB,EAAE,EAAE,CAAC;IAC7B,MAAM,EAAE,EAAE,CAAC;CACX,CAAC;AAEF,oBAAY,WAAW,GAAG;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE,CAAC;IACb,WAAW,EAAE,EAAE,CAAC;IAChB,mBAAmB,EAAE,EAAE,CAAC;IACxB,sBAAsB,EAAE,EAAE,CAAC;IAC3B,uBAAuB,EAAE,EAAE,CAAC;IAC5B,WAAW,EAAE,EAAE,CAAC;IAChB,kBAAkB,EAAE,EAAE,CAAC;IACvB,qBAAqB,EAAE,EAAE,CAAC;IAC1B,sBAAsB,EAAE,EAAE,CAAC;IAC3B,UAAU,EAAE,EAAE,CAAC;IACf,mBAAmB,EAAE,EAAE,CAAC;IACxB,oBAAoB,EAAE,EAAE,CAAC;IACzB,eAAe,EAAE,EAAE,CAAC;IACpB,YAAY,EAAE,EAAE,CAAC;CACjB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACzB,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE,CAAC;IACb,aAAa,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,EAAE;QACV,IAAI,CAAC,EAAE,GAAG,CAAC;QACX,KAAK,CAAC,EAAE,GAAG,CAAC;KACZ,CAAC;IACF,eAAe,EAAE,EAAE,CAAC;IACpB,gBAAgB,EAAE,EAAE,CAAC;IACrB,eAAe,EAAE,EAAE,CAAC;IACpB,cAAc,EAAE,EAAE,CAAC;IACnB,GAAG,EAAE,EAAE,CAAC;IACR,cAAc,EAAE,EAAE,CAAC;IACnB,eAAe,EAAE,EAAE,CAAC;IACpB,aAAa,EAAE,EAAE,CAAC;IAClB,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,EAAE,CAAC;CAChB,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAC/B,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE,CAAC;IACb,WAAW,EAAE,EAAE,CAAC;IAChB,WAAW,EAAE,EAAE,CAAC;IAChB,yBAAyB,EAAE,EAAE,CAAC;IAC9B,0BAA0B,EAAE,EAAE,CAAC;IAC/B,eAAe,EAAE,EAAE,CAAC;IACpB,aAAa,EAAE,EAAE,CAAC;CAClB,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IAClC,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE,CAAC;IACb,aAAa,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,EAAE,CAAC;IAChB,cAAc,EAAE,EAAE,CAAC;IACnB,eAAe,EAAE,EAAE,CAAC;IACpB,yBAAyB,EAAE,EAAE,CAAC;IAC9B,qBAAqB,EAAE,EAAE,CAAC;IAC1B,wBAAwB,EAAE,EAAE,CAAC;IAC7B,yBAAyB,EAAE,EAAE,CAAC;CAC9B,CAAC;AAEF,oBAAY,iBAAiB,GAAG;IAC/B,EAAE,EAAE,EAAE,CAAC;IACP,QAAQ,EAAE,EAAE,CAAC;IACb,aAAa,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,EAAE,CAAC;IACnB,oBAAoB,EAAE,EAAE,CAAC;IACzB,cAAc,EAAE,EAAE,CAAC;IACnB,eAAe,EAAE,EAAE,CAAC;IACpB,kBAAkB,EAAE,EAAE,CAAC;IACvB,UAAU,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,EAAE,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,aAAa,EAAE,EAAE,CAAC;IAClB,WAAW,EAAE,EAAE,CAAC;CAChB,CAAC;AAEF,oBAAY,YAAY,GAAG;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,SAAS,CAAC;IAC1B,eAAe,EAAE,SAAS,CAAC;IAC3B,wBAAwB,EAAE,SAAS,CAAC;IACpC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,SAAS,CAAC;IAC1B,uBAAuB,EAAE,SAAS,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,EAAE,CAAC;IACvB,sBAAsB,EAAE,EAAE,CAAC;IAC3B,kBAAkB,EAAE,EAAE,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IACnB,YAAY,EAAE,SAAS,CAAC;IACxB,cAAc,EAAE,SAAS,CAAC;IAC1B,kBAAkB,EAAE,SAAS,CAAC;IAC9B,qBAAqB,EAAE,SAAS,CAAC;IACjC,YAAY,EAAE,SAAS,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,0CAA0C,EAAE,EAAE,CAAC;IAC/C,4CAA4C,EAAE,EAAE,CAAC;IACjD,4CAA4C,EAAE,EAAE,CAAC;IACjD,8CAA8C,EAAE,EAAE,CAAC;IACnD,yCAAyC,EAAE,EAAE,CAAC;IAC9C,2CAA2C,EAAE,EAAE,CAAC;IAChD,4CAA4C,EAAE,EAAE,CAAC;IACjD,yCAAyC,EAAE,EAAE,CAAC;IAC9C,YAAY,EAAE,YAAY,CAAC;IAC3B,QAAQ,EAAE,EAAE,CAAC;IACb,iBAAiB,EAAE,EAAE,CAAC;IACtB,aAAa,EAAE,SAAS,CAAC;IACzB,YAAY,EAAE,SAAS,CAAC;IACxB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,UAAU,EAAE,EAAE,CAAC;CACf,CAAC;AAEF,oBAAY,cAAc,GAAG;IAC5B,YAAY,EAAE,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC;AAEF,oBAAY,MAAM,GAAG;IACpB,GAAG,EAAE,GAAG,CAAC;IACT,eAAe,EAAE,EAAE,CAAC;IACpB,mBAAmB,EAAE,EAAE,CAAC;IACxB,oBAAoB,EAAE,EAAE,CAAC;IACzB,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,EAAE,CAAC;CACjB,CAAC;AAEF,oBAAY,GAAG,GAAG;IACjB,gBAAgB,EAAE,EAAE,CAAC;IACrB,KAAK,EAAE,EAAE,CAAC;IACV,qBAAqB,EAAE,EAAE,CAAC;IAC1B,eAAe,EAAE,EAAE,CAAC;IACpB,iBAAiB,EAAE,EAAE,CAAC;IACtB,iBAAiB,EAAE,EAAE,CAAC;IACtB,mBAAmB,EAAE,EAAE,CAAC;IACxB,mBAAmB,EAAE,EAAE,CAAC;IACxB,qBAAqB,EAAE,EAAE,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,EAAE,CAAC;IAClB,iBAAiB,EAAE,EAAE,CAAC;IACtB,aAAa,EAAE,EAAE,CAAC;IAClB,yBAAyB,EAAE,EAAE,CAAC;IAC9B,0BAA0B,EAAE,EAAE,CAAC;IAC/B,yBAAyB,EAAE,EAAE,CAAC;IAC9B,0BAA0B,EAAE,EAAE,CAAC;IAC/B,0BAA0B,EAAE,EAAE,CAAC;IAC/B,iBAAiB,EAAE,EAAE,CAAC;IACtB,QAAQ,EAAE,EAAE,CAAC;IACb,gBAAgB,EAAE,EAAE,CAAC;CACrB,CAAC;AAGF,oBAAY,YAAY,GAAG;IAC1B,eAAe,EAAE,EAAE,CAAC;IACpB,yBAAyB,EAAE,EAAE,CAAC;IAC9B,WAAW,EAAE,EAAE,CAAC;IAChB,gBAAgB,EAAE,EAAE,CAAC;CACrB,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IAClC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,IAAI,EAAE,SAAS,CAAC;CAChB,CAAC;AAEF,oBAAY,WAAW,GAAG;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,EAAE,CAAC;IACf,kBAAkB,EAAE,EAAE,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,EAAE,CAAC;CACjB,CAAC;AAGF,MAAM,WAAW,KAAK;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,oBAAY,WAAW,GAAG;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,SAAS,CAAC;IACzB,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,SAAS,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,oBAAY,MAAM,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACZ,CAAC;AACF,MAAM,WAAW,cAAc;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,yBAAyB,EAAE,MAAM,CAAC;IAClC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;CACb;AAGD,MAAM,WAAW,OAAO;IACvB,eAAe,CAAC,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACvD,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAChE,SAAS,EAAE,SAAS,CAAC;CACrB;AAED,oBAAY,YAAY,GAAG;IAC1B,YAAY,EAAE,EAAE,CAAC;IACjB,cAAc,EAAE,EAAE,CAAC;IACnB,kBAAkB,EAAE;QACnB,SAAS,EAAE;YACV,cAAc,EAAE,EAAE,CAAC;YACnB,iBAAiB,EAAE,EAAE,CAAC;YACtB,mBAAmB,EAAE,EAAE,CAAC;SACxB,CAAC;QACF,UAAU,EAAE;YACX,cAAc,EAAE,EAAE,CAAC;YACnB,iBAAiB,EAAE,EAAE,CAAC;YACtB,mBAAmB,EAAE,EAAE,CAAC;SACxB,CAAC;QACF,SAAS,EAAE;YACV,cAAc,EAAE,EAAE,CAAC;YACnB,iBAAiB,EAAE,EAAE,CAAC;YACtB,mBAAmB,EAAE,EAAE,CAAC;SACxB,CAAC;QACF,UAAU,EAAE;YACX,cAAc,EAAE,EAAE,CAAC;YACnB,iBAAiB,EAAE,EAAE,CAAC;YACtB,mBAAmB,EAAE,EAAE,CAAC;SACxB,CAAC;KACF,CAAC;IACF,gBAAgB,EAAE;QACjB,uBAAuB,EAAE,EAAE,CAAC;QAC5B,yBAAyB,EAAE,EAAE,CAAC;QAC9B,wBAAwB,EAAE,EAAE,CAAC;QAC7B,0BAA0B,EAAE,EAAE,CAAC;KAC/B,CAAC;CACF,CAAC;AAEF,oBAAY,gBAAgB,GAAG;IAC9B,eAAe,EAAE;QAChB,6BAA6B,EAAE,EAAE,CAAC;QAClC,+BAA+B,EAAE,EAAE,CAAC;KACpC,CAAC;IACF,QAAQ,EAAE;QACT,gBAAgB,EAAE,EAAE,CAAC;QACrB,yBAAyB,EAAE,EAAE,CAAC;QAC9B,gBAAgB,EAAE,EAAE,CAAC;KACrB,CAAC;IACF,kBAAkB,EAAE,OAAO,CAAC;CAC5B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@drift-labs/sdk",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"types": "lib/index.d.ts",
|
|
6
6
|
"author": "crispheaney",
|
|
@@ -11,10 +11,15 @@
|
|
|
11
11
|
},
|
|
12
12
|
"scripts": {
|
|
13
13
|
"build": "yarn clean && tsc",
|
|
14
|
-
"clean": "rm -rf lib"
|
|
14
|
+
"clean": "rm -rf lib",
|
|
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"
|
|
15
18
|
},
|
|
16
19
|
"keywords": [
|
|
17
|
-
"drift-labs",
|
|
20
|
+
"drift-labs",
|
|
21
|
+
"drift",
|
|
22
|
+
"perps"
|
|
18
23
|
],
|
|
19
24
|
"license": "Apache-2.0",
|
|
20
25
|
"directories": {
|
|
@@ -31,6 +36,14 @@
|
|
|
31
36
|
"@types/bn.js": "^5.1.0",
|
|
32
37
|
"strict-event-emitter-types": "^2.0.0"
|
|
33
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
|
+
},
|
|
34
47
|
"description": "SDK for Drift Protocol v1",
|
|
35
48
|
"engines": {
|
|
36
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
|
-
|
|
182
|
-
|
|
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
|
-
|
|
193
|
-
|
|
192
|
+
baseAssetReserve,
|
|
193
|
+
quoteAssetReserve,
|
|
194
194
|
periodicity,
|
|
195
195
|
pegMultiplier,
|
|
196
196
|
{
|
package/src/clearingHouse.ts
CHANGED
|
@@ -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,
|
package/src/clearingHouseUser.ts
CHANGED
|
@@ -86,8 +86,15 @@ export class ClearingHouseUser {
|
|
|
86
86
|
* @returns userPosition
|
|
87
87
|
*/
|
|
88
88
|
public getUserPosition(marketIndex: BN): UserPosition {
|
|
89
|
-
return
|
|
90
|
-
|
|
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(
|
|
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: '
|
|
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 ?? {}) };
|