@drift-labs/sdk 0.2.0-master.4 → 0.2.0-master.40
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/README.md +27 -27
- package/lib/accounts/bulkAccountLoader.d.ts +2 -0
- package/lib/accounts/bulkAccountLoader.js +36 -29
- package/lib/accounts/bulkUserStatsSubscription.d.ts +7 -0
- package/lib/accounts/bulkUserStatsSubscription.js +21 -0
- package/lib/accounts/bulkUserSubscription.d.ts +2 -2
- package/lib/accounts/bulkUserSubscription.js +0 -1
- package/lib/accounts/fetch.d.ts +2 -1
- package/lib/accounts/fetch.js +9 -1
- package/lib/accounts/{pollingClearingHouseAccountSubscriber.d.ts → pollingDriftClientAccountSubscriber.d.ts} +20 -25
- package/lib/accounts/{pollingClearingHouseAccountSubscriber.js → pollingDriftClientAccountSubscriber.js} +45 -49
- package/lib/accounts/{pollingOracleSubscriber.d.ts → pollingOracleAccountSubscriber.d.ts} +2 -2
- package/lib/accounts/{pollingOracleSubscriber.js → pollingOracleAccountSubscriber.js} +3 -3
- package/lib/accounts/pollingUserStatsAccountSubscriber.d.ts +27 -0
- package/lib/accounts/pollingUserStatsAccountSubscriber.js +113 -0
- package/lib/accounts/types.d.ts +26 -15
- package/lib/accounts/webSocketDriftClientAccountSubscriber.d.ts +49 -0
- package/lib/accounts/{webSocketClearingHouseAccountSubscriber.js → webSocketDriftClientAccountSubscriber.js} +47 -45
- package/lib/accounts/webSocketUserStatsAccountSubsriber.d.ts +20 -0
- package/lib/accounts/webSocketUserStatsAccountSubsriber.js +47 -0
- package/lib/addresses/marketAddresses.d.ts +1 -3
- package/lib/addresses/marketAddresses.js +1 -1
- package/lib/addresses/pda.d.ts +15 -9
- package/lib/addresses/pda.js +73 -35
- package/lib/adminClient.d.ts +65 -0
- package/lib/adminClient.js +637 -0
- package/lib/config.d.ts +9 -9
- package/lib/config.js +25 -21
- package/lib/constants/numericConstants.d.ts +30 -12
- package/lib/constants/numericConstants.js +41 -21
- package/lib/constants/perpMarkets.d.ts +18 -0
- package/lib/constants/{markets.js → perpMarkets.js} +7 -7
- package/lib/constants/spotMarkets.d.ts +19 -0
- package/lib/constants/spotMarkets.js +53 -0
- package/lib/dlob/DLOB.d.ts +82 -0
- package/lib/dlob/DLOB.js +696 -0
- package/lib/dlob/DLOBNode.d.ts +54 -0
- package/lib/dlob/DLOBNode.js +77 -0
- package/lib/dlob/NodeList.d.ts +27 -0
- package/lib/dlob/NodeList.js +144 -0
- package/lib/driftClient.d.ts +233 -0
- package/lib/driftClient.js +2096 -0
- package/lib/{clearingHouseConfig.d.ts → driftClientConfig.d.ts} +9 -9
- package/lib/{clearingHouseConfig.js → driftClientConfig.js} +0 -0
- package/lib/events/eventList.js +3 -0
- package/lib/events/eventSubscriber.d.ts +5 -2
- package/lib/events/eventSubscriber.js +25 -11
- package/lib/events/fetchLogs.d.ts +13 -2
- package/lib/events/fetchLogs.js +40 -12
- package/lib/events/pollingLogProvider.d.ts +2 -1
- package/lib/events/pollingLogProvider.js +7 -3
- package/lib/events/sort.js +8 -11
- package/lib/events/types.d.ts +9 -3
- package/lib/events/types.js +6 -0
- package/lib/events/webSocketLogProvider.js +1 -1
- package/lib/examples/makeTradeExample.js +30 -18
- package/lib/factory/bigNum.d.ts +8 -4
- package/lib/factory/bigNum.js +109 -19
- package/lib/idl/drift.json +8250 -0
- package/lib/idl/{mock_usdc_faucet.json → token_faucet.json} +46 -23
- package/lib/index.d.ts +30 -13
- package/lib/index.js +30 -13
- package/lib/math/amm.d.ts +9 -6
- package/lib/math/amm.js +91 -38
- package/lib/math/conversion.js +1 -1
- package/lib/math/exchangeStatus.d.ts +4 -0
- package/lib/math/exchangeStatus.js +18 -0
- package/lib/math/funding.d.ts +6 -6
- package/lib/math/funding.js +23 -21
- package/lib/math/insurance.d.ts +4 -0
- package/lib/math/insurance.js +27 -0
- package/lib/math/margin.d.ts +11 -0
- package/lib/math/margin.js +82 -0
- package/lib/math/market.d.ts +14 -9
- package/lib/math/market.js +70 -10
- package/lib/math/oracles.d.ts +4 -0
- package/lib/math/oracles.js +36 -8
- package/lib/math/orders.d.ts +14 -6
- package/lib/math/orders.js +90 -17
- package/lib/math/position.d.ts +27 -13
- package/lib/math/position.js +92 -36
- package/lib/math/repeg.js +17 -8
- package/lib/math/spotBalance.d.ts +22 -0
- package/lib/math/spotBalance.js +192 -0
- package/lib/math/spotMarket.d.ts +4 -0
- package/lib/math/spotMarket.js +8 -0
- package/lib/math/spotPosition.d.ts +6 -0
- package/lib/math/spotPosition.js +23 -0
- package/lib/math/trade.d.ts +10 -10
- package/lib/math/trade.js +27 -31
- package/lib/oracles/pythClient.js +1 -1
- package/lib/oracles/quoteAssetOracleClient.js +1 -1
- package/lib/oracles/switchboardClient.js +1 -1
- package/lib/orderParams.d.ts +4 -4
- package/lib/orderParams.js +12 -4
- package/lib/serum/serumFulfillmentConfigMap.d.ts +10 -0
- package/lib/serum/serumFulfillmentConfigMap.js +17 -0
- package/lib/serum/serumSubscriber.d.ts +27 -0
- package/lib/serum/serumSubscriber.js +56 -0
- package/lib/serum/types.d.ts +11 -0
- package/lib/{clearingHouseUserConfig.js → serum/types.js} +0 -0
- package/lib/slot/SlotSubscriber.d.ts +7 -0
- package/lib/slot/SlotSubscriber.js +3 -0
- package/lib/{mockUSDCFaucet.d.ts → tokenFaucet.d.ts} +8 -5
- package/lib/{mockUSDCFaucet.js → tokenFaucet.js} +63 -51
- package/lib/tx/retryTxSender.d.ts +1 -1
- package/lib/tx/retryTxSender.js +13 -4
- package/lib/tx/types.d.ts +1 -1
- package/lib/tx/utils.js +1 -1
- package/lib/types.d.ts +589 -196
- package/lib/types.js +108 -17
- package/lib/user.d.ts +226 -0
- package/lib/user.js +949 -0
- package/lib/userConfig.d.ts +14 -0
- package/lib/userConfig.js +2 -0
- package/lib/userMap/userMap.d.ts +41 -0
- package/lib/userMap/userMap.js +85 -0
- package/lib/userMap/userStatsMap.d.ts +19 -0
- package/lib/userMap/userStatsMap.js +68 -0
- package/lib/userName.d.ts +1 -0
- package/lib/userName.js +3 -2
- package/lib/userStats.d.ts +18 -0
- package/lib/userStats.js +49 -0
- package/lib/userStatsConfig.d.ts +14 -0
- package/lib/userStatsConfig.js +2 -0
- package/lib/util/computeUnits.js +1 -1
- package/lib/util/getTokenAddress.d.ts +2 -0
- package/lib/util/getTokenAddress.js +9 -0
- package/package.json +10 -3
- package/src/accounts/bulkAccountLoader.ts +44 -34
- package/src/accounts/bulkUserStatsSubscription.ts +33 -0
- package/src/accounts/bulkUserSubscription.ts +2 -3
- package/src/accounts/fetch.ts +27 -2
- package/src/accounts/{pollingClearingHouseAccountSubscriber.ts → pollingDriftClientAccountSubscriber.ts} +65 -75
- package/src/accounts/{pollingOracleSubscriber.ts → pollingOracleAccountSubscriber.ts} +2 -2
- package/src/accounts/pollingUserStatsAccountSubscriber.ts +172 -0
- package/src/accounts/types.ts +35 -15
- package/src/accounts/{webSocketClearingHouseAccountSubscriber.ts → webSocketDriftClientAccountSubscriber.ts} +78 -73
- package/src/accounts/webSocketUserStatsAccountSubsriber.ts +80 -0
- package/src/addresses/marketAddresses.ts +3 -4
- package/src/addresses/pda.ts +105 -33
- package/src/adminClient.ts +1207 -0
- package/src/config.ts +37 -31
- package/src/constants/numericConstants.ts +58 -24
- package/src/constants/{markets.ts → perpMarkets.ts} +10 -10
- package/src/constants/spotMarkets.ts +73 -0
- package/src/dlob/DLOB.ts +1123 -0
- package/src/dlob/DLOBNode.ts +155 -0
- package/src/dlob/NodeList.ts +195 -0
- package/src/driftClient.ts +3564 -0
- package/src/{clearingHouseConfig.ts → driftClientConfig.ts} +9 -8
- package/src/events/eventList.ts +3 -0
- package/src/events/eventSubscriber.ts +36 -14
- package/src/events/fetchLogs.ts +55 -13
- package/src/events/pollingLogProvider.ts +11 -3
- package/src/events/sort.ts +11 -15
- package/src/events/types.ts +21 -2
- package/src/events/webSocketLogProvider.ts +1 -1
- package/src/examples/makeTradeExample.ts +44 -28
- package/src/factory/bigNum.ts +150 -22
- package/src/idl/drift.json +8250 -0
- package/src/idl/pyth.json +98 -2
- package/src/idl/{mock_usdc_faucet.json → token_faucet.json} +46 -23
- package/src/index.ts +30 -13
- package/src/math/amm.ts +161 -48
- package/src/math/conversion.ts +2 -2
- package/src/math/exchangeStatus.ts +31 -0
- package/src/math/funding.ts +41 -31
- package/src/math/insurance.ts +35 -0
- package/src/math/margin.ts +133 -0
- package/src/math/market.ts +143 -14
- package/src/math/oracles.ts +63 -9
- package/src/math/orders.ts +163 -26
- package/src/math/position.ts +136 -58
- package/src/math/repeg.ts +19 -9
- package/src/math/spotBalance.ts +319 -0
- package/src/math/spotMarket.ts +9 -0
- package/src/math/spotPosition.ts +47 -0
- package/src/math/trade.ts +33 -37
- package/src/oracles/pythClient.ts +2 -2
- package/src/oracles/quoteAssetOracleClient.ts +2 -2
- package/src/oracles/switchboardClient.ts +2 -2
- package/src/orderParams.ts +16 -8
- package/src/serum/serumFulfillmentConfigMap.ts +26 -0
- package/src/serum/serumSubscriber.ts +99 -0
- package/src/serum/types.ts +13 -0
- package/src/slot/SlotSubscriber.ts +11 -1
- package/src/{mockUSDCFaucet.ts → tokenFaucet.ts} +82 -70
- package/src/tx/retryTxSender.ts +16 -5
- package/src/tx/types.ts +2 -1
- package/src/tx/utils.ts +1 -1
- package/src/types.ts +572 -178
- package/src/user.ts +1582 -0
- package/src/{clearingHouseUserConfig.ts → userConfig.ts} +5 -5
- package/src/userMap/userMap.ts +124 -0
- package/src/userMap/userStatsMap.ts +108 -0
- package/src/userName.ts +2 -1
- package/src/userStats.ts +75 -0
- package/src/userStatsConfig.ts +18 -0
- package/src/util/computeUnits.ts +1 -1
- package/src/util/getTokenAddress.ts +18 -0
- package/tests/bn/test.ts +46 -11
- package/tests/dlob/helpers.ts +611 -0
- package/tests/dlob/test.ts +4588 -0
- package/lib/accounts/webSocketClearingHouseAccountSubscriber.d.ts +0 -49
- package/lib/admin.d.ts +0 -44
- package/lib/admin.js +0 -433
- package/lib/clearingHouse.d.ts +0 -133
- package/lib/clearingHouse.js +0 -931
- package/lib/clearingHouseUser.d.ts +0 -187
- package/lib/clearingHouseUser.js +0 -643
- package/lib/clearingHouseUserConfig.d.ts +0 -14
- package/lib/constants/banks.d.ts +0 -16
- package/lib/constants/banks.js +0 -34
- package/lib/constants/markets.d.ts +0 -19
- package/lib/idl/clearing_house.json +0 -3998
- package/lib/math/bankBalance.d.ts +0 -9
- package/lib/math/bankBalance.js +0 -75
- package/lib/math/state.d.ts +0 -8
- package/lib/math/state.js +0 -15
- package/lib/orders.d.ts +0 -8
- package/lib/orders.js +0 -134
- package/src/admin.ts +0 -722
- package/src/clearingHouse.ts +0 -1451
- package/src/clearingHouseUser.ts +0 -989
- package/src/constants/banks.ts +0 -43
- package/src/idl/clearing_house.json +0 -3998
- package/src/math/bankBalance.ts +0 -112
- package/src/math/state.ts +0 -14
- package/src/math/utils.js +0 -27
- package/src/math/utils.js.map +0 -1
- package/src/orders.ts +0 -244
- package/src/util/computeUnits.js +0 -17
- package/src/util/computeUnits.js.map +0 -1
package/src/math/amm.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BN } from '@project-serum/anchor';
|
|
2
2
|
import {
|
|
3
3
|
AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO,
|
|
4
|
-
|
|
4
|
+
PRICE_PRECISION,
|
|
5
5
|
PEG_PRECISION,
|
|
6
6
|
ZERO,
|
|
7
7
|
BID_ASK_SPREAD_PRECISION,
|
|
@@ -15,11 +15,11 @@ import {
|
|
|
15
15
|
AMM,
|
|
16
16
|
PositionDirection,
|
|
17
17
|
SwapDirection,
|
|
18
|
-
|
|
18
|
+
PerpMarketAccount,
|
|
19
19
|
isVariant,
|
|
20
20
|
} from '../types';
|
|
21
21
|
import { assert } from '../assert/assert';
|
|
22
|
-
import { squareRootBN } from '..';
|
|
22
|
+
import { squareRootBN, standardizeBaseAssetAmount } from '..';
|
|
23
23
|
|
|
24
24
|
import { OraclePriceData } from '../oracles/types';
|
|
25
25
|
import {
|
|
@@ -33,18 +33,21 @@ export function calculatePegFromTargetPrice(
|
|
|
33
33
|
baseAssetReserve: BN,
|
|
34
34
|
quoteAssetReserve: BN
|
|
35
35
|
): BN {
|
|
36
|
-
return
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
return BN.max(
|
|
37
|
+
targetPrice
|
|
38
|
+
.mul(baseAssetReserve)
|
|
39
|
+
.div(quoteAssetReserve)
|
|
40
|
+
.add(PRICE_DIV_PEG.div(new BN(2)))
|
|
41
|
+
.div(PRICE_DIV_PEG),
|
|
42
|
+
ONE
|
|
43
|
+
);
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
export function calculateOptimalPegAndBudget(
|
|
44
47
|
amm: AMM,
|
|
45
48
|
oraclePriceData: OraclePriceData
|
|
46
49
|
): [BN, BN, BN, boolean] {
|
|
47
|
-
const
|
|
50
|
+
const reservePriceBefore = calculatePrice(
|
|
48
51
|
amm.baseAssetReserve,
|
|
49
52
|
amm.quoteAssetReserve,
|
|
50
53
|
amm.pegMultiplier
|
|
@@ -67,15 +70,15 @@ export function calculateOptimalPegAndBudget(
|
|
|
67
70
|
let newTargetPrice: BN;
|
|
68
71
|
let newOptimalPeg: BN;
|
|
69
72
|
let newBudget: BN;
|
|
70
|
-
const targetPriceGap =
|
|
73
|
+
const targetPriceGap = reservePriceBefore.sub(targetPrice);
|
|
71
74
|
|
|
72
75
|
if (targetPriceGap.abs().gt(maxPriceSpread)) {
|
|
73
76
|
const markAdj = targetPriceGap.abs().sub(maxPriceSpread);
|
|
74
77
|
|
|
75
78
|
if (targetPriceGap.lt(new BN(0))) {
|
|
76
|
-
newTargetPrice =
|
|
79
|
+
newTargetPrice = reservePriceBefore.add(markAdj);
|
|
77
80
|
} else {
|
|
78
|
-
newTargetPrice =
|
|
81
|
+
newTargetPrice = reservePriceBefore.sub(markAdj);
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
newOptimalPeg = calculatePegFromTargetPrice(
|
|
@@ -114,7 +117,7 @@ export function calculateNewAmm(
|
|
|
114
117
|
newAmm.sqrtK = newAmm.sqrtK.mul(pKNumer).div(pKDenom);
|
|
115
118
|
const invariant = newAmm.sqrtK.mul(newAmm.sqrtK);
|
|
116
119
|
newAmm.quoteAssetReserve = invariant.div(newAmm.baseAssetReserve);
|
|
117
|
-
const directionToClose = amm.
|
|
120
|
+
const directionToClose = amm.baseAssetAmountWithAmm.gt(ZERO)
|
|
118
121
|
? PositionDirection.SHORT
|
|
119
122
|
: PositionDirection.LONG;
|
|
120
123
|
|
|
@@ -122,7 +125,7 @@ export function calculateNewAmm(
|
|
|
122
125
|
calculateAmmReservesAfterSwap(
|
|
123
126
|
newAmm,
|
|
124
127
|
'base',
|
|
125
|
-
amm.
|
|
128
|
+
amm.baseAssetAmountWithAmm.abs(),
|
|
126
129
|
getSwapDirection('base', directionToClose)
|
|
127
130
|
);
|
|
128
131
|
|
|
@@ -154,7 +157,7 @@ export function calculateUpdatedAMM(
|
|
|
154
157
|
newAmm.quoteAssetReserve = invariant.div(newAmm.baseAssetReserve);
|
|
155
158
|
newAmm.pegMultiplier = newPeg;
|
|
156
159
|
|
|
157
|
-
const directionToClose = amm.
|
|
160
|
+
const directionToClose = amm.baseAssetAmountWithAmm.gt(ZERO)
|
|
158
161
|
? PositionDirection.SHORT
|
|
159
162
|
: PositionDirection.LONG;
|
|
160
163
|
|
|
@@ -162,7 +165,7 @@ export function calculateUpdatedAMM(
|
|
|
162
165
|
calculateAmmReservesAfterSwap(
|
|
163
166
|
newAmm,
|
|
164
167
|
'base',
|
|
165
|
-
amm.
|
|
168
|
+
amm.baseAssetAmountWithAmm.abs(),
|
|
166
169
|
getSwapDirection('base', directionToClose)
|
|
167
170
|
);
|
|
168
171
|
|
|
@@ -239,7 +242,7 @@ export function calculateBidAskPrice(
|
|
|
239
242
|
* @param baseAssetReserves
|
|
240
243
|
* @param quoteAssetReserves
|
|
241
244
|
* @param pegMultiplier
|
|
242
|
-
* @returns price : Precision
|
|
245
|
+
* @returns price : Precision PRICE_PRECISION
|
|
243
246
|
*/
|
|
244
247
|
export function calculatePrice(
|
|
245
248
|
baseAssetReserves: BN,
|
|
@@ -251,7 +254,7 @@ export function calculatePrice(
|
|
|
251
254
|
}
|
|
252
255
|
|
|
253
256
|
return quoteAssetReserves
|
|
254
|
-
.mul(
|
|
257
|
+
.mul(PRICE_PRECISION)
|
|
255
258
|
.mul(pegMultiplier)
|
|
256
259
|
.div(PEG_PRECISION)
|
|
257
260
|
.div(baseAssetReserves);
|
|
@@ -305,13 +308,62 @@ export function calculateAmmReservesAfterSwap(
|
|
|
305
308
|
return [newQuoteAssetReserve, newBaseAssetReserve];
|
|
306
309
|
}
|
|
307
310
|
|
|
311
|
+
export function calculateMarketOpenBidAsk(
|
|
312
|
+
baseAssetReserve: BN,
|
|
313
|
+
minBaseAssetReserve: BN,
|
|
314
|
+
maxBaseAssetReserve: BN
|
|
315
|
+
): [BN, BN] {
|
|
316
|
+
// open orders
|
|
317
|
+
let openAsks;
|
|
318
|
+
if (maxBaseAssetReserve > baseAssetReserve) {
|
|
319
|
+
openAsks = maxBaseAssetReserve.sub(baseAssetReserve).mul(new BN(-1));
|
|
320
|
+
} else {
|
|
321
|
+
openAsks = ZERO;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
let openBids;
|
|
325
|
+
if (minBaseAssetReserve < baseAssetReserve) {
|
|
326
|
+
openBids = baseAssetReserve.sub(minBaseAssetReserve);
|
|
327
|
+
} else {
|
|
328
|
+
openBids = ZERO;
|
|
329
|
+
}
|
|
330
|
+
return [openBids, openAsks];
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
export function calculateInventoryScale(
|
|
334
|
+
netBaseAssetAmount: BN,
|
|
335
|
+
baseAssetReserve: BN,
|
|
336
|
+
minBaseAssetReserve: BN,
|
|
337
|
+
maxBaseAssetReserve: BN
|
|
338
|
+
): number {
|
|
339
|
+
const maxScale = BID_ASK_SPREAD_PRECISION.mul(new BN(10));
|
|
340
|
+
// inventory skew
|
|
341
|
+
const [openBids, openAsks] = calculateMarketOpenBidAsk(
|
|
342
|
+
baseAssetReserve,
|
|
343
|
+
minBaseAssetReserve,
|
|
344
|
+
maxBaseAssetReserve
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
const minSideLiquidity = BN.max(
|
|
348
|
+
new BN(1),
|
|
349
|
+
BN.min(openBids.abs(), openAsks.abs())
|
|
350
|
+
);
|
|
351
|
+
const inventoryScale =
|
|
352
|
+
BN.min(
|
|
353
|
+
maxScale,
|
|
354
|
+
netBaseAssetAmount.mul(maxScale).div(minSideLiquidity).abs()
|
|
355
|
+
).toNumber() / BID_ASK_SPREAD_PRECISION.toNumber();
|
|
356
|
+
|
|
357
|
+
return inventoryScale;
|
|
358
|
+
}
|
|
359
|
+
|
|
308
360
|
export function calculateEffectiveLeverage(
|
|
309
361
|
baseSpread: number,
|
|
310
362
|
quoteAssetReserve: BN,
|
|
311
363
|
terminalQuoteAssetReserve: BN,
|
|
312
364
|
pegMultiplier: BN,
|
|
313
365
|
netBaseAssetAmount: BN,
|
|
314
|
-
|
|
366
|
+
reservePrice: BN,
|
|
315
367
|
totalFeeMinusDistributions: BN
|
|
316
368
|
): number {
|
|
317
369
|
// inventory skew
|
|
@@ -321,8 +373,8 @@ export function calculateEffectiveLeverage(
|
|
|
321
373
|
.div(AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO);
|
|
322
374
|
|
|
323
375
|
const localBaseAssetValue = netBaseAssetAmount
|
|
324
|
-
.mul(
|
|
325
|
-
.div(AMM_TO_QUOTE_PRECISION_RATIO.mul(
|
|
376
|
+
.mul(reservePrice)
|
|
377
|
+
.div(AMM_TO_QUOTE_PRECISION_RATIO.mul(PRICE_PRECISION));
|
|
326
378
|
|
|
327
379
|
const effectiveLeverage =
|
|
328
380
|
localBaseAssetValue.sub(netBaseAssetValue).toNumber() /
|
|
@@ -342,34 +394,59 @@ export function calculateMaxSpread(marginRatioInitial: number): number {
|
|
|
342
394
|
|
|
343
395
|
export function calculateSpreadBN(
|
|
344
396
|
baseSpread: number,
|
|
345
|
-
|
|
397
|
+
lastOracleReservePriceSpreadPct: BN,
|
|
346
398
|
lastOracleConfPct: BN,
|
|
347
399
|
maxSpread: number,
|
|
348
400
|
quoteAssetReserve: BN,
|
|
349
401
|
terminalQuoteAssetReserve: BN,
|
|
350
402
|
pegMultiplier: BN,
|
|
351
403
|
netBaseAssetAmount: BN,
|
|
352
|
-
|
|
353
|
-
totalFeeMinusDistributions: BN
|
|
404
|
+
reservePrice: BN,
|
|
405
|
+
totalFeeMinusDistributions: BN,
|
|
406
|
+
baseAssetReserve: BN,
|
|
407
|
+
minBaseAssetReserve: BN,
|
|
408
|
+
maxBaseAssetReserve: BN
|
|
354
409
|
): [number, number] {
|
|
355
410
|
let longSpread = baseSpread / 2;
|
|
356
411
|
let shortSpread = baseSpread / 2;
|
|
357
412
|
|
|
358
|
-
if (
|
|
413
|
+
if (lastOracleReservePriceSpreadPct.gt(ZERO)) {
|
|
359
414
|
shortSpread = Math.max(
|
|
360
415
|
shortSpread,
|
|
361
|
-
|
|
416
|
+
lastOracleReservePriceSpreadPct.abs().toNumber() +
|
|
417
|
+
lastOracleConfPct.toNumber()
|
|
362
418
|
);
|
|
363
|
-
} else if (
|
|
419
|
+
} else if (lastOracleReservePriceSpreadPct.lt(ZERO)) {
|
|
364
420
|
longSpread = Math.max(
|
|
365
421
|
longSpread,
|
|
366
|
-
|
|
422
|
+
lastOracleReservePriceSpreadPct.abs().toNumber() +
|
|
423
|
+
lastOracleConfPct.toNumber()
|
|
367
424
|
);
|
|
368
425
|
}
|
|
369
426
|
|
|
370
|
-
const maxTargetSpread: number =
|
|
427
|
+
const maxTargetSpread: number = Math.max(
|
|
428
|
+
maxSpread,
|
|
429
|
+
lastOracleReservePriceSpreadPct.abs().toNumber()
|
|
430
|
+
);
|
|
371
431
|
|
|
372
|
-
const
|
|
432
|
+
const MAX_BID_ASK_INVENTORY_SKEW_FACTOR = 10;
|
|
433
|
+
|
|
434
|
+
const inventoryScale = calculateInventoryScale(
|
|
435
|
+
netBaseAssetAmount,
|
|
436
|
+
baseAssetReserve,
|
|
437
|
+
minBaseAssetReserve,
|
|
438
|
+
maxBaseAssetReserve
|
|
439
|
+
);
|
|
440
|
+
const inventorySpreadScale = Math.min(
|
|
441
|
+
MAX_BID_ASK_INVENTORY_SKEW_FACTOR,
|
|
442
|
+
1 + inventoryScale
|
|
443
|
+
);
|
|
444
|
+
|
|
445
|
+
if (netBaseAssetAmount.gt(ZERO)) {
|
|
446
|
+
longSpread *= inventorySpreadScale;
|
|
447
|
+
} else if (netBaseAssetAmount.lt(ZERO)) {
|
|
448
|
+
shortSpread *= inventorySpreadScale;
|
|
449
|
+
}
|
|
373
450
|
|
|
374
451
|
const effectiveLeverage = calculateEffectiveLeverage(
|
|
375
452
|
baseSpread,
|
|
@@ -377,20 +454,23 @@ export function calculateSpreadBN(
|
|
|
377
454
|
terminalQuoteAssetReserve,
|
|
378
455
|
pegMultiplier,
|
|
379
456
|
netBaseAssetAmount,
|
|
380
|
-
|
|
457
|
+
reservePrice,
|
|
381
458
|
totalFeeMinusDistributions
|
|
382
459
|
);
|
|
383
460
|
|
|
384
461
|
if (totalFeeMinusDistributions.gt(ZERO)) {
|
|
385
|
-
const spreadScale = Math.min(
|
|
462
|
+
const spreadScale = Math.min(
|
|
463
|
+
MAX_BID_ASK_INVENTORY_SKEW_FACTOR,
|
|
464
|
+
1 + effectiveLeverage
|
|
465
|
+
);
|
|
386
466
|
if (netBaseAssetAmount.gt(ZERO)) {
|
|
387
467
|
longSpread *= spreadScale;
|
|
388
468
|
} else {
|
|
389
469
|
shortSpread *= spreadScale;
|
|
390
470
|
}
|
|
391
471
|
} else {
|
|
392
|
-
longSpread *=
|
|
393
|
-
shortSpread *=
|
|
472
|
+
longSpread *= MAX_BID_ASK_INVENTORY_SKEW_FACTOR;
|
|
473
|
+
shortSpread *= MAX_BID_ASK_INVENTORY_SKEW_FACTOR;
|
|
394
474
|
}
|
|
395
475
|
|
|
396
476
|
const totalSpread = longSpread + shortSpread;
|
|
@@ -416,23 +496,23 @@ export function calculateSpread(
|
|
|
416
496
|
return amm.baseSpread / 2;
|
|
417
497
|
}
|
|
418
498
|
|
|
419
|
-
const
|
|
499
|
+
const reservePrice = calculatePrice(
|
|
420
500
|
amm.baseAssetReserve,
|
|
421
501
|
amm.quoteAssetReserve,
|
|
422
502
|
amm.pegMultiplier
|
|
423
503
|
);
|
|
424
504
|
|
|
425
|
-
const targetPrice = oraclePriceData?.price ||
|
|
505
|
+
const targetPrice = oraclePriceData?.price || reservePrice;
|
|
426
506
|
const confInterval = oraclePriceData.confidence || ZERO;
|
|
427
507
|
|
|
428
|
-
const targetMarkSpreadPct =
|
|
508
|
+
const targetMarkSpreadPct = reservePrice
|
|
429
509
|
.sub(targetPrice)
|
|
430
510
|
.mul(BID_ASK_SPREAD_PRECISION)
|
|
431
|
-
.div(
|
|
511
|
+
.div(reservePrice);
|
|
432
512
|
|
|
433
513
|
const confIntervalPct = confInterval
|
|
434
514
|
.mul(BID_ASK_SPREAD_PRECISION)
|
|
435
|
-
.div(
|
|
515
|
+
.div(reservePrice);
|
|
436
516
|
|
|
437
517
|
const [longSpread, shortSpread] = calculateSpreadBN(
|
|
438
518
|
amm.baseSpread,
|
|
@@ -442,9 +522,12 @@ export function calculateSpread(
|
|
|
442
522
|
amm.quoteAssetReserve,
|
|
443
523
|
amm.terminalQuoteAssetReserve,
|
|
444
524
|
amm.pegMultiplier,
|
|
445
|
-
amm.
|
|
446
|
-
|
|
447
|
-
amm.totalFeeMinusDistributions
|
|
525
|
+
amm.baseAssetAmountWithAmm,
|
|
526
|
+
reservePrice,
|
|
527
|
+
amm.totalFeeMinusDistributions,
|
|
528
|
+
amm.baseAssetReserve,
|
|
529
|
+
amm.minBaseAssetReserve,
|
|
530
|
+
amm.maxBaseAssetReserve
|
|
448
531
|
);
|
|
449
532
|
|
|
450
533
|
let spread: number;
|
|
@@ -543,10 +626,10 @@ export function getSwapDirection(
|
|
|
543
626
|
* Helper function calculating terminal price of amm
|
|
544
627
|
*
|
|
545
628
|
* @param market
|
|
546
|
-
* @returns cost : Precision
|
|
629
|
+
* @returns cost : Precision PRICE_PRECISION
|
|
547
630
|
*/
|
|
548
|
-
export function calculateTerminalPrice(market:
|
|
549
|
-
const directionToClose = market.amm.
|
|
631
|
+
export function calculateTerminalPrice(market: PerpMarketAccount) {
|
|
632
|
+
const directionToClose = market.amm.baseAssetAmountWithAmm.gt(ZERO)
|
|
550
633
|
? PositionDirection.SHORT
|
|
551
634
|
: PositionDirection.LONG;
|
|
552
635
|
|
|
@@ -554,12 +637,12 @@ export function calculateTerminalPrice(market: MarketAccount) {
|
|
|
554
637
|
calculateAmmReservesAfterSwap(
|
|
555
638
|
market.amm,
|
|
556
639
|
'base',
|
|
557
|
-
market.amm.
|
|
640
|
+
market.amm.baseAssetAmountWithAmm.abs(),
|
|
558
641
|
getSwapDirection('base', directionToClose)
|
|
559
642
|
);
|
|
560
643
|
|
|
561
644
|
const terminalPrice = newQuoteAssetReserve
|
|
562
|
-
.mul(
|
|
645
|
+
.mul(PRICE_PRECISION)
|
|
563
646
|
.mul(market.amm.pegMultiplier)
|
|
564
647
|
.div(PEG_PRECISION)
|
|
565
648
|
.div(newBaseAssetReserve);
|
|
@@ -576,7 +659,7 @@ export function calculateMaxBaseAssetAmountToTrade(
|
|
|
576
659
|
const invariant = amm.sqrtK.mul(amm.sqrtK);
|
|
577
660
|
|
|
578
661
|
const newBaseAssetReserveSquared = invariant
|
|
579
|
-
.mul(
|
|
662
|
+
.mul(PRICE_PRECISION)
|
|
580
663
|
.mul(amm.pegMultiplier)
|
|
581
664
|
.div(limit_price)
|
|
582
665
|
.div(PEG_PRECISION);
|
|
@@ -610,6 +693,10 @@ export function calculateQuoteAssetAmountSwapped(
|
|
|
610
693
|
pegMultiplier: BN,
|
|
611
694
|
swapDirection: SwapDirection
|
|
612
695
|
): BN {
|
|
696
|
+
if (isVariant(swapDirection, 'remove')) {
|
|
697
|
+
quoteAssetReserves = quoteAssetReserves.add(ONE);
|
|
698
|
+
}
|
|
699
|
+
|
|
613
700
|
let quoteAssetAmount = quoteAssetReserves
|
|
614
701
|
.mul(pegMultiplier)
|
|
615
702
|
.div(AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO);
|
|
@@ -620,3 +707,29 @@ export function calculateQuoteAssetAmountSwapped(
|
|
|
620
707
|
|
|
621
708
|
return quoteAssetAmount;
|
|
622
709
|
}
|
|
710
|
+
|
|
711
|
+
export function calculateMaxBaseAssetAmountFillable(
|
|
712
|
+
amm: AMM,
|
|
713
|
+
orderDirection: PositionDirection
|
|
714
|
+
): BN {
|
|
715
|
+
const maxFillSize = amm.baseAssetReserve.div(
|
|
716
|
+
new BN(amm.maxFillReserveFraction)
|
|
717
|
+
);
|
|
718
|
+
let maxBaseAssetAmountOnSide: BN;
|
|
719
|
+
if (isVariant(orderDirection, 'long')) {
|
|
720
|
+
maxBaseAssetAmountOnSide = BN.max(
|
|
721
|
+
ZERO,
|
|
722
|
+
amm.baseAssetReserve.sub(amm.minBaseAssetReserve)
|
|
723
|
+
);
|
|
724
|
+
} else {
|
|
725
|
+
maxBaseAssetAmountOnSide = BN.max(
|
|
726
|
+
ZERO,
|
|
727
|
+
amm.maxBaseAssetReserve.sub(amm.baseAssetReserve)
|
|
728
|
+
);
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
return standardizeBaseAssetAmount(
|
|
732
|
+
BN.min(maxFillSize, maxBaseAssetAmountOnSide),
|
|
733
|
+
amm.orderStepSize
|
|
734
|
+
);
|
|
735
|
+
}
|
package/src/math/conversion.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { BN } from '../';
|
|
2
|
-
import {
|
|
2
|
+
import { PRICE_PRECISION } from '../constants/numericConstants';
|
|
3
3
|
|
|
4
4
|
export const convertToNumber = (
|
|
5
5
|
bigNumber: BN,
|
|
6
|
-
precision: BN =
|
|
6
|
+
precision: BN = PRICE_PRECISION
|
|
7
7
|
) => {
|
|
8
8
|
if (!bigNumber) return 0;
|
|
9
9
|
return (
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isOneOfVariant,
|
|
3
|
+
isVariant,
|
|
4
|
+
PerpMarketAccount,
|
|
5
|
+
SpotMarketAccount,
|
|
6
|
+
StateAccount,
|
|
7
|
+
} from '../types';
|
|
8
|
+
|
|
9
|
+
export function exchangePaused(state: StateAccount): boolean {
|
|
10
|
+
return isVariant(state.exchangeStatus, 'paused');
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function fillPaused(
|
|
14
|
+
state: StateAccount,
|
|
15
|
+
market: PerpMarketAccount | SpotMarketAccount
|
|
16
|
+
): boolean {
|
|
17
|
+
return (
|
|
18
|
+
isOneOfVariant(state.exchangeStatus, ['paused', 'fillPaused']) ||
|
|
19
|
+
isOneOfVariant(market.status, ['paused', 'fillPaused'])
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function ammPaused(
|
|
24
|
+
state: StateAccount,
|
|
25
|
+
market: PerpMarketAccount | SpotMarketAccount
|
|
26
|
+
): boolean {
|
|
27
|
+
return (
|
|
28
|
+
isOneOfVariant(state.exchangeStatus, ['paused', 'ammPaused']) ||
|
|
29
|
+
isOneOfVariant(market.status, ['paused', 'ammPaused'])
|
|
30
|
+
);
|
|
31
|
+
}
|
package/src/math/funding.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { BN } from '@project-serum/anchor';
|
|
2
2
|
import {
|
|
3
3
|
AMM_RESERVE_PRECISION,
|
|
4
|
-
|
|
4
|
+
PRICE_PRECISION,
|
|
5
5
|
QUOTE_PRECISION,
|
|
6
6
|
ZERO,
|
|
7
7
|
} from '../constants/numericConstants';
|
|
8
|
-
import {
|
|
9
|
-
import { calculateMarkPrice } from './market';
|
|
8
|
+
import { PerpMarketAccount, isVariant } from '../types';
|
|
10
9
|
import { OraclePriceData } from '../oracles/types';
|
|
10
|
+
import { calculateBidAskPrice } from './amm';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
*
|
|
@@ -17,7 +17,7 @@ import { OraclePriceData } from '../oracles/types';
|
|
|
17
17
|
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
18
18
|
*/
|
|
19
19
|
export async function calculateAllEstimatedFundingRate(
|
|
20
|
-
market:
|
|
20
|
+
market: PerpMarketAccount,
|
|
21
21
|
oraclePriceData?: OraclePriceData,
|
|
22
22
|
periodAdjustment: BN = new BN(1)
|
|
23
23
|
): Promise<[BN, BN, BN, BN, BN]> {
|
|
@@ -29,7 +29,7 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
29
29
|
const hoursInDay = new BN(24);
|
|
30
30
|
const ONE = new BN(1);
|
|
31
31
|
|
|
32
|
-
if (
|
|
32
|
+
if (isVariant(market.status, 'uninitialized')) {
|
|
33
33
|
return [ZERO, ZERO, ZERO, ZERO, ZERO];
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -48,10 +48,8 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
48
48
|
secondsInHour,
|
|
49
49
|
BN.max(ZERO, secondsInHour.sub(timeSinceLastMarkChange))
|
|
50
50
|
);
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
oraclePriceData
|
|
54
|
-
);
|
|
51
|
+
const [bid, ask] = calculateBidAskPrice(market.amm, oraclePriceData);
|
|
52
|
+
const baseAssetPriceWithMantissa = bid.add(ask).div(new BN(2));
|
|
55
53
|
|
|
56
54
|
const markTwapWithMantissa = markTwapTimeSinceLastUpdate
|
|
57
55
|
.mul(lastMarkTwapWithMantissa)
|
|
@@ -60,8 +58,10 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
60
58
|
|
|
61
59
|
// calculate real-time (predicted) oracle twap
|
|
62
60
|
// note: oracle twap depends on `when the chord is struck` (market is trade)
|
|
63
|
-
const lastOracleTwapWithMantissa =
|
|
64
|
-
|
|
61
|
+
const lastOracleTwapWithMantissa =
|
|
62
|
+
market.amm.historicalOracleData.lastOraclePriceTwap;
|
|
63
|
+
const lastOraclePriceTwapTs =
|
|
64
|
+
market.amm.historicalOracleData.lastOraclePriceTwapTs;
|
|
65
65
|
|
|
66
66
|
const oracleInvalidDuration = BN.max(
|
|
67
67
|
ZERO,
|
|
@@ -85,12 +85,12 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
85
85
|
const oracleLiveVsTwap = oraclePrice
|
|
86
86
|
.sub(lastOracleTwapWithMantissa)
|
|
87
87
|
.abs()
|
|
88
|
-
.mul(
|
|
88
|
+
.mul(PRICE_PRECISION)
|
|
89
89
|
.mul(new BN(100))
|
|
90
90
|
.div(lastOracleTwapWithMantissa);
|
|
91
91
|
|
|
92
92
|
// verify pyth live input is within 10% of last twap for live update
|
|
93
|
-
if (oracleLiveVsTwap.lte(
|
|
93
|
+
if (oracleLiveVsTwap.lte(PRICE_PRECISION.mul(new BN(10)))) {
|
|
94
94
|
oracleTwapWithMantissa = oracleTwapTimeSinceLastUpdate
|
|
95
95
|
.mul(lastOracleTwapWithMantissa)
|
|
96
96
|
.add(timeSinceLastMarkChange.mul(oraclePrice))
|
|
@@ -108,7 +108,7 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
108
108
|
);
|
|
109
109
|
|
|
110
110
|
const twapSpreadPct = twapSpread
|
|
111
|
-
.mul(
|
|
111
|
+
.mul(PRICE_PRECISION)
|
|
112
112
|
.mul(new BN(100))
|
|
113
113
|
.div(shrunkLastOracleTwapwithMantissa);
|
|
114
114
|
|
|
@@ -125,7 +125,7 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
125
125
|
const interpRateQuote = twapSpreadPct
|
|
126
126
|
.mul(periodAdjustment)
|
|
127
127
|
.div(hoursInDay)
|
|
128
|
-
.div(
|
|
128
|
+
.div(PRICE_PRECISION.div(QUOTE_PRECISION));
|
|
129
129
|
|
|
130
130
|
let feePoolSize = calculateFundingPool(market);
|
|
131
131
|
if (interpRateQuote.lt(new BN(0))) {
|
|
@@ -135,9 +135,11 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
135
135
|
let cappedAltEst: BN;
|
|
136
136
|
let largerSide: BN;
|
|
137
137
|
let smallerSide: BN;
|
|
138
|
-
if (
|
|
139
|
-
|
|
140
|
-
|
|
138
|
+
if (
|
|
139
|
+
market.amm.baseAssetAmountLong.gt(market.amm.baseAssetAmountShort.abs())
|
|
140
|
+
) {
|
|
141
|
+
largerSide = market.amm.baseAssetAmountLong.abs();
|
|
142
|
+
smallerSide = market.amm.baseAssetAmountShort.abs();
|
|
141
143
|
if (twapSpread.gt(new BN(0))) {
|
|
142
144
|
return [
|
|
143
145
|
markTwapWithMantissa,
|
|
@@ -147,9 +149,11 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
147
149
|
interpEst,
|
|
148
150
|
];
|
|
149
151
|
}
|
|
150
|
-
} else if (
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
} else if (
|
|
153
|
+
market.amm.baseAssetAmountLong.lt(market.amm.baseAssetAmountShort.abs())
|
|
154
|
+
) {
|
|
155
|
+
largerSide = market.amm.baseAssetAmountShort.abs();
|
|
156
|
+
smallerSide = market.amm.baseAssetAmountLong.abs();
|
|
153
157
|
if (twapSpread.lt(new BN(0))) {
|
|
154
158
|
return [
|
|
155
159
|
markTwapWithMantissa,
|
|
@@ -173,12 +177,12 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
173
177
|
// funding smaller flow
|
|
174
178
|
cappedAltEst = smallerSide.mul(twapSpread).div(hoursInDay);
|
|
175
179
|
const feePoolTopOff = feePoolSize
|
|
176
|
-
.mul(
|
|
180
|
+
.mul(PRICE_PRECISION.div(QUOTE_PRECISION))
|
|
177
181
|
.mul(AMM_RESERVE_PRECISION);
|
|
178
182
|
cappedAltEst = cappedAltEst.add(feePoolTopOff).div(largerSide);
|
|
179
183
|
|
|
180
184
|
cappedAltEst = cappedAltEst
|
|
181
|
-
.mul(
|
|
185
|
+
.mul(PRICE_PRECISION)
|
|
182
186
|
.mul(new BN(100))
|
|
183
187
|
.div(oracleTwapWithMantissa)
|
|
184
188
|
.mul(periodAdjustment);
|
|
@@ -208,7 +212,7 @@ export async function calculateAllEstimatedFundingRate(
|
|
|
208
212
|
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
209
213
|
*/
|
|
210
214
|
export async function calculateEstimatedFundingRate(
|
|
211
|
-
market:
|
|
215
|
+
market: PerpMarketAccount,
|
|
212
216
|
oraclePriceData?: OraclePriceData,
|
|
213
217
|
periodAdjustment: BN = new BN(1),
|
|
214
218
|
estimationMethod?: 'interpolated' | 'lowerbound' | 'capped'
|
|
@@ -238,7 +242,7 @@ export async function calculateEstimatedFundingRate(
|
|
|
238
242
|
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
239
243
|
*/
|
|
240
244
|
export async function calculateLongShortFundingRate(
|
|
241
|
-
market:
|
|
245
|
+
market: PerpMarketAccount,
|
|
242
246
|
oraclePriceData?: OraclePriceData,
|
|
243
247
|
periodAdjustment: BN = new BN(1)
|
|
244
248
|
): Promise<[BN, BN]> {
|
|
@@ -249,9 +253,11 @@ export async function calculateLongShortFundingRate(
|
|
|
249
253
|
periodAdjustment
|
|
250
254
|
);
|
|
251
255
|
|
|
252
|
-
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
|
|
256
|
+
if (market.amm.baseAssetAmountLong.gt(market.amm.baseAssetAmountShort)) {
|
|
253
257
|
return [cappedAltEst, interpEst];
|
|
254
|
-
} else if (
|
|
258
|
+
} else if (
|
|
259
|
+
market.amm.baseAssetAmountLong.lt(market.amm.baseAssetAmountShort)
|
|
260
|
+
) {
|
|
255
261
|
return [interpEst, cappedAltEst];
|
|
256
262
|
} else {
|
|
257
263
|
return [interpEst, interpEst];
|
|
@@ -266,7 +272,7 @@ export async function calculateLongShortFundingRate(
|
|
|
266
272
|
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
267
273
|
*/
|
|
268
274
|
export async function calculateLongShortFundingRateAndLiveTwaps(
|
|
269
|
-
market:
|
|
275
|
+
market: PerpMarketAccount,
|
|
270
276
|
oraclePriceData?: OraclePriceData,
|
|
271
277
|
periodAdjustment: BN = new BN(1)
|
|
272
278
|
): Promise<[BN, BN, BN, BN]> {
|
|
@@ -277,9 +283,13 @@ export async function calculateLongShortFundingRateAndLiveTwaps(
|
|
|
277
283
|
periodAdjustment
|
|
278
284
|
);
|
|
279
285
|
|
|
280
|
-
if (
|
|
286
|
+
if (
|
|
287
|
+
market.amm.baseAssetAmountLong.gt(market.amm.baseAssetAmountShort.abs())
|
|
288
|
+
) {
|
|
281
289
|
return [markTwapLive, oracleTwapLive, cappedAltEst, interpEst];
|
|
282
|
-
} else if (
|
|
290
|
+
} else if (
|
|
291
|
+
market.amm.baseAssetAmountLong.lt(market.amm.baseAssetAmountShort.abs())
|
|
292
|
+
) {
|
|
283
293
|
return [markTwapLive, oracleTwapLive, interpEst, cappedAltEst];
|
|
284
294
|
} else {
|
|
285
295
|
return [markTwapLive, oracleTwapLive, interpEst, interpEst];
|
|
@@ -291,7 +301,7 @@ export async function calculateLongShortFundingRateAndLiveTwaps(
|
|
|
291
301
|
* @param market
|
|
292
302
|
* @returns Estimated fee pool size
|
|
293
303
|
*/
|
|
294
|
-
export function calculateFundingPool(market:
|
|
304
|
+
export function calculateFundingPool(market: PerpMarketAccount): BN {
|
|
295
305
|
// todo
|
|
296
306
|
const totalFeeLB = market.amm.totalExchangeFee.div(new BN(2));
|
|
297
307
|
const feePool = BN.max(
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ZERO } from '../constants/numericConstants';
|
|
2
|
+
import { BN } from '../index';
|
|
3
|
+
|
|
4
|
+
export function stakeAmountToShares(
|
|
5
|
+
amount: BN,
|
|
6
|
+
totalIfShares: BN,
|
|
7
|
+
insuranceFundVaultBalance: BN
|
|
8
|
+
): BN {
|
|
9
|
+
let nShares: BN;
|
|
10
|
+
if (insuranceFundVaultBalance.gt(ZERO)) {
|
|
11
|
+
nShares = amount.mul(totalIfShares).div(insuranceFundVaultBalance);
|
|
12
|
+
} else {
|
|
13
|
+
nShares = amount;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return nShares;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function unstakeSharesToAmount(
|
|
20
|
+
nShares: BN,
|
|
21
|
+
totalIfShares: BN,
|
|
22
|
+
insuranceFundVaultBalance: BN
|
|
23
|
+
): BN {
|
|
24
|
+
let amount: BN;
|
|
25
|
+
if (totalIfShares.gt(ZERO)) {
|
|
26
|
+
amount = BN.max(
|
|
27
|
+
ZERO,
|
|
28
|
+
nShares.mul(insuranceFundVaultBalance).div(totalIfShares)
|
|
29
|
+
);
|
|
30
|
+
} else {
|
|
31
|
+
amount = ZERO;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return amount;
|
|
35
|
+
}
|