@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.
Files changed (62) hide show
  1. package/lib/constants.d.ts +8 -1
  2. package/lib/constants.js +8 -1
  3. package/lib/contracts/fetch/fees/borrowingFeesV2.d.ts +76 -0
  4. package/lib/contracts/fetch/fees/borrowingFeesV2.js +193 -0
  5. package/lib/contracts/fetch/fees/fundingFees.d.ts +66 -0
  6. package/lib/contracts/fetch/fees/fundingFees.js +150 -0
  7. package/lib/contracts/fetch/priceImpact/skew.d.ts +63 -0
  8. package/lib/contracts/fetch/priceImpact/skew.js +168 -0
  9. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +20 -7
  10. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +16 -7
  11. package/lib/contracts/types/generated/factories/GToken__factory.d.ts +0 -7
  12. package/lib/contracts/types/generated/factories/GToken__factory.js +0 -4
  13. package/lib/contracts/types/index.d.ts +2 -1
  14. package/lib/contracts/types/index.js +1 -0
  15. package/lib/contracts/utils/index.d.ts +3 -0
  16. package/lib/contracts/utils/index.js +3 -0
  17. package/lib/contracts/utils/openTrades.d.ts +1 -0
  18. package/lib/contracts/utils/openTrades.js +109 -55
  19. package/lib/contracts/utils/pairs.js +7 -0
  20. package/lib/trade/fees/borrowing/index.d.ts +10 -0
  21. package/lib/trade/fees/borrowing/index.js +10 -0
  22. package/lib/trade/fees/borrowingV2/converter.d.ts +66 -0
  23. package/lib/trade/fees/borrowingV2/converter.js +121 -0
  24. package/lib/trade/fees/borrowingV2/index.d.ts +59 -0
  25. package/lib/trade/fees/borrowingV2/index.js +139 -0
  26. package/lib/trade/fees/borrowingV2/types.d.ts +79 -0
  27. package/lib/trade/fees/borrowingV2/types.js +5 -0
  28. package/lib/trade/fees/fundingFees/converter.d.ts +102 -0
  29. package/lib/trade/fees/fundingFees/converter.js +196 -0
  30. package/lib/trade/fees/fundingFees/index.d.ts +135 -0
  31. package/lib/trade/fees/fundingFees/index.js +322 -0
  32. package/lib/trade/fees/fundingFees/types.d.ts +77 -0
  33. package/lib/trade/fees/fundingFees/types.js +5 -0
  34. package/lib/trade/fees/index.d.ts +6 -2
  35. package/lib/trade/fees/index.js +58 -16
  36. package/lib/trade/fees/tiers/index.d.ts +17 -0
  37. package/lib/trade/fees/tiers/index.js +44 -1
  38. package/lib/trade/fees/trading/converter.d.ts +30 -0
  39. package/lib/trade/fees/trading/converter.js +43 -0
  40. package/lib/trade/fees/trading/index.d.ts +34 -0
  41. package/lib/trade/fees/trading/index.js +104 -0
  42. package/lib/trade/fees/trading/types.d.ts +39 -0
  43. package/lib/trade/fees/trading/types.js +5 -0
  44. package/lib/trade/index.d.ts +2 -1
  45. package/lib/trade/index.js +2 -1
  46. package/lib/trade/liquidation.d.ts +32 -2
  47. package/lib/trade/liquidation.js +93 -8
  48. package/lib/trade/pnl.d.ts +3 -3
  49. package/lib/trade/pnl.js +7 -2
  50. package/lib/trade/priceImpact/index.d.ts +8 -0
  51. package/lib/trade/priceImpact/index.js +32 -0
  52. package/lib/trade/priceImpact/skew/converter.d.ts +77 -0
  53. package/lib/trade/priceImpact/skew/converter.js +171 -0
  54. package/lib/trade/priceImpact/skew/index.d.ts +57 -0
  55. package/lib/trade/priceImpact/skew/index.js +175 -0
  56. package/lib/trade/priceImpact/skew/types.d.ts +55 -0
  57. package/lib/trade/priceImpact/skew/types.js +5 -0
  58. package/lib/trade/types.d.ts +25 -2
  59. package/lib/trade/types.js +7 -0
  60. package/lib/trade/utils.d.ts +18 -0
  61. package/lib/trade/utils.js +30 -0
  62. 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 };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Types for trading fee calculations (open/close position fees)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,6 +2,7 @@ export * from "./fees";
2
2
  export * from "./pnl";
3
3
  export * from "./spread";
4
4
  export * from "./liquidation";
5
- export * from "./fees";
6
5
  export * from "./types";
7
6
  export * from "./oiWindows";
7
+ export * from "./priceImpact";
8
+ export * from "./utils";
@@ -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 { Fee, LiquidationParams, Trade, UserPriceImpact } from "./types";
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;
@@ -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
- const closingFee = (0, fees_1.getClosingFee)(trade.collateralAmount, trade.leverage, trade.pairIndex, fee, context.collateralPriceUsd);
10
- const borrowingFee = (0, fees_1.getBorrowingFee)(trade.collateralAmount * trade.leverage, trade.pairIndex, trade.long, initialAccFees, context);
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
- let liqPriceDistance = (trade.openPrice *
13
- (trade.collateralAmount * liqThresholdP - (borrowingFee + closingFee))) /
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
- ((((_a = context === null || context === void 0 ? void 0 : context.liquidationParams) === null || _a === void 0 ? void 0 : _a.maxLiqSpreadP) !== undefined &&
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
- (((_b = context === null || context === void 0 ? void 0 : context.userPriceImpact) === null || _b === void 0 ? void 0 : _b.fixedSpreadP) !== undefined &&
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);
@@ -1,8 +1,8 @@
1
1
  import { GetBorrowingFeeContext } from "./fees";
2
- import { Fee, LiquidationParams, Trade, TradeInfo, TradeInitialAccFees } from "./types";
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
- pnlCollat -= (0, fees_1.getClosingFee)(posCollat, trade.leverage, trade.pairIndex, fee, context.collateralPriceUsd, context.feeMultiplier);
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;