@gainsnetwork/sdk 0.0.0-v10.rc1 → 0.0.0-v10.rc2
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/constants.d.ts +8 -1
- package/lib/constants.js +8 -1
- package/lib/contracts/fetch/fees/borrowingFeesV2.d.ts +76 -0
- package/lib/contracts/fetch/fees/borrowingFeesV2.js +193 -0
- package/lib/contracts/fetch/fees/fundingFees.d.ts +66 -0
- package/lib/contracts/fetch/fees/fundingFees.js +150 -0
- package/lib/contracts/fetch/priceImpact/skew.d.ts +63 -0
- package/lib/contracts/fetch/priceImpact/skew.js +168 -0
- package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +20 -7
- package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +16 -7
- package/lib/contracts/types/generated/factories/GToken__factory.d.ts +0 -7
- package/lib/contracts/types/generated/factories/GToken__factory.js +0 -4
- package/lib/contracts/types/index.d.ts +2 -1
- package/lib/contracts/types/index.js +1 -0
- package/lib/contracts/utils/index.d.ts +3 -0
- package/lib/contracts/utils/index.js +3 -0
- package/lib/contracts/utils/openTrades.d.ts +1 -0
- package/lib/contracts/utils/openTrades.js +109 -55
- package/lib/contracts/utils/pairs.js +7 -0
- package/lib/trade/fees/borrowing/index.d.ts +10 -0
- package/lib/trade/fees/borrowing/index.js +10 -0
- package/lib/trade/fees/borrowingV2/converter.d.ts +66 -0
- package/lib/trade/fees/borrowingV2/converter.js +121 -0
- package/lib/trade/fees/borrowingV2/index.d.ts +59 -0
- package/lib/trade/fees/borrowingV2/index.js +139 -0
- package/lib/trade/fees/borrowingV2/types.d.ts +79 -0
- package/lib/trade/fees/borrowingV2/types.js +5 -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/index.d.ts +135 -0
- package/lib/trade/fees/fundingFees/index.js +322 -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 +6 -2
- package/lib/trade/fees/index.js +58 -16
- package/lib/trade/fees/tiers/index.d.ts +17 -0
- package/lib/trade/fees/tiers/index.js +44 -1
- package/lib/trade/fees/trading/converter.d.ts +30 -0
- package/lib/trade/fees/trading/converter.js +43 -0
- package/lib/trade/fees/trading/index.d.ts +34 -0
- package/lib/trade/fees/trading/index.js +104 -0
- package/lib/trade/fees/trading/types.d.ts +39 -0
- package/lib/trade/fees/trading/types.js +5 -0
- package/lib/trade/index.d.ts +2 -1
- package/lib/trade/index.js +2 -1
- package/lib/trade/liquidation.d.ts +32 -2
- package/lib/trade/liquidation.js +93 -8
- package/lib/trade/pnl.d.ts +3 -3
- package/lib/trade/pnl.js +7 -2
- package/lib/trade/priceImpact/index.d.ts +8 -0
- package/lib/trade/priceImpact/index.js +32 -0
- package/lib/trade/priceImpact/skew/converter.d.ts +77 -0
- package/lib/trade/priceImpact/skew/converter.js +171 -0
- package/lib/trade/priceImpact/skew/index.d.ts +57 -0
- package/lib/trade/priceImpact/skew/index.js +175 -0
- package/lib/trade/priceImpact/skew/types.d.ts +55 -0
- package/lib/trade/priceImpact/skew/types.js +5 -0
- package/lib/trade/types.d.ts +25 -2
- package/lib/trade/types.js +7 -0
- package/lib/trade/utils.d.ts +18 -0
- package/lib/trade/utils.js +30 -0
- package/package.json +2 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @dev Converters for trading fee data between contract and SDK formats
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.convertGlobalTradeFeeParams = exports.convertCounterTradeFeeRateMultipliers = exports.convertCounterTradeSettings = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* @dev Converts contract counter trade settings to SDK format
|
|
9
|
+
* @param feeRateMultiplier Fee rate multiplier from contract (1e3 precision)
|
|
10
|
+
* @param maxLeverage Max leverage from contract (1e3 precision)
|
|
11
|
+
* @returns Normalized counter trade settings
|
|
12
|
+
*/
|
|
13
|
+
const convertCounterTradeSettings = (feeRateMultiplier, maxLeverage) => {
|
|
14
|
+
return {
|
|
15
|
+
feeRateMultiplier: feeRateMultiplier / 1000,
|
|
16
|
+
maxLeverage: maxLeverage / 1000, // 1e3 → float
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
exports.convertCounterTradeSettings = convertCounterTradeSettings;
|
|
20
|
+
/**
|
|
21
|
+
* @dev Converts array of counter trade fee rate multipliers from contract
|
|
22
|
+
* @param multipliers Array of fee rate multipliers (1e3 precision)
|
|
23
|
+
* @returns Array of normalized multipliers
|
|
24
|
+
*/
|
|
25
|
+
const convertCounterTradeFeeRateMultipliers = (multipliers) => {
|
|
26
|
+
return multipliers.map(m => m / 1000);
|
|
27
|
+
};
|
|
28
|
+
exports.convertCounterTradeFeeRateMultipliers = convertCounterTradeFeeRateMultipliers;
|
|
29
|
+
/**
|
|
30
|
+
* @dev Converts global trade fee params from contract to SDK format
|
|
31
|
+
* @param contractParams Global trade fee params from contract
|
|
32
|
+
* @returns Normalized global trade fee params
|
|
33
|
+
*/
|
|
34
|
+
const convertGlobalTradeFeeParams = (contractParams) => {
|
|
35
|
+
return {
|
|
36
|
+
referralFeeP: contractParams.referralFeeP / 1e10 / 100,
|
|
37
|
+
govFeeP: contractParams.govFeeP / 1e10 / 100,
|
|
38
|
+
triggerOrderFeeP: contractParams.triggerOrderFeeP / 1e10 / 100,
|
|
39
|
+
gnsOtcFeeP: contractParams.gnsOtcFeeP / 1e10 / 100,
|
|
40
|
+
gTokenFeeP: contractParams.gTokenFeeP / 1e10 / 100,
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
exports.convertGlobalTradeFeeParams = convertGlobalTradeFeeParams;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dev Trading fee calculations for opening and closing positions
|
|
3
|
+
*/
|
|
4
|
+
import { Fee, PairIndex } from "../../types";
|
|
5
|
+
import { GetTradeFeesContext, GetLiquidationFeesContext, GetClosingFeeContext, TradeFeesBreakdown } from "./types";
|
|
6
|
+
/**
|
|
7
|
+
* @dev Returns the total fee for a trade in collateral tokens
|
|
8
|
+
* @dev Mirrors the contract's getTotalTradeFeesCollateral function
|
|
9
|
+
* @param collateralIndex Collateral index (not used in calculation, for consistency)
|
|
10
|
+
* @param trader Trader address (for fee tier lookup)
|
|
11
|
+
* @param pairIndex Index of the trading pair
|
|
12
|
+
* @param positionSizeCollateral Position size in collateral tokens
|
|
13
|
+
* @param isCounterTrade Whether the trade is a counter trade
|
|
14
|
+
* @param context Context containing fee parameters and settings
|
|
15
|
+
* @returns Total fee in collateral tokens
|
|
16
|
+
*/
|
|
17
|
+
export declare const getTotalTradeFeesCollateral: (collateralIndex: number, trader: string, pairIndex: PairIndex, positionSizeCollateral: number, isCounterTrade: boolean, context: GetTradeFeesContext) => number;
|
|
18
|
+
/**
|
|
19
|
+
* @dev Returns the fee breakdown for a trade
|
|
20
|
+
* @dev Mirrors the contract's getTradeFeesCollateral function
|
|
21
|
+
*/
|
|
22
|
+
export declare const getTradeFeesCollateral: (collateralIndex: number, trader: string, pairIndex: PairIndex, positionSizeCollateral: number, isCounterTrade: boolean, context: GetTradeFeesContext) => TradeFeesBreakdown;
|
|
23
|
+
/**
|
|
24
|
+
* @dev Returns total liquidation fee for a trade in collateral tokens
|
|
25
|
+
* @dev Mirrors the contract's getTotalTradeLiqFeesCollateral function
|
|
26
|
+
*/
|
|
27
|
+
export declare const getTotalTradeLiqFeesCollateral: (collateralIndex: number, trader: string, pairIndex: PairIndex, collateralAmount: number, context: GetLiquidationFeesContext) => number;
|
|
28
|
+
/**
|
|
29
|
+
* @dev Legacy function for backward compatibility
|
|
30
|
+
* @deprecated Use getTotalTradeFeesCollateral instead
|
|
31
|
+
*/
|
|
32
|
+
export declare const getClosingFee: (collateralAmount: number, leverage: number, pairIndex: PairIndex, pairFee: Fee | undefined, _collateralPriceUsd?: number | undefined, isCounterTrade?: boolean, trader?: string, context?: GetClosingFeeContext) => number;
|
|
33
|
+
export * from "./types";
|
|
34
|
+
export * from "./converter";
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @dev Trading fee calculations for opening and closing positions
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.getClosingFee = exports.getTotalTradeLiqFeesCollateral = exports.getTradeFeesCollateral = exports.getTotalTradeFeesCollateral = void 0;
|
|
21
|
+
const tiers_1 = require("../tiers");
|
|
22
|
+
/**
|
|
23
|
+
* @dev Returns the total fee for a trade in collateral tokens
|
|
24
|
+
* @dev Mirrors the contract's getTotalTradeFeesCollateral function
|
|
25
|
+
* @param collateralIndex Collateral index (not used in calculation, for consistency)
|
|
26
|
+
* @param trader Trader address (for fee tier lookup)
|
|
27
|
+
* @param pairIndex Index of the trading pair
|
|
28
|
+
* @param positionSizeCollateral Position size in collateral tokens
|
|
29
|
+
* @param isCounterTrade Whether the trade is a counter trade
|
|
30
|
+
* @param context Context containing fee parameters and settings
|
|
31
|
+
* @returns Total fee in collateral tokens
|
|
32
|
+
*/
|
|
33
|
+
const getTotalTradeFeesCollateral = (collateralIndex, trader, pairIndex, positionSizeCollateral, isCounterTrade, context) => {
|
|
34
|
+
var _a;
|
|
35
|
+
const { fee, collateralPriceUsd } = context;
|
|
36
|
+
const { totalPositionSizeFeeP, minPositionSizeUsd } = fee;
|
|
37
|
+
// Get counter trade fee rate multiplier (default 1 = 1x)
|
|
38
|
+
const counterTradeFeeRateMultiplier = isCounterTrade && ((_a = context.counterTradeSettings) === null || _a === void 0 ? void 0 : _a[pairIndex])
|
|
39
|
+
? context.counterTradeSettings[pairIndex].feeRateMultiplier
|
|
40
|
+
: 1;
|
|
41
|
+
// Apply counter trade multiplier to position size
|
|
42
|
+
const adjustedPositionSizeCollateral = positionSizeCollateral * counterTradeFeeRateMultiplier;
|
|
43
|
+
// Calculate minimum position size in collateral
|
|
44
|
+
const minPositionSizeCollateral = minPositionSizeUsd / collateralPriceUsd;
|
|
45
|
+
// Use max of adjusted position size and minimum position size
|
|
46
|
+
const positionSizeBasis = Math.max(adjustedPositionSizeCollateral, minPositionSizeCollateral);
|
|
47
|
+
// Calculate raw fee
|
|
48
|
+
const rawFee = totalPositionSizeFeeP * positionSizeBasis;
|
|
49
|
+
// Apply trader fee tier if available
|
|
50
|
+
return (0, tiers_1.calculateFeeAmount)(trader, rawFee, context.traderFeeMultiplier);
|
|
51
|
+
};
|
|
52
|
+
exports.getTotalTradeFeesCollateral = getTotalTradeFeesCollateral;
|
|
53
|
+
/**
|
|
54
|
+
* @dev Returns the fee breakdown for a trade
|
|
55
|
+
* @dev Mirrors the contract's getTradeFeesCollateral function
|
|
56
|
+
*/
|
|
57
|
+
const getTradeFeesCollateral = (collateralIndex, trader, pairIndex, positionSizeCollateral, isCounterTrade, context) => {
|
|
58
|
+
const totalFees = (0, exports.getTotalTradeFeesCollateral)(collateralIndex, trader, pairIndex, positionSizeCollateral, isCounterTrade, context);
|
|
59
|
+
const { globalTradeFeeParams } = context;
|
|
60
|
+
const totalP = globalTradeFeeParams.referralFeeP +
|
|
61
|
+
globalTradeFeeParams.govFeeP +
|
|
62
|
+
globalTradeFeeParams.triggerOrderFeeP +
|
|
63
|
+
globalTradeFeeParams.gnsOtcFeeP +
|
|
64
|
+
globalTradeFeeParams.gTokenFeeP;
|
|
65
|
+
// Distribute fees proportionally
|
|
66
|
+
return {
|
|
67
|
+
referralFeeCollateral: (totalFees * globalTradeFeeParams.referralFeeP) / totalP,
|
|
68
|
+
govFeeCollateral: (totalFees * globalTradeFeeParams.govFeeP) / totalP,
|
|
69
|
+
triggerFeeCollateral: (totalFees * globalTradeFeeParams.triggerOrderFeeP) / totalP,
|
|
70
|
+
gnsOtcFeeCollateral: (totalFees * globalTradeFeeParams.gnsOtcFeeP) / totalP,
|
|
71
|
+
gTokenFeeCollateral: (totalFees * globalTradeFeeParams.gTokenFeeP) / totalP,
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
exports.getTradeFeesCollateral = getTradeFeesCollateral;
|
|
75
|
+
/**
|
|
76
|
+
* @dev Returns total liquidation fee for a trade in collateral tokens
|
|
77
|
+
* @dev Mirrors the contract's getTotalTradeLiqFeesCollateral function
|
|
78
|
+
*/
|
|
79
|
+
const getTotalTradeLiqFeesCollateral = (collateralIndex, trader, pairIndex, collateralAmount, context) => {
|
|
80
|
+
const { totalLiqCollateralFeeP } = context;
|
|
81
|
+
// Calculate raw liquidation fee
|
|
82
|
+
const rawFee = collateralAmount * totalLiqCollateralFeeP;
|
|
83
|
+
// Apply trader fee tier if available
|
|
84
|
+
return (0, tiers_1.calculateFeeAmount)(trader, rawFee, context.traderFeeMultiplier);
|
|
85
|
+
};
|
|
86
|
+
exports.getTotalTradeLiqFeesCollateral = getTotalTradeLiqFeesCollateral;
|
|
87
|
+
/**
|
|
88
|
+
* @dev Legacy function for backward compatibility
|
|
89
|
+
* @deprecated Use getTotalTradeFeesCollateral instead
|
|
90
|
+
*/
|
|
91
|
+
const getClosingFee = (collateralAmount, leverage, pairIndex, pairFee,
|
|
92
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
93
|
+
_collateralPriceUsd = 0, // Kept for backward compatibility
|
|
94
|
+
isCounterTrade = false, trader, context) => {
|
|
95
|
+
if (!pairFee || !context)
|
|
96
|
+
return 0;
|
|
97
|
+
const positionSizeCollateral = collateralAmount * leverage;
|
|
98
|
+
return (0, exports.getTotalTradeFeesCollateral)(0, // collateralIndex not used
|
|
99
|
+
trader || "", pairIndex, positionSizeCollateral, isCounterTrade, context);
|
|
100
|
+
};
|
|
101
|
+
exports.getClosingFee = getClosingFee;
|
|
102
|
+
// Export types
|
|
103
|
+
__exportStar(require("./types"), exports);
|
|
104
|
+
__exportStar(require("./converter"), exports);
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dev Types for trading fee calculations (open/close position fees)
|
|
3
|
+
*/
|
|
4
|
+
import { Fee, CounterTradeSettings, GlobalTradeFeeParams } from "../../types";
|
|
5
|
+
/**
|
|
6
|
+
* @dev Breakdown of trading fees into components
|
|
7
|
+
*/
|
|
8
|
+
export type TradeFeesBreakdown = {
|
|
9
|
+
referralFeeCollateral: number;
|
|
10
|
+
govFeeCollateral: number;
|
|
11
|
+
triggerFeeCollateral: number;
|
|
12
|
+
gnsOtcFeeCollateral: number;
|
|
13
|
+
gTokenFeeCollateral: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* @dev Context for calculating trading fees
|
|
17
|
+
*/
|
|
18
|
+
export type GetTradeFeesContext = {
|
|
19
|
+
fee: Fee;
|
|
20
|
+
collateralPriceUsd: number;
|
|
21
|
+
globalTradeFeeParams: GlobalTradeFeeParams;
|
|
22
|
+
counterTradeSettings?: {
|
|
23
|
+
[pairIndex: number]: CounterTradeSettings;
|
|
24
|
+
};
|
|
25
|
+
traderFeeMultiplier?: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* @dev Context for calculating liquidation fees
|
|
29
|
+
*/
|
|
30
|
+
export type GetLiquidationFeesContext = {
|
|
31
|
+
totalLiqCollateralFeeP: number;
|
|
32
|
+
globalTradeFeeParams: GlobalTradeFeeParams;
|
|
33
|
+
traderFeeMultiplier?: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* @dev Legacy support
|
|
37
|
+
*/
|
|
38
|
+
export type GetClosingFeeContext = GetTradeFeesContext;
|
|
39
|
+
export type { GlobalTradeFeeParams };
|
package/lib/trade/index.d.ts
CHANGED
package/lib/trade/index.js
CHANGED
|
@@ -18,6 +18,7 @@ __exportStar(require("./fees"), exports);
|
|
|
18
18
|
__exportStar(require("./pnl"), exports);
|
|
19
19
|
__exportStar(require("./spread"), exports);
|
|
20
20
|
__exportStar(require("./liquidation"), exports);
|
|
21
|
-
__exportStar(require("./fees"), exports);
|
|
22
21
|
__exportStar(require("./types"), exports);
|
|
23
22
|
__exportStar(require("./oiWindows"), exports);
|
|
23
|
+
__exportStar(require("./priceImpact"), exports);
|
|
24
|
+
__exportStar(require("./utils"), exports);
|
|
@@ -1,12 +1,42 @@
|
|
|
1
1
|
import { GetBorrowingFeeContext, BorrowingFee } from "./fees";
|
|
2
|
-
import {
|
|
2
|
+
import { GetLiquidationFeesContext } from "./fees/trading";
|
|
3
|
+
import { BorrowingFeeV2 } from "./fees/borrowingV2";
|
|
4
|
+
import { Fee, LiquidationParams, Trade, TradeInfo, UserPriceImpact, TradeFeesData } from "./types";
|
|
3
5
|
import { ContractsVersion } from "../contracts/types";
|
|
4
|
-
export type GetLiquidationPriceContext = GetBorrowingFeeContext & {
|
|
6
|
+
export type GetLiquidationPriceContext = GetBorrowingFeeContext & BorrowingFeeV2.GetBorrowingFeeV2Context & GetLiquidationFeesContext & {
|
|
5
7
|
liquidationParams: LiquidationParams | undefined;
|
|
6
8
|
pairSpreadP: number | undefined;
|
|
7
9
|
collateralPriceUsd: number | undefined;
|
|
8
10
|
contractsVersion: ContractsVersion | undefined;
|
|
9
11
|
userPriceImpact?: UserPriceImpact | undefined;
|
|
12
|
+
currentPairPrice?: number;
|
|
13
|
+
isCounterTrade?: boolean;
|
|
14
|
+
tradeFeesData?: TradeFeesData;
|
|
15
|
+
partialCloseMultiplier?: number;
|
|
16
|
+
additionalFeeCollateral?: number;
|
|
17
|
+
beforeOpened?: boolean;
|
|
18
|
+
initialAccFees?: BorrowingFee.InitialAccFees;
|
|
19
|
+
fundingParams?: Record<number, Record<number, any>>;
|
|
20
|
+
fundingData?: Record<number, Record<number, any>>;
|
|
21
|
+
pairOiAfterV10?: Record<number, Record<number, any>>;
|
|
22
|
+
netExposureToken?: Record<number, Record<number, number>>;
|
|
23
|
+
netExposureUsd?: Record<number, Record<number, number>>;
|
|
10
24
|
};
|
|
25
|
+
export type TradeHoldingFees = {
|
|
26
|
+
fundingFeeCollateral: number;
|
|
27
|
+
borrowingFeeCollateral: number;
|
|
28
|
+
borrowingFeeCollateral_old: number;
|
|
29
|
+
totalFeeCollateral: number;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* @dev Calculates total holding fees for a trade (funding + borrowing fees)
|
|
33
|
+
* @param trade The trade to calculate fees for
|
|
34
|
+
* @param tradeInfo Trade info containing contracts version
|
|
35
|
+
* @param tradeFeesData Trade fees data containing initial acc fees
|
|
36
|
+
* @param currentPairPrice Current pair price
|
|
37
|
+
* @param context Context with fee parameters
|
|
38
|
+
* @returns Object containing all holding fee components
|
|
39
|
+
*/
|
|
40
|
+
export declare const getTradePendingHoldingFeesCollateral: (trade: Trade, tradeInfo: TradeInfo, tradeFeesData: TradeFeesData, currentPairPrice: number, context: GetLiquidationPriceContext) => TradeHoldingFees;
|
|
11
41
|
export declare const getLiquidationPrice: (trade: Trade, fee: Fee, initialAccFees: BorrowingFee.InitialAccFees, context: GetLiquidationPriceContext) => number;
|
|
12
42
|
export declare const getLiqPnlThresholdP: (liquidationParams: LiquidationParams | undefined, leverage: number | undefined) => number;
|
package/lib/trade/liquidation.js
CHANGED
|
@@ -1,27 +1,112 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getLiqPnlThresholdP = exports.getLiquidationPrice = void 0;
|
|
3
|
+
exports.getLiqPnlThresholdP = exports.getLiquidationPrice = exports.getTradePendingHoldingFeesCollateral = void 0;
|
|
4
4
|
const fees_1 = require("./fees");
|
|
5
|
+
const trading_1 = require("./fees/trading");
|
|
6
|
+
const borrowingV2_1 = require("./fees/borrowingV2");
|
|
5
7
|
const spread_1 = require("./spread");
|
|
6
8
|
const types_1 = require("../contracts/types");
|
|
9
|
+
/**
|
|
10
|
+
* @dev Calculates total holding fees for a trade (funding + borrowing fees)
|
|
11
|
+
* @param trade The trade to calculate fees for
|
|
12
|
+
* @param tradeInfo Trade info containing contracts version
|
|
13
|
+
* @param tradeFeesData Trade fees data containing initial acc fees
|
|
14
|
+
* @param currentPairPrice Current pair price
|
|
15
|
+
* @param context Context with fee parameters
|
|
16
|
+
* @returns Object containing all holding fee components
|
|
17
|
+
*/
|
|
18
|
+
const getTradePendingHoldingFeesCollateral = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
|
|
19
|
+
var _a;
|
|
20
|
+
// Calculate funding fees (v10+ only)
|
|
21
|
+
const fundingFeeCollateral = ((_a = context.contractsVersion) !== null && _a !== void 0 ? _a : tradeInfo.contractsVersion) >=
|
|
22
|
+
types_1.ContractsVersion.V10
|
|
23
|
+
? (0, fees_1.getTradeFundingFeesCollateral)(trade, tradeInfo, tradeFeesData, currentPairPrice, context)
|
|
24
|
+
: 0;
|
|
25
|
+
// Calculate borrowing fees v2
|
|
26
|
+
const borrowingFeeCollateral = (0, borrowingV2_1.getTradeBorrowingFeesCollateral)({
|
|
27
|
+
positionSizeCollateral: trade.collateralAmount * trade.leverage,
|
|
28
|
+
openPrice: trade.openPrice,
|
|
29
|
+
collateralIndex: trade.collateralIndex,
|
|
30
|
+
pairIndex: trade.pairIndex,
|
|
31
|
+
currentPairPrice,
|
|
32
|
+
initialAccBorrowingFeeP: tradeFeesData.initialAccBorrowingFeeP,
|
|
33
|
+
currentTimestamp: context.currentTimestamp,
|
|
34
|
+
}, context);
|
|
35
|
+
// Calculate v1 borrowing fees (some markets use v1 indefinitely)
|
|
36
|
+
const borrowingFeeCollateral_old = (0, fees_1.getBorrowingFee)(trade.collateralAmount * trade.leverage, trade.pairIndex, trade.long, context.initialAccFees || { accPairFee: 0, accGroupFee: 0, block: 0 }, // Use context initial fees or empty
|
|
37
|
+
context);
|
|
38
|
+
return {
|
|
39
|
+
fundingFeeCollateral,
|
|
40
|
+
borrowingFeeCollateral,
|
|
41
|
+
borrowingFeeCollateral_old,
|
|
42
|
+
totalFeeCollateral: fundingFeeCollateral +
|
|
43
|
+
borrowingFeeCollateral +
|
|
44
|
+
borrowingFeeCollateral_old,
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
exports.getTradePendingHoldingFeesCollateral = getTradePendingHoldingFeesCollateral;
|
|
7
48
|
const getLiquidationPrice = (trade, fee, initialAccFees, context) => {
|
|
8
|
-
var _a, _b;
|
|
9
|
-
|
|
10
|
-
|
|
49
|
+
var _a, _b, _c, _d, _e, _f;
|
|
50
|
+
// Ensure initialAccFees is in context
|
|
51
|
+
if (!context.initialAccFees) {
|
|
52
|
+
context = Object.assign(Object.assign({}, context), { initialAccFees });
|
|
53
|
+
}
|
|
54
|
+
// 1. Calculate liquidation fees
|
|
55
|
+
const closingFee = (0, trading_1.getTotalTradeLiqFeesCollateral)(0, // collateralIndex not used in calculation
|
|
56
|
+
trade.user, trade.pairIndex, trade.collateralAmount, context);
|
|
57
|
+
// 2. Calculate holding fees and realized PnL
|
|
58
|
+
let holdingFeesTotal = 0;
|
|
59
|
+
let totalRealizedPnlCollateral = 0;
|
|
60
|
+
if (!context.beforeOpened &&
|
|
61
|
+
context.tradeFeesData &&
|
|
62
|
+
context.currentPairPrice) {
|
|
63
|
+
// V10 data available - calculate full holding fees
|
|
64
|
+
// Create a minimal tradeInfo from context
|
|
65
|
+
const tradeInfo = {
|
|
66
|
+
contractsVersion: (_a = context.contractsVersion) !== null && _a !== void 0 ? _a : types_1.ContractsVersion.V10,
|
|
67
|
+
createdBlock: 0,
|
|
68
|
+
tpLastUpdatedBlock: 0,
|
|
69
|
+
slLastUpdatedBlock: 0,
|
|
70
|
+
maxSlippageP: 0,
|
|
71
|
+
lastOiUpdateTs: 0,
|
|
72
|
+
collateralPriceUsd: (_b = context.collateralPriceUsd) !== null && _b !== void 0 ? _b : 0,
|
|
73
|
+
lastPosIncreaseBlock: 0,
|
|
74
|
+
};
|
|
75
|
+
const holdingFees = (0, exports.getTradePendingHoldingFeesCollateral)(trade, tradeInfo, context.tradeFeesData, context.currentPairPrice, context);
|
|
76
|
+
holdingFeesTotal = holdingFees.totalFeeCollateral;
|
|
77
|
+
// Calculate total realized PnL (realized PnL minus realized trading fees)
|
|
78
|
+
totalRealizedPnlCollateral =
|
|
79
|
+
context.tradeFeesData.realizedPnlCollateral -
|
|
80
|
+
context.tradeFeesData.realizedTradingFeesCollateral;
|
|
81
|
+
}
|
|
82
|
+
else if (!context.beforeOpened) {
|
|
83
|
+
// Markets using v1 borrowing fees model
|
|
84
|
+
holdingFeesTotal = (0, fees_1.getBorrowingFee)(trade.collateralAmount * trade.leverage, trade.pairIndex, trade.long, initialAccFees, context);
|
|
85
|
+
}
|
|
86
|
+
// 3. Apply unified formula for all trades
|
|
87
|
+
const partialCloseMultiplier = (_c = context.partialCloseMultiplier) !== null && _c !== void 0 ? _c : 1;
|
|
88
|
+
const additionalFeeCollateral = (_d = context.additionalFeeCollateral) !== null && _d !== void 0 ? _d : 0;
|
|
89
|
+
const totalFeesCollateral = closingFee +
|
|
90
|
+
(holdingFeesTotal - totalRealizedPnlCollateral) * partialCloseMultiplier +
|
|
91
|
+
additionalFeeCollateral;
|
|
92
|
+
// 4. Calculate liquidation threshold
|
|
11
93
|
const liqThresholdP = (0, exports.getLiqPnlThresholdP)(context.liquidationParams, trade.leverage);
|
|
12
|
-
|
|
13
|
-
|
|
94
|
+
// 5. Calculate liquidation price distance
|
|
95
|
+
const collateralLiqNegativePnl = trade.collateralAmount * liqThresholdP;
|
|
96
|
+
let liqPriceDistance = (trade.openPrice * (collateralLiqNegativePnl - totalFeesCollateral)) /
|
|
14
97
|
trade.collateralAmount /
|
|
15
98
|
trade.leverage;
|
|
99
|
+
// 6. Apply closing spread for v9.2+
|
|
16
100
|
if ((context === null || context === void 0 ? void 0 : context.contractsVersion) !== undefined &&
|
|
17
101
|
context.contractsVersion >= types_1.ContractsVersion.V9_2 &&
|
|
18
|
-
((((
|
|
102
|
+
((((_e = context === null || context === void 0 ? void 0 : context.liquidationParams) === null || _e === void 0 ? void 0 : _e.maxLiqSpreadP) !== undefined &&
|
|
19
103
|
context.liquidationParams.maxLiqSpreadP > 0) ||
|
|
20
|
-
(((
|
|
104
|
+
(((_f = context === null || context === void 0 ? void 0 : context.userPriceImpact) === null || _f === void 0 ? void 0 : _f.fixedSpreadP) !== undefined &&
|
|
21
105
|
context.userPriceImpact.fixedSpreadP > 0))) {
|
|
22
106
|
const closingSpreadP = (0, spread_1.getSpreadP)(context.pairSpreadP, true, context.liquidationParams, context.userPriceImpact);
|
|
23
107
|
liqPriceDistance -= trade.openPrice * closingSpreadP;
|
|
24
108
|
}
|
|
109
|
+
// 7. Calculate final liquidation price
|
|
25
110
|
return trade.long
|
|
26
111
|
? Math.max(trade.openPrice - liqPriceDistance, 0)
|
|
27
112
|
: Math.max(trade.openPrice + liqPriceDistance, 0);
|
package/lib/trade/pnl.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { GetBorrowingFeeContext } from "./fees";
|
|
2
|
-
import {
|
|
2
|
+
import { GetTradeFeesContext } from "./fees/trading";
|
|
3
|
+
import { LiquidationParams, Trade, TradeInfo, TradeInitialAccFees } from "./types";
|
|
3
4
|
import { ContractsVersion } from "../contracts/types";
|
|
4
|
-
export type GetPnlContext = GetBorrowingFeeContext & {
|
|
5
|
-
fee: Fee | undefined;
|
|
5
|
+
export type GetPnlContext = GetBorrowingFeeContext & GetTradeFeesContext & {
|
|
6
6
|
collateralPriceUsd: number | undefined;
|
|
7
7
|
contractsVersion: ContractsVersion | undefined;
|
|
8
8
|
feeMultiplier: number | undefined;
|
package/lib/trade/pnl.js
CHANGED
|
@@ -2,14 +2,15 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getPnl = void 0;
|
|
4
4
|
const fees_1 = require("./fees");
|
|
5
|
+
const trading_1 = require("./fees/trading");
|
|
5
6
|
const liquidation_1 = require("./liquidation");
|
|
6
7
|
const getPnl = (price, trade, tradeInfo, initialAccFees, liquidationParams, useFees, context) => {
|
|
8
|
+
var _a;
|
|
7
9
|
if (!price) {
|
|
8
10
|
return;
|
|
9
11
|
}
|
|
10
12
|
const posCollat = trade.collateralAmount;
|
|
11
13
|
const { openPrice, leverage } = trade;
|
|
12
|
-
const { fee } = context;
|
|
13
14
|
let pnlCollat = trade.long
|
|
14
15
|
? ((price - openPrice) / openPrice) * leverage * posCollat
|
|
15
16
|
: ((openPrice - price) / openPrice) * leverage * posCollat;
|
|
@@ -23,7 +24,11 @@ const getPnl = (price, trade, tradeInfo, initialAccFees, liquidationParams, useF
|
|
|
23
24
|
pnlPercentage = -100;
|
|
24
25
|
}
|
|
25
26
|
else {
|
|
26
|
-
|
|
27
|
+
// Calculate closing fee using the same function as opening fees
|
|
28
|
+
const positionSizeCollateral = posCollat * trade.leverage;
|
|
29
|
+
const closingFee = (0, trading_1.getTotalTradeFeesCollateral)(0, // collateralIndex not used
|
|
30
|
+
trade.user, trade.pairIndex, positionSizeCollateral, (_a = trade.isCounterTrade) !== null && _a !== void 0 ? _a : false, context);
|
|
31
|
+
pnlCollat -= closingFee;
|
|
27
32
|
pnlPercentage = (pnlCollat / posCollat) * 100;
|
|
28
33
|
}
|
|
29
34
|
pnlPercentage = pnlPercentage < -100 ? -100 : pnlPercentage;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dev Main price impact module
|
|
3
|
+
* @dev Exports skew price impact functionality (v10+)
|
|
4
|
+
* @dev Cumulative volume price impact remains in spread.ts for now
|
|
5
|
+
*/
|
|
6
|
+
export { getNetSkewToken, getNetSkewCollateral, getTradeSkewDirection, calculateSkewPriceImpactP, getTradeSkewPriceImpact, getTradeSkewPriceImpactWithChecks, calculatePartialSizeToken, SkewPriceImpact, } from "./skew";
|
|
7
|
+
export { convertPairOiToken, convertPairOiTokenArray, convertPairOiCollateral, convertPairOiCollateralArray, normalizeSkewDepth, createSkewDepth, createSkewPriceImpactContext, isValidSkewDepth, convertSkewDepthsArray, mergeSkewPriceImpactContexts, } from "./skew/converter";
|
|
8
|
+
export type { PairOiToken, PairOiCollateral, SkewDepth, SkewPriceImpactInput, SkewPriceImpactResult, SkewPriceImpactContext, TradeSkewParams, PositionSizeResult, } from "./skew/types";
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @dev Main price impact module
|
|
4
|
+
* @dev Exports skew price impact functionality (v10+)
|
|
5
|
+
* @dev Cumulative volume price impact remains in spread.ts for now
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.mergeSkewPriceImpactContexts = exports.convertSkewDepthsArray = exports.isValidSkewDepth = exports.createSkewPriceImpactContext = exports.createSkewDepth = exports.normalizeSkewDepth = exports.convertPairOiCollateralArray = exports.convertPairOiCollateral = exports.convertPairOiTokenArray = exports.convertPairOiToken = exports.SkewPriceImpact = exports.calculatePartialSizeToken = exports.getTradeSkewPriceImpactWithChecks = exports.getTradeSkewPriceImpact = exports.calculateSkewPriceImpactP = exports.getTradeSkewDirection = exports.getNetSkewCollateral = exports.getNetSkewToken = void 0;
|
|
9
|
+
// Export skew price impact functionality
|
|
10
|
+
var skew_1 = require("./skew");
|
|
11
|
+
// Core functions
|
|
12
|
+
Object.defineProperty(exports, "getNetSkewToken", { enumerable: true, get: function () { return skew_1.getNetSkewToken; } });
|
|
13
|
+
Object.defineProperty(exports, "getNetSkewCollateral", { enumerable: true, get: function () { return skew_1.getNetSkewCollateral; } });
|
|
14
|
+
Object.defineProperty(exports, "getTradeSkewDirection", { enumerable: true, get: function () { return skew_1.getTradeSkewDirection; } });
|
|
15
|
+
Object.defineProperty(exports, "calculateSkewPriceImpactP", { enumerable: true, get: function () { return skew_1.calculateSkewPriceImpactP; } });
|
|
16
|
+
Object.defineProperty(exports, "getTradeSkewPriceImpact", { enumerable: true, get: function () { return skew_1.getTradeSkewPriceImpact; } });
|
|
17
|
+
Object.defineProperty(exports, "getTradeSkewPriceImpactWithChecks", { enumerable: true, get: function () { return skew_1.getTradeSkewPriceImpactWithChecks; } });
|
|
18
|
+
Object.defineProperty(exports, "calculatePartialSizeToken", { enumerable: true, get: function () { return skew_1.calculatePartialSizeToken; } });
|
|
19
|
+
// Types namespace
|
|
20
|
+
Object.defineProperty(exports, "SkewPriceImpact", { enumerable: true, get: function () { return skew_1.SkewPriceImpact; } });
|
|
21
|
+
// Export converters
|
|
22
|
+
var converter_1 = require("./skew/converter");
|
|
23
|
+
Object.defineProperty(exports, "convertPairOiToken", { enumerable: true, get: function () { return converter_1.convertPairOiToken; } });
|
|
24
|
+
Object.defineProperty(exports, "convertPairOiTokenArray", { enumerable: true, get: function () { return converter_1.convertPairOiTokenArray; } });
|
|
25
|
+
Object.defineProperty(exports, "convertPairOiCollateral", { enumerable: true, get: function () { return converter_1.convertPairOiCollateral; } });
|
|
26
|
+
Object.defineProperty(exports, "convertPairOiCollateralArray", { enumerable: true, get: function () { return converter_1.convertPairOiCollateralArray; } });
|
|
27
|
+
Object.defineProperty(exports, "normalizeSkewDepth", { enumerable: true, get: function () { return converter_1.normalizeSkewDepth; } });
|
|
28
|
+
Object.defineProperty(exports, "createSkewDepth", { enumerable: true, get: function () { return converter_1.createSkewDepth; } });
|
|
29
|
+
Object.defineProperty(exports, "createSkewPriceImpactContext", { enumerable: true, get: function () { return converter_1.createSkewPriceImpactContext; } });
|
|
30
|
+
Object.defineProperty(exports, "isValidSkewDepth", { enumerable: true, get: function () { return converter_1.isValidSkewDepth; } });
|
|
31
|
+
Object.defineProperty(exports, "convertSkewDepthsArray", { enumerable: true, get: function () { return converter_1.convertSkewDepthsArray; } });
|
|
32
|
+
Object.defineProperty(exports, "mergeSkewPriceImpactContexts", { enumerable: true, get: function () { return converter_1.mergeSkewPriceImpactContexts; } });
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dev Converters for skew price impact data between contract and SDK formats
|
|
3
|
+
* @dev All BigNumber values are normalized to floats with appropriate precision
|
|
4
|
+
*/
|
|
5
|
+
import { IPriceImpact } from "../../../contracts/types/generated/GNSMultiCollatDiamond";
|
|
6
|
+
import { PairOiToken, PairOiCollateral, SkewDepth, SkewPriceImpactContext } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* @dev Converts contract pair OI token data to SDK format
|
|
9
|
+
* @param contractData Contract pair OI token struct
|
|
10
|
+
* @returns Normalized pair OI token data
|
|
11
|
+
*/
|
|
12
|
+
export declare const convertPairOiToken: (contractData: IPriceImpact.PairOiTokenStruct) => PairOiToken;
|
|
13
|
+
/**
|
|
14
|
+
* @dev Converts array of contract pair OI token data to SDK format
|
|
15
|
+
* @param contractDataArray Array of contract pair OI token data
|
|
16
|
+
* @returns Array of normalized pair OI token data
|
|
17
|
+
*/
|
|
18
|
+
export declare const convertPairOiTokenArray: (contractDataArray: IPriceImpact.PairOiTokenStruct[]) => PairOiToken[];
|
|
19
|
+
/**
|
|
20
|
+
* @dev Converts contract pair OI collateral data to SDK format
|
|
21
|
+
* @param contractData Contract pair OI collateral struct
|
|
22
|
+
* @param collateralDecimals Number of decimals for the collateral (e.g., 18 for DAI, 6 for USDC)
|
|
23
|
+
* @returns Normalized pair OI collateral data
|
|
24
|
+
*/
|
|
25
|
+
export declare const convertPairOiCollateral: (contractData: IPriceImpact.PairOiCollateralStruct, collateralDecimals: number) => PairOiCollateral;
|
|
26
|
+
/**
|
|
27
|
+
* @dev Converts array of contract pair OI collateral data to SDK format
|
|
28
|
+
* @param contractDataArray Array of contract pair OI collateral data
|
|
29
|
+
* @param collateralDecimals Array of collateral decimals for each entry
|
|
30
|
+
* @returns Array of normalized pair OI collateral data
|
|
31
|
+
*/
|
|
32
|
+
export declare const convertPairOiCollateralArray: (contractDataArray: IPriceImpact.PairOiCollateralStruct[], collateralDecimals: number[]) => PairOiCollateral[];
|
|
33
|
+
/**
|
|
34
|
+
* @dev Normalizes skew depth from contract format
|
|
35
|
+
* @param depth Skew depth from contract (in collateral wei)
|
|
36
|
+
* @param collateralDecimals Number of decimals for the collateral
|
|
37
|
+
* @returns Normalized skew depth
|
|
38
|
+
*/
|
|
39
|
+
export declare const normalizeSkewDepth: (depth: bigint | number | string, collateralDecimals: number) => number;
|
|
40
|
+
/**
|
|
41
|
+
* @dev Creates a skew depth object
|
|
42
|
+
* @param collateralIndex Collateral index
|
|
43
|
+
* @param pairIndex Pair index
|
|
44
|
+
* @param depth Normalized depth value
|
|
45
|
+
* @returns Skew depth object
|
|
46
|
+
*/
|
|
47
|
+
export declare const createSkewDepth: (collateralIndex: number, pairIndex: number, depth: number) => SkewDepth;
|
|
48
|
+
/**
|
|
49
|
+
* @dev Creates skew price impact context from arrays of data
|
|
50
|
+
* @param collateralIndices Array of collateral indices
|
|
51
|
+
* @param pairIndices Array of pair indices
|
|
52
|
+
* @param skewDepths Array of normalized skew depths
|
|
53
|
+
* @param pairOiTokens Array of pair OI token data
|
|
54
|
+
* @returns Complete skew price impact context
|
|
55
|
+
*/
|
|
56
|
+
export declare const createSkewPriceImpactContext: (collateralIndices: number[], pairIndices: number[], skewDepths: number[], pairOiTokens: PairOiToken[]) => SkewPriceImpactContext;
|
|
57
|
+
/**
|
|
58
|
+
* @dev Validates skew depth is within reasonable bounds
|
|
59
|
+
* @param depth Normalized skew depth
|
|
60
|
+
* @param minDepth Minimum allowed depth (default: 0)
|
|
61
|
+
* @param maxDepth Maximum allowed depth (default: 1e12)
|
|
62
|
+
* @returns Whether depth is valid
|
|
63
|
+
*/
|
|
64
|
+
export declare const isValidSkewDepth: (depth: number, minDepth?: number, maxDepth?: number) => boolean;
|
|
65
|
+
/**
|
|
66
|
+
* @dev Converts contract skew depths array to normalized values
|
|
67
|
+
* @param contractDepths Array of depths from contract
|
|
68
|
+
* @param collateralDecimals Array of decimals for each collateral
|
|
69
|
+
* @returns Array of normalized depths
|
|
70
|
+
*/
|
|
71
|
+
export declare const convertSkewDepthsArray: (contractDepths: Array<bigint | number | string>, collateralDecimals: number[]) => number[];
|
|
72
|
+
/**
|
|
73
|
+
* @dev Merges multiple contexts into one
|
|
74
|
+
* @param contexts Array of contexts to merge
|
|
75
|
+
* @returns Merged context
|
|
76
|
+
*/
|
|
77
|
+
export declare const mergeSkewPriceImpactContexts: (contexts: SkewPriceImpactContext[]) => SkewPriceImpactContext;
|