@gainsnetwork/sdk 0.0.0-me-rc1
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/LICENSE +21 -0
- package/README.md +11 -0
- package/lib/backend/globalTrades/index.d.ts +11 -0
- package/lib/backend/globalTrades/index.js +69 -0
- package/lib/backend/index.d.ts +3 -0
- package/lib/backend/index.js +28 -0
- package/lib/backend/tradingVariables/backend.types.d.ts +337 -0
- package/lib/backend/tradingVariables/backend.types.js +2 -0
- package/lib/backend/tradingVariables/converter.d.ts +38 -0
- package/lib/backend/tradingVariables/converter.js +359 -0
- package/lib/backend/tradingVariables/index.d.ts +5 -0
- package/lib/backend/tradingVariables/index.js +98 -0
- package/lib/backend/tradingVariables/types.d.ts +115 -0
- package/lib/backend/tradingVariables/types.js +14 -0
- package/lib/constants.d.ts +483 -0
- package/lib/constants.js +516 -0
- package/lib/contracts/addresses.d.ts +3 -0
- package/lib/contracts/addresses.js +35 -0
- package/lib/contracts/addresses.json +266 -0
- package/lib/contracts/index.d.ts +14 -0
- package/lib/contracts/index.js +92 -0
- package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +9327 -0
- package/lib/contracts/types/generated/GNSMultiCollatDiamond.js +2 -0
- package/lib/contracts/types/generated/GToken.d.ts +1917 -0
- package/lib/contracts/types/generated/GToken.js +2 -0
- package/lib/contracts/types/generated/GTokenOpenPnlFeed.d.ts +557 -0
- package/lib/contracts/types/generated/GTokenOpenPnlFeed.js +2 -0
- package/lib/contracts/types/generated/common.d.ts +22 -0
- package/lib/contracts/types/generated/common.js +2 -0
- package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.d.ts +276 -0
- package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +21557 -0
- package/lib/contracts/types/generated/factories/GTokenOpenPnlFeed__factory.d.ts +59 -0
- package/lib/contracts/types/generated/factories/GTokenOpenPnlFeed__factory.js +765 -0
- package/lib/contracts/types/generated/factories/GToken__factory.d.ts +121 -0
- package/lib/contracts/types/generated/factories/GToken__factory.js +2867 -0
- package/lib/contracts/types/generated/factories/index.d.ts +3 -0
- package/lib/contracts/types/generated/factories/index.js +12 -0
- package/lib/contracts/types/generated/index.d.ts +7 -0
- package/lib/contracts/types/generated/index.js +33 -0
- package/lib/contracts/types/index.d.ts +37 -0
- package/lib/contracts/types/index.js +30 -0
- package/lib/contracts/utils/borrowingFees.d.ts +9 -0
- package/lib/contracts/utils/borrowingFees.js +43 -0
- package/lib/contracts/utils/index.d.ts +3 -0
- package/lib/contracts/utils/index.js +19 -0
- package/lib/contracts/utils/openTrades.d.ts +12 -0
- package/lib/contracts/utils/openTrades.js +172 -0
- package/lib/contracts/utils/pairs.d.ts +18 -0
- package/lib/contracts/utils/pairs.js +602 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +30 -0
- package/lib/markets/collateral/converter.d.ts +5 -0
- package/lib/markets/collateral/converter.js +11 -0
- package/lib/markets/collateral/index.d.ts +1 -0
- package/lib/markets/collateral/index.js +17 -0
- package/lib/markets/collateral/types.d.ts +7 -0
- package/lib/markets/collateral/types.js +2 -0
- package/lib/markets/commodities.d.ts +1 -0
- package/lib/markets/commodities.js +7 -0
- package/lib/markets/crypto.d.ts +1 -0
- package/lib/markets/crypto.js +6 -0
- package/lib/markets/forex.d.ts +3 -0
- package/lib/markets/forex.js +8 -0
- package/lib/markets/holdingFees/index.d.ts +46 -0
- package/lib/markets/holdingFees/index.js +104 -0
- package/lib/markets/holdingFees/types.d.ts +23 -0
- package/lib/markets/holdingFees/types.js +5 -0
- package/lib/markets/index.d.ts +11 -0
- package/lib/markets/index.js +27 -0
- package/lib/markets/indices.d.ts +1 -0
- package/lib/markets/indices.js +6 -0
- package/lib/markets/leverage/builder.d.ts +12 -0
- package/lib/markets/leverage/builder.js +25 -0
- package/lib/markets/leverage/getMarketLeverageRestrictions.d.ts +7 -0
- package/lib/markets/leverage/getMarketLeverageRestrictions.js +38 -0
- package/lib/markets/leverage/index.d.ts +3 -0
- package/lib/markets/leverage/index.js +19 -0
- package/lib/markets/leverage/types.d.ts +15 -0
- package/lib/markets/leverage/types.js +2 -0
- package/lib/markets/oi/converter.d.ts +62 -0
- package/lib/markets/oi/converter.js +111 -0
- package/lib/markets/oi/index.d.ts +49 -0
- package/lib/markets/oi/index.js +77 -0
- package/lib/markets/oi/types.d.ts +89 -0
- package/lib/markets/oi/types.js +6 -0
- package/lib/markets/price/builder.d.ts +25 -0
- package/lib/markets/price/builder.js +69 -0
- package/lib/markets/price/index.d.ts +7 -0
- package/lib/markets/price/index.js +23 -0
- package/lib/markets/price/marketPrice.d.ts +13 -0
- package/lib/markets/price/marketPrice.js +35 -0
- package/lib/markets/price/signedPrices.d.ts +36 -0
- package/lib/markets/price/signedPrices.js +181 -0
- package/lib/markets/price/types.d.ts +50 -0
- package/lib/markets/price/types.js +5 -0
- package/lib/markets/schedules/builders.d.ts +7 -0
- package/lib/markets/schedules/builders.js +81 -0
- package/lib/markets/schedules/checkers.d.ts +7 -0
- package/lib/markets/schedules/checkers.js +36 -0
- package/lib/markets/schedules/holidays.d.ts +4 -0
- package/lib/markets/schedules/holidays.js +77 -0
- package/lib/markets/schedules/index.d.ts +9 -0
- package/lib/markets/schedules/index.js +45 -0
- package/lib/markets/schedules/types.d.ts +43 -0
- package/lib/markets/schedules/types.js +37 -0
- package/lib/markets/stocks.d.ts +3 -0
- package/lib/markets/stocks.js +15 -0
- package/lib/pricing/depthBands.d.ts +39 -0
- package/lib/pricing/depthBands.js +94 -0
- package/lib/pricing/index.d.ts +4 -0
- package/lib/pricing/index.js +20 -0
- package/lib/trade/counterTrade/index.d.ts +2 -0
- package/lib/trade/counterTrade/index.js +18 -0
- package/lib/trade/counterTrade/types.d.ts +7 -0
- package/lib/trade/counterTrade/types.js +2 -0
- package/lib/trade/counterTrade/validateCounterTrade.d.ts +10 -0
- package/lib/trade/counterTrade/validateCounterTrade.js +29 -0
- package/lib/trade/effectiveLeverage/getTradeNewEffectiveLeverage.d.ts +20 -0
- package/lib/trade/effectiveLeverage/getTradeNewEffectiveLeverage.js +42 -0
- package/lib/trade/effectiveLeverage/index.d.ts +2 -0
- package/lib/trade/effectiveLeverage/index.js +21 -0
- package/lib/trade/effectiveLeverage/types.d.ts +30 -0
- package/lib/trade/effectiveLeverage/types.js +2 -0
- package/lib/trade/fees/borrowing/builder.d.ts +14 -0
- package/lib/trade/fees/borrowing/builder.js +33 -0
- package/lib/trade/fees/borrowing/converter.d.ts +17 -0
- package/lib/trade/fees/borrowing/converter.js +46 -0
- package/lib/trade/fees/borrowing/index.d.ts +81 -0
- package/lib/trade/fees/borrowing/index.js +259 -0
- package/lib/trade/fees/borrowing/types.d.ts +36 -0
- package/lib/trade/fees/borrowing/types.js +2 -0
- package/lib/trade/fees/borrowingV2/builder.d.ts +6 -0
- package/lib/trade/fees/borrowingV2/builder.js +23 -0
- package/lib/trade/fees/borrowingV2/converter.d.ts +75 -0
- package/lib/trade/fees/borrowingV2/converter.js +132 -0
- package/lib/trade/fees/borrowingV2/fetcher.d.ts +76 -0
- package/lib/trade/fees/borrowingV2/fetcher.js +179 -0
- package/lib/trade/fees/borrowingV2/index.d.ts +48 -0
- package/lib/trade/fees/borrowingV2/index.js +112 -0
- package/lib/trade/fees/borrowingV2/types.d.ts +95 -0
- package/lib/trade/fees/borrowingV2/types.js +5 -0
- package/lib/trade/fees/converter.d.ts +48 -0
- package/lib/trade/fees/converter.js +114 -0
- package/lib/trade/fees/fundingFees/builder.d.ts +9 -0
- package/lib/trade/fees/fundingFees/builder.js +38 -0
- package/lib/trade/fees/fundingFees/converter.d.ts +102 -0
- package/lib/trade/fees/fundingFees/converter.js +196 -0
- package/lib/trade/fees/fundingFees/fetcher.d.ts +66 -0
- package/lib/trade/fees/fundingFees/fetcher.js +141 -0
- package/lib/trade/fees/fundingFees/index.d.ts +124 -0
- package/lib/trade/fees/fundingFees/index.js +309 -0
- package/lib/trade/fees/fundingFees/pairContext.d.ts +33 -0
- package/lib/trade/fees/fundingFees/pairContext.js +17 -0
- package/lib/trade/fees/fundingFees/types.d.ts +77 -0
- package/lib/trade/fees/fundingFees/types.js +5 -0
- package/lib/trade/fees/index.d.ts +11 -0
- package/lib/trade/fees/index.js +87 -0
- package/lib/trade/fees/tiers/converter.d.ts +64 -0
- package/lib/trade/fees/tiers/converter.js +100 -0
- package/lib/trade/fees/tiers/index.d.ts +46 -0
- package/lib/trade/fees/tiers/index.js +135 -0
- package/lib/trade/fees/tiers/types.d.ts +22 -0
- package/lib/trade/fees/tiers/types.js +8 -0
- package/lib/trade/fees/trading/builder.d.ts +19 -0
- package/lib/trade/fees/trading/builder.js +21 -0
- package/lib/trade/fees/trading/converter.d.ts +32 -0
- package/lib/trade/fees/trading/converter.js +47 -0
- package/lib/trade/fees/trading/index.d.ts +62 -0
- package/lib/trade/fees/trading/index.js +157 -0
- package/lib/trade/fees/trading/types.d.ts +46 -0
- package/lib/trade/fees/trading/types.js +5 -0
- package/lib/trade/index.d.ts +10 -0
- package/lib/trade/index.js +26 -0
- package/lib/trade/liquidation/builder.d.ts +25 -0
- package/lib/trade/liquidation/builder.js +58 -0
- package/lib/trade/liquidation/converter.d.ts +23 -0
- package/lib/trade/liquidation/converter.js +46 -0
- package/lib/trade/liquidation/index.d.ts +29 -0
- package/lib/trade/liquidation/index.js +216 -0
- package/lib/trade/liquidation/types.d.ts +38 -0
- package/lib/trade/liquidation/types.js +2 -0
- package/lib/trade/oiWindows.d.ts +3 -0
- package/lib/trade/oiWindows.js +19 -0
- package/lib/trade/pnl/builder.d.ts +16 -0
- package/lib/trade/pnl/builder.js +43 -0
- package/lib/trade/pnl/converter.d.ts +47 -0
- package/lib/trade/pnl/converter.js +72 -0
- package/lib/trade/pnl/index.d.ts +91 -0
- package/lib/trade/pnl/index.js +301 -0
- package/lib/trade/pnl/types.d.ts +79 -0
- package/lib/trade/pnl/types.js +5 -0
- package/lib/trade/priceImpact/close/builder.d.ts +23 -0
- package/lib/trade/priceImpact/close/builder.js +44 -0
- package/lib/trade/priceImpact/close/index.d.ts +22 -0
- package/lib/trade/priceImpact/close/index.js +137 -0
- package/lib/trade/priceImpact/close/types.d.ts +47 -0
- package/lib/trade/priceImpact/close/types.js +5 -0
- package/lib/trade/priceImpact/cumulVol/builder.d.ts +22 -0
- package/lib/trade/priceImpact/cumulVol/builder.js +53 -0
- package/lib/trade/priceImpact/cumulVol/converter.d.ts +94 -0
- package/lib/trade/priceImpact/cumulVol/converter.js +155 -0
- package/lib/trade/priceImpact/cumulVol/index.d.ts +109 -0
- package/lib/trade/priceImpact/cumulVol/index.js +316 -0
- package/lib/trade/priceImpact/cumulVol/types.d.ts +11 -0
- package/lib/trade/priceImpact/cumulVol/types.js +2 -0
- package/lib/trade/priceImpact/index.d.ts +21 -0
- package/lib/trade/priceImpact/index.js +79 -0
- package/lib/trade/priceImpact/open/builder.d.ts +21 -0
- package/lib/trade/priceImpact/open/builder.js +42 -0
- package/lib/trade/priceImpact/open/index.d.ts +23 -0
- package/lib/trade/priceImpact/open/index.js +82 -0
- package/lib/trade/priceImpact/open/types.d.ts +45 -0
- package/lib/trade/priceImpact/open/types.js +5 -0
- package/lib/trade/priceImpact/skew/builder.d.ts +12 -0
- package/lib/trade/priceImpact/skew/builder.js +27 -0
- package/lib/trade/priceImpact/skew/converter.d.ts +46 -0
- package/lib/trade/priceImpact/skew/converter.js +81 -0
- package/lib/trade/priceImpact/skew/fetcher.d.ts +60 -0
- package/lib/trade/priceImpact/skew/fetcher.js +160 -0
- package/lib/trade/priceImpact/skew/index.d.ts +53 -0
- package/lib/trade/priceImpact/skew/index.js +148 -0
- package/lib/trade/priceImpact/skew/types.d.ts +44 -0
- package/lib/trade/priceImpact/skew/types.js +5 -0
- package/lib/trade/spread.d.ts +5 -0
- package/lib/trade/spread.js +19 -0
- package/lib/trade/types.d.ts +777 -0
- package/lib/trade/types.js +478 -0
- package/lib/trade/utils.d.ts +18 -0
- package/lib/trade/utils.js +30 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +17 -0
- package/lib/utils/packing.d.ts +2 -0
- package/lib/utils/packing.js +39 -0
- package/lib/vault/index.d.ts +10 -0
- package/lib/vault/index.js +10 -0
- package/package.json +106 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getTradeEffectiveLeverage = exports.getTradeNewEffectiveLeverage = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @dev Calculates the effective leverage of a trade accounting for unrealized PnL
|
|
6
|
+
* @dev Effective leverage increases when PnL is negative and decreases when positive
|
|
7
|
+
* @dev Mirrors contract's getTradeNewEffectiveLeverage function
|
|
8
|
+
* @param input Trade parameters including new position values
|
|
9
|
+
* @returns Effective leverage and related values
|
|
10
|
+
*/
|
|
11
|
+
const getTradeNewEffectiveLeverage = (input) => {
|
|
12
|
+
const { newOpenPrice, newCollateralAmount, newLeverage, currentPairPrice, tradeValueCollateral, } = input;
|
|
13
|
+
// Calculate new position size
|
|
14
|
+
const newPositionSize = newCollateralAmount * newLeverage;
|
|
15
|
+
// Calculate dynamic position size (matching on-chain logic)
|
|
16
|
+
// This adjusts position size based on current price vs open price
|
|
17
|
+
const newPosSizeCollateralDynamic = (newPositionSize * currentPairPrice) / newOpenPrice;
|
|
18
|
+
// Use the provided trade value as margin value
|
|
19
|
+
// This already includes collateral + PnL with price impact - fees
|
|
20
|
+
const newMarginValueCollateral = tradeValueCollateral;
|
|
21
|
+
// Calculate effective leverage (matching on-chain)
|
|
22
|
+
// If margin value is <= 0, leverage is effectively infinite
|
|
23
|
+
const effectiveLeverage = newMarginValueCollateral > 0
|
|
24
|
+
? newPosSizeCollateralDynamic / newMarginValueCollateral
|
|
25
|
+
: Number.MAX_SAFE_INTEGER;
|
|
26
|
+
return {
|
|
27
|
+
effectiveLeverage,
|
|
28
|
+
unrealizedPnl: tradeValueCollateral - newCollateralAmount,
|
|
29
|
+
effectiveCollateral: newMarginValueCollateral,
|
|
30
|
+
positionSize: newPositionSize,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
exports.getTradeNewEffectiveLeverage = getTradeNewEffectiveLeverage;
|
|
34
|
+
/**
|
|
35
|
+
* @dev Simplified version for existing positions
|
|
36
|
+
* @param input Trade parameters
|
|
37
|
+
* @returns Effective leverage and related values
|
|
38
|
+
*/
|
|
39
|
+
const getTradeEffectiveLeverage = (input) => {
|
|
40
|
+
return (0, exports.getTradeNewEffectiveLeverage)(input);
|
|
41
|
+
};
|
|
42
|
+
exports.getTradeEffectiveLeverage = getTradeEffectiveLeverage;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.getTradeEffectiveLeverage = exports.getTradeNewEffectiveLeverage = void 0;
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
var getTradeNewEffectiveLeverage_1 = require("./getTradeNewEffectiveLeverage");
|
|
20
|
+
Object.defineProperty(exports, "getTradeNewEffectiveLeverage", { enumerable: true, get: function () { return getTradeNewEffectiveLeverage_1.getTradeNewEffectiveLeverage; } });
|
|
21
|
+
Object.defineProperty(exports, "getTradeEffectiveLeverage", { enumerable: true, get: function () { return getTradeNewEffectiveLeverage_1.getTradeEffectiveLeverage; } });
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dev Types for trade effective leverage calculations
|
|
3
|
+
*/
|
|
4
|
+
import { Trade } from "..";
|
|
5
|
+
/**
|
|
6
|
+
* @dev Input parameters for effective leverage calculation
|
|
7
|
+
* @dev Mirrors contract's parameters for getTradeNewEffectiveLeverage
|
|
8
|
+
*/
|
|
9
|
+
export type TradeEffectiveLeverageInput = {
|
|
10
|
+
trade: Trade;
|
|
11
|
+
newOpenPrice: number;
|
|
12
|
+
newCollateralAmount: number;
|
|
13
|
+
newLeverage: number;
|
|
14
|
+
currentPairPrice: number;
|
|
15
|
+
tradeValueCollateral: number;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* @dev Context for effective leverage calculation
|
|
19
|
+
* Simplified context since price impact is now included in tradeValueCollateral
|
|
20
|
+
*/
|
|
21
|
+
export type TradeEffectiveLeverageContext = {};
|
|
22
|
+
/**
|
|
23
|
+
* @dev Result of effective leverage calculation
|
|
24
|
+
*/
|
|
25
|
+
export type TradeEffectiveLeverageResult = {
|
|
26
|
+
effectiveLeverage: number;
|
|
27
|
+
unrealizedPnl: number;
|
|
28
|
+
effectiveCollateral: number;
|
|
29
|
+
positionSize: number;
|
|
30
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dev Context builder for borrowing v1 fees
|
|
3
|
+
*/
|
|
4
|
+
import { GlobalTradingVariablesType } from "../../../backend/tradingVariables/types";
|
|
5
|
+
import { GetBorrowingFeeContext } from "./index";
|
|
6
|
+
/**
|
|
7
|
+
* @dev Builds borrowing v1 context from global trading variables
|
|
8
|
+
* @dev Returns full array-based context required for v1 borrowing fee calculations
|
|
9
|
+
* @param globalTradingVariables The transformed global trading variables from backend
|
|
10
|
+
* @param collateralIndex Collateral index (1-based)
|
|
11
|
+
* @param currentBlock Current block number
|
|
12
|
+
* @returns Full borrowing context with all pairs and groups or undefined if data not available
|
|
13
|
+
*/
|
|
14
|
+
export declare const buildBorrowingV1Context: (globalTradingVariables: GlobalTradingVariablesType, collateralIndex: number, currentBlock: number) => GetBorrowingFeeContext | undefined;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @dev Context builder for borrowing v1 fees
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.buildBorrowingV1Context = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* @dev Builds borrowing v1 context from global trading variables
|
|
9
|
+
* @dev Returns full array-based context required for v1 borrowing fee calculations
|
|
10
|
+
* @param globalTradingVariables The transformed global trading variables from backend
|
|
11
|
+
* @param collateralIndex Collateral index (1-based)
|
|
12
|
+
* @param currentBlock Current block number
|
|
13
|
+
* @returns Full borrowing context with all pairs and groups or undefined if data not available
|
|
14
|
+
*/
|
|
15
|
+
const buildBorrowingV1Context = (globalTradingVariables, collateralIndex, currentBlock) => {
|
|
16
|
+
const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
|
|
17
|
+
if (!collateral?.pairBorrowingFees || !collateral?.groupBorrowingFees) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const pairs = collateral.pairBorrowingFees;
|
|
21
|
+
const groups = collateral.groupBorrowingFees;
|
|
22
|
+
if (pairs.length === 0 || groups.length === 0) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
currentBlock,
|
|
27
|
+
pairs,
|
|
28
|
+
groups,
|
|
29
|
+
collateralPriceUsd: collateral.prices?.collateralPriceUsd || 1,
|
|
30
|
+
pairOis: collateral.pairOis,
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
exports.buildBorrowingV1Context = buildBorrowingV1Context;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IBorrowingFees } from "../../../contracts/types/generated/GNSMultiCollatDiamond";
|
|
2
|
+
import { BorrowingFee } from ".";
|
|
3
|
+
export declare const convertPairGroupBorrowingFee: (pairGroup: IBorrowingFees.BorrowingPairGroupStructOutput) => BorrowingFee.PairGroup;
|
|
4
|
+
export declare const convertPairBorrowingFee: (pair: IBorrowingFees.BorrowingDataStructOutput, pairOi: IBorrowingFees.OpenInterestStructOutput, pairGroup: IBorrowingFees.BorrowingPairGroupStructOutput[], feeCap: IBorrowingFees.BorrowingFeePerBlockCapStructOutput) => BorrowingFee.Pair;
|
|
5
|
+
export declare const convertPairBorrowingFees: ([pairs, pairOi, pairGroups, feeCaps]: [
|
|
6
|
+
IBorrowingFees.BorrowingDataStructOutput[],
|
|
7
|
+
IBorrowingFees.OpenInterestStructOutput[],
|
|
8
|
+
IBorrowingFees.BorrowingPairGroupStructOutput[][],
|
|
9
|
+
IBorrowingFees.BorrowingFeePerBlockCapStructOutput[]
|
|
10
|
+
]) => BorrowingFee.Pair[];
|
|
11
|
+
export declare const convertGroupBorrowingFee: (group: IBorrowingFees.BorrowingDataStructOutput, groupOi: IBorrowingFees.OpenInterestStructOutput) => BorrowingFee.Group;
|
|
12
|
+
export declare const convertGroupBorrowingData: (obj: IBorrowingFees.BorrowingDataStructOutput, oi: IBorrowingFees.OpenInterestStructOutput) => BorrowingFee.BorrowingData & BorrowingFee.BorrowingOi;
|
|
13
|
+
export declare const convertGroupBorrowingFees: ([groups, groupOis]: [
|
|
14
|
+
IBorrowingFees.BorrowingDataStructOutput[],
|
|
15
|
+
IBorrowingFees.OpenInterestStructOutput[]
|
|
16
|
+
]) => BorrowingFee.Group[];
|
|
17
|
+
export declare const convertFeePerBlockCap: (feeCap: IBorrowingFees.BorrowingFeePerBlockCapStructOutput) => BorrowingFee.BorrowingFeePerBlockCap;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.convertFeePerBlockCap = exports.convertGroupBorrowingFees = exports.convertGroupBorrowingData = exports.convertGroupBorrowingFee = exports.convertPairBorrowingFees = exports.convertPairBorrowingFee = exports.convertPairGroupBorrowingFee = void 0;
|
|
4
|
+
const borrowingFees_1 = require("../../../contracts/utils/borrowingFees");
|
|
5
|
+
const convertPairGroupBorrowingFee = (pairGroup) => ({
|
|
6
|
+
groupIndex: pairGroup.groupIndex,
|
|
7
|
+
name: (0, borrowingFees_1.getBorrowingGroupName)(pairGroup.groupIndex),
|
|
8
|
+
initialAccFeeLong: parseFloat(pairGroup.initialAccFeeLong.toString()) / 1e10,
|
|
9
|
+
initialAccFeeShort: parseFloat(pairGroup.initialAccFeeShort.toString()) / 1e10,
|
|
10
|
+
prevGroupAccFeeLong: parseFloat(pairGroup.prevGroupAccFeeLong.toString()) / 1e10,
|
|
11
|
+
prevGroupAccFeeShort: parseFloat(pairGroup.prevGroupAccFeeShort.toString()) / 1e10,
|
|
12
|
+
pairAccFeeLong: parseFloat(pairGroup.pairAccFeeLong.toString()) / 1e10,
|
|
13
|
+
pairAccFeeShort: parseFloat(pairGroup.pairAccFeeShort.toString()) / 1e10,
|
|
14
|
+
block: pairGroup.block,
|
|
15
|
+
});
|
|
16
|
+
exports.convertPairGroupBorrowingFee = convertPairGroupBorrowingFee;
|
|
17
|
+
const convertPairBorrowingFee = (pair, pairOi, pairGroup, feeCap) => ({
|
|
18
|
+
...(0, exports.convertGroupBorrowingData)(pair, pairOi),
|
|
19
|
+
groups: pairGroup.map(value => (0, exports.convertPairGroupBorrowingFee)(value)),
|
|
20
|
+
feePerBlockCap: (0, exports.convertFeePerBlockCap)(feeCap),
|
|
21
|
+
});
|
|
22
|
+
exports.convertPairBorrowingFee = convertPairBorrowingFee;
|
|
23
|
+
const convertPairBorrowingFees = ([pairs, pairOi, pairGroups, feeCaps]) => pairs.map((value, ix) => (0, exports.convertPairBorrowingFee)(value, pairOi[ix], pairGroups[ix], feeCaps[ix]));
|
|
24
|
+
exports.convertPairBorrowingFees = convertPairBorrowingFees;
|
|
25
|
+
const convertGroupBorrowingFee = (group, groupOi) => (0, exports.convertGroupBorrowingData)(group, groupOi);
|
|
26
|
+
exports.convertGroupBorrowingFee = convertGroupBorrowingFee;
|
|
27
|
+
const convertGroupBorrowingData = (obj, oi) => ({
|
|
28
|
+
oi: {
|
|
29
|
+
long: parseFloat(oi.long.toString()) / 1e10,
|
|
30
|
+
short: parseFloat(oi.short.toString()) / 1e10,
|
|
31
|
+
max: parseFloat(oi.max.toString()) / 1e10,
|
|
32
|
+
},
|
|
33
|
+
feePerBlock: obj.feePerBlock / 1e10,
|
|
34
|
+
accFeeLong: parseFloat(obj.accFeeLong.toString()) / 1e10,
|
|
35
|
+
accFeeShort: parseFloat(obj.accFeeShort.toString()) / 1e10,
|
|
36
|
+
accLastUpdatedBlock: obj.accLastUpdatedBlock,
|
|
37
|
+
feeExponent: obj.feeExponent,
|
|
38
|
+
});
|
|
39
|
+
exports.convertGroupBorrowingData = convertGroupBorrowingData;
|
|
40
|
+
const convertGroupBorrowingFees = ([groups, groupOis]) => groups.map((value, ix) => (0, exports.convertGroupBorrowingFee)(value, groupOis[ix]));
|
|
41
|
+
exports.convertGroupBorrowingFees = convertGroupBorrowingFees;
|
|
42
|
+
const convertFeePerBlockCap = (feeCap) => ({
|
|
43
|
+
minP: feeCap.minP ? parseFloat(feeCap.minP.toString()) / 1e3 / 100 : 0,
|
|
44
|
+
maxP: feeCap.maxP ? parseFloat(feeCap.maxP.toString()) / 1e3 / 100 : 1,
|
|
45
|
+
});
|
|
46
|
+
exports.convertFeePerBlockCap = convertFeePerBlockCap;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { UnifiedPairOi } from "../../..";
|
|
2
|
+
import { OpenInterest, PairIndex } from "../../types";
|
|
3
|
+
import * as BorrowingFee from "./types";
|
|
4
|
+
export type GetBorrowingFeeContext = {
|
|
5
|
+
currentBlock: number;
|
|
6
|
+
groups: BorrowingFee.Group[];
|
|
7
|
+
pairs: BorrowingFee.Pair[];
|
|
8
|
+
collateralPriceUsd: number;
|
|
9
|
+
pairOis: UnifiedPairOi[];
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @dev Calculates borrowing fees using v1 model (block-based with groups)
|
|
13
|
+
* @dev Still actively used by markets that haven't migrated to v2
|
|
14
|
+
* @dev Uses dynamic collateral OI - converts OI to USD for fee calculations
|
|
15
|
+
* @param posDai Position size in collateral
|
|
16
|
+
* @param pairIndex Trading pair index (required)
|
|
17
|
+
* @param long Whether position is long
|
|
18
|
+
* @param initialAccFees Initial accumulated fees when trade was opened
|
|
19
|
+
* @param context Context with current block, fee data, and collateral price
|
|
20
|
+
* @returns Borrowing fee in collateral tokens
|
|
21
|
+
*/
|
|
22
|
+
export declare const getBorrowingFee: (posDai: number, pairIndex: PairIndex | undefined, long: boolean, initialAccFees: BorrowingFee.InitialAccFees, currentPairPrice: number, context: GetBorrowingFeeContext) => number;
|
|
23
|
+
/**
|
|
24
|
+
* @dev This function uses static OI which doesn't reflect current market values
|
|
25
|
+
* @dev The v10 contracts use dynamic OI (beforeV10 + afterV10Token * currentPrice)
|
|
26
|
+
*/
|
|
27
|
+
export declare const withinMaxGroupOi: (pairIndex: PairIndex, long: boolean, positionSizeCollateral: number, context: {
|
|
28
|
+
groups: BorrowingFee.Group[];
|
|
29
|
+
pairs: BorrowingFee.Pair[];
|
|
30
|
+
}) => boolean;
|
|
31
|
+
export declare const borrowingFeeUtils: {
|
|
32
|
+
getPairGroupAccFeesDeltas: (i: number, pairGroups: BorrowingFee.PairGroup[], initialFees: BorrowingFee.InitialAccFees, pairIndex: PairIndex, long: boolean, currentPairPrice: number, context: GetBorrowingFeeContext) => {
|
|
33
|
+
deltaGroup: number;
|
|
34
|
+
deltaPair: number;
|
|
35
|
+
beforeTradeOpen: boolean;
|
|
36
|
+
};
|
|
37
|
+
getPairPendingAccFees: (pairIndex: PairIndex, currentBlock: number, context: {
|
|
38
|
+
pairs: BorrowingFee.Pair[];
|
|
39
|
+
openInterest: OpenInterest;
|
|
40
|
+
collateralPriceUsd: number;
|
|
41
|
+
}) => {
|
|
42
|
+
accFeeLong: number;
|
|
43
|
+
accFeeShort: number;
|
|
44
|
+
deltaLong: number;
|
|
45
|
+
deltaShort: number;
|
|
46
|
+
};
|
|
47
|
+
getPairPendingAccFee: (pairIndex: PairIndex, currentBlock: number, long: boolean, context: {
|
|
48
|
+
pairs: BorrowingFee.Pair[];
|
|
49
|
+
openInterest: OpenInterest;
|
|
50
|
+
collateralPriceUsd: number;
|
|
51
|
+
}) => number;
|
|
52
|
+
getGroupPendingAccFees: (groupIndex: number, currentBlock: number, context: {
|
|
53
|
+
groups: BorrowingFee.Group[];
|
|
54
|
+
collateralPriceUsd: number;
|
|
55
|
+
}) => {
|
|
56
|
+
accFeeLong: number;
|
|
57
|
+
accFeeShort: number;
|
|
58
|
+
deltaLong: number;
|
|
59
|
+
deltaShort: number;
|
|
60
|
+
};
|
|
61
|
+
getGroupPendingAccFee: (groupIndex: number, currentBlock: number, long: boolean, context: {
|
|
62
|
+
groups: BorrowingFee.Group[];
|
|
63
|
+
collateralPriceUsd: number;
|
|
64
|
+
}) => number;
|
|
65
|
+
getPendingAccFees: (accFeeLong: number, accFeeShort: number, oiLong: number, oiShort: number, feePerBlock: number, currentBlock: number, accLastUpdatedBlock: number, maxOi: number, feeExponent: number, feeCaps?: BorrowingFee.BorrowingFeePerBlockCap, collateralPriceUsd?: number) => {
|
|
66
|
+
accFeeLong: number;
|
|
67
|
+
accFeeShort: number;
|
|
68
|
+
deltaLong: number;
|
|
69
|
+
deltaShort: number;
|
|
70
|
+
};
|
|
71
|
+
getActiveFeePerBlock: (pair: BorrowingFee.Pair, group: BorrowingFee.Group | undefined) => number;
|
|
72
|
+
getBorrowingDataActiveFeePerBlock: (val: BorrowingFee.Pair | BorrowingFee.Group) => number;
|
|
73
|
+
getPairGroupIndex: (pairIndex: PairIndex, context: {
|
|
74
|
+
pairs: BorrowingFee.Pair[];
|
|
75
|
+
}) => number;
|
|
76
|
+
getPendingAccFeesDelta: (blockDistance: number, feePerBlock: number, netOi: number, maxOi: number, feeExponent: number) => number;
|
|
77
|
+
getFeePerBlockCaps: (cap?: BorrowingFee.BorrowingFeePerBlockCap) => BorrowingFee.BorrowingFeePerBlockCap;
|
|
78
|
+
};
|
|
79
|
+
export * as BorrowingFee from "./types";
|
|
80
|
+
export * from "./converter";
|
|
81
|
+
export * from "./builder";
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
26
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.BorrowingFee = exports.borrowingFeeUtils = exports.withinMaxGroupOi = exports.getBorrowingFee = void 0;
|
|
30
|
+
const __1 = require("../../..");
|
|
31
|
+
/**
|
|
32
|
+
* @dev Calculates borrowing fees using v1 model (block-based with groups)
|
|
33
|
+
* @dev Still actively used by markets that haven't migrated to v2
|
|
34
|
+
* @dev Uses dynamic collateral OI - converts OI to USD for fee calculations
|
|
35
|
+
* @param posDai Position size in collateral
|
|
36
|
+
* @param pairIndex Trading pair index (required)
|
|
37
|
+
* @param long Whether position is long
|
|
38
|
+
* @param initialAccFees Initial accumulated fees when trade was opened
|
|
39
|
+
* @param context Context with current block, fee data, and collateral price
|
|
40
|
+
* @returns Borrowing fee in collateral tokens
|
|
41
|
+
*/
|
|
42
|
+
const getBorrowingFee = (posDai, pairIndex, long, initialAccFees, currentPairPrice, context) => {
|
|
43
|
+
if (pairIndex === undefined) {
|
|
44
|
+
throw new Error("pairIndex is required for borrowing fee calculations");
|
|
45
|
+
}
|
|
46
|
+
const { pairs, groups } = context;
|
|
47
|
+
if (!groups || !pairs || !pairs[pairIndex]) {
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
50
|
+
const pairGroups = pairs[pairIndex].groups;
|
|
51
|
+
const firstPairGroup = pairGroups?.length > 0 ? pairGroups[0] : undefined;
|
|
52
|
+
let fee = 0;
|
|
53
|
+
if (!firstPairGroup || firstPairGroup.block > initialAccFees.block) {
|
|
54
|
+
const openInterest = (0, __1.getPairTotalOisDynamicCollateral)(pairIndex, {
|
|
55
|
+
pairOis: context.pairOis,
|
|
56
|
+
currentPairPrice,
|
|
57
|
+
});
|
|
58
|
+
fee =
|
|
59
|
+
(!firstPairGroup
|
|
60
|
+
? getPairPendingAccFee(pairIndex, context.currentBlock, long, {
|
|
61
|
+
pairs,
|
|
62
|
+
openInterest: {
|
|
63
|
+
long: openInterest.long,
|
|
64
|
+
short: openInterest.short,
|
|
65
|
+
max: context.pairOis[pairIndex].maxCollateral,
|
|
66
|
+
},
|
|
67
|
+
collateralPriceUsd: context.collateralPriceUsd,
|
|
68
|
+
})
|
|
69
|
+
: long
|
|
70
|
+
? firstPairGroup.pairAccFeeLong
|
|
71
|
+
: firstPairGroup.pairAccFeeShort) - initialAccFees.accPairFee;
|
|
72
|
+
}
|
|
73
|
+
for (let i = pairGroups.length; i > 0; i--) {
|
|
74
|
+
const { deltaGroup, deltaPair, beforeTradeOpen } = getPairGroupAccFeesDeltas(i - 1, pairGroups, initialAccFees, pairIndex, long, currentPairPrice, {
|
|
75
|
+
currentBlock: context.currentBlock,
|
|
76
|
+
groups,
|
|
77
|
+
pairs,
|
|
78
|
+
collateralPriceUsd: context.collateralPriceUsd,
|
|
79
|
+
pairOis: context.pairOis,
|
|
80
|
+
});
|
|
81
|
+
fee += Math.max(deltaGroup, deltaPair);
|
|
82
|
+
if (beforeTradeOpen) {
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return (posDai * fee) / 100;
|
|
87
|
+
};
|
|
88
|
+
exports.getBorrowingFee = getBorrowingFee;
|
|
89
|
+
/**
|
|
90
|
+
* @dev This function uses static OI which doesn't reflect current market values
|
|
91
|
+
* @dev The v10 contracts use dynamic OI (beforeV10 + afterV10Token * currentPrice)
|
|
92
|
+
*/
|
|
93
|
+
const withinMaxGroupOi = (pairIndex, long, positionSizeCollateral, context) => {
|
|
94
|
+
const { groups, pairs } = context;
|
|
95
|
+
if (!groups || !pairs) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const g = groups[getPairGroupIndex(pairIndex, { pairs })].oi;
|
|
99
|
+
return (g.max == 0 || (long ? g.long : g.short) + positionSizeCollateral <= g.max);
|
|
100
|
+
};
|
|
101
|
+
exports.withinMaxGroupOi = withinMaxGroupOi;
|
|
102
|
+
const getPairGroupIndex = (pairIndex, context) => {
|
|
103
|
+
const { pairs } = context;
|
|
104
|
+
if (!pairs[pairIndex]) {
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
const pairGroups = pairs[pairIndex].groups;
|
|
108
|
+
return pairGroups.length == 0 ? 0 : pairGroups[0].groupIndex;
|
|
109
|
+
};
|
|
110
|
+
const getPairPendingAccFees = (pairIndex, currentBlock, context) => {
|
|
111
|
+
const { pairs, openInterest: { long, short }, collateralPriceUsd, } = context;
|
|
112
|
+
const pair = pairs[pairIndex];
|
|
113
|
+
return getPendingAccFees(pair.accFeeLong, pair.accFeeShort, long, short, pair.feePerBlock, currentBlock, pair.accLastUpdatedBlock, context.openInterest.max, pair.feeExponent, pair.feePerBlockCap, collateralPriceUsd);
|
|
114
|
+
};
|
|
115
|
+
const getPairPendingAccFee = (pairIndex, currentBlock, long, context) => {
|
|
116
|
+
const { accFeeLong, accFeeShort } = getPairPendingAccFees(pairIndex, currentBlock, context);
|
|
117
|
+
return long ? accFeeLong : accFeeShort;
|
|
118
|
+
};
|
|
119
|
+
const getGroupPendingAccFees = (groupIndex, currentBlock, context) => {
|
|
120
|
+
const { groups, collateralPriceUsd } = context;
|
|
121
|
+
const group = groups[groupIndex];
|
|
122
|
+
return getPendingAccFees(group.accFeeLong, group.accFeeShort, group.oi.long, group.oi.short, group.feePerBlock, currentBlock, group.accLastUpdatedBlock, group.oi.max, group.feeExponent, undefined, // no fee caps for groups
|
|
123
|
+
collateralPriceUsd);
|
|
124
|
+
};
|
|
125
|
+
const getGroupPendingAccFee = (groupIndex, currentBlock, long, context) => {
|
|
126
|
+
const { accFeeLong, accFeeShort } = getGroupPendingAccFees(groupIndex, currentBlock, context);
|
|
127
|
+
return long ? accFeeLong : accFeeShort;
|
|
128
|
+
};
|
|
129
|
+
const getPairGroupAccFeesDeltas = (i, pairGroups, initialFees, pairIndex, long, currentPairPrice, context) => {
|
|
130
|
+
const group = pairGroups[i];
|
|
131
|
+
const beforeTradeOpen = group.block < initialFees.block;
|
|
132
|
+
let deltaGroup, deltaPair;
|
|
133
|
+
if (i == pairGroups.length - 1) {
|
|
134
|
+
const { currentBlock, groups, pairs, collateralPriceUsd } = context;
|
|
135
|
+
const openInterest = (0, __1.getPairTotalOisDynamicCollateral)(pairIndex, {
|
|
136
|
+
pairOis: context.pairOis,
|
|
137
|
+
currentPairPrice,
|
|
138
|
+
});
|
|
139
|
+
deltaGroup = getGroupPendingAccFee(group.groupIndex, currentBlock, long, {
|
|
140
|
+
groups,
|
|
141
|
+
collateralPriceUsd,
|
|
142
|
+
});
|
|
143
|
+
deltaPair = getPairPendingAccFee(pairIndex, currentBlock, long, {
|
|
144
|
+
pairs,
|
|
145
|
+
openInterest: {
|
|
146
|
+
long: openInterest.long,
|
|
147
|
+
short: openInterest.short,
|
|
148
|
+
max: context.pairOis[pairIndex].maxCollateral,
|
|
149
|
+
},
|
|
150
|
+
collateralPriceUsd,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
const nextGroup = pairGroups[i + 1];
|
|
155
|
+
if (beforeTradeOpen && nextGroup.block <= initialFees.block) {
|
|
156
|
+
return { deltaGroup: 0, deltaPair: 0, beforeTradeOpen };
|
|
157
|
+
}
|
|
158
|
+
deltaGroup = long
|
|
159
|
+
? nextGroup.prevGroupAccFeeLong
|
|
160
|
+
: nextGroup.prevGroupAccFeeShort;
|
|
161
|
+
deltaPair = long ? nextGroup.pairAccFeeLong : nextGroup.pairAccFeeShort;
|
|
162
|
+
}
|
|
163
|
+
if (beforeTradeOpen) {
|
|
164
|
+
deltaGroup -= initialFees.accGroupFee;
|
|
165
|
+
deltaPair -= initialFees.accPairFee;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
deltaGroup -= long ? group.initialAccFeeLong : group.initialAccFeeShort;
|
|
169
|
+
deltaPair -= long ? group.pairAccFeeLong : group.pairAccFeeShort;
|
|
170
|
+
}
|
|
171
|
+
return { deltaGroup, deltaPair, beforeTradeOpen };
|
|
172
|
+
};
|
|
173
|
+
const getPendingAccFees = (accFeeLong, accFeeShort, oiLong, oiShort, feePerBlock, currentBlock, accLastUpdatedBlock, maxOi, feeExponent, feeCaps, // as percentage: eg minP: 0.1 = 10%, maxP: 0.5 = 50%
|
|
174
|
+
collateralPriceUsd) => {
|
|
175
|
+
const moreShorts = oiLong < oiShort;
|
|
176
|
+
const blockDistance = currentBlock > accLastUpdatedBlock ? currentBlock - accLastUpdatedBlock : 0;
|
|
177
|
+
// If block distance is zero nothing changes
|
|
178
|
+
if (blockDistance === 0) {
|
|
179
|
+
return {
|
|
180
|
+
accFeeLong,
|
|
181
|
+
accFeeShort,
|
|
182
|
+
deltaLong: 0,
|
|
183
|
+
deltaShort: 0,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Convert OI to USD if collateral price is provided (dynamic collateral OI)
|
|
187
|
+
const oiLongUsd = collateralPriceUsd ? oiLong * collateralPriceUsd : oiLong;
|
|
188
|
+
const oiShortUsd = collateralPriceUsd
|
|
189
|
+
? oiShort * collateralPriceUsd
|
|
190
|
+
: oiShort;
|
|
191
|
+
const maxOiUsd = collateralPriceUsd ? maxOi * collateralPriceUsd : maxOi;
|
|
192
|
+
const netOi = Math.abs(oiLongUsd - oiShortUsd);
|
|
193
|
+
// Calculate minimum and maximum effective oi (using USD values if available)
|
|
194
|
+
const { minP, maxP } = getFeePerBlockCaps(feeCaps);
|
|
195
|
+
const minNetOi = maxOiUsd * minP;
|
|
196
|
+
const maxNetOi = maxOiUsd * maxP;
|
|
197
|
+
// Calculate the minimum acc fee delta (applies to both sides)
|
|
198
|
+
const minDelta = minNetOi > 0
|
|
199
|
+
? getPendingAccFeesDelta(blockDistance, feePerBlock, minNetOi, maxOiUsd, feeExponent)
|
|
200
|
+
: 0;
|
|
201
|
+
// Calculate the actual acc fee (using capped oi of 100% or less)
|
|
202
|
+
const delta = netOi > minNetOi
|
|
203
|
+
? getPendingAccFeesDelta(blockDistance, feePerBlock, Math.min(netOi, maxNetOi), // if netOi > cap, use cap
|
|
204
|
+
maxOiUsd, feeExponent)
|
|
205
|
+
: minDelta;
|
|
206
|
+
const [deltaLong, deltaShort] = moreShorts
|
|
207
|
+
? [minDelta, delta]
|
|
208
|
+
: [delta, minDelta];
|
|
209
|
+
return {
|
|
210
|
+
accFeeLong: accFeeLong + deltaLong,
|
|
211
|
+
accFeeShort: accFeeShort + deltaShort,
|
|
212
|
+
deltaLong,
|
|
213
|
+
deltaShort,
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
const getPendingAccFeesDelta = (blockDistance, feePerBlock, netOi, maxOi, feeExponent) => {
|
|
217
|
+
return maxOi > 0 && feeExponent > 0
|
|
218
|
+
? feePerBlock * blockDistance * (netOi / maxOi) ** feeExponent
|
|
219
|
+
: 0;
|
|
220
|
+
};
|
|
221
|
+
const getFeePerBlockCaps = (cap) => {
|
|
222
|
+
return {
|
|
223
|
+
minP: cap?.minP || 0,
|
|
224
|
+
maxP: cap?.maxP && cap.maxP > 0 ? cap.maxP : 1,
|
|
225
|
+
};
|
|
226
|
+
};
|
|
227
|
+
const getBorrowingDataActiveFeePerBlock = (val) => {
|
|
228
|
+
const { long, short, max } = val.oi;
|
|
229
|
+
const { minP, maxP } = getFeePerBlockCaps("feePerBlockCap" in val ? val.feePerBlockCap : undefined);
|
|
230
|
+
// Calculate the effective open interest
|
|
231
|
+
// If minP > 0 then netOi has to be at least minP * maxOi
|
|
232
|
+
// If maxP > 0 then netOi cannot be more than maxP * maxOi
|
|
233
|
+
const effectiveOi = Math.min(Math.max(Math.abs(long - short), max * minP), max * maxP);
|
|
234
|
+
return val.feePerBlock * (effectiveOi / max) ** val.feeExponent;
|
|
235
|
+
};
|
|
236
|
+
const getActiveFeePerBlock = (pair, group) => {
|
|
237
|
+
const pairFeePerBlock = getBorrowingDataActiveFeePerBlock(pair);
|
|
238
|
+
if (!group) {
|
|
239
|
+
return pairFeePerBlock;
|
|
240
|
+
}
|
|
241
|
+
const groupFeePerBlock = getBorrowingDataActiveFeePerBlock(group);
|
|
242
|
+
return Math.max(pairFeePerBlock, groupFeePerBlock);
|
|
243
|
+
};
|
|
244
|
+
exports.borrowingFeeUtils = {
|
|
245
|
+
getPairGroupAccFeesDeltas,
|
|
246
|
+
getPairPendingAccFees,
|
|
247
|
+
getPairPendingAccFee,
|
|
248
|
+
getGroupPendingAccFees,
|
|
249
|
+
getGroupPendingAccFee,
|
|
250
|
+
getPendingAccFees,
|
|
251
|
+
getActiveFeePerBlock,
|
|
252
|
+
getBorrowingDataActiveFeePerBlock,
|
|
253
|
+
getPairGroupIndex,
|
|
254
|
+
getPendingAccFeesDelta,
|
|
255
|
+
getFeePerBlockCaps,
|
|
256
|
+
};
|
|
257
|
+
exports.BorrowingFee = __importStar(require("./types"));
|
|
258
|
+
__exportStar(require("./converter"), exports);
|
|
259
|
+
__exportStar(require("./builder"), exports);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { OpenInterest } from "../../types";
|
|
2
|
+
export type BorrowingData = {
|
|
3
|
+
feePerBlock: number;
|
|
4
|
+
accFeeLong: number;
|
|
5
|
+
accFeeShort: number;
|
|
6
|
+
accLastUpdatedBlock: number;
|
|
7
|
+
feeExponent: number;
|
|
8
|
+
};
|
|
9
|
+
export type PairGroup = {
|
|
10
|
+
groupIndex: number;
|
|
11
|
+
name?: string;
|
|
12
|
+
block: number;
|
|
13
|
+
initialAccFeeLong: number;
|
|
14
|
+
initialAccFeeShort: number;
|
|
15
|
+
prevGroupAccFeeLong: number;
|
|
16
|
+
prevGroupAccFeeShort: number;
|
|
17
|
+
pairAccFeeLong: number;
|
|
18
|
+
pairAccFeeShort: number;
|
|
19
|
+
};
|
|
20
|
+
export type BorrowingOi = {
|
|
21
|
+
oi: OpenInterest;
|
|
22
|
+
};
|
|
23
|
+
export type BorrowingFeePerBlockCap = {
|
|
24
|
+
minP: number;
|
|
25
|
+
maxP: number;
|
|
26
|
+
};
|
|
27
|
+
export type Pair = BorrowingData & BorrowingOi & {
|
|
28
|
+
groups: PairGroup[];
|
|
29
|
+
feePerBlockCap?: BorrowingFeePerBlockCap;
|
|
30
|
+
};
|
|
31
|
+
export type Group = BorrowingData & BorrowingOi;
|
|
32
|
+
export type InitialAccFees = {
|
|
33
|
+
accPairFee: number;
|
|
34
|
+
accGroupFee: number;
|
|
35
|
+
block: number;
|
|
36
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { GlobalTradingVariablesType } from "../../../backend/tradingVariables/types";
|
|
2
|
+
import { GetPairBorrowingFeeV2Context } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* @dev Builds borrowing v2 sub-context for a specific pair
|
|
5
|
+
*/
|
|
6
|
+
export declare const buildBorrowingV2Context: (globalTradingVariables: GlobalTradingVariablesType, collateralIndex: number, pairIndex: number, currentTimestamp: number) => GetPairBorrowingFeeV2Context | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildBorrowingV2Context = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @dev Builds borrowing v2 sub-context for a specific pair
|
|
6
|
+
*/
|
|
7
|
+
const buildBorrowingV2Context = (globalTradingVariables, collateralIndex, pairIndex, currentTimestamp) => {
|
|
8
|
+
const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
|
|
9
|
+
if (!collateral?.pairBorrowingFeesV2) {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
const params = collateral.pairBorrowingFeesV2.params?.[pairIndex];
|
|
13
|
+
const data = collateral.pairBorrowingFeesV2.data?.[pairIndex];
|
|
14
|
+
if (!params || !data) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
params,
|
|
19
|
+
data,
|
|
20
|
+
currentTimestamp,
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
exports.buildBorrowingV2Context = buildBorrowingV2Context;
|