@gainsnetwork/sdk 1.4.0-rc1 → 1.4.2-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.
Files changed (142) hide show
  1. package/lib/backend/globalTrades/index.js +10 -10
  2. package/lib/backend/tradingVariables/converter.js +57 -57
  3. package/lib/backend/tradingVariables/index.js +6 -7
  4. package/lib/constants.js +2 -2
  5. package/lib/contracts/addresses.js +4 -1
  6. package/lib/contracts/index.d.ts +1 -1
  7. package/lib/contracts/index.js +3 -3
  8. package/lib/contracts/types/generated/GFarmTradingStorageV5.d.ts +1911 -0
  9. package/lib/contracts/types/generated/GFarmTradingStorageV5.js +2 -0
  10. package/lib/contracts/types/generated/GNSBorrowingFees.d.ts +1067 -0
  11. package/lib/contracts/types/generated/GNSBorrowingFees.js +2 -0
  12. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.d.ts +979 -0
  13. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.js +2 -0
  14. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.d.ts +1058 -0
  15. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.js +2 -0
  16. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +386 -260
  17. package/lib/contracts/types/generated/GNSNftRewardsV6.d.ts +533 -0
  18. package/lib/contracts/types/generated/GNSNftRewardsV6.js +2 -0
  19. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +613 -0
  20. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +2 -0
  21. package/lib/contracts/types/generated/GNSPairInfosV6_1.d.ts +911 -0
  22. package/lib/contracts/types/generated/GNSPairInfosV6_1.js +2 -0
  23. package/lib/contracts/types/generated/GNSPairsStorageV6.d.ts +660 -0
  24. package/lib/contracts/types/generated/GNSPairsStorageV6.js +2 -0
  25. package/lib/contracts/types/generated/GNSTrading.d.ts +758 -0
  26. package/lib/contracts/types/generated/GNSTrading.js +2 -0
  27. package/lib/contracts/types/generated/GNSTradingCallbacks.d.ts +875 -0
  28. package/lib/contracts/types/generated/GNSTradingCallbacks.js +2 -0
  29. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.d.ts +806 -0
  30. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.js +2 -0
  31. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.d.ts +821 -0
  32. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.js +2 -0
  33. package/lib/contracts/types/generated/GNSTradingStorage.d.ts +1387 -0
  34. package/lib/contracts/types/generated/GNSTradingStorage.js +2 -0
  35. package/lib/contracts/types/generated/GTokenV6_3_2.d.ts +1838 -0
  36. package/lib/contracts/types/generated/GTokenV6_3_2.js +2 -0
  37. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.d.ts +83 -0
  38. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.js +2691 -0
  39. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.d.ts +88 -0
  40. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.js +1654 -0
  41. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.d.ts +113 -0
  42. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.js +1742 -0
  43. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.d.ts +124 -0
  44. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.js +1784 -0
  45. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.d.ts +2 -10
  46. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +1621 -219
  47. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +100 -0
  48. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +1116 -0
  49. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.d.ts +100 -0
  50. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.js +1003 -0
  51. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.d.ts +98 -0
  52. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.js +1485 -0
  53. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.d.ts +117 -0
  54. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.js +1265 -0
  55. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.d.ts +82 -0
  56. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.js +1273 -0
  57. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.d.ts +82 -0
  58. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.js +1326 -0
  59. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.d.ts +113 -0
  60. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.js +1428 -0
  61. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.d.ts +96 -0
  62. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.js +2241 -0
  63. package/lib/contracts/types/generated/factories/GNSTrading__factory.d.ts +95 -0
  64. package/lib/contracts/types/generated/factories/GNSTrading__factory.js +1071 -0
  65. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.d.ts +110 -0
  66. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.js +2682 -0
  67. package/lib/contracts/utils/borrowingFees.js +9 -20
  68. package/lib/contracts/utils/openTrades.js +11 -20
  69. package/lib/contracts/utils/pairs.js +12 -21
  70. package/lib/markets/forex.js +1 -1
  71. package/lib/markets/leverage/builder.js +2 -2
  72. package/lib/markets/oi/fetcher.d.ts +58 -0
  73. package/lib/markets/oi/fetcher.js +181 -0
  74. package/lib/markets/oi/validation.d.ts +80 -0
  75. package/lib/markets/oi/validation.js +172 -0
  76. package/lib/markets/price/index.d.ts +1 -0
  77. package/lib/markets/price/index.js +1 -0
  78. package/lib/markets/price/signedPrices.d.ts +36 -0
  79. package/lib/markets/price/signedPrices.js +181 -0
  80. package/lib/markets/price/types.d.ts +27 -0
  81. package/lib/pricing/depthBands/converter.d.ts +65 -0
  82. package/lib/pricing/depthBands/converter.js +155 -0
  83. package/lib/pricing/depthBands/decoder.d.ts +32 -0
  84. package/lib/pricing/depthBands/decoder.js +109 -0
  85. package/lib/pricing/depthBands/encoder.d.ts +19 -0
  86. package/lib/pricing/depthBands/encoder.js +105 -0
  87. package/lib/pricing/depthBands/index.d.ts +8 -0
  88. package/lib/pricing/depthBands/index.js +26 -0
  89. package/lib/pricing/depthBands/types.d.ts +49 -0
  90. package/lib/pricing/depthBands/types.js +10 -0
  91. package/lib/pricing/depthBands/validator.d.ts +22 -0
  92. package/lib/pricing/depthBands/validator.js +113 -0
  93. package/lib/pricing/depthBands.d.ts +39 -0
  94. package/lib/pricing/depthBands.js +94 -0
  95. package/lib/pricing/index.d.ts +4 -0
  96. package/lib/pricing/index.js +20 -0
  97. package/lib/trade/effectiveLeverage/builder.d.ts +23 -0
  98. package/lib/trade/effectiveLeverage/builder.js +30 -0
  99. package/lib/trade/fees/borrowing/builder.js +2 -3
  100. package/lib/trade/fees/borrowing/converter.js +5 -1
  101. package/lib/trade/fees/borrowing/index.js +5 -5
  102. package/lib/trade/fees/borrowingV2/builder.js +3 -4
  103. package/lib/trade/fees/borrowingV2/converter.js +1 -1
  104. package/lib/trade/fees/borrowingV2/fetcher.js +26 -32
  105. package/lib/trade/fees/borrowingV2/index.js +3 -3
  106. package/lib/trade/fees/converter.js +22 -22
  107. package/lib/trade/fees/fundingFees/builder.js +6 -7
  108. package/lib/trade/fees/fundingFees/converter.js +1 -1
  109. package/lib/trade/fees/fundingFees/fetcher.js +16 -25
  110. package/lib/trade/fees/fundingFees/index.js +2 -3
  111. package/lib/trade/fees/holdingFees/index.d.ts +46 -0
  112. package/lib/trade/fees/holdingFees/index.js +105 -0
  113. package/lib/trade/fees/holdingFees/types.d.ts +23 -0
  114. package/lib/trade/fees/holdingFees/types.js +5 -0
  115. package/lib/trade/fees/tiers/index.js +1 -2
  116. package/lib/trade/fees/trading/holdingFees.d.ts +28 -0
  117. package/lib/trade/fees/trading/holdingFees.js +66 -0
  118. package/lib/trade/fees/trading/holdingFeesStructured.d.ts +28 -0
  119. package/lib/trade/fees/trading/holdingFeesStructured.js +66 -0
  120. package/lib/trade/fees/trading/index.js +5 -3
  121. package/lib/trade/liquidation/builder.js +1 -2
  122. package/lib/trade/liquidation/index.js +4 -6
  123. package/lib/trade/oiWindows.js +1 -2
  124. package/lib/trade/pnl/builder.js +1 -2
  125. package/lib/trade/pnl/converter.js +1 -1
  126. package/lib/trade/pnl/index.js +4 -7
  127. package/lib/trade/priceImpact/close/builder.js +1 -2
  128. package/lib/trade/priceImpact/close/index.js +4 -1
  129. package/lib/trade/priceImpact/cumulVol/builder.js +18 -10
  130. package/lib/trade/priceImpact/cumulVol/index.js +21 -16
  131. package/lib/trade/priceImpact/cumulVol/types.d.ts +11 -0
  132. package/lib/trade/priceImpact/cumulVol/types.js +2 -0
  133. package/lib/trade/priceImpact/open/builder.js +1 -2
  134. package/lib/trade/priceImpact/open/index.js +4 -1
  135. package/lib/trade/priceImpact/skew/builder.js +2 -3
  136. package/lib/trade/priceImpact/skew/converter.js +1 -1
  137. package/lib/trade/priceImpact/skew/fetcher.js +24 -33
  138. package/package.json +2 -2
  139. package/lib/trade/liquidation.d.ts +0 -12
  140. package/lib/trade/liquidation.js +0 -55
  141. package/lib/trade/pnl.d.ts +0 -10
  142. package/lib/trade/pnl.js +0 -33
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @dev Holding fees calculation utilities for v10+ markets
3
+ * @dev Combines funding fees and borrowing v2 fees
4
+ */
5
+ import { FundingFeeParams, PairFundingFeeData, PairOiAfterV10 } from "../fundingFees/types";
6
+ import { BorrowingFeeParams, PairBorrowingFeeData } from "../borrowingV2/types";
7
+ export type HoldingFeeRates = {
8
+ longHourlyRate: number;
9
+ shortHourlyRate: number;
10
+ fundingFeeLongHourlyRate: number;
11
+ fundingFeeShortHourlyRate: number;
12
+ borrowingFeeHourlyRate: number;
13
+ currentFundingRatePerSecondP: number;
14
+ currentBorrowingRatePerSecondP: number;
15
+ };
16
+ export type GetPairHoldingFeeRatesInput = {
17
+ fundingParams: FundingFeeParams;
18
+ fundingData: PairFundingFeeData;
19
+ pairOiToken: PairOiAfterV10;
20
+ netExposureToken: number;
21
+ netExposureUsd: number;
22
+ borrowingParams: BorrowingFeeParams | null;
23
+ borrowingData: PairBorrowingFeeData | null;
24
+ currentPairPrice: number;
25
+ currentTimestamp: number;
26
+ };
27
+ /**
28
+ * @dev Calculates current holding fee rates per hour for display
29
+ * @param input Input parameters for calculation
30
+ * @returns Holding fee rates per hour with breakdown
31
+ */
32
+ export declare const getPairHoldingFeeRates: (input: GetPairHoldingFeeRatesInput) => HoldingFeeRates;
33
+ /**
34
+ * @dev Converts a per-second rate to annual percentage rate (APR)
35
+ * @param ratePerSecond Rate per second
36
+ * @returns Annual percentage rate
37
+ */
38
+ export declare const convertRatePerSecondToAPR: (ratePerSecond: number) => number;
39
+ /**
40
+ * @dev Formats a holding fee rate for display
41
+ * @param rate Hourly rate (can be negative)
42
+ * @param decimals Number of decimal places
43
+ * @returns Formatted string with sign
44
+ */
45
+ export declare const formatHoldingFeeRate: (rate: number, decimals?: number) => string;
46
+ export * as HoldingFees from "./types";
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Holding fees calculation utilities for v10+ markets
4
+ * @dev Combines funding fees and borrowing v2 fees
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || function (mod) {
23
+ if (mod && mod.__esModule) return mod;
24
+ var result = {};
25
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
26
+ __setModuleDefault(result, mod);
27
+ return result;
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.HoldingFees = exports.formatHoldingFeeRate = exports.convertRatePerSecondToAPR = exports.getPairHoldingFeeRates = void 0;
31
+ const fundingFees_1 = require("../fundingFees");
32
+ const SECONDS_PER_HOUR = 3600;
33
+ const SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
34
+ const PERCENTAGE_PRECISION = 100;
35
+ /**
36
+ * @dev Calculates current holding fee rates per hour for display
37
+ * @param input Input parameters for calculation
38
+ * @returns Holding fee rates per hour with breakdown
39
+ */
40
+ const getPairHoldingFeeRates = (input) => {
41
+ const { fundingParams, fundingData, pairOiToken, netExposureToken, netExposureUsd, borrowingParams, borrowingData, currentPairPrice, currentTimestamp, } = input;
42
+ // Calculate funding fee rates
43
+ let fundingFeeLongHourlyRate = 0;
44
+ let fundingFeeShortHourlyRate = 0;
45
+ let currentFundingRatePerSecondP = 0;
46
+ if (fundingParams.fundingFeesEnabled) {
47
+ // Get current funding rate
48
+ const pendingFunding = (0, fundingFees_1.getPairPendingAccFundingFees)(fundingParams, fundingData, currentPairPrice, pairOiToken, netExposureToken, netExposureUsd, currentTimestamp);
49
+ currentFundingRatePerSecondP = pendingFunding.currentFundingRatePerSecondP;
50
+ // Get APR multipliers
51
+ const { longAprMultiplier, shortAprMultiplier } = (0, fundingFees_1.getLongShortAprMultiplier)(currentFundingRatePerSecondP, pairOiToken.oiLongToken, pairOiToken.oiShortToken, fundingParams.aprMultiplierEnabled);
52
+ // Calculate hourly rates
53
+ // Funding rate * seconds per hour * current price * APR multiplier / 100
54
+ const baseHourlyRate = (currentFundingRatePerSecondP * SECONDS_PER_HOUR * currentPairPrice) /
55
+ PERCENTAGE_PRECISION;
56
+ // Long side pays when rate is positive, earns when negative
57
+ fundingFeeLongHourlyRate = baseHourlyRate * longAprMultiplier;
58
+ // Short side is opposite
59
+ fundingFeeShortHourlyRate = -baseHourlyRate * shortAprMultiplier;
60
+ }
61
+ // Calculate borrowing v2 rates
62
+ let borrowingFeeHourlyRate = 0;
63
+ let currentBorrowingRatePerSecondP = 0;
64
+ if (borrowingParams && borrowingData) {
65
+ currentBorrowingRatePerSecondP = borrowingParams.borrowingRatePerSecondP;
66
+ // Borrowing rate * seconds per hour * current price / 100
67
+ borrowingFeeHourlyRate =
68
+ (currentBorrowingRatePerSecondP * SECONDS_PER_HOUR * currentPairPrice) /
69
+ PERCENTAGE_PRECISION;
70
+ }
71
+ // Total holding fees (funding can be negative/positive, borrowing always positive cost)
72
+ const longHourlyRate = fundingFeeLongHourlyRate + borrowingFeeHourlyRate;
73
+ const shortHourlyRate = fundingFeeShortHourlyRate + borrowingFeeHourlyRate;
74
+ return {
75
+ longHourlyRate,
76
+ shortHourlyRate,
77
+ fundingFeeLongHourlyRate,
78
+ fundingFeeShortHourlyRate,
79
+ borrowingFeeHourlyRate,
80
+ currentFundingRatePerSecondP,
81
+ currentBorrowingRatePerSecondP,
82
+ };
83
+ };
84
+ exports.getPairHoldingFeeRates = getPairHoldingFeeRates;
85
+ /**
86
+ * @dev Converts a per-second rate to annual percentage rate (APR)
87
+ * @param ratePerSecond Rate per second
88
+ * @returns Annual percentage rate
89
+ */
90
+ const convertRatePerSecondToAPR = (ratePerSecond) => {
91
+ return ratePerSecond * SECONDS_PER_YEAR * PERCENTAGE_PRECISION;
92
+ };
93
+ exports.convertRatePerSecondToAPR = convertRatePerSecondToAPR;
94
+ /**
95
+ * @dev Formats a holding fee rate for display
96
+ * @param rate Hourly rate (can be negative)
97
+ * @param decimals Number of decimal places
98
+ * @returns Formatted string with sign
99
+ */
100
+ const formatHoldingFeeRate = (rate, decimals = 4) => {
101
+ const sign = rate > 0 ? "+" : "";
102
+ return `${sign}${rate.toFixed(decimals)}%`;
103
+ };
104
+ exports.formatHoldingFeeRate = formatHoldingFeeRate;
105
+ exports.HoldingFees = __importStar(require("./types"));
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @dev Type definitions for holding fees (funding + borrowing v2)
3
+ */
4
+ export interface HoldingFeeRates {
5
+ longHourlyRate: number;
6
+ shortHourlyRate: number;
7
+ fundingFeeLongHourlyRate: number;
8
+ fundingFeeShortHourlyRate: number;
9
+ borrowingFeeHourlyRate: number;
10
+ currentFundingRatePerSecondP: number;
11
+ currentBorrowingRatePerSecondP: number;
12
+ }
13
+ export interface GetPairHoldingFeeRatesInput {
14
+ fundingParams: import("../fundingFees/types").FundingFeeParams;
15
+ fundingData: import("../fundingFees/types").PairFundingFeeData;
16
+ pairOiToken: import("../fundingFees/types").PairOiAfterV10;
17
+ netExposureToken: number;
18
+ netExposureUsd: number;
19
+ borrowingParams: import("../borrowingV2/types").BorrowingFeeParams | null;
20
+ borrowingData: import("../borrowingV2/types").PairBorrowingFeeData | null;
21
+ currentPairPrice: number;
22
+ currentTimestamp: number;
23
+ }
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Type definitions for holding fees (funding + borrowing v2)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -24,9 +24,8 @@ exports.MAX_FEE_TIERS = 8;
24
24
  const getCurrentDay = () => Math.floor(Date.now() / 1000 / 60 / 60 / 24);
25
25
  exports.getCurrentDay = getCurrentDay;
26
26
  const getFeeTiersCount = (feeTiers) => {
27
- var _a;
28
27
  for (let i = exports.MAX_FEE_TIERS; i > 0; --i) {
29
- if (((_a = feeTiers[i - 1]) === null || _a === void 0 ? void 0 : _a.feeMultiplier) > 0) {
28
+ if (feeTiers[i - 1]?.feeMultiplier > 0) {
30
29
  return i;
31
30
  }
32
31
  }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @dev Holding fees calculation for structured contexts
3
+ */
4
+ import { Trade, TradeInfo, TradeFeesData } from "../../types";
5
+ import { TradeHoldingFees } from "./types";
6
+ import { ContractsVersion } from "../../../contracts/types";
7
+ import type { BorrowingV1SubContext, BorrowingV2SubContext, FundingFeesSubContext } from "../../pnl";
8
+ /**
9
+ * @dev Context for holding fees calculation with structured sub-contexts
10
+ */
11
+ export type GetStructuredHoldingFeesContext = {
12
+ contractsVersion: ContractsVersion;
13
+ currentTimestamp: number;
14
+ collateralPriceUsd: number;
15
+ borrowingV1?: BorrowingV1SubContext;
16
+ borrowingV2?: BorrowingV2SubContext;
17
+ funding?: FundingFeesSubContext;
18
+ };
19
+ /**
20
+ * @dev Calculates total holding fees using structured context
21
+ * @param trade The trade to calculate fees for
22
+ * @param tradeInfo Trade info containing contracts version
23
+ * @param tradeFeesData Trade fees data containing initial acc fees
24
+ * @param currentPairPrice Current pair price
25
+ * @param context Structured context with sub-contexts for each fee type
26
+ * @returns Object containing all holding fee components
27
+ */
28
+ export declare const getTradePendingHoldingFeesCollateralStructured: (trade: Trade, tradeInfo: TradeInfo, tradeFeesData: TradeFeesData, currentPairPrice: number, context: GetStructuredHoldingFeesContext) => TradeHoldingFees;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Holding fees calculation for structured contexts
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTradePendingHoldingFeesCollateralStructured = void 0;
7
+ const types_1 = require("../../../contracts/types");
8
+ const borrowing_1 = require("../borrowing");
9
+ const borrowingV2_1 = require("../borrowingV2");
10
+ const pairContext_1 = require("../fundingFees/pairContext");
11
+ /**
12
+ * @dev Calculates total holding fees using structured context
13
+ * @param trade The trade to calculate fees for
14
+ * @param tradeInfo Trade info containing contracts version
15
+ * @param tradeFeesData Trade fees data containing initial acc fees
16
+ * @param currentPairPrice Current pair price
17
+ * @param context Structured context with sub-contexts for each fee type
18
+ * @returns Object containing all holding fee components
19
+ */
20
+ const getTradePendingHoldingFeesCollateralStructured = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
21
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
22
+ // Calculate funding fees (v10+ only)
23
+ let fundingFeeCollateral = 0;
24
+ if (context.contractsVersion >= types_1.ContractsVersion.V10 &&
25
+ context.funding &&
26
+ tradeFeesData.initialAccFundingFeeP !== undefined) {
27
+ fundingFeeCollateral = (0, pairContext_1.getPairTradeFundingFeesCollateral)({
28
+ positionSizeCollateral,
29
+ openPrice: trade.openPrice,
30
+ long: trade.long,
31
+ currentPairPrice,
32
+ initialAccFundingFeeP: tradeFeesData.initialAccFundingFeeP,
33
+ }, context.funding // TODO: Fix types once funding types are properly imported
34
+ );
35
+ }
36
+ // Calculate borrowing fees v2
37
+ let borrowingFeeCollateral = 0;
38
+ if (context.borrowingV2 && tradeFeesData.initialAccBorrowingFeeP !== undefined) {
39
+ borrowingFeeCollateral = (0, borrowingV2_1.getPairTradeBorrowingFeesCollateral)({
40
+ positionSizeCollateral,
41
+ openPrice: trade.openPrice,
42
+ currentPairPrice,
43
+ initialAccBorrowingFeeP: tradeFeesData.initialAccBorrowingFeeP,
44
+ currentTimestamp: context.currentTimestamp,
45
+ }, context.borrowingV2);
46
+ }
47
+ // Calculate v1 borrowing fees (some markets use v1 indefinitely)
48
+ let borrowingFeeCollateral_old = 0;
49
+ if (context.borrowingV1) {
50
+ borrowingFeeCollateral_old = (0, borrowing_1.getPairBorrowingFee)(positionSizeCollateral, trade.long, context.borrowingV1.initialAccFees || { accPairFee: 0, accGroupFee: 0, block: 0 }, {
51
+ currentBlock: context.borrowingV1.currentBlock,
52
+ group: context.borrowingV1.group,
53
+ pair: context.borrowingV1.pair,
54
+ collateralPriceUsd: context.collateralPriceUsd,
55
+ });
56
+ }
57
+ return {
58
+ fundingFeeCollateral,
59
+ borrowingFeeCollateral,
60
+ borrowingFeeCollateral_old,
61
+ totalFeeCollateral: fundingFeeCollateral +
62
+ borrowingFeeCollateral +
63
+ borrowingFeeCollateral_old,
64
+ };
65
+ };
66
+ exports.getTradePendingHoldingFeesCollateralStructured = getTradePendingHoldingFeesCollateralStructured;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @dev Holding fees calculation for structured contexts
3
+ */
4
+ import { Trade, TradeInfo, TradeFeesData } from "../../types";
5
+ import { TradeHoldingFees } from "./types";
6
+ import { ContractsVersion } from "../../../contracts/types";
7
+ import type { BorrowingV1SubContext, BorrowingV2SubContext, FundingFeesSubContext } from "../../pnl";
8
+ /**
9
+ * @dev Context for holding fees calculation with structured sub-contexts
10
+ */
11
+ export type GetStructuredHoldingFeesContext = {
12
+ contractsVersion: ContractsVersion;
13
+ currentTimestamp: number;
14
+ collateralPriceUsd: number;
15
+ borrowingV1?: BorrowingV1SubContext;
16
+ borrowingV2?: BorrowingV2SubContext;
17
+ funding?: FundingFeesSubContext;
18
+ };
19
+ /**
20
+ * @dev Calculates total holding fees using structured context
21
+ * @param trade The trade to calculate fees for
22
+ * @param tradeInfo Trade info containing contracts version
23
+ * @param tradeFeesData Trade fees data containing initial acc fees
24
+ * @param currentPairPrice Current pair price
25
+ * @param context Structured context with sub-contexts for each fee type
26
+ * @returns Object containing all holding fee components
27
+ */
28
+ export declare const getTradePendingHoldingFeesCollateralStructured: (trade: Trade, tradeInfo: TradeInfo, tradeFeesData: TradeFeesData, currentPairPrice: number, context: GetStructuredHoldingFeesContext) => TradeHoldingFees;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Holding fees calculation for structured contexts
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getTradePendingHoldingFeesCollateralStructured = void 0;
7
+ const types_1 = require("../../../contracts/types");
8
+ const borrowing_1 = require("../borrowing");
9
+ const borrowingV2_1 = require("../borrowingV2");
10
+ const fundingFees_1 = require("../fundingFees");
11
+ /**
12
+ * @dev Calculates total holding fees using structured context
13
+ * @param trade The trade to calculate fees for
14
+ * @param tradeInfo Trade info containing contracts version
15
+ * @param tradeFeesData Trade fees data containing initial acc fees
16
+ * @param currentPairPrice Current pair price
17
+ * @param context Structured context with sub-contexts for each fee type
18
+ * @returns Object containing all holding fee components
19
+ */
20
+ const getTradePendingHoldingFeesCollateralStructured = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
21
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
22
+ // Calculate funding fees (v10+ only)
23
+ let fundingFeeCollateral = 0;
24
+ if (context.contractsVersion >= types_1.ContractsVersion.V10 &&
25
+ context.funding &&
26
+ tradeFeesData.initialAccFundingFeeP !== undefined) {
27
+ fundingFeeCollateral = (0, fundingFees_1.getTradeFundingFeesCollateral)(trade, tradeInfo, tradeFeesData, currentPairPrice, Object.assign(Object.assign({}, context.funding), { currentTimestamp: context.currentTimestamp }) // TODO: Fix types once funding types are properly imported
28
+ );
29
+ }
30
+ // Calculate borrowing fees v2
31
+ let borrowingFeeCollateral = 0;
32
+ if (context.borrowingV2 &&
33
+ tradeFeesData.initialAccBorrowingFeeP !== undefined) {
34
+ borrowingFeeCollateral = (0, borrowingV2_1.getTradeBorrowingFeesCollateral)({
35
+ positionSizeCollateral,
36
+ openPrice: trade.openPrice,
37
+ currentPairPrice,
38
+ initialAccBorrowingFeeP: tradeFeesData.initialAccBorrowingFeeP,
39
+ currentTimestamp: context.currentTimestamp,
40
+ }, context.borrowingV2);
41
+ }
42
+ // Calculate v1 borrowing fees (some markets use v1 indefinitely)
43
+ let borrowingFeeCollateral_old = 0;
44
+ if (context.borrowingV1) {
45
+ borrowingFeeCollateral_old = (0, borrowing_1.getBorrowingFee)(positionSizeCollateral, undefined, // pairIndex not needed for pair-specific context
46
+ trade.long, context.borrowingV1.initialAccFees || {
47
+ accPairFee: 0,
48
+ accGroupFee: 0,
49
+ block: 0,
50
+ }, {
51
+ currentBlock: context.borrowingV1.currentBlock,
52
+ group: context.borrowingV1.group,
53
+ pair: context.borrowingV1.pair,
54
+ collateralPriceUsd: context.collateralPriceUsd,
55
+ });
56
+ }
57
+ return {
58
+ fundingFeeCollateral,
59
+ borrowingFeeCollateral,
60
+ borrowingFeeCollateral_old,
61
+ totalFeeCollateral: fundingFeeCollateral +
62
+ borrowingFeeCollateral +
63
+ borrowingFeeCollateral_old,
64
+ };
65
+ };
66
+ exports.getTradePendingHoldingFeesCollateralStructured = getTradePendingHoldingFeesCollateralStructured;
@@ -35,11 +35,10 @@ const types_1 = require("../../../contracts/types");
35
35
  * @returns Total fee in collateral tokens
36
36
  */
37
37
  const getTotalTradeFeesCollateral = (collateralIndex, trader, pairIndex, positionSizeCollateral, isCounterTrade, context) => {
38
- var _a;
39
38
  const { fee, collateralPriceUsd } = context;
40
39
  const { totalPositionSizeFeeP, minPositionSizeUsd } = fee;
41
40
  // Get counter trade fee rate multiplier (default 1 = 1x)
42
- const counterTradeFeeRateMultiplier = isCounterTrade && ((_a = context.counterTradeSettings) === null || _a === void 0 ? void 0 : _a[pairIndex])
41
+ const counterTradeFeeRateMultiplier = isCounterTrade && context.counterTradeSettings?.[pairIndex]
43
42
  ? context.counterTradeSettings[pairIndex].feeRateMultiplier
44
43
  : 1;
45
44
  // Apply counter trade multiplier to position size
@@ -119,7 +118,10 @@ const getTradePendingHoldingFeesCollateral = (trade, tradeInfo, tradeFeesData, c
119
118
  if (context.contractsVersion >= types_1.ContractsVersion.V10 &&
120
119
  context.funding &&
121
120
  tradeFeesData.initialAccFundingFeeP !== undefined) {
122
- fundingFeeCollateral = (0, fundingFees_1.getTradeFundingFeesCollateral)(trade, tradeInfo, tradeFeesData, currentPairPrice, Object.assign(Object.assign({}, context.funding), { currentTimestamp: context.currentTimestamp }));
121
+ fundingFeeCollateral = (0, fundingFees_1.getTradeFundingFeesCollateral)(trade, tradeInfo, tradeFeesData, currentPairPrice, {
122
+ ...context.funding,
123
+ currentTimestamp: context.currentTimestamp,
124
+ });
123
125
  }
124
126
  // Calculate borrowing fees v2 (v10+ only)
125
127
  let borrowingFeeCollateral = 0;
@@ -17,7 +17,6 @@ const builder_4 = require("../fees/trading/builder");
17
17
  * @returns Complete context ready for getLiquidationPrice
18
18
  */
19
19
  const buildLiquidationPriceContext = (globalTradingVariables, tradeContainer, additionalParams) => {
20
- var _a;
21
20
  const { trade, tradeInfo } = tradeContainer;
22
21
  const collateralIndex = trade.collateralIndex || 1;
23
22
  const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
@@ -29,7 +28,7 @@ const buildLiquidationPriceContext = (globalTradingVariables, tradeContainer, ad
29
28
  core: {
30
29
  currentBlock: additionalParams.currentBlock,
31
30
  currentTimestamp: additionalParams.currentTimestamp,
32
- collateralPriceUsd: ((_a = collateral.prices) === null || _a === void 0 ? void 0 : _a.collateralPriceUsd) || 1,
31
+ collateralPriceUsd: collateral.prices?.collateralPriceUsd || 1,
33
32
  contractsVersion: tradeInfo.contractsVersion,
34
33
  spreadP: additionalParams.spreadP,
35
34
  },
@@ -27,7 +27,6 @@ const __1 = require("..");
27
27
  * @returns Liquidation price
28
28
  */
29
29
  const getLiquidationPrice = (trade, context) => {
30
- var _a, _b;
31
30
  // Extract parameters from structured context
32
31
  const { currentPairPrice, additionalFeeCollateral = 0, partialCloseMultiplier = 1, beforeOpened = false, isCounterTrade = false, } = context.liquidationSpecific;
33
32
  // 1. Calculate closing fees
@@ -72,9 +71,9 @@ const getLiquidationPrice = (trade, context) => {
72
71
  trade.leverage;
73
72
  // 6. Apply closing spread for v9.2+
74
73
  if (context.core.contractsVersion >= types_1.ContractsVersion.V9_2 &&
75
- ((((_a = context.tradeData.liquidationParams) === null || _a === void 0 ? void 0 : _a.maxLiqSpreadP) !== undefined &&
74
+ ((context.tradeData.liquidationParams?.maxLiqSpreadP !== undefined &&
76
75
  context.tradeData.liquidationParams.maxLiqSpreadP > 0) ||
77
- (((_b = context.liquidationSpecific.userPriceImpact) === null || _b === void 0 ? void 0 : _b.fixedSpreadP) !==
76
+ (context.liquidationSpecific.userPriceImpact?.fixedSpreadP !==
78
77
  undefined &&
79
78
  context.liquidationSpecific.userPriceImpact.fixedSpreadP > 0))) {
80
79
  const closingSpreadP = (0, __1.getSpreadP)(context.core.spreadP, true, context.tradeData.liquidationParams, context.liquidationSpecific.userPriceImpact);
@@ -99,7 +98,6 @@ exports.getLiquidationPrice = getLiquidationPrice;
99
98
  * @returns New liquidation price after the update
100
99
  */
101
100
  const getLiquidationPriceAfterPositionUpdate = (existingTrade, newCollateralAmount, newLeverage, isLeverageUpdate, positionSizeCollateralDelta, pnlToRealizeCollateral, context) => {
102
- var _a, _b;
103
101
  const { currentPairPrice, isCounterTrade = false } = context.liquidationSpecific;
104
102
  // 1. Calculate closing fees on the new position size
105
103
  const closingFeeCollateral = (0, __1.getTotalTradeFeesCollateral)(existingTrade.collateralIndex, "", // No fee tiers applied for liquidation calculation
@@ -167,9 +165,9 @@ const getLiquidationPriceAfterPositionUpdate = (existingTrade, newCollateralAmou
167
165
  newLeverage;
168
166
  // 9. Apply closing spread for v9.2+
169
167
  if (context.core.contractsVersion >= types_1.ContractsVersion.V9_2 &&
170
- ((((_a = context.tradeData.liquidationParams) === null || _a === void 0 ? void 0 : _a.maxLiqSpreadP) !== undefined &&
168
+ ((context.tradeData.liquidationParams?.maxLiqSpreadP !== undefined &&
171
169
  context.tradeData.liquidationParams.maxLiqSpreadP > 0) ||
172
- (((_b = context.liquidationSpecific.userPriceImpact) === null || _b === void 0 ? void 0 : _b.fixedSpreadP) !==
170
+ (context.liquidationSpecific.userPriceImpact?.fixedSpreadP !==
173
171
  undefined &&
174
172
  context.liquidationSpecific.userPriceImpact.fixedSpreadP > 0))) {
175
173
  const closingSpreadP = (0, __1.getSpreadP)(context.core.spreadP, true, context.tradeData.liquidationParams, context.liquidationSpecific.userPriceImpact);
@@ -7,13 +7,12 @@ const getCurrentOiWindowId = (oiWindowSettings) => {
7
7
  };
8
8
  exports.getCurrentOiWindowId = getCurrentOiWindowId;
9
9
  const getActiveOi = (currentOiWindowId, windowsCount, oiWindows, buy) => {
10
- var _a, _b;
11
10
  if (oiWindows === undefined || windowsCount === 0)
12
11
  return 0;
13
12
  let activeOi = 0;
14
13
  for (let id = currentOiWindowId - (windowsCount - 1); id <= currentOiWindowId; id++) {
15
14
  activeOi +=
16
- (buy ? (_a = oiWindows === null || oiWindows === void 0 ? void 0 : oiWindows[id]) === null || _a === void 0 ? void 0 : _a.oiLongUsd : (_b = oiWindows === null || oiWindows === void 0 ? void 0 : oiWindows[id]) === null || _b === void 0 ? void 0 : _b.oiShortUsd) || 0;
15
+ (buy ? oiWindows?.[id]?.oiLongUsd : oiWindows?.[id]?.oiShortUsd) || 0;
17
16
  }
18
17
  return activeOi;
19
18
  };
@@ -14,7 +14,6 @@ const builder_4 = require("../fees/trading/builder");
14
14
  * @returns Complete context ready for getComprehensivePnl
15
15
  */
16
16
  const buildComprehensivePnlContext = (globalTradingVariables, tradeContainer, additionalParams) => {
17
- var _a;
18
17
  const { trade, tradeInfo } = tradeContainer;
19
18
  const collateralIndex = trade.collateralIndex || 1;
20
19
  const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
@@ -23,7 +22,7 @@ const buildComprehensivePnlContext = (globalTradingVariables, tradeContainer, ad
23
22
  core: {
24
23
  currentBlock: additionalParams.currentBlock,
25
24
  currentTimestamp: additionalParams.currentTimestamp,
26
- collateralPriceUsd: ((_a = collateral.prices) === null || _a === void 0 ? void 0 : _a.collateralPriceUsd) || 1,
25
+ collateralPriceUsd: collateral.prices?.collateralPriceUsd || 1,
27
26
  contractsVersion: tradeInfo.contractsVersion,
28
27
  },
29
28
  // Build sub-contexts using dedicated builders
@@ -34,7 +34,7 @@ exports.encodePnlPercent = encodePnlPercent;
34
34
  */
35
35
  const convertCollateralAmount = (amount, collateralDecimals) => {
36
36
  const value = typeof amount === "bigint" ? Number(amount) : amount;
37
- return value / Math.pow(10, collateralDecimals);
37
+ return value / 10 ** collateralDecimals;
38
38
  };
39
39
  exports.convertCollateralAmount = convertCollateralAmount;
40
40
  /**
@@ -81,7 +81,6 @@ exports.getTradeValue = getTradeValue;
81
81
  * @returns Detailed PnL breakdown
82
82
  */
83
83
  const getComprehensivePnl = (trade, marketPrice, executionPrice, tradeInfo, context) => {
84
- var _a;
85
84
  // Calculate both raw PnL (market price) and impact-adjusted PnL (execution price)
86
85
  let rawPnlPercent = (0, exports.getPnlPercent)(trade.openPrice, marketPrice, trade.long, trade.leverage);
87
86
  let impactPnlPercent = (0, exports.getPnlPercent)(trade.openPrice, executionPrice, trade.long, trade.leverage);
@@ -115,7 +114,7 @@ const getComprehensivePnl = (trade, marketPrice, executionPrice, tradeInfo, cont
115
114
  const totalHoldingFees = borrowingFeeV1 + borrowingFeeV2 + fundingFee;
116
115
  const totalFees = totalHoldingFees + closingFee;
117
116
  // Check liquidation (using raw PnL for liquidation check)
118
- const liquidationThreshold = ((_a = context.tradeData) === null || _a === void 0 ? void 0 : _a.liquidationParams)
117
+ const liquidationThreshold = context.tradeData?.liquidationParams
119
118
  ? (0, liquidation_1.getLiqPnlThresholdP)(context.tradeData.liquidationParams, trade.leverage) *
120
119
  -100
121
120
  : -90; // Default 90% loss
@@ -192,7 +191,6 @@ exports.getComprehensivePnl = getComprehensivePnl;
192
191
  * @returns [pnlCollateral, pnlPercentage] or undefined if no price
193
192
  */
194
193
  const getPnl = (price, trade, _tradeInfo, initialAccFees, liquidationParams, useFees, context) => {
195
- var _a;
196
194
  if (!price) {
197
195
  return;
198
196
  }
@@ -224,7 +222,7 @@ const getPnl = (price, trade, _tradeInfo, initialAccFees, liquidationParams, use
224
222
  // Calculate closing fee using the same function as opening fees
225
223
  const positionSizeCollateral = posCollat * trade.leverage;
226
224
  const closingFee = (0, trading_1.getTotalTradeFeesCollateral)(0, // collateralIndex not used
227
- trade.user, trade.pairIndex, positionSizeCollateral, (_a = trade.isCounterTrade) !== null && _a !== void 0 ? _a : false, {
225
+ trade.user, trade.pairIndex, positionSizeCollateral, trade.isCounterTrade ?? false, {
228
226
  fee: context.fee,
229
227
  globalTradeFeeParams: context.globalTradeFeeParams,
230
228
  collateralPriceUsd: context.collateralPriceUsd || 1,
@@ -248,12 +246,11 @@ exports.getPnl = getPnl;
248
246
  * @returns The price that would result in the target PnL percentage
249
247
  */
250
248
  const getPriceForTargetPnlPercentage = (targetPnlPercent, trade, tradeInfo, context, netPnl = false) => {
251
- var _a, _b;
252
249
  const { leverage, openPrice, long, collateralAmount } = trade;
253
250
  const positionSizeCollateral = collateralAmount * leverage;
254
251
  // Calculate holding fees - always use getTradePendingHoldingFeesCollateral
255
252
  // This mirrors the contract's getTradeValueCollateral which always calls this function
256
- const fees = (0, trading_1.getTradePendingHoldingFeesCollateral)(trade, tradeInfo, ((_a = context.tradeData) === null || _a === void 0 ? void 0 : _a.tradeFeesData) || {
253
+ const fees = (0, trading_1.getTradePendingHoldingFeesCollateral)(trade, tradeInfo, context.tradeData?.tradeFeesData || {
257
254
  realizedTradingFeesCollateral: 0,
258
255
  realizedPnlCollateral: 0,
259
256
  manuallyRealizedNegativePnlCollateral: 0,
@@ -269,7 +266,7 @@ const getPriceForTargetPnlPercentage = (targetPnlPercent, trade, tradeInfo, cont
269
266
  borrowingV1: context.borrowingV1,
270
267
  borrowingV2: context.borrowingV2,
271
268
  funding: context.funding,
272
- initialAccFees: (_b = context.tradeData) === null || _b === void 0 ? void 0 : _b.initialAccFees,
269
+ initialAccFees: context.tradeData?.initialAccFees,
273
270
  });
274
271
  const totalHoldingFees = fees.fundingFeeCollateral +
275
272
  fees.borrowingFeeCollateral +
@@ -14,7 +14,6 @@ const builder_2 = require("../skew/builder");
14
14
  * @returns Complete context ready for getTradeClosingPriceImpact
15
15
  */
16
16
  const buildTradeClosingPriceImpactContext = (globalTradingVariables, collateralIndex, pairIndex, tradeInfo, additionalParams) => {
17
- var _a;
18
17
  const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
19
18
  if (!collateral) {
20
19
  return undefined;
@@ -36,7 +35,7 @@ const buildTradeClosingPriceImpactContext = (globalTradingVariables, collateralI
36
35
  }
37
36
  // Return structured context with proper subcontexts
38
37
  return {
39
- collateralPriceUsd: ((_a = collateral.prices) === null || _a === void 0 ? void 0 : _a.collateralPriceUsd) || 1,
38
+ collateralPriceUsd: collateral.prices?.collateralPriceUsd || 1,
40
39
  cumulVolContext,
41
40
  skewContext,
42
41
  tradeInfo,
@@ -129,6 +129,9 @@ exports.getTradeClosingPriceImpact = getTradeClosingPriceImpact;
129
129
  * @returns Price impact breakdown and trade value
130
130
  */
131
131
  const getTradeClosingPriceImpactAtOracle = (input, context) => {
132
- return (0, exports.getTradeClosingPriceImpact)(Object.assign(Object.assign({}, input), { currentPairPrice: input.oraclePrice }), context);
132
+ return (0, exports.getTradeClosingPriceImpact)({
133
+ ...input,
134
+ currentPairPrice: input.oraclePrice,
135
+ }, context);
133
136
  };
134
137
  exports.getTradeClosingPriceImpactAtOracle = getTradeClosingPriceImpactAtOracle;