@drift-labs/sdk 0.1.24 → 0.1.27
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/lib/accounts/bulkAccountLoader.d.ts +1 -0
- package/lib/accounts/bulkAccountLoader.js +16 -2
- package/lib/accounts/pollingClearingHouseAccountSubscriber.js +3 -3
- package/lib/accounts/pollingOracleSubscriber.d.ts +26 -0
- package/lib/accounts/pollingOracleSubscriber.js +79 -0
- package/lib/accounts/pollingTokenAccountSubscriber.js +2 -2
- package/lib/accounts/pollingUserAccountSubscriber.js +4 -4
- package/lib/accounts/types.d.ts +14 -1
- package/lib/accounts/webSocketAccountSubscriber.js +2 -2
- package/lib/accounts/webSocketClearingHouseAccountSubscriber.js +1 -1
- package/lib/accounts/webSocketUserAccountSubscriber.js +2 -2
- package/lib/addresses.js +5 -1
- package/lib/admin.d.ts +1 -1
- package/lib/admin.js +15 -10
- package/lib/clearingHouse.d.ts +4 -4
- package/lib/clearingHouse.js +56 -25
- package/lib/clearingHouseUser.js +18 -18
- package/lib/constants/markets.d.ts +8 -6
- package/lib/constants/markets.js +85 -26
- package/lib/constants/numericConstants.d.ts +1 -0
- package/lib/constants/numericConstants.js +2 -1
- package/lib/examples/makeTradeExample.js +6 -6
- package/lib/factory/oracleClient.d.ts +5 -0
- package/lib/factory/oracleClient.js +16 -0
- package/lib/idl/clearing_house.json +22 -2
- package/lib/idl/switchboard_v2.json +4663 -0
- package/lib/index.d.ts +5 -1
- package/lib/index.js +10 -2
- package/lib/math/amm.js +12 -12
- package/lib/math/conversion.js +1 -1
- package/lib/math/funding.d.ts +6 -6
- package/lib/math/funding.js +5 -17
- package/lib/math/market.d.ts +2 -0
- package/lib/math/market.js +8 -3
- package/lib/math/orders.js +9 -9
- package/lib/math/position.js +1 -1
- package/lib/math/trade.js +18 -18
- package/lib/mockUSDCFaucet.js +5 -1
- package/lib/oracles/pythClient.d.ts +14 -0
- package/lib/oracles/pythClient.js +53 -0
- package/lib/oracles/switchboardClient.d.ts +13 -0
- package/lib/oracles/switchboardClient.js +76 -0
- package/lib/oracles/types.d.ts +15 -0
- package/lib/oracles/types.js +2 -0
- package/lib/orderParams.d.ts +1 -1
- package/lib/orderParams.js +3 -3
- package/lib/orders.d.ts +3 -2
- package/lib/orders.js +29 -22
- package/lib/tx/retryTxSender.js +1 -1
- package/lib/types.d.ts +1 -0
- package/package.json +2 -1
- package/src/accounts/bulkAccountLoader.js +180 -0
- package/src/accounts/bulkAccountLoader.js.map +1 -0
- package/src/accounts/bulkAccountLoader.ts +19 -0
- package/src/accounts/bulkUserSubscription.js +56 -0
- package/src/accounts/bulkUserSubscription.js.map +1 -0
- package/src/accounts/pollingClearingHouseAccountSubscriber.js +210 -0
- package/src/accounts/pollingClearingHouseAccountSubscriber.js.map +1 -0
- package/src/accounts/pollingOracleSubscriber.js +65 -0
- package/src/accounts/pollingOracleSubscriber.js.map +1 -0
- package/src/accounts/pollingOracleSubscriber.ts +103 -0
- package/src/accounts/pollingTokenAccountSubscriber.js +65 -0
- package/src/accounts/pollingTokenAccountSubscriber.js.map +1 -0
- package/src/accounts/pollingUserAccountSubscriber.js +139 -0
- package/src/accounts/pollingUserAccountSubscriber.js.map +1 -0
- package/src/accounts/types.js +1 -0
- package/src/accounts/types.js.map +1 -0
- package/src/accounts/types.ts +22 -1
- package/src/accounts/utils.js +1 -0
- package/src/accounts/utils.js.map +1 -0
- package/src/accounts/webSocketAccountSubscriber.js +15 -27
- package/src/accounts/webSocketAccountSubscriber.js.map +1 -0
- package/src/accounts/webSocketClearingHouseAccountSubscriber.js +212 -0
- package/src/accounts/webSocketClearingHouseAccountSubscriber.js.map +1 -0
- package/src/accounts/webSocketUserAccountSubscriber.js +78 -0
- package/src/accounts/webSocketUserAccountSubscriber.js.map +1 -0
- package/src/addresses.js +20 -44
- package/src/addresses.js.map +1 -0
- package/src/admin.js +443 -0
- package/src/admin.js.map +1 -0
- package/src/admin.ts +2 -0
- package/src/assert/assert.js +10 -0
- package/src/assert/assert.js.map +1 -0
- package/src/clearingHouse.js +769 -0
- package/src/clearingHouse.js.map +1 -0
- package/src/clearingHouse.ts +47 -7
- package/src/clearingHouseUser.js +581 -0
- package/src/clearingHouseUser.js.map +1 -0
- package/src/config.js +37 -0
- package/src/config.js.map +1 -0
- package/src/constants/markets.js +167 -0
- package/src/constants/markets.js.map +1 -0
- package/src/constants/markets.ts +93 -31
- package/src/constants/numericConstants.js +22 -0
- package/src/constants/numericConstants.js.map +1 -0
- package/src/constants/numericConstants.ts +1 -0
- package/src/factory/clearingHouse.js +65 -0
- package/src/factory/clearingHouse.js.map +1 -0
- package/src/factory/clearingHouseUser.js +35 -0
- package/src/factory/clearingHouseUser.js.map +1 -0
- package/src/factory/oracleClient.js +17 -0
- package/src/factory/oracleClient.js.map +1 -0
- package/src/factory/oracleClient.ts +22 -0
- package/src/idl/clearing_house.json +22 -2
- package/src/idl/switchboard_v2.json +4663 -0
- package/src/index.js +56 -0
- package/src/index.js.map +1 -0
- package/src/index.ts +5 -1
- package/src/math/amm.js +285 -0
- package/src/math/amm.js.map +1 -0
- package/src/math/conversion.js +16 -0
- package/src/math/conversion.js.map +1 -0
- package/src/math/funding.js +223 -0
- package/src/math/funding.js.map +1 -0
- package/src/math/funding.ts +9 -25
- package/src/math/insuranceFund.js +23 -0
- package/src/math/insuranceFund.js.map +1 -0
- package/src/math/market.js +30 -0
- package/src/math/market.js.map +1 -0
- package/src/math/market.ts +9 -0
- package/src/math/orders.js +73 -0
- package/src/math/orders.js.map +1 -0
- package/src/math/position.js +121 -0
- package/src/math/position.js.map +1 -0
- package/src/math/trade.js +182 -0
- package/src/math/trade.js.map +1 -0
- package/src/math/utils.js +27 -0
- package/src/math/utils.js.map +1 -0
- package/src/mockUSDCFaucet.js +88 -116
- package/src/mockUSDCFaucet.js.map +1 -0
- package/src/oracles/pythClient.js +39 -0
- package/src/oracles/pythClient.js.map +1 -0
- package/src/oracles/pythClient.ts +49 -0
- package/src/oracles/switchboardClient.js +60 -0
- package/src/oracles/switchboardClient.js.map +1 -0
- package/src/oracles/switchboardClient.ts +87 -0
- package/src/oracles/types.js +3 -0
- package/src/oracles/types.js.map +1 -0
- package/src/oracles/types.ts +15 -0
- package/src/orderParams.js +109 -0
- package/src/orderParams.js.map +1 -0
- package/src/orderParams.ts +5 -3
- package/src/orders.js +172 -0
- package/src/orders.js.map +1 -0
- package/src/orders.ts +17 -4
- package/src/token/index.js +39 -0
- package/src/token/index.js.map +1 -0
- package/src/tx/defaultTxSender.js +13 -0
- package/src/tx/defaultTxSender.js.map +1 -0
- package/src/tx/retryTxSender.js +137 -0
- package/src/tx/retryTxSender.js.map +1 -0
- package/src/tx/types.js +3 -0
- package/src/tx/types.js.map +1 -0
- package/src/tx/utils.js +9 -0
- package/src/tx/utils.js.map +1 -0
- package/src/types.js +1 -0
- package/src/types.js.map +1 -0
- package/src/types.ts +1 -0
- package/src/util/computeUnits.js +17 -0
- package/src/util/computeUnits.js.map +1 -0
- package/src/util/tps.js +17 -0
- package/src/util/tps.js.map +1 -0
- package/src/wallet.js +23 -0
- package/src/wallet.js.map +1 -0
- package/lib/pythClient.d.ts +0 -7
- package/lib/pythClient.js +0 -25
- package/src/pythClient.ts +0 -15
package/src/index.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.PublicKey = exports.BN = void 0;
|
|
14
|
+
const anchor_1 = require("@project-serum/anchor");
|
|
15
|
+
Object.defineProperty(exports, "BN", { enumerable: true, get: function () { return anchor_1.BN; } });
|
|
16
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
17
|
+
Object.defineProperty(exports, "PublicKey", { enumerable: true, get: function () { return web3_js_1.PublicKey; } });
|
|
18
|
+
__exportStar(require("./mockUSDCFaucet"), exports);
|
|
19
|
+
__exportStar(require("./oracles/types"), exports);
|
|
20
|
+
__exportStar(require("./oracles/pythClient"), exports);
|
|
21
|
+
__exportStar(require("./oracles/switchboardClient"), exports);
|
|
22
|
+
__exportStar(require("./types"), exports);
|
|
23
|
+
__exportStar(require("./constants/markets"), exports);
|
|
24
|
+
__exportStar(require("./accounts/webSocketClearingHouseAccountSubscriber"), exports);
|
|
25
|
+
__exportStar(require("./accounts/bulkAccountLoader"), exports);
|
|
26
|
+
__exportStar(require("./accounts/bulkUserSubscription"), exports);
|
|
27
|
+
__exportStar(require("./accounts/pollingClearingHouseAccountSubscriber"), exports);
|
|
28
|
+
__exportStar(require("./accounts/pollingOracleSubscriber"), exports);
|
|
29
|
+
__exportStar(require("./accounts/pollingTokenAccountSubscriber"), exports);
|
|
30
|
+
__exportStar(require("./accounts/types"), exports);
|
|
31
|
+
__exportStar(require("./addresses"), exports);
|
|
32
|
+
__exportStar(require("./admin"), exports);
|
|
33
|
+
__exportStar(require("./clearingHouseUser"), exports);
|
|
34
|
+
__exportStar(require("./clearingHouse"), exports);
|
|
35
|
+
__exportStar(require("./factory/clearingHouse"), exports);
|
|
36
|
+
__exportStar(require("./factory/clearingHouseUser"), exports);
|
|
37
|
+
__exportStar(require("./factory/oracleClient"), exports);
|
|
38
|
+
__exportStar(require("./math/conversion"), exports);
|
|
39
|
+
__exportStar(require("./math/funding"), exports);
|
|
40
|
+
__exportStar(require("./math/insuranceFund"), exports);
|
|
41
|
+
__exportStar(require("./math/market"), exports);
|
|
42
|
+
__exportStar(require("./math/position"), exports);
|
|
43
|
+
__exportStar(require("./math/amm"), exports);
|
|
44
|
+
__exportStar(require("./math/trade"), exports);
|
|
45
|
+
__exportStar(require("./math/orders"), exports);
|
|
46
|
+
__exportStar(require("./orders"), exports);
|
|
47
|
+
__exportStar(require("./orderParams"), exports);
|
|
48
|
+
__exportStar(require("./wallet"), exports);
|
|
49
|
+
__exportStar(require("./types"), exports);
|
|
50
|
+
__exportStar(require("./math/utils"), exports);
|
|
51
|
+
__exportStar(require("./config"), exports);
|
|
52
|
+
__exportStar(require("./constants/numericConstants"), exports);
|
|
53
|
+
__exportStar(require("./tx/retryTxSender"), exports);
|
|
54
|
+
__exportStar(require("./util/computeUnits"), exports);
|
|
55
|
+
__exportStar(require("./util/tps"), exports);
|
|
56
|
+
//# sourceMappingURL=index.js.map
|
package/src/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,kDAA2C;AA0ClC,mFA1CA,WAAE,OA0CA;AAzCX,6CAA4C;AAyC/B,0FAzCJ,mBAAS,OAyCI;AAvCtB,mDAAiC;AACjC,kDAAgC;AAChC,uDAAqC;AACrC,8DAA4C;AAC5C,0CAAwB;AACxB,sDAAoC;AACpC,qFAAmE;AACnE,+DAA6C;AAC7C,kEAAgD;AAChD,mFAAiE;AACjE,qEAAmD;AACnD,2EAAyD;AACzD,mDAAiC;AACjC,8CAA4B;AAC5B,0CAAwB;AACxB,sDAAoC;AACpC,kDAAgC;AAChC,0DAAwC;AACxC,8DAA4C;AAC5C,yDAAuC;AACvC,oDAAkC;AAClC,iDAA+B;AAC/B,uDAAqC;AACrC,gDAA8B;AAC9B,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,gDAA8B;AAC9B,2CAAyB;AACzB,gDAA8B;AAC9B,2CAAyB;AACzB,0CAAwB;AACxB,+CAA6B;AAC7B,2CAAyB;AACzB,+DAA6C;AAC7C,qDAAmC;AACnC,sDAAoC;AACpC,6CAA2B"}
|
package/src/index.ts
CHANGED
|
@@ -2,13 +2,16 @@ import { BN } from '@project-serum/anchor';
|
|
|
2
2
|
import { PublicKey } from '@solana/web3.js';
|
|
3
3
|
|
|
4
4
|
export * from './mockUSDCFaucet';
|
|
5
|
-
export * from './
|
|
5
|
+
export * from './oracles/types';
|
|
6
|
+
export * from './oracles/pythClient';
|
|
7
|
+
export * from './oracles/switchboardClient';
|
|
6
8
|
export * from './types';
|
|
7
9
|
export * from './constants/markets';
|
|
8
10
|
export * from './accounts/webSocketClearingHouseAccountSubscriber';
|
|
9
11
|
export * from './accounts/bulkAccountLoader';
|
|
10
12
|
export * from './accounts/bulkUserSubscription';
|
|
11
13
|
export * from './accounts/pollingClearingHouseAccountSubscriber';
|
|
14
|
+
export * from './accounts/pollingOracleSubscriber';
|
|
12
15
|
export * from './accounts/pollingTokenAccountSubscriber';
|
|
13
16
|
export * from './accounts/types';
|
|
14
17
|
export * from './addresses';
|
|
@@ -17,6 +20,7 @@ export * from './clearingHouseUser';
|
|
|
17
20
|
export * from './clearingHouse';
|
|
18
21
|
export * from './factory/clearingHouse';
|
|
19
22
|
export * from './factory/clearingHouseUser';
|
|
23
|
+
export * from './factory/oracleClient';
|
|
20
24
|
export * from './math/conversion';
|
|
21
25
|
export * from './math/funding';
|
|
22
26
|
export * from './math/insuranceFund';
|
package/src/math/amm.js
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateBudgetedPeg = exports.calculateBudgetedK = exports.calculateMaxBaseAssetAmountToTrade = exports.calculateTerminalPrice = exports.calculateRepegCost = exports.calculateAdjustKCost = exports.getSwapDirection = exports.calculateSwapOutput = exports.calculateAmmReservesAfterSwap = exports.calculatePrice = void 0;
|
|
4
|
+
const anchor_1 = require("@project-serum/anchor");
|
|
5
|
+
const numericConstants_1 = require("../constants/numericConstants");
|
|
6
|
+
const position_1 = require("./position");
|
|
7
|
+
const types_1 = require("../types");
|
|
8
|
+
const assert_1 = require("../assert/assert");
|
|
9
|
+
const __1 = require("..");
|
|
10
|
+
/**
|
|
11
|
+
* Calculates a price given an arbitrary base and quote amount (they must have the same precision)
|
|
12
|
+
*
|
|
13
|
+
* @param baseAssetAmount
|
|
14
|
+
* @param quoteAssetAmount
|
|
15
|
+
* @param peg_multiplier
|
|
16
|
+
* @returns price : Precision MARK_PRICE_PRECISION
|
|
17
|
+
*/
|
|
18
|
+
function calculatePrice(baseAssetAmount, quoteAssetAmount, peg_multiplier) {
|
|
19
|
+
if (baseAssetAmount.abs().lte(numericConstants_1.ZERO)) {
|
|
20
|
+
return new anchor_1.BN(0);
|
|
21
|
+
}
|
|
22
|
+
return quoteAssetAmount
|
|
23
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
24
|
+
.mul(peg_multiplier)
|
|
25
|
+
.div(numericConstants_1.PEG_PRECISION)
|
|
26
|
+
.div(baseAssetAmount);
|
|
27
|
+
}
|
|
28
|
+
exports.calculatePrice = calculatePrice;
|
|
29
|
+
/**
|
|
30
|
+
* Calculates what the amm reserves would be after swapping a quote or base asset amount.
|
|
31
|
+
*
|
|
32
|
+
* @param amm
|
|
33
|
+
* @param inputAssetType
|
|
34
|
+
* @param swapAmount
|
|
35
|
+
* @param swapDirection
|
|
36
|
+
* @returns quoteAssetReserve and baseAssetReserve after swap. : Precision AMM_RESERVE_PRECISION
|
|
37
|
+
*/
|
|
38
|
+
function calculateAmmReservesAfterSwap(amm, inputAssetType, swapAmount, swapDirection) {
|
|
39
|
+
(0, assert_1.assert)(swapAmount.gte(numericConstants_1.ZERO), 'swapAmount must be greater than 0');
|
|
40
|
+
let newQuoteAssetReserve;
|
|
41
|
+
let newBaseAssetReserve;
|
|
42
|
+
if (inputAssetType === 'quote') {
|
|
43
|
+
swapAmount = swapAmount
|
|
44
|
+
.mul(numericConstants_1.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO)
|
|
45
|
+
.div(amm.pegMultiplier);
|
|
46
|
+
[newQuoteAssetReserve, newBaseAssetReserve] = calculateSwapOutput(amm.quoteAssetReserve, swapAmount, swapDirection, amm.sqrtK.mul(amm.sqrtK));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
[newBaseAssetReserve, newQuoteAssetReserve] = calculateSwapOutput(amm.baseAssetReserve, swapAmount, swapDirection, amm.sqrtK.mul(amm.sqrtK));
|
|
50
|
+
}
|
|
51
|
+
return [newQuoteAssetReserve, newBaseAssetReserve];
|
|
52
|
+
}
|
|
53
|
+
exports.calculateAmmReservesAfterSwap = calculateAmmReservesAfterSwap;
|
|
54
|
+
/**
|
|
55
|
+
* Helper function calculating constant product curve output. Agnostic to whether input asset is quote or base
|
|
56
|
+
*
|
|
57
|
+
* @param inputAssetReserve
|
|
58
|
+
* @param swapAmount
|
|
59
|
+
* @param swapDirection
|
|
60
|
+
* @param invariant
|
|
61
|
+
* @returns newInputAssetReserve and newOutputAssetReserve after swap. : Precision AMM_RESERVE_PRECISION
|
|
62
|
+
*/
|
|
63
|
+
function calculateSwapOutput(inputAssetReserve, swapAmount, swapDirection, invariant) {
|
|
64
|
+
let newInputAssetReserve;
|
|
65
|
+
if (swapDirection === types_1.SwapDirection.ADD) {
|
|
66
|
+
newInputAssetReserve = inputAssetReserve.add(swapAmount);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
newInputAssetReserve = inputAssetReserve.sub(swapAmount);
|
|
70
|
+
}
|
|
71
|
+
const newOutputAssetReserve = invariant.div(newInputAssetReserve);
|
|
72
|
+
return [newInputAssetReserve, newOutputAssetReserve];
|
|
73
|
+
}
|
|
74
|
+
exports.calculateSwapOutput = calculateSwapOutput;
|
|
75
|
+
/**
|
|
76
|
+
* Translate long/shorting quote/base asset into amm operation
|
|
77
|
+
*
|
|
78
|
+
* @param inputAssetType
|
|
79
|
+
* @param positionDirection
|
|
80
|
+
*/
|
|
81
|
+
function getSwapDirection(inputAssetType, positionDirection) {
|
|
82
|
+
if ((0, types_1.isVariant)(positionDirection, 'long') && inputAssetType === 'base') {
|
|
83
|
+
return types_1.SwapDirection.REMOVE;
|
|
84
|
+
}
|
|
85
|
+
if ((0, types_1.isVariant)(positionDirection, 'short') && inputAssetType === 'quote') {
|
|
86
|
+
return types_1.SwapDirection.REMOVE;
|
|
87
|
+
}
|
|
88
|
+
return types_1.SwapDirection.ADD;
|
|
89
|
+
}
|
|
90
|
+
exports.getSwapDirection = getSwapDirection;
|
|
91
|
+
/**
|
|
92
|
+
* Helper function calculating adjust k cost
|
|
93
|
+
* @param market
|
|
94
|
+
* @param marketIndex
|
|
95
|
+
* @param numerator
|
|
96
|
+
* @param denomenator
|
|
97
|
+
* @returns cost : Precision QUOTE_ASSET_PRECISION
|
|
98
|
+
*/
|
|
99
|
+
function calculateAdjustKCost(market, marketIndex, numerator, denomenator) {
|
|
100
|
+
const netUserPosition = {
|
|
101
|
+
baseAssetAmount: market.baseAssetAmount,
|
|
102
|
+
lastCumulativeFundingRate: market.amm.cumulativeFundingRate,
|
|
103
|
+
marketIndex: new anchor_1.BN(marketIndex),
|
|
104
|
+
quoteAssetAmount: new anchor_1.BN(0),
|
|
105
|
+
openOrders: new anchor_1.BN(0),
|
|
106
|
+
};
|
|
107
|
+
const currentValue = (0, position_1.calculateBaseAssetValue)(market, netUserPosition);
|
|
108
|
+
const marketNewK = Object.assign({}, market);
|
|
109
|
+
marketNewK.amm = Object.assign({}, market.amm);
|
|
110
|
+
marketNewK.amm.baseAssetReserve = market.amm.baseAssetReserve
|
|
111
|
+
.mul(numerator)
|
|
112
|
+
.div(denomenator);
|
|
113
|
+
marketNewK.amm.quoteAssetReserve = market.amm.quoteAssetReserve
|
|
114
|
+
.mul(numerator)
|
|
115
|
+
.div(denomenator);
|
|
116
|
+
marketNewK.amm.sqrtK = market.amm.sqrtK.mul(numerator).div(denomenator);
|
|
117
|
+
netUserPosition.quoteAssetAmount = currentValue;
|
|
118
|
+
const cost = (0, __1.calculatePositionPNL)(marketNewK, netUserPosition);
|
|
119
|
+
const p = numericConstants_1.PEG_PRECISION.mul(numerator).div(denomenator);
|
|
120
|
+
const x = market.amm.baseAssetReserve;
|
|
121
|
+
const y = market.amm.quoteAssetReserve;
|
|
122
|
+
const delta = market.baseAssetAmount;
|
|
123
|
+
const k = market.amm.sqrtK.mul(market.amm.sqrtK);
|
|
124
|
+
const numer1 = numericConstants_1.PEG_PRECISION.sub(p).mul(y).div(numericConstants_1.PEG_PRECISION);
|
|
125
|
+
const numer20 = k
|
|
126
|
+
.mul(p)
|
|
127
|
+
.mul(p)
|
|
128
|
+
.div(numericConstants_1.PEG_PRECISION)
|
|
129
|
+
.div(numericConstants_1.PEG_PRECISION)
|
|
130
|
+
.div(x.mul(p).div(numericConstants_1.PEG_PRECISION).add(delta));
|
|
131
|
+
const numer21 = k.div(x.add(delta));
|
|
132
|
+
const formulaCost = numer21
|
|
133
|
+
.sub(numer20)
|
|
134
|
+
.sub(numer1)
|
|
135
|
+
.mul(market.amm.pegMultiplier)
|
|
136
|
+
.div(numericConstants_1.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO);
|
|
137
|
+
console.log((0, __1.convertToNumber)(formulaCost, numericConstants_1.QUOTE_PRECISION));
|
|
138
|
+
// p.div(p.mul(x).add(delta)).sub()
|
|
139
|
+
return cost;
|
|
140
|
+
}
|
|
141
|
+
exports.calculateAdjustKCost = calculateAdjustKCost;
|
|
142
|
+
/**
|
|
143
|
+
* Helper function calculating adjust pegMultiplier (repeg) cost
|
|
144
|
+
*
|
|
145
|
+
* @param market
|
|
146
|
+
* @param marketIndex
|
|
147
|
+
* @param newPeg
|
|
148
|
+
* @returns cost : Precision QUOTE_ASSET_PRECISION
|
|
149
|
+
*/
|
|
150
|
+
function calculateRepegCost(market, marketIndex, newPeg) {
|
|
151
|
+
const netUserPosition = {
|
|
152
|
+
baseAssetAmount: market.baseAssetAmount,
|
|
153
|
+
lastCumulativeFundingRate: market.amm.cumulativeFundingRate,
|
|
154
|
+
marketIndex: new anchor_1.BN(marketIndex),
|
|
155
|
+
quoteAssetAmount: new anchor_1.BN(0),
|
|
156
|
+
openOrders: new anchor_1.BN(0),
|
|
157
|
+
};
|
|
158
|
+
const currentValue = (0, position_1.calculateBaseAssetValue)(market, netUserPosition);
|
|
159
|
+
netUserPosition.quoteAssetAmount = currentValue;
|
|
160
|
+
const prevMarketPrice = (0, __1.calculateMarkPrice)(market);
|
|
161
|
+
const marketNewPeg = Object.assign({}, market);
|
|
162
|
+
marketNewPeg.amm = Object.assign({}, market.amm);
|
|
163
|
+
// const marketNewPeg = JSON.parse(JSON.stringify(market));
|
|
164
|
+
marketNewPeg.amm.pegMultiplier = newPeg;
|
|
165
|
+
console.log('Price moves from', (0, __1.convertToNumber)(prevMarketPrice), 'to', (0, __1.convertToNumber)((0, __1.calculateMarkPrice)(marketNewPeg)));
|
|
166
|
+
const cost = (0, __1.calculatePositionPNL)(marketNewPeg, netUserPosition);
|
|
167
|
+
const k = market.amm.sqrtK.mul(market.amm.sqrtK);
|
|
168
|
+
const newQuoteAssetReserve = k.div(market.amm.baseAssetReserve.add(netUserPosition.baseAssetAmount));
|
|
169
|
+
const deltaQuoteAssetReserves = newQuoteAssetReserve.sub(market.amm.quoteAssetReserve);
|
|
170
|
+
const cost2 = deltaQuoteAssetReserves
|
|
171
|
+
.mul(market.amm.pegMultiplier.sub(newPeg))
|
|
172
|
+
.div(numericConstants_1.AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO);
|
|
173
|
+
console.log((0, __1.convertToNumber)(cost2, numericConstants_1.QUOTE_PRECISION));
|
|
174
|
+
return cost;
|
|
175
|
+
}
|
|
176
|
+
exports.calculateRepegCost = calculateRepegCost;
|
|
177
|
+
/**
|
|
178
|
+
* Helper function calculating terminal price of amm
|
|
179
|
+
*
|
|
180
|
+
* @param market
|
|
181
|
+
* @returns cost : Precision MARK_PRICE_PRECISION
|
|
182
|
+
*/
|
|
183
|
+
function calculateTerminalPrice(market) {
|
|
184
|
+
const directionToClose = market.baseAssetAmount.gt(numericConstants_1.ZERO)
|
|
185
|
+
? types_1.PositionDirection.SHORT
|
|
186
|
+
: types_1.PositionDirection.LONG;
|
|
187
|
+
const [newQuoteAssetReserve, newBaseAssetReserve] = calculateAmmReservesAfterSwap(market.amm, 'base', market.baseAssetAmount.abs(), getSwapDirection('base', directionToClose));
|
|
188
|
+
const terminalPrice = newQuoteAssetReserve
|
|
189
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
190
|
+
.mul(market.amm.pegMultiplier)
|
|
191
|
+
.div(numericConstants_1.PEG_PRECISION)
|
|
192
|
+
.div(newBaseAssetReserve);
|
|
193
|
+
return terminalPrice;
|
|
194
|
+
}
|
|
195
|
+
exports.calculateTerminalPrice = calculateTerminalPrice;
|
|
196
|
+
function calculateMaxBaseAssetAmountToTrade(amm, limit_price) {
|
|
197
|
+
const invariant = amm.sqrtK.mul(amm.sqrtK);
|
|
198
|
+
const newBaseAssetReserveSquared = invariant
|
|
199
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
200
|
+
.mul(amm.pegMultiplier)
|
|
201
|
+
.div(limit_price)
|
|
202
|
+
.div(numericConstants_1.PEG_PRECISION);
|
|
203
|
+
const newBaseAssetReserve = (0, __1.squareRootBN)(newBaseAssetReserveSquared);
|
|
204
|
+
if (newBaseAssetReserve.gt(amm.baseAssetReserve)) {
|
|
205
|
+
return [
|
|
206
|
+
newBaseAssetReserve.sub(amm.baseAssetReserve),
|
|
207
|
+
types_1.PositionDirection.SHORT,
|
|
208
|
+
];
|
|
209
|
+
}
|
|
210
|
+
else if (newBaseAssetReserve.lt(amm.baseAssetReserve)) {
|
|
211
|
+
return [
|
|
212
|
+
amm.baseAssetReserve.sub(newBaseAssetReserve),
|
|
213
|
+
types_1.PositionDirection.LONG,
|
|
214
|
+
];
|
|
215
|
+
}
|
|
216
|
+
else {
|
|
217
|
+
console.log('tradeSize Too Small');
|
|
218
|
+
return [new anchor_1.BN(0), types_1.PositionDirection.LONG];
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.calculateMaxBaseAssetAmountToTrade = calculateMaxBaseAssetAmountToTrade;
|
|
222
|
+
function calculateBudgetedK(market, cost) {
|
|
223
|
+
// wolframalpha.com
|
|
224
|
+
// (1/(x+d) - p/(x*p+d))*y*d*Q = C solve for p
|
|
225
|
+
// p = (d(y*d*Q - C(x+d))) / (C*x(x+d) + y*y*d*Q)
|
|
226
|
+
// todo: assumes k = x * y
|
|
227
|
+
// otherwise use: (y(1-p) + (kp^2/(x*p+d)) - k/(x+d)) * Q = C solve for p
|
|
228
|
+
// const k = market.amm.sqrtK.mul(market.amm.sqrtK);
|
|
229
|
+
const x = market.amm.baseAssetReserve;
|
|
230
|
+
const y = market.amm.quoteAssetReserve;
|
|
231
|
+
const d = market.baseAssetAmount;
|
|
232
|
+
const Q = market.amm.pegMultiplier;
|
|
233
|
+
const C = cost.mul(new anchor_1.BN(-1));
|
|
234
|
+
const numer1 = y.mul(d).mul(Q).div(numericConstants_1.AMM_RESERVE_PRECISION).div(numericConstants_1.PEG_PRECISION);
|
|
235
|
+
const numer2 = C.mul(x.add(d)).div(numericConstants_1.QUOTE_PRECISION);
|
|
236
|
+
const denom1 = C.mul(x)
|
|
237
|
+
.mul(x.add(d))
|
|
238
|
+
.div(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
239
|
+
.div(numericConstants_1.QUOTE_PRECISION);
|
|
240
|
+
const denom2 = y
|
|
241
|
+
.mul(d)
|
|
242
|
+
.mul(d)
|
|
243
|
+
.mul(Q)
|
|
244
|
+
.div(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
245
|
+
.div(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
246
|
+
.div(numericConstants_1.PEG_PRECISION);
|
|
247
|
+
const numerator = d
|
|
248
|
+
.mul(numer1.add(numer2))
|
|
249
|
+
.div(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
250
|
+
.div(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
251
|
+
.div(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO);
|
|
252
|
+
const denominator = denom1
|
|
253
|
+
.add(denom2)
|
|
254
|
+
.div(numericConstants_1.AMM_RESERVE_PRECISION)
|
|
255
|
+
.div(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO);
|
|
256
|
+
console.log(numerator, denominator);
|
|
257
|
+
// const p = (numerator).div(denominator);
|
|
258
|
+
// const formulaCost = (numer21.sub(numer20).sub(numer1)).mul(market.amm.pegMultiplier).div(AMM_TIMES_PEG_TO_QUOTE_PRECISION_RATIO)
|
|
259
|
+
// console.log(convertToNumber(formulaCost, QUOTE_PRECISION))
|
|
260
|
+
return [numerator, denominator];
|
|
261
|
+
}
|
|
262
|
+
exports.calculateBudgetedK = calculateBudgetedK;
|
|
263
|
+
function calculateBudgetedPeg(market, cost) {
|
|
264
|
+
// wolframalpha.com
|
|
265
|
+
// (1/(x+d) - p/(x*p+d))*y*d*Q = C solve for p
|
|
266
|
+
// p = (d(y*d*Q - C(x+d))) / (C*x(x+d) + y*y*d*Q)
|
|
267
|
+
// todo: assumes k = x * y
|
|
268
|
+
// otherwise use: (y(1-p) + (kp^2/(x*p+d)) - k/(x+d)) * Q = C solve for p
|
|
269
|
+
const k = market.amm.sqrtK.mul(market.amm.sqrtK);
|
|
270
|
+
const x = market.amm.baseAssetReserve;
|
|
271
|
+
const y = market.amm.quoteAssetReserve;
|
|
272
|
+
const d = market.baseAssetAmount;
|
|
273
|
+
const Q = market.amm.pegMultiplier;
|
|
274
|
+
const C = cost.mul(new anchor_1.BN(-1));
|
|
275
|
+
const deltaQuoteAssetReserves = y.sub(k.div(x.add(d)));
|
|
276
|
+
const deltaPegMultiplier = C.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
277
|
+
.div(deltaQuoteAssetReserves.div(numericConstants_1.AMM_TO_QUOTE_PRECISION_RATIO))
|
|
278
|
+
.mul(numericConstants_1.PEG_PRECISION)
|
|
279
|
+
.div(numericConstants_1.QUOTE_PRECISION);
|
|
280
|
+
console.log(Q.toNumber(), 'change by', deltaPegMultiplier.toNumber() / numericConstants_1.MARK_PRICE_PRECISION.toNumber());
|
|
281
|
+
const newPeg = Q.sub(deltaPegMultiplier.mul(numericConstants_1.PEG_PRECISION).div(numericConstants_1.MARK_PRICE_PRECISION));
|
|
282
|
+
return newPeg;
|
|
283
|
+
}
|
|
284
|
+
exports.calculateBudgetedPeg = calculateBudgetedPeg;
|
|
285
|
+
//# sourceMappingURL=amm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"amm.js","sourceRoot":"","sources":["amm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertBaseAssetAmountToNumber = exports.convertToNumber = void 0;
|
|
4
|
+
const numericConstants_1 = require("../constants/numericConstants");
|
|
5
|
+
const convertToNumber = (bigNumber, precision = numericConstants_1.MARK_PRICE_PRECISION) => {
|
|
6
|
+
if (!bigNumber)
|
|
7
|
+
return 0;
|
|
8
|
+
return (bigNumber.div(precision).toNumber() +
|
|
9
|
+
bigNumber.mod(precision).toNumber() / precision.toNumber());
|
|
10
|
+
};
|
|
11
|
+
exports.convertToNumber = convertToNumber;
|
|
12
|
+
const convertBaseAssetAmountToNumber = (baseAssetAmount) => {
|
|
13
|
+
return (0, exports.convertToNumber)(baseAssetAmount, numericConstants_1.MARK_PRICE_PRECISION.mul(numericConstants_1.PEG_PRECISION));
|
|
14
|
+
};
|
|
15
|
+
exports.convertBaseAssetAmountToNumber = convertBaseAssetAmountToNumber;
|
|
16
|
+
//# sourceMappingURL=conversion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversion.js","sourceRoot":"","sources":["conversion.ts"],"names":[],"mappings":";;;AACA,oEAGuC;AAEhC,MAAM,eAAe,GAAG,CAC9B,SAAa,EACb,YAAgB,uCAAoB,EACnC,EAAE;IACH,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,CAAC;IACzB,OAAO,CACN,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE;QACnC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAC1D,CAAC;AACH,CAAC,CAAC;AATW,QAAA,eAAe,mBAS1B;AAEK,MAAM,8BAA8B,GAAG,CAAC,eAAmB,EAAE,EAAE;IACrE,OAAO,IAAA,uBAAe,EACrB,eAAe,EACf,uCAAoB,CAAC,GAAG,CAAC,gCAAa,CAAC,CACvC,CAAC;AACH,CAAC,CAAC;AALW,QAAA,8BAA8B,kCAKzC"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.calculateFundingPool = exports.calculateLongShortFundingRateAndLiveTwaps = exports.calculateLongShortFundingRate = exports.calculateEstimatedFundingRate = exports.calculateAllEstimatedFundingRate = void 0;
|
|
4
|
+
const anchor_1 = require("@project-serum/anchor");
|
|
5
|
+
const numericConstants_1 = require("../constants/numericConstants");
|
|
6
|
+
const market_1 = require("./market");
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param market
|
|
10
|
+
* @param oraclePriceData
|
|
11
|
+
* @param periodAdjustment
|
|
12
|
+
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
13
|
+
*/
|
|
14
|
+
async function calculateAllEstimatedFundingRate(market, oraclePriceData, periodAdjustment = new anchor_1.BN(1)) {
|
|
15
|
+
// periodAdjustment
|
|
16
|
+
// 1: hourly
|
|
17
|
+
// 24: daily
|
|
18
|
+
// 24 * 365.25: annualized
|
|
19
|
+
const secondsInHour = new anchor_1.BN(3600);
|
|
20
|
+
const hoursInDay = new anchor_1.BN(24);
|
|
21
|
+
if (!market.initialized) {
|
|
22
|
+
return [numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO, numericConstants_1.ZERO];
|
|
23
|
+
}
|
|
24
|
+
const payFreq = new anchor_1.BN(market.amm.fundingPeriod);
|
|
25
|
+
// todo: sufficiently differs from blockchain timestamp?
|
|
26
|
+
const now = new anchor_1.BN((Date.now() / 1000).toFixed(0));
|
|
27
|
+
const timeSinceLastUpdate = now.sub(market.amm.lastFundingRateTs);
|
|
28
|
+
// calculate real-time mark twap
|
|
29
|
+
const lastMarkTwapWithMantissa = market.amm.lastMarkPriceTwap;
|
|
30
|
+
const lastMarkPriceTwapTs = market.amm.lastMarkPriceTwapTs;
|
|
31
|
+
const timeSinceLastMarkChange = now.sub(lastMarkPriceTwapTs);
|
|
32
|
+
const markTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastMarkChange));
|
|
33
|
+
const baseAssetPriceWithMantissa = (0, market_1.calculateMarkPrice)(market);
|
|
34
|
+
const markTwapWithMantissa = markTwapTimeSinceLastUpdate
|
|
35
|
+
.mul(lastMarkTwapWithMantissa)
|
|
36
|
+
.add(timeSinceLastMarkChange.mul(baseAssetPriceWithMantissa))
|
|
37
|
+
.div(timeSinceLastMarkChange.add(markTwapTimeSinceLastUpdate));
|
|
38
|
+
// calculate real-time (predicted) oracle twap
|
|
39
|
+
// note: oracle twap depends on `when the chord is struck` (market is trade)
|
|
40
|
+
const lastOracleTwapWithMantissa = market.amm.lastOraclePriceTwap;
|
|
41
|
+
const lastOraclePriceTwapTs = market.amm.lastOraclePriceTwapTs;
|
|
42
|
+
const timeSinceLastOracleTwapUpdate = now.sub(lastOraclePriceTwapTs);
|
|
43
|
+
const oracleTwapTimeSinceLastUpdate = anchor_1.BN.max(secondsInHour, secondsInHour.sub(timeSinceLastOracleTwapUpdate));
|
|
44
|
+
const oraclePrice = oraclePriceData.price;
|
|
45
|
+
let oracleTwapWithMantissa = lastOracleTwapWithMantissa;
|
|
46
|
+
const oracleLiveVsTwap = oraclePrice
|
|
47
|
+
.sub(lastOracleTwapWithMantissa)
|
|
48
|
+
.abs()
|
|
49
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
50
|
+
.mul(new anchor_1.BN(100))
|
|
51
|
+
.div(lastOracleTwapWithMantissa);
|
|
52
|
+
// verify pyth live input is within 10% of last twap for live update
|
|
53
|
+
if (oracleLiveVsTwap.lte(numericConstants_1.MARK_PRICE_PRECISION.mul(new anchor_1.BN(10)))) {
|
|
54
|
+
oracleTwapWithMantissa = oracleTwapTimeSinceLastUpdate
|
|
55
|
+
.mul(lastOracleTwapWithMantissa)
|
|
56
|
+
.add(timeSinceLastMarkChange.mul(oraclePrice))
|
|
57
|
+
.div(timeSinceLastOracleTwapUpdate.add(oracleTwapTimeSinceLastUpdate));
|
|
58
|
+
}
|
|
59
|
+
const twapSpread = lastMarkTwapWithMantissa.sub(lastOracleTwapWithMantissa);
|
|
60
|
+
const twapSpreadPct = twapSpread
|
|
61
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
62
|
+
.mul(new anchor_1.BN(100))
|
|
63
|
+
.div(oracleTwapWithMantissa);
|
|
64
|
+
const lowerboundEst = twapSpreadPct
|
|
65
|
+
.mul(payFreq)
|
|
66
|
+
.mul(anchor_1.BN.min(secondsInHour, timeSinceLastUpdate))
|
|
67
|
+
.mul(periodAdjustment)
|
|
68
|
+
.div(secondsInHour)
|
|
69
|
+
.div(secondsInHour)
|
|
70
|
+
.div(hoursInDay);
|
|
71
|
+
const interpEst = twapSpreadPct.mul(periodAdjustment).div(hoursInDay);
|
|
72
|
+
const interpRateQuote = twapSpreadPct
|
|
73
|
+
.mul(periodAdjustment)
|
|
74
|
+
.div(hoursInDay)
|
|
75
|
+
.div(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION));
|
|
76
|
+
let feePoolSize = calculateFundingPool(market);
|
|
77
|
+
if (interpRateQuote.lt(new anchor_1.BN(0))) {
|
|
78
|
+
feePoolSize = feePoolSize.mul(new anchor_1.BN(-1));
|
|
79
|
+
}
|
|
80
|
+
let cappedAltEst;
|
|
81
|
+
let largerSide;
|
|
82
|
+
let smallerSide;
|
|
83
|
+
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
|
|
84
|
+
largerSide = market.baseAssetAmountLong.abs();
|
|
85
|
+
smallerSide = market.baseAssetAmountShort.abs();
|
|
86
|
+
if (twapSpread.gt(new anchor_1.BN(0))) {
|
|
87
|
+
return [
|
|
88
|
+
markTwapWithMantissa,
|
|
89
|
+
oracleTwapWithMantissa,
|
|
90
|
+
lowerboundEst,
|
|
91
|
+
interpEst,
|
|
92
|
+
interpEst,
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
|
|
97
|
+
largerSide = market.baseAssetAmountShort.abs();
|
|
98
|
+
smallerSide = market.baseAssetAmountLong.abs();
|
|
99
|
+
if (twapSpread.lt(new anchor_1.BN(0))) {
|
|
100
|
+
return [
|
|
101
|
+
markTwapWithMantissa,
|
|
102
|
+
oracleTwapWithMantissa,
|
|
103
|
+
lowerboundEst,
|
|
104
|
+
interpEst,
|
|
105
|
+
interpEst,
|
|
106
|
+
];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
return [
|
|
111
|
+
markTwapWithMantissa,
|
|
112
|
+
oracleTwapWithMantissa,
|
|
113
|
+
lowerboundEst,
|
|
114
|
+
interpEst,
|
|
115
|
+
interpEst,
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
if (largerSide.gt(numericConstants_1.ZERO)) {
|
|
119
|
+
// funding smaller flow
|
|
120
|
+
cappedAltEst = smallerSide.mul(twapSpread).div(hoursInDay);
|
|
121
|
+
const feePoolTopOff = feePoolSize
|
|
122
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION.div(numericConstants_1.QUOTE_PRECISION))
|
|
123
|
+
.mul(numericConstants_1.AMM_RESERVE_PRECISION);
|
|
124
|
+
cappedAltEst = cappedAltEst.add(feePoolTopOff).div(largerSide);
|
|
125
|
+
cappedAltEst = cappedAltEst
|
|
126
|
+
.mul(numericConstants_1.MARK_PRICE_PRECISION)
|
|
127
|
+
.mul(new anchor_1.BN(100))
|
|
128
|
+
.div(oracleTwapWithMantissa)
|
|
129
|
+
.mul(periodAdjustment);
|
|
130
|
+
if (cappedAltEst.abs().gte(interpEst.abs())) {
|
|
131
|
+
cappedAltEst = interpEst;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
cappedAltEst = interpEst;
|
|
136
|
+
}
|
|
137
|
+
return [
|
|
138
|
+
markTwapWithMantissa,
|
|
139
|
+
oracleTwapWithMantissa,
|
|
140
|
+
lowerboundEst,
|
|
141
|
+
cappedAltEst,
|
|
142
|
+
interpEst,
|
|
143
|
+
];
|
|
144
|
+
}
|
|
145
|
+
exports.calculateAllEstimatedFundingRate = calculateAllEstimatedFundingRate;
|
|
146
|
+
/**
|
|
147
|
+
*
|
|
148
|
+
* @param market
|
|
149
|
+
* @param oraclePriceData
|
|
150
|
+
* @param periodAdjustment
|
|
151
|
+
* @param estimationMethod
|
|
152
|
+
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
153
|
+
*/
|
|
154
|
+
async function calculateEstimatedFundingRate(market, oraclePriceData, periodAdjustment = new anchor_1.BN(1), estimationMethod) {
|
|
155
|
+
const [_1, _2, lowerboundEst, cappedAltEst, interpEst] = await calculateAllEstimatedFundingRate(market, oraclePriceData, periodAdjustment);
|
|
156
|
+
if (estimationMethod == 'lowerbound') {
|
|
157
|
+
//assuming remaining funding period has no gap
|
|
158
|
+
return lowerboundEst;
|
|
159
|
+
}
|
|
160
|
+
else if (estimationMethod == 'capped') {
|
|
161
|
+
return cappedAltEst;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
return interpEst;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
exports.calculateEstimatedFundingRate = calculateEstimatedFundingRate;
|
|
168
|
+
/**
|
|
169
|
+
*
|
|
170
|
+
* @param market
|
|
171
|
+
* @param oraclePriceData
|
|
172
|
+
* @param periodAdjustment
|
|
173
|
+
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
174
|
+
*/
|
|
175
|
+
async function calculateLongShortFundingRate(market, oraclePriceData, periodAdjustment = new anchor_1.BN(1)) {
|
|
176
|
+
const [_1, _2, _, cappedAltEst, interpEst] = await calculateAllEstimatedFundingRate(market, oraclePriceData, periodAdjustment);
|
|
177
|
+
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort)) {
|
|
178
|
+
return [cappedAltEst, interpEst];
|
|
179
|
+
}
|
|
180
|
+
else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort)) {
|
|
181
|
+
return [interpEst, cappedAltEst];
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
return [interpEst, interpEst];
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
exports.calculateLongShortFundingRate = calculateLongShortFundingRate;
|
|
188
|
+
/**
|
|
189
|
+
*
|
|
190
|
+
* @param market
|
|
191
|
+
* @param oraclePriceData
|
|
192
|
+
* @param periodAdjustment
|
|
193
|
+
* @returns Estimated funding rate. : Precision //TODO-PRECISION
|
|
194
|
+
*/
|
|
195
|
+
async function calculateLongShortFundingRateAndLiveTwaps(market, oraclePriceData, periodAdjustment = new anchor_1.BN(1)) {
|
|
196
|
+
const [markTwapLive, oracleTwapLive, _2, cappedAltEst, interpEst] = await calculateAllEstimatedFundingRate(market, oraclePriceData, periodAdjustment);
|
|
197
|
+
if (market.baseAssetAmountLong.gt(market.baseAssetAmountShort.abs())) {
|
|
198
|
+
return [markTwapLive, oracleTwapLive, cappedAltEst, interpEst];
|
|
199
|
+
}
|
|
200
|
+
else if (market.baseAssetAmountLong.lt(market.baseAssetAmountShort.abs())) {
|
|
201
|
+
return [markTwapLive, oracleTwapLive, interpEst, cappedAltEst];
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
return [markTwapLive, oracleTwapLive, interpEst, interpEst];
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
exports.calculateLongShortFundingRateAndLiveTwaps = calculateLongShortFundingRateAndLiveTwaps;
|
|
208
|
+
/**
|
|
209
|
+
*
|
|
210
|
+
* @param market
|
|
211
|
+
* @returns Estimated fee pool size
|
|
212
|
+
*/
|
|
213
|
+
function calculateFundingPool(market) {
|
|
214
|
+
// todo
|
|
215
|
+
const totalFeeLB = market.amm.totalFee.div(new anchor_1.BN(2));
|
|
216
|
+
const feePool = anchor_1.BN.max(numericConstants_1.ZERO, market.amm.totalFeeMinusDistributions
|
|
217
|
+
.sub(totalFeeLB)
|
|
218
|
+
.mul(new anchor_1.BN(2))
|
|
219
|
+
.div(new anchor_1.BN(3)));
|
|
220
|
+
return feePool;
|
|
221
|
+
}
|
|
222
|
+
exports.calculateFundingPool = calculateFundingPool;
|
|
223
|
+
//# sourceMappingURL=funding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"funding.js","sourceRoot":"","sources":["funding.ts"],"names":[],"mappings":"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"}
|