@gainsnetwork/sdk 0.2.67-rc7 → 0.2.67-rc8

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 (147) hide show
  1. package/lib/backend/globalTrades/index.d.ts +11 -0
  2. package/lib/backend/globalTrades/index.js +69 -0
  3. package/lib/backend/index.d.ts +3 -0
  4. package/lib/backend/index.js +28 -0
  5. package/lib/backend/tradingVariables/backend.types.d.ts +312 -0
  6. package/lib/backend/tradingVariables/backend.types.js +2 -0
  7. package/lib/backend/tradingVariables/converter.d.ts +31 -0
  8. package/lib/backend/tradingVariables/converter.js +330 -0
  9. package/lib/backend/tradingVariables/index.d.ts +5 -0
  10. package/lib/backend/tradingVariables/index.js +95 -0
  11. package/lib/backend/tradingVariables/types.d.ts +109 -0
  12. package/lib/backend/tradingVariables/types.js +14 -0
  13. package/lib/constants.js +1 -1
  14. package/lib/contracts/types/generated/GFarmTradingStorageV5.d.ts +1911 -0
  15. package/lib/contracts/types/generated/GFarmTradingStorageV5.js +2 -0
  16. package/lib/contracts/types/generated/GNSBorrowingFees.d.ts +1067 -0
  17. package/lib/contracts/types/generated/GNSBorrowingFees.js +2 -0
  18. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +2140 -286
  19. package/lib/contracts/types/generated/GNSNftRewardsV6.d.ts +533 -0
  20. package/lib/contracts/types/generated/GNSNftRewardsV6.js +2 -0
  21. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +613 -0
  22. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +2 -0
  23. package/lib/contracts/types/generated/GNSTrading.d.ts +758 -0
  24. package/lib/contracts/types/generated/GNSTrading.js +2 -0
  25. package/lib/contracts/types/generated/GNSTradingCallbacks.d.ts +875 -0
  26. package/lib/contracts/types/generated/GNSTradingCallbacks.js +2 -0
  27. package/lib/contracts/types/generated/GNSTradingStorage.d.ts +1387 -0
  28. package/lib/contracts/types/generated/GNSTradingStorage.js +2 -0
  29. package/lib/contracts/types/generated/GToken.d.ts +78 -107
  30. package/lib/contracts/types/generated/GTokenV6_3_2.d.ts +1838 -0
  31. package/lib/contracts/types/generated/GTokenV6_3_2.js +2 -0
  32. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.d.ts +83 -0
  33. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.js +2691 -0
  34. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.d.ts +124 -0
  35. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.js +1784 -0
  36. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.d.ts +90 -53
  37. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +4502 -427
  38. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +100 -0
  39. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +1116 -0
  40. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.d.ts +100 -0
  41. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.js +1003 -0
  42. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.d.ts +113 -0
  43. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.js +1428 -0
  44. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.d.ts +96 -0
  45. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.js +2241 -0
  46. package/lib/contracts/types/generated/factories/GNSTrading__factory.d.ts +95 -0
  47. package/lib/contracts/types/generated/factories/GNSTrading__factory.js +1071 -0
  48. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.d.ts +110 -0
  49. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.js +2682 -0
  50. package/lib/contracts/types/generated/factories/GToken__factory.js +65 -142
  51. package/lib/contracts/utils/openLimitOrders.d.ts +8 -0
  52. package/lib/contracts/utils/openLimitOrders.js +88 -0
  53. package/lib/markets/collateral/converter.d.ts +5 -0
  54. package/lib/markets/collateral/converter.js +11 -0
  55. package/lib/markets/collateral/index.d.ts +1 -0
  56. package/lib/markets/collateral/index.js +17 -0
  57. package/lib/markets/collateral/types.d.ts +7 -0
  58. package/lib/markets/collateral/types.js +2 -0
  59. package/lib/markets/oi/converter.d.ts +63 -0
  60. package/lib/markets/oi/converter.js +103 -0
  61. package/lib/markets/oi/fetcher.d.ts +58 -0
  62. package/lib/markets/oi/fetcher.js +181 -0
  63. package/lib/markets/oi/index.d.ts +10 -0
  64. package/lib/markets/oi/index.js +37 -0
  65. package/lib/markets/oi/types.d.ts +82 -0
  66. package/lib/markets/oi/types.js +6 -0
  67. package/lib/markets/oi/validation.d.ts +80 -0
  68. package/lib/markets/oi/validation.js +172 -0
  69. package/lib/trade/fees/borrowing/builder.d.ts +14 -0
  70. package/lib/trade/fees/borrowing/builder.js +33 -0
  71. package/lib/trade/fees/borrowingV2/builder.d.ts +6 -0
  72. package/lib/trade/fees/borrowingV2/builder.js +24 -0
  73. package/lib/trade/fees/borrowingV2/converter.d.ts +75 -0
  74. package/lib/trade/fees/borrowingV2/converter.js +132 -0
  75. package/lib/trade/fees/borrowingV2/fetcher.d.ts +75 -0
  76. package/lib/trade/fees/borrowingV2/fetcher.js +185 -0
  77. package/lib/trade/fees/borrowingV2/index.d.ts +48 -0
  78. package/lib/trade/fees/borrowingV2/index.js +112 -0
  79. package/lib/trade/fees/borrowingV2/types.d.ts +95 -0
  80. package/lib/trade/fees/borrowingV2/types.js +5 -0
  81. package/lib/trade/fees/converter.d.ts +48 -0
  82. package/lib/trade/fees/converter.js +110 -0
  83. package/lib/trade/fees/fundingFees/builder.d.ts +9 -0
  84. package/lib/trade/fees/fundingFees/builder.js +35 -0
  85. package/lib/trade/fees/fundingFees/converter.d.ts +102 -0
  86. package/lib/trade/fees/fundingFees/converter.js +196 -0
  87. package/lib/trade/fees/fundingFees/fetcher.d.ts +66 -0
  88. package/lib/trade/fees/fundingFees/fetcher.js +150 -0
  89. package/lib/trade/fees/fundingFees/index.d.ts +146 -0
  90. package/lib/trade/fees/fundingFees/index.js +346 -0
  91. package/lib/trade/fees/fundingFees/pairContext.d.ts +33 -0
  92. package/lib/trade/fees/fundingFees/pairContext.js +17 -0
  93. package/lib/trade/fees/fundingFees/types.d.ts +77 -0
  94. package/lib/trade/fees/fundingFees/types.js +5 -0
  95. package/lib/trade/fees/tiers/converter.d.ts +54 -0
  96. package/lib/trade/fees/tiers/converter.js +81 -0
  97. package/lib/trade/fees/trading/builder.d.ts +18 -0
  98. package/lib/trade/fees/trading/builder.js +20 -0
  99. package/lib/trade/fees/trading/converter.d.ts +30 -0
  100. package/lib/trade/fees/trading/converter.js +43 -0
  101. package/lib/trade/fees/trading/index.d.ts +62 -0
  102. package/lib/trade/fees/trading/index.js +155 -0
  103. package/lib/trade/fees/trading/types.d.ts +48 -0
  104. package/lib/trade/fees/trading/types.js +5 -0
  105. package/lib/trade/liquidation/builder.d.ts +25 -0
  106. package/lib/trade/liquidation/builder.js +59 -0
  107. package/lib/trade/liquidation/converter.d.ts +23 -0
  108. package/lib/trade/liquidation/converter.js +46 -0
  109. package/lib/trade/liquidation/index.d.ts +26 -0
  110. package/lib/trade/liquidation/index.js +142 -0
  111. package/lib/trade/liquidation/types.d.ts +59 -0
  112. package/lib/trade/liquidation/types.js +2 -0
  113. package/lib/trade/openLimitOrder.d.ts +2 -0
  114. package/lib/trade/openLimitOrder.js +23 -0
  115. package/lib/trade/pnl/builder.d.ts +16 -0
  116. package/lib/trade/pnl/builder.js +44 -0
  117. package/lib/trade/pnl/converter.d.ts +47 -0
  118. package/lib/trade/pnl/converter.js +72 -0
  119. package/lib/trade/pnl/index.d.ts +77 -0
  120. package/lib/trade/pnl/index.js +270 -0
  121. package/lib/trade/pnl/types.d.ts +114 -0
  122. package/lib/trade/pnl/types.js +5 -0
  123. package/lib/trade/priceImpact/close/index.d.ts +21 -0
  124. package/lib/trade/priceImpact/close/index.js +131 -0
  125. package/lib/trade/priceImpact/close/types.d.ts +43 -0
  126. package/lib/trade/priceImpact/close/types.js +5 -0
  127. package/lib/trade/priceImpact/cumulVol/converter.d.ts +31 -0
  128. package/lib/trade/priceImpact/cumulVol/converter.js +59 -0
  129. package/lib/trade/priceImpact/cumulVol/index.d.ts +107 -0
  130. package/lib/trade/priceImpact/cumulVol/index.js +228 -0
  131. package/lib/trade/priceImpact/index.d.ts +12 -0
  132. package/lib/trade/priceImpact/index.js +59 -0
  133. package/lib/trade/priceImpact/open/index.d.ts +22 -0
  134. package/lib/trade/priceImpact/open/index.js +76 -0
  135. package/lib/trade/priceImpact/open/types.d.ts +41 -0
  136. package/lib/trade/priceImpact/open/types.js +5 -0
  137. package/lib/trade/priceImpact/skew/converter.d.ts +77 -0
  138. package/lib/trade/priceImpact/skew/converter.js +171 -0
  139. package/lib/trade/priceImpact/skew/fetcher.d.ts +63 -0
  140. package/lib/trade/priceImpact/skew/fetcher.js +168 -0
  141. package/lib/trade/priceImpact/skew/index.d.ts +58 -0
  142. package/lib/trade/priceImpact/skew/index.js +179 -0
  143. package/lib/trade/priceImpact/skew/types.d.ts +55 -0
  144. package/lib/trade/priceImpact/skew/types.js +5 -0
  145. package/lib/trade/utils.d.ts +18 -0
  146. package/lib/trade/utils.js +30 -0
  147. package/package.json +1 -1
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.collateralToContractFormat = exports.priceToContractFormat = exports.fetchPairPendingAccFundingFeesBatch = exports.fetchTradeFeesDataBatch = exports.fetchTradeFeesData = exports.fetchTradeFundingFeesCollateral = exports.fetchPairPendingAccFundingFees = void 0;
13
+ /**
14
+ * @dev Fetches pending accumulated funding fees for a specific pair
15
+ * @param contract GNSMultiCollatDiamond contract instance
16
+ * @param collateralIndex Collateral index
17
+ * @param pairIndex Pair index
18
+ * @param currentPairPrice Current pair price (1e10)
19
+ * @returns Promise resolving to accumulated funding fees and current rate
20
+ */
21
+ const fetchPairPendingAccFundingFees = (contract, collateralIndex, pairIndex, currentPairPrice) => __awaiter(void 0, void 0, void 0, function* () {
22
+ try {
23
+ const result = yield contract.getPairPendingAccFundingFees(collateralIndex, pairIndex, currentPairPrice);
24
+ return {
25
+ accFundingFeeLongP: Number(result.accFundingFeeLongP) / 1e20,
26
+ accFundingFeeShortP: Number(result.accFundingFeeShortP) / 1e20,
27
+ currentFundingRatePerSecondP: Number(result.currentFundingRatePerSecondP) / 1e18, // FUNDING_RATE_PER_SECOND_P precision
28
+ };
29
+ }
30
+ catch (error) {
31
+ console.error("Error fetching pair pending acc funding fees:", error);
32
+ throw error;
33
+ }
34
+ });
35
+ exports.fetchPairPendingAccFundingFees = fetchPairPendingAccFundingFees;
36
+ /**
37
+ * @dev Fetches funding fees for a specific trade in collateral tokens
38
+ * @param contract GNSMultiCollatDiamond contract instance
39
+ * @param trader Trader address
40
+ * @param index Trade index
41
+ * @param currentPairPrice Current pair price (1e10)
42
+ * @returns Promise resolving to funding fee in collateral tokens
43
+ */
44
+ const fetchTradeFundingFeesCollateral = (contract, trader, index, currentPairPrice) => __awaiter(void 0, void 0, void 0, function* () {
45
+ try {
46
+ const fundingFeeCollateral = yield contract.getTradeFundingFeesCollateral(trader, index, currentPairPrice);
47
+ // Convert from BigNumber to number (collateral precision already applied)
48
+ return Number(fundingFeeCollateral);
49
+ }
50
+ catch (error) {
51
+ console.error("Error fetching trade funding fees:", error);
52
+ throw error;
53
+ }
54
+ });
55
+ exports.fetchTradeFundingFeesCollateral = fetchTradeFundingFeesCollateral;
56
+ /**
57
+ * @dev Fetches trade fees data for a specific trade
58
+ * @param contract GNSMultiCollatDiamond contract instance
59
+ * @param trader Trader address
60
+ * @param index Trade index
61
+ * @returns Promise resolving to trade fees data
62
+ */
63
+ const fetchTradeFeesData = (contract, trader, index) => __awaiter(void 0, void 0, void 0, function* () {
64
+ try {
65
+ const feesData = yield contract.getTradeFeesData(trader, index);
66
+ return {
67
+ accPerOiLong: Number(feesData.initialAccFundingFeeP) / 1e20,
68
+ accPerOiShort: Number(feesData.initialAccFundingFeeP) / 1e20,
69
+ openBlock: 0, // Not available in this struct
70
+ };
71
+ }
72
+ catch (error) {
73
+ console.error("Error fetching trade fees data:", error);
74
+ throw error;
75
+ }
76
+ });
77
+ exports.fetchTradeFeesData = fetchTradeFeesData;
78
+ /**
79
+ * @dev Fetches trade fees data for multiple trades
80
+ * @param contract GNSMultiCollatDiamond contract instance
81
+ * @param traders Array of trader addresses
82
+ * @param indices Array of trade indices
83
+ * @returns Promise resolving to array of trade fees data
84
+ */
85
+ const fetchTradeFeesDataBatch = (contract, traders, indices) => __awaiter(void 0, void 0, void 0, function* () {
86
+ if (traders.length !== indices.length) {
87
+ throw new Error("Traders and indices arrays must have the same length");
88
+ }
89
+ try {
90
+ const feesDatas = yield contract.getTradeFeesDataArray(traders, indices);
91
+ return feesDatas.map(feesData => ({
92
+ accPerOiLong: Number(feesData.initialAccFundingFeeP) / 1e20,
93
+ accPerOiShort: Number(feesData.initialAccFundingFeeP) / 1e20,
94
+ openBlock: 0,
95
+ }));
96
+ }
97
+ catch (error) {
98
+ console.error("Error fetching trade fees data batch:", error);
99
+ throw error;
100
+ }
101
+ });
102
+ exports.fetchTradeFeesDataBatch = fetchTradeFeesDataBatch;
103
+ /**
104
+ * @dev Fetches pending accumulated funding fees for multiple pairs
105
+ * @param contract GNSMultiCollatDiamond contract instance
106
+ * @param collateralIndices Array of collateral indices
107
+ * @param pairIndices Array of pair indices
108
+ * @param currentPairPrices Array of current pair prices (1e10)
109
+ * @returns Promise resolving to array of accumulated funding fees
110
+ */
111
+ const fetchPairPendingAccFundingFeesBatch = (contract, collateralIndices, pairIndices, currentPairPrices) => __awaiter(void 0, void 0, void 0, function* () {
112
+ if (collateralIndices.length !== pairIndices.length ||
113
+ pairIndices.length !== currentPairPrices.length) {
114
+ throw new Error("All input arrays must have the same length");
115
+ }
116
+ try {
117
+ // Fetch all in parallel
118
+ const promises = collateralIndices.map((collateralIndex, i) => contract.getPairPendingAccFundingFees(collateralIndex, pairIndices[i], currentPairPrices[i]));
119
+ const results = yield Promise.all(promises);
120
+ return results.map(result => ({
121
+ accFundingFeeLongP: Number(result.accFundingFeeLongP) / 1e20,
122
+ accFundingFeeShortP: Number(result.accFundingFeeShortP) / 1e20,
123
+ currentFundingRatePerSecondP: Number(result.currentFundingRatePerSecondP) / 1e18,
124
+ }));
125
+ }
126
+ catch (error) {
127
+ console.error("Error fetching pair pending acc funding fees batch:", error);
128
+ throw error;
129
+ }
130
+ });
131
+ exports.fetchPairPendingAccFundingFeesBatch = fetchPairPendingAccFundingFeesBatch;
132
+ /**
133
+ * @dev Helper to convert price from number to contract format
134
+ * @param price Price as number
135
+ * @returns Price in contract format (1e10)
136
+ */
137
+ const priceToContractFormat = (price) => {
138
+ return BigInt(Math.round(price * 1e10));
139
+ };
140
+ exports.priceToContractFormat = priceToContractFormat;
141
+ /**
142
+ * @dev Helper to convert collateral amount to contract format
143
+ * @param amount Amount as number
144
+ * @param decimals Collateral decimals (6 for USDC, 18 for others)
145
+ * @returns Amount in contract format
146
+ */
147
+ const collateralToContractFormat = (amount, decimals) => {
148
+ return BigInt(Math.round(amount * Math.pow(10, decimals)));
149
+ };
150
+ exports.collateralToContractFormat = collateralToContractFormat;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @dev Funding fees calculations for v10+ trades
3
+ * @dev Based on skew-based funding rate model with velocity and APR multipliers
4
+ */
5
+ import { FundingFeeParams, PairFundingFeeData, GetFundingFeeContext, TradeFundingFeeResult, PairPendingAccFundingFeesResult, PairOiAfterV10 } from "./types";
6
+ /**
7
+ * @dev Calculates current funding velocity per year based on skew
8
+ * @param netExposureToken Net exposure (long - short) in tokens
9
+ * @param netExposureUsd Net exposure in USD
10
+ * @param skewCoefficientPerYear Skew coefficient per year from params
11
+ * @param absoluteVelocityPerYearCap Cap on velocity per year
12
+ * @param thetaThresholdUsd Minimum exposure USD to start charging funding fees
13
+ * @returns Current yearly funding velocity
14
+ */
15
+ export declare const getCurrentFundingVelocityPerYear: (netExposureToken: number, netExposureUsd: number, skewCoefficientPerYear: number, absoluteVelocityPerYearCap: number, thetaThresholdUsd: number) => number;
16
+ /**
17
+ * @dev Calculates seconds until funding rate reaches zero
18
+ * @param lastFundingRatePerSecondP Last funding rate per second
19
+ * @param currentVelocityPerYear Current velocity per year
20
+ * @returns Seconds until rate reaches zero
21
+ */
22
+ export declare const getSecondsToReachZeroRate: (lastFundingRatePerSecondP: number, currentVelocityPerYear: number) => number;
23
+ /**
24
+ * @dev Calculates average and current funding rate per second
25
+ * @param lastFundingRatePerSecondP Last funding rate per second
26
+ * @param absoluteRatePerSecondCap Absolute cap on funding rate per second
27
+ * @param currentVelocityPerYear Current velocity per year
28
+ * @param secondsSinceLastUpdate Seconds elapsed since last update
29
+ * @returns Average and current funding rate per second
30
+ */
31
+ export declare const getAvgFundingRatePerSecondP: (lastFundingRatePerSecondP: number, absoluteRatePerSecondCap: number, currentVelocityPerYear: number, secondsSinceLastUpdate: number) => {
32
+ avgFundingRatePerSecondP: number;
33
+ currentFundingRatePerSecondP: number;
34
+ };
35
+ /**
36
+ * @dev Calculates APR multipliers for long and short sides based on OI ratio
37
+ * @param avgFundingRatePerSecondP Average funding rate per second
38
+ * @param pairOiLongToken Long OI in tokens
39
+ * @param pairOiShortToken Short OI in tokens
40
+ * @param aprMultiplierEnabled Whether APR multiplier is enabled
41
+ * @returns Long and short APR multipliers
42
+ */
43
+ export declare const getLongShortAprMultiplier: (avgFundingRatePerSecondP: number, pairOiLongToken: number, pairOiShortToken: number, aprMultiplierEnabled: boolean) => {
44
+ longAprMultiplier: number;
45
+ shortAprMultiplier: number;
46
+ };
47
+ /**
48
+ * @dev Calculates pending accumulated funding fees for a pair
49
+ * @param params Funding fee parameters
50
+ * @param data Current funding fee data
51
+ * @param currentPairPrice Current pair price
52
+ * @param pairOiToken Pair OI after v10
53
+ * @param netExposureToken Net exposure in tokens
54
+ * @param netExposureUsd Net exposure in USD
55
+ * @param currentTimestamp Current timestamp
56
+ * @returns Pending accumulated funding fees and current rate
57
+ */
58
+ export declare const getPairPendingAccFundingFees: (params: FundingFeeParams, data: PairFundingFeeData, currentPairPrice: number, pairOiToken: PairOiAfterV10, netExposureToken: number, netExposureUsd: number, currentTimestamp: number) => PairPendingAccFundingFeesResult;
59
+ /**
60
+ * @dev Calculates funding fees for a specific trade (SDK version following contract pattern)
61
+ * @param trade Trade parameters (collateral amount, leverage, open price, long/short, collateralIndex, pairIndex)
62
+ * @param tradeInfo Trade info (contracts version)
63
+ * @param tradeFeesData Trade fees data containing initial acc funding fee
64
+ * @param currentPairPrice Current pair price
65
+ * @param context Optional context with funding fee data (full or pair-specific)
66
+ * @returns Funding fee in collateral tokens
67
+ */
68
+ export declare const getTradeFundingFeesCollateral: (trade: {
69
+ collateralAmount: number;
70
+ leverage: number;
71
+ openPrice: number;
72
+ long: boolean;
73
+ collateralIndex?: number;
74
+ pairIndex?: number;
75
+ }, tradeInfo: {
76
+ contractsVersion: number;
77
+ }, tradeFeesData: {
78
+ initialAccFundingFeeP: number;
79
+ }, currentPairPrice: number, context?: (GetFundingFeeContext & {
80
+ pairOiAfterV10?: {
81
+ [collateralIndex: number]: {
82
+ [pairIndex: number]: PairOiAfterV10;
83
+ };
84
+ } | undefined;
85
+ netExposureToken?: {
86
+ [collateralIndex: number]: {
87
+ [pairIndex: number]: number;
88
+ };
89
+ } | undefined;
90
+ netExposureUsd?: {
91
+ [collateralIndex: number]: {
92
+ [pairIndex: number]: number;
93
+ };
94
+ } | undefined;
95
+ }) | {
96
+ currentTimestamp: number;
97
+ params: FundingFeeParams;
98
+ data: PairFundingFeeData;
99
+ pairOi?: PairOiAfterV10 | undefined;
100
+ netExposureToken?: number | undefined;
101
+ netExposureUsd?: number | undefined;
102
+ } | undefined) => number;
103
+ /**
104
+ * @dev Main function to calculate funding fees for a trade within context
105
+ * @param context Funding fee context with params and data
106
+ * @param collateralIndex Collateral index
107
+ * @param pairIndex Pair index
108
+ * @param trade Trade details
109
+ * @param tradeInfo Trade info (contracts version)
110
+ * @param initialAccFundingFeeP Initial accumulated funding fee
111
+ * @param currentPairPrice Current pair price
112
+ * @param pairOiToken Pair OI after v10
113
+ * @param netExposureToken Net exposure in tokens
114
+ * @param netExposureUsd Net exposure in USD
115
+ * @returns Complete funding fee calculation result
116
+ */
117
+ export declare const getTradeFundingFees: (context: GetFundingFeeContext, collateralIndex: number, pairIndex: number, trade: {
118
+ collateralAmount: number;
119
+ leverage: number;
120
+ openPrice: number;
121
+ long: boolean;
122
+ }, tradeInfo: {
123
+ contractsVersion: number;
124
+ }, initialAccFundingFeeP: number, currentPairPrice: number, pairOiToken: PairOiAfterV10, netExposureToken: number, netExposureUsd: number) => TradeFundingFeeResult;
125
+ /**
126
+ * @dev Simple version of getTradeFundingFeesCollateral for backward compatibility
127
+ * @param trade Trade parameters
128
+ * @param tradeInfo Trade info with contracts version
129
+ * @param initialAccFundingFeeP Initial accumulated funding fee
130
+ * @param currentAccFundingFeeP Current accumulated funding fee
131
+ * @returns Funding fee in collateral tokens
132
+ */
133
+ export declare const getTradeFundingFeesCollateralSimple: (trade: {
134
+ collateralAmount: number;
135
+ leverage: number;
136
+ openPrice: number;
137
+ long: boolean;
138
+ }, tradeInfo: {
139
+ contractsVersion: number;
140
+ }, initialAccFundingFeeP: number, currentAccFundingFeeP: number) => number;
141
+ export * as FundingFees from "./types";
142
+ export type { FundingFeeParams, PairFundingFeeData, PairGlobalParams, TradeInitialAccFundingFees, PairOiAfterV10, FundingRateCalculation, GetFundingFeeContext, TradeFundingFeeResult, PairPendingAccFundingFeesResult, PairAccumulatedFees, TradeInitialAccFees, } from "./types";
143
+ export type { GetPairFundingFeeContext } from "./pairContext";
144
+ export * from "./fetcher";
145
+ export * from "./pairContext";
146
+ export * from "./builder";
@@ -0,0 +1,346 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Funding fees calculations for v10+ trades
4
+ * @dev Based on skew-based funding rate model with velocity and APR multipliers
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
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
30
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
31
+ };
32
+ Object.defineProperty(exports, "__esModule", { value: true });
33
+ exports.FundingFees = exports.getTradeFundingFeesCollateralSimple = exports.getTradeFundingFees = exports.getTradeFundingFeesCollateral = exports.getPairPendingAccFundingFees = exports.getLongShortAprMultiplier = exports.getAvgFundingRatePerSecondP = exports.getSecondsToReachZeroRate = exports.getCurrentFundingVelocityPerYear = void 0;
34
+ // Constants from contract
35
+ const FUNDING_APR_MULTIPLIER_CAP = 100; // Smaller side can earn up to 100x more APR
36
+ const ONE_YEAR = 365 * 24 * 60 * 60; // 1 year in seconds
37
+ /**
38
+ * @dev Calculates current funding velocity per year based on skew
39
+ * @param netExposureToken Net exposure (long - short) in tokens
40
+ * @param netExposureUsd Net exposure in USD
41
+ * @param skewCoefficientPerYear Skew coefficient per year from params
42
+ * @param absoluteVelocityPerYearCap Cap on velocity per year
43
+ * @param thetaThresholdUsd Minimum exposure USD to start charging funding fees
44
+ * @returns Current yearly funding velocity
45
+ */
46
+ const getCurrentFundingVelocityPerYear = (netExposureToken, netExposureUsd, skewCoefficientPerYear, absoluteVelocityPerYearCap, thetaThresholdUsd) => {
47
+ // If no exposure or skew coefficient 0 or velocity cap 0, velocity is 0
48
+ if (netExposureToken === 0 ||
49
+ skewCoefficientPerYear === 0 ||
50
+ absoluteVelocityPerYearCap === 0) {
51
+ return 0;
52
+ }
53
+ // Check theta threshold
54
+ const absNetExposureUsd = Math.abs(netExposureUsd);
55
+ if (absNetExposureUsd < thetaThresholdUsd) {
56
+ return 0;
57
+ }
58
+ // Calculate absolute velocity
59
+ const absoluteVelocityPerYear = Math.abs(netExposureToken) * skewCoefficientPerYear;
60
+ // Apply cap
61
+ const cappedAbsoluteVelocity = Math.min(absoluteVelocityPerYear, absoluteVelocityPerYearCap);
62
+ // Return with proper sign
63
+ return netExposureToken < 0
64
+ ? -cappedAbsoluteVelocity
65
+ : cappedAbsoluteVelocity;
66
+ };
67
+ exports.getCurrentFundingVelocityPerYear = getCurrentFundingVelocityPerYear;
68
+ /**
69
+ * @dev Calculates seconds until funding rate reaches zero
70
+ * @param lastFundingRatePerSecondP Last funding rate per second
71
+ * @param currentVelocityPerYear Current velocity per year
72
+ * @returns Seconds until rate reaches zero
73
+ */
74
+ const getSecondsToReachZeroRate = (lastFundingRatePerSecondP, currentVelocityPerYear) => {
75
+ if (currentVelocityPerYear === 0) {
76
+ throw new Error("Velocity cannot be zero when calculating time to reach zero rate");
77
+ }
78
+ const secondsToReachZeroRate = (-lastFundingRatePerSecondP * ONE_YEAR) / currentVelocityPerYear;
79
+ if (secondsToReachZeroRate < 0) {
80
+ throw new Error("Invalid calculation: seconds to reach zero rate cannot be negative");
81
+ }
82
+ return secondsToReachZeroRate;
83
+ };
84
+ exports.getSecondsToReachZeroRate = getSecondsToReachZeroRate;
85
+ /**
86
+ * @dev Calculates average and current funding rate per second
87
+ * @param lastFundingRatePerSecondP Last funding rate per second
88
+ * @param absoluteRatePerSecondCap Absolute cap on funding rate per second
89
+ * @param currentVelocityPerYear Current velocity per year
90
+ * @param secondsSinceLastUpdate Seconds elapsed since last update
91
+ * @returns Average and current funding rate per second
92
+ */
93
+ const getAvgFundingRatePerSecondP = (lastFundingRatePerSecondP, absoluteRatePerSecondCap, currentVelocityPerYear, secondsSinceLastUpdate) => {
94
+ // If cap is 0, there are no funding fees
95
+ if (absoluteRatePerSecondCap === 0) {
96
+ return { avgFundingRatePerSecondP: 0, currentFundingRatePerSecondP: 0 };
97
+ }
98
+ // If velocity is 0 or no time elapsed, funding rate is still the same
99
+ if (currentVelocityPerYear === 0 || secondsSinceLastUpdate === 0) {
100
+ return {
101
+ avgFundingRatePerSecondP: lastFundingRatePerSecondP,
102
+ currentFundingRatePerSecondP: lastFundingRatePerSecondP,
103
+ };
104
+ }
105
+ const ratePerSecondCap = absoluteRatePerSecondCap * (currentVelocityPerYear < 0 ? -1 : 1);
106
+ // If rate is already at cap, just return it
107
+ if (ratePerSecondCap === lastFundingRatePerSecondP) {
108
+ return {
109
+ avgFundingRatePerSecondP: ratePerSecondCap,
110
+ currentFundingRatePerSecondP: ratePerSecondCap,
111
+ };
112
+ }
113
+ const secondsToReachCap = ((ratePerSecondCap - lastFundingRatePerSecondP) * ONE_YEAR) /
114
+ currentVelocityPerYear;
115
+ if (secondsSinceLastUpdate > secondsToReachCap) {
116
+ // Rate reached cap during this period
117
+ const currentFundingRatePerSecondP = ratePerSecondCap;
118
+ // Weighted average: time to cap at average rate + time at cap
119
+ const avgFundingRatePerSecondP_1 = (lastFundingRatePerSecondP + ratePerSecondCap) / 2;
120
+ const avgFundingRatePerSecondP = (avgFundingRatePerSecondP_1 * secondsToReachCap +
121
+ ratePerSecondCap * (secondsSinceLastUpdate - secondsToReachCap)) /
122
+ secondsSinceLastUpdate;
123
+ return { avgFundingRatePerSecondP, currentFundingRatePerSecondP };
124
+ }
125
+ else {
126
+ // Rate didn't reach cap
127
+ const currentFundingRatePerSecondP = lastFundingRatePerSecondP +
128
+ (secondsSinceLastUpdate * currentVelocityPerYear) / ONE_YEAR;
129
+ const avgFundingRatePerSecondP = (lastFundingRatePerSecondP + currentFundingRatePerSecondP) / 2;
130
+ return { avgFundingRatePerSecondP, currentFundingRatePerSecondP };
131
+ }
132
+ };
133
+ exports.getAvgFundingRatePerSecondP = getAvgFundingRatePerSecondP;
134
+ /**
135
+ * @dev Calculates APR multipliers for long and short sides based on OI ratio
136
+ * @param avgFundingRatePerSecondP Average funding rate per second
137
+ * @param pairOiLongToken Long OI in tokens
138
+ * @param pairOiShortToken Short OI in tokens
139
+ * @param aprMultiplierEnabled Whether APR multiplier is enabled
140
+ * @returns Long and short APR multipliers
141
+ */
142
+ const getLongShortAprMultiplier = (avgFundingRatePerSecondP, pairOiLongToken, pairOiShortToken, aprMultiplierEnabled) => {
143
+ // If funding rate is 0, multipliers don't matter
144
+ if (avgFundingRatePerSecondP === 0) {
145
+ return { longAprMultiplier: 1, shortAprMultiplier: 1 };
146
+ }
147
+ const longsEarned = avgFundingRatePerSecondP < 0;
148
+ let longAprMultiplier = 1;
149
+ let shortAprMultiplier = 1;
150
+ if (aprMultiplierEnabled) {
151
+ if (longsEarned && pairOiLongToken > 0) {
152
+ longAprMultiplier = pairOiShortToken / pairOiLongToken;
153
+ }
154
+ else if (!longsEarned && pairOiShortToken > 0) {
155
+ shortAprMultiplier = pairOiLongToken / pairOiShortToken;
156
+ }
157
+ // Apply cap
158
+ longAprMultiplier = Math.min(longAprMultiplier, FUNDING_APR_MULTIPLIER_CAP);
159
+ shortAprMultiplier = Math.min(shortAprMultiplier, FUNDING_APR_MULTIPLIER_CAP);
160
+ }
161
+ return { longAprMultiplier, shortAprMultiplier };
162
+ };
163
+ exports.getLongShortAprMultiplier = getLongShortAprMultiplier;
164
+ /**
165
+ * @dev Calculates pending accumulated funding fees for a pair
166
+ * @param params Funding fee parameters
167
+ * @param data Current funding fee data
168
+ * @param currentPairPrice Current pair price
169
+ * @param pairOiToken Pair OI after v10
170
+ * @param netExposureToken Net exposure in tokens
171
+ * @param netExposureUsd Net exposure in USD
172
+ * @param currentTimestamp Current timestamp
173
+ * @returns Pending accumulated funding fees and current rate
174
+ */
175
+ const getPairPendingAccFundingFees = (params, data, currentPairPrice, pairOiToken, netExposureToken, netExposureUsd, currentTimestamp) => {
176
+ let accFundingFeeLongP = data.accFundingFeeLongP;
177
+ let accFundingFeeShortP = data.accFundingFeeShortP;
178
+ // If funding fees are disabled, return current values
179
+ if (!params.fundingFeesEnabled) {
180
+ return {
181
+ accFundingFeeLongP,
182
+ accFundingFeeShortP,
183
+ currentFundingRatePerSecondP: data.lastFundingRatePerSecondP,
184
+ };
185
+ }
186
+ const secondsSinceLastUpdate = currentTimestamp - data.lastFundingUpdateTs;
187
+ // Calculate current velocity
188
+ const currentVelocityPerYear = (0, exports.getCurrentFundingVelocityPerYear)(netExposureToken, netExposureUsd, params.skewCoefficientPerYear, params.absoluteVelocityPerYearCap, params.thetaThresholdUsd);
189
+ // Get average and current funding rates
190
+ const { avgFundingRatePerSecondP, currentFundingRatePerSecondP } = (0, exports.getAvgFundingRatePerSecondP)(data.lastFundingRatePerSecondP, params.absoluteRatePerSecondCap, currentVelocityPerYear, secondsSinceLastUpdate);
191
+ // Check if we need to handle rate sign change
192
+ const rateChangedSign = params.aprMultiplierEnabled &&
193
+ ((currentFundingRatePerSecondP > 0 && data.lastFundingRatePerSecondP < 0) ||
194
+ (currentFundingRatePerSecondP < 0 && data.lastFundingRatePerSecondP > 0));
195
+ if (rateChangedSign) {
196
+ // Split calculation into two periods: before and after sign change
197
+ // 1. From last update to rate = 0
198
+ const secondsToReachZeroRate = (0, exports.getSecondsToReachZeroRate)(data.lastFundingRatePerSecondP, currentVelocityPerYear);
199
+ const avgFundingRatePerSecondP_1 = data.lastFundingRatePerSecondP / 2;
200
+ const fundingFeesDeltaP_1 = avgFundingRatePerSecondP_1 * secondsToReachZeroRate * currentPairPrice;
201
+ const { longAprMultiplier: longMultiplier1, shortAprMultiplier: shortMultiplier1, } = (0, exports.getLongShortAprMultiplier)(avgFundingRatePerSecondP_1, pairOiToken.oiLongToken, pairOiToken.oiShortToken, true);
202
+ accFundingFeeLongP += fundingFeesDeltaP_1 * longMultiplier1;
203
+ accFundingFeeShortP -= fundingFeesDeltaP_1 * shortMultiplier1;
204
+ // 2. From rate = 0 to current rate
205
+ const avgFundingRatePerSecondP_2 = currentFundingRatePerSecondP / 2;
206
+ const fundingFeesDeltaP_2 = avgFundingRatePerSecondP_2 *
207
+ (secondsSinceLastUpdate - secondsToReachZeroRate) *
208
+ currentPairPrice;
209
+ const { longAprMultiplier: longMultiplier2, shortAprMultiplier: shortMultiplier2, } = (0, exports.getLongShortAprMultiplier)(avgFundingRatePerSecondP_2, pairOiToken.oiLongToken, pairOiToken.oiShortToken, true);
210
+ accFundingFeeLongP += fundingFeesDeltaP_2 * longMultiplier2;
211
+ accFundingFeeShortP -= fundingFeesDeltaP_2 * shortMultiplier2;
212
+ }
213
+ else {
214
+ // Single period calculation
215
+ const fundingFeesDeltaP = avgFundingRatePerSecondP * secondsSinceLastUpdate * currentPairPrice;
216
+ const { longAprMultiplier, shortAprMultiplier } = (0, exports.getLongShortAprMultiplier)(avgFundingRatePerSecondP, pairOiToken.oiLongToken, pairOiToken.oiShortToken, params.aprMultiplierEnabled);
217
+ accFundingFeeLongP += fundingFeesDeltaP * longAprMultiplier;
218
+ accFundingFeeShortP -= fundingFeesDeltaP * shortAprMultiplier;
219
+ }
220
+ return {
221
+ accFundingFeeLongP,
222
+ accFundingFeeShortP,
223
+ currentFundingRatePerSecondP,
224
+ };
225
+ };
226
+ exports.getPairPendingAccFundingFees = getPairPendingAccFundingFees;
227
+ /**
228
+ * @dev Calculates funding fees for a specific trade (SDK version following contract pattern)
229
+ * @param trade Trade parameters (collateral amount, leverage, open price, long/short, collateralIndex, pairIndex)
230
+ * @param tradeInfo Trade info (contracts version)
231
+ * @param tradeFeesData Trade fees data containing initial acc funding fee
232
+ * @param currentPairPrice Current pair price
233
+ * @param context Optional context with funding fee data (full or pair-specific)
234
+ * @returns Funding fee in collateral tokens
235
+ */
236
+ const getTradeFundingFeesCollateral = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
237
+ var _a, _b, _c, _d, _e, _f, _g, _h;
238
+ // Funding fees are only charged on post-v10 trades
239
+ if (tradeInfo.contractsVersion < 10) {
240
+ return 0;
241
+ }
242
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
243
+ if (!context) {
244
+ return 0; // Cannot calculate without context
245
+ }
246
+ // Check if we have a pair-specific context
247
+ if ("params" in context && "data" in context) {
248
+ // Pair-specific context
249
+ const { params, data, pairOi, netExposureToken, netExposureUsd } = context;
250
+ if (!params.fundingFeesEnabled) {
251
+ return 0;
252
+ }
253
+ // Calculate pending accumulated fees
254
+ const { accFundingFeeLongP, accFundingFeeShortP } = (0, exports.getPairPendingAccFundingFees)(params, data, currentPairPrice, pairOi || { oiLongToken: 0, oiShortToken: 0 }, netExposureToken || 0, netExposureUsd || 0, context.currentTimestamp);
255
+ const currentAccFundingFeeP = trade.long
256
+ ? accFundingFeeLongP
257
+ : accFundingFeeShortP;
258
+ const fundingFeeDelta = currentAccFundingFeeP - tradeFeesData.initialAccFundingFeeP;
259
+ return (positionSizeCollateral * fundingFeeDelta) / trade.openPrice;
260
+ }
261
+ // Full context - original logic
262
+ if ("fundingParams" in context &&
263
+ trade.collateralIndex !== undefined &&
264
+ trade.pairIndex !== undefined) {
265
+ const params = (_a = context.fundingParams[trade.collateralIndex]) === null || _a === void 0 ? void 0 : _a[trade.pairIndex];
266
+ const data = (_b = context.fundingData[trade.collateralIndex]) === null || _b === void 0 ? void 0 : _b[trade.pairIndex];
267
+ const pairOi = (_d = (_c = context.pairOiAfterV10) === null || _c === void 0 ? void 0 : _c[trade.collateralIndex]) === null || _d === void 0 ? void 0 : _d[trade.pairIndex];
268
+ const netExposureToken = ((_f = (_e = context.netExposureToken) === null || _e === void 0 ? void 0 : _e[trade.collateralIndex]) === null || _f === void 0 ? void 0 : _f[trade.pairIndex]) || 0;
269
+ const netExposureUsd = ((_h = (_g = context.netExposureUsd) === null || _g === void 0 ? void 0 : _g[trade.collateralIndex]) === null || _h === void 0 ? void 0 : _h[trade.pairIndex]) || 0;
270
+ if (params && data && pairOi) {
271
+ // Calculate pending accumulated fees
272
+ const { accFundingFeeLongP, accFundingFeeShortP } = (0, exports.getPairPendingAccFundingFees)(params, data, currentPairPrice, pairOi, netExposureToken, netExposureUsd, context.currentTimestamp);
273
+ const currentAccFundingFeeP = trade.long
274
+ ? accFundingFeeLongP
275
+ : accFundingFeeShortP;
276
+ const fundingFeeDelta = currentAccFundingFeeP - tradeFeesData.initialAccFundingFeeP;
277
+ return (positionSizeCollateral * fundingFeeDelta) / trade.openPrice;
278
+ }
279
+ }
280
+ return 0; // Cannot calculate without proper context
281
+ };
282
+ exports.getTradeFundingFeesCollateral = getTradeFundingFeesCollateral;
283
+ /**
284
+ * @dev Main function to calculate funding fees for a trade within context
285
+ * @param context Funding fee context with params and data
286
+ * @param collateralIndex Collateral index
287
+ * @param pairIndex Pair index
288
+ * @param trade Trade details
289
+ * @param tradeInfo Trade info (contracts version)
290
+ * @param initialAccFundingFeeP Initial accumulated funding fee
291
+ * @param currentPairPrice Current pair price
292
+ * @param pairOiToken Pair OI after v10
293
+ * @param netExposureToken Net exposure in tokens
294
+ * @param netExposureUsd Net exposure in USD
295
+ * @returns Complete funding fee calculation result
296
+ */
297
+ const getTradeFundingFees = (context, collateralIndex, pairIndex, trade, tradeInfo, initialAccFundingFeeP, currentPairPrice, pairOiToken, netExposureToken, netExposureUsd) => {
298
+ var _a, _b;
299
+ // Get params and data from context
300
+ const params = (_a = context.fundingParams[collateralIndex]) === null || _a === void 0 ? void 0 : _a[pairIndex];
301
+ const data = (_b = context.fundingData[collateralIndex]) === null || _b === void 0 ? void 0 : _b[pairIndex];
302
+ if (!params || !data) {
303
+ throw new Error(`Missing funding fee data for collateral ${collateralIndex} pair ${pairIndex}`);
304
+ }
305
+ // Calculate pending accumulated fees
306
+ const { accFundingFeeLongP, accFundingFeeShortP } = (0, exports.getPairPendingAccFundingFees)(params, data, currentPairPrice, pairOiToken, netExposureToken, netExposureUsd, context.currentTimestamp);
307
+ const currentAccFundingFeeP = trade.long
308
+ ? accFundingFeeLongP
309
+ : accFundingFeeShortP;
310
+ // Calculate funding fee in collateral
311
+ const fundingFeeCollateral = (0, exports.getTradeFundingFeesCollateralSimple)(trade, tradeInfo, initialAccFundingFeeP, currentAccFundingFeeP);
312
+ // Calculate funding fee as percentage
313
+ const fundingFeeP = trade.collateralAmount > 0
314
+ ? (fundingFeeCollateral / trade.collateralAmount) * 100
315
+ : 0;
316
+ return {
317
+ fundingFeeCollateral,
318
+ fundingFeeP,
319
+ currentAccFundingFeeP,
320
+ initialAccFundingFeeP,
321
+ };
322
+ };
323
+ exports.getTradeFundingFees = getTradeFundingFees;
324
+ /**
325
+ * @dev Simple version of getTradeFundingFeesCollateral for backward compatibility
326
+ * @param trade Trade parameters
327
+ * @param tradeInfo Trade info with contracts version
328
+ * @param initialAccFundingFeeP Initial accumulated funding fee
329
+ * @param currentAccFundingFeeP Current accumulated funding fee
330
+ * @returns Funding fee in collateral tokens
331
+ */
332
+ const getTradeFundingFeesCollateralSimple = (trade, tradeInfo, initialAccFundingFeeP, currentAccFundingFeeP) => {
333
+ // Funding fees are only charged on post-v10 trades
334
+ if (tradeInfo.contractsVersion < 10) {
335
+ return 0;
336
+ }
337
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
338
+ const fundingFeeDelta = currentAccFundingFeeP - initialAccFundingFeeP;
339
+ return (positionSizeCollateral * fundingFeeDelta) / trade.openPrice;
340
+ };
341
+ exports.getTradeFundingFeesCollateralSimple = getTradeFundingFeesCollateralSimple;
342
+ // Export namespace for types
343
+ exports.FundingFees = __importStar(require("./types"));
344
+ __exportStar(require("./fetcher"), exports);
345
+ __exportStar(require("./pairContext"), exports);
346
+ __exportStar(require("./builder"), exports);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @dev Pair-specific funding fee types and utilities
3
+ */
4
+ import { FundingFeeParams, PairFundingFeeData, PairGlobalParams, PairOiAfterV10, PairPendingAccFundingFeesResult } from "./types";
5
+ /**
6
+ * @dev Context for pair-specific funding fee calculations
7
+ */
8
+ export type GetPairFundingFeeContext = {
9
+ currentTimestamp: number;
10
+ params: FundingFeeParams;
11
+ data: PairFundingFeeData;
12
+ globalParams?: PairGlobalParams;
13
+ pairOi?: PairOiAfterV10;
14
+ netExposureToken?: number;
15
+ netExposureUsd?: number;
16
+ };
17
+ /**
18
+ * @dev Input for pair-specific trade funding fee calculation
19
+ */
20
+ export type PairTradeFundingFeeInput = {
21
+ positionSizeCollateral: number;
22
+ openPrice: number;
23
+ long: boolean;
24
+ currentPairPrice: number;
25
+ initialAccFundingFeeP: number;
26
+ };
27
+ /**
28
+ * @dev Calculate pending accumulated funding fees for a pair using pair-specific context
29
+ * @param currentPairPrice Current price of the pair
30
+ * @param context Pair-specific funding context
31
+ * @returns Pending accumulated funding fees
32
+ */
33
+ export declare const getPairPendingAccFundingFees: (currentPairPrice: number, context: GetPairFundingFeeContext) => PairPendingAccFundingFeesResult;