@gainsnetwork/sdk 0.2.71-rc4 → 1.0.0-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 (247) hide show
  1. package/README.md +2 -2
  2. package/lib/backend/globalTrades/index.d.ts +11 -0
  3. package/lib/backend/globalTrades/index.js +69 -0
  4. package/lib/backend/index.d.ts +3 -0
  5. package/lib/backend/index.js +28 -0
  6. package/lib/backend/tradingVariables/backend.types.d.ts +318 -0
  7. package/lib/backend/tradingVariables/backend.types.js +2 -0
  8. package/lib/backend/tradingVariables/converter.d.ts +34 -0
  9. package/lib/backend/tradingVariables/converter.js +338 -0
  10. package/lib/backend/tradingVariables/index.d.ts +5 -0
  11. package/lib/backend/tradingVariables/index.js +96 -0
  12. package/lib/backend/tradingVariables/types.d.ts +113 -0
  13. package/lib/backend/tradingVariables/types.js +14 -0
  14. package/lib/constants.d.ts +0 -3
  15. package/lib/constants.js +7 -9
  16. package/lib/contracts/types/generated/GFarmTradingStorageV5.d.ts +1911 -0
  17. package/lib/contracts/types/generated/GFarmTradingStorageV5.js +2 -0
  18. package/lib/contracts/types/generated/GNSBorrowingFees.d.ts +1067 -0
  19. package/lib/contracts/types/generated/GNSBorrowingFees.js +2 -0
  20. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.d.ts +979 -0
  21. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.js +2 -0
  22. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.d.ts +1058 -0
  23. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.js +2 -0
  24. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +2134 -293
  25. package/lib/contracts/types/generated/GNSNftRewardsV6.d.ts +533 -0
  26. package/lib/contracts/types/generated/GNSNftRewardsV6.js +2 -0
  27. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +613 -0
  28. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +2 -0
  29. package/lib/contracts/types/generated/GNSPairInfosV6_1.d.ts +911 -0
  30. package/lib/contracts/types/generated/GNSPairInfosV6_1.js +2 -0
  31. package/lib/contracts/types/generated/GNSPairsStorageV6.d.ts +660 -0
  32. package/lib/contracts/types/generated/GNSPairsStorageV6.js +2 -0
  33. package/lib/contracts/types/generated/GNSTrading.d.ts +758 -0
  34. package/lib/contracts/types/generated/GNSTrading.js +2 -0
  35. package/lib/contracts/types/generated/GNSTradingCallbacks.d.ts +875 -0
  36. package/lib/contracts/types/generated/GNSTradingCallbacks.js +2 -0
  37. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.d.ts +806 -0
  38. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.js +2 -0
  39. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.d.ts +821 -0
  40. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.js +2 -0
  41. package/lib/contracts/types/generated/GNSTradingStorage.d.ts +1387 -0
  42. package/lib/contracts/types/generated/GNSTradingStorage.js +2 -0
  43. package/lib/contracts/types/generated/GToken.d.ts +78 -107
  44. package/lib/contracts/types/generated/GTokenV6_3_2.d.ts +1838 -0
  45. package/lib/contracts/types/generated/GTokenV6_3_2.js +2 -0
  46. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.d.ts +83 -0
  47. package/lib/contracts/types/generated/factories/GFarmTradingStorageV5__factory.js +2691 -0
  48. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.d.ts +88 -0
  49. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.js +1654 -0
  50. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.d.ts +113 -0
  51. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_4__factory.js +1742 -0
  52. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.d.ts +124 -0
  53. package/lib/contracts/types/generated/factories/GNSBorrowingFees__factory.js +1784 -0
  54. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.d.ts +90 -53
  55. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +4496 -430
  56. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +100 -0
  57. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +1116 -0
  58. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.d.ts +100 -0
  59. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.js +1003 -0
  60. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.d.ts +98 -0
  61. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.js +1485 -0
  62. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.d.ts +117 -0
  63. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.js +1265 -0
  64. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.d.ts +82 -0
  65. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.js +1273 -0
  66. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.d.ts +82 -0
  67. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.js +1326 -0
  68. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.d.ts +113 -0
  69. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.js +1428 -0
  70. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.d.ts +96 -0
  71. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.js +2241 -0
  72. package/lib/contracts/types/generated/factories/GNSTrading__factory.d.ts +95 -0
  73. package/lib/contracts/types/generated/factories/GNSTrading__factory.js +1071 -0
  74. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.d.ts +110 -0
  75. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.js +2682 -0
  76. package/lib/contracts/types/generated/factories/GToken__factory.d.ts +7 -0
  77. package/lib/contracts/types/generated/factories/GToken__factory.js +69 -142
  78. package/lib/contracts/types/index.d.ts +2 -1
  79. package/lib/contracts/types/index.js +1 -0
  80. package/lib/contracts/utils/openTrades.d.ts +1 -0
  81. package/lib/contracts/utils/openTrades.js +94 -56
  82. package/lib/contracts/utils/pairs.js +0 -3
  83. package/lib/index.d.ts +2 -0
  84. package/lib/index.js +5 -0
  85. package/lib/markets/collateral/converter.d.ts +5 -0
  86. package/lib/markets/collateral/converter.js +11 -0
  87. package/lib/markets/collateral/index.d.ts +1 -0
  88. package/lib/markets/collateral/index.js +17 -0
  89. package/lib/markets/collateral/types.d.ts +7 -0
  90. package/lib/markets/collateral/types.js +2 -0
  91. package/lib/markets/holdingFees/index.d.ts +46 -0
  92. package/lib/markets/holdingFees/index.js +105 -0
  93. package/lib/markets/holdingFees/types.d.ts +23 -0
  94. package/lib/markets/holdingFees/types.js +5 -0
  95. package/lib/markets/index.d.ts +5 -0
  96. package/lib/markets/index.js +5 -0
  97. package/lib/markets/leverage/builder.d.ts +12 -0
  98. package/lib/markets/leverage/builder.js +25 -0
  99. package/lib/markets/leverage/getMarketLeverageRestrictions.d.ts +7 -0
  100. package/lib/markets/leverage/getMarketLeverageRestrictions.js +38 -0
  101. package/lib/markets/leverage/index.d.ts +3 -0
  102. package/lib/markets/leverage/index.js +19 -0
  103. package/lib/markets/leverage/types.d.ts +15 -0
  104. package/lib/markets/leverage/types.js +2 -0
  105. package/lib/markets/oi/converter.d.ts +62 -0
  106. package/lib/markets/oi/converter.js +102 -0
  107. package/lib/markets/oi/fetcher.d.ts +58 -0
  108. package/lib/markets/oi/fetcher.js +181 -0
  109. package/lib/markets/oi/index.d.ts +49 -0
  110. package/lib/markets/oi/index.js +77 -0
  111. package/lib/markets/oi/types.d.ts +73 -0
  112. package/lib/markets/oi/types.js +6 -0
  113. package/lib/markets/oi/validation.d.ts +80 -0
  114. package/lib/markets/oi/validation.js +172 -0
  115. package/lib/markets/price/builder.d.ts +25 -0
  116. package/lib/markets/price/builder.js +69 -0
  117. package/lib/markets/price/index.d.ts +6 -0
  118. package/lib/markets/price/index.js +22 -0
  119. package/lib/markets/price/marketPrice.d.ts +13 -0
  120. package/lib/markets/price/marketPrice.js +35 -0
  121. package/lib/markets/price/types.d.ts +23 -0
  122. package/lib/markets/price/types.js +5 -0
  123. package/lib/trade/counterTrade/index.d.ts +2 -0
  124. package/lib/trade/counterTrade/index.js +18 -0
  125. package/lib/trade/counterTrade/types.d.ts +7 -0
  126. package/lib/trade/counterTrade/types.js +2 -0
  127. package/lib/trade/counterTrade/validateCounterTrade.d.ts +10 -0
  128. package/lib/trade/counterTrade/validateCounterTrade.js +29 -0
  129. package/lib/trade/effectiveLeverage/builder.d.ts +23 -0
  130. package/lib/trade/effectiveLeverage/builder.js +30 -0
  131. package/lib/trade/effectiveLeverage/getTradeNewEffectiveLeverage.d.ts +23 -0
  132. package/lib/trade/effectiveLeverage/getTradeNewEffectiveLeverage.js +64 -0
  133. package/lib/trade/effectiveLeverage/index.d.ts +3 -0
  134. package/lib/trade/effectiveLeverage/index.js +22 -0
  135. package/lib/trade/effectiveLeverage/types.d.ts +33 -0
  136. package/lib/trade/effectiveLeverage/types.js +2 -0
  137. package/lib/trade/fees/borrowing/builder.d.ts +14 -0
  138. package/lib/trade/fees/borrowing/builder.js +33 -0
  139. package/lib/trade/fees/borrowing/index.d.ts +23 -2
  140. package/lib/trade/fees/borrowing/index.js +50 -16
  141. package/lib/trade/fees/borrowingV2/builder.d.ts +6 -0
  142. package/lib/trade/fees/borrowingV2/builder.js +24 -0
  143. package/lib/trade/fees/borrowingV2/converter.d.ts +75 -0
  144. package/lib/trade/fees/borrowingV2/converter.js +132 -0
  145. package/lib/trade/fees/borrowingV2/fetcher.d.ts +75 -0
  146. package/lib/trade/fees/borrowingV2/fetcher.js +185 -0
  147. package/lib/trade/fees/borrowingV2/index.d.ts +48 -0
  148. package/lib/trade/fees/borrowingV2/index.js +112 -0
  149. package/lib/trade/fees/borrowingV2/types.d.ts +95 -0
  150. package/lib/trade/fees/borrowingV2/types.js +5 -0
  151. package/lib/trade/fees/converter.d.ts +48 -0
  152. package/lib/trade/fees/converter.js +114 -0
  153. package/lib/trade/fees/fundingFees/builder.d.ts +9 -0
  154. package/lib/trade/fees/fundingFees/builder.js +35 -0
  155. package/lib/trade/fees/fundingFees/converter.d.ts +102 -0
  156. package/lib/trade/fees/fundingFees/converter.js +196 -0
  157. package/lib/trade/fees/fundingFees/fetcher.d.ts +66 -0
  158. package/lib/trade/fees/fundingFees/fetcher.js +150 -0
  159. package/lib/trade/fees/fundingFees/index.d.ts +124 -0
  160. package/lib/trade/fees/fundingFees/index.js +309 -0
  161. package/lib/trade/fees/fundingFees/pairContext.d.ts +33 -0
  162. package/lib/trade/fees/fundingFees/pairContext.js +17 -0
  163. package/lib/trade/fees/fundingFees/types.d.ts +77 -0
  164. package/lib/trade/fees/fundingFees/types.js +5 -0
  165. package/lib/trade/fees/holdingFees/index.d.ts +46 -0
  166. package/lib/trade/fees/holdingFees/index.js +105 -0
  167. package/lib/trade/fees/holdingFees/types.d.ts +23 -0
  168. package/lib/trade/fees/holdingFees/types.js +5 -0
  169. package/lib/trade/fees/index.d.ts +8 -2
  170. package/lib/trade/fees/index.js +67 -16
  171. package/lib/trade/fees/tiers/converter.d.ts +54 -0
  172. package/lib/trade/fees/tiers/converter.js +81 -0
  173. package/lib/trade/fees/tiers/index.d.ts +18 -0
  174. package/lib/trade/fees/tiers/index.js +45 -1
  175. package/lib/trade/fees/trading/builder.d.ts +18 -0
  176. package/lib/trade/fees/trading/builder.js +20 -0
  177. package/lib/trade/fees/trading/converter.d.ts +32 -0
  178. package/lib/trade/fees/trading/converter.js +47 -0
  179. package/lib/trade/fees/trading/holdingFees.d.ts +28 -0
  180. package/lib/trade/fees/trading/holdingFees.js +66 -0
  181. package/lib/trade/fees/trading/holdingFeesStructured.d.ts +28 -0
  182. package/lib/trade/fees/trading/holdingFeesStructured.js +66 -0
  183. package/lib/trade/fees/trading/index.d.ts +62 -0
  184. package/lib/trade/fees/trading/index.js +155 -0
  185. package/lib/trade/fees/trading/types.d.ts +48 -0
  186. package/lib/trade/fees/trading/types.js +5 -0
  187. package/lib/trade/index.d.ts +5 -2
  188. package/lib/trade/index.js +5 -2
  189. package/lib/trade/liquidation/builder.d.ts +25 -0
  190. package/lib/trade/liquidation/builder.js +59 -0
  191. package/lib/trade/liquidation/converter.d.ts +23 -0
  192. package/lib/trade/liquidation/converter.js +46 -0
  193. package/lib/trade/liquidation/index.d.ts +29 -0
  194. package/lib/trade/liquidation/index.js +218 -0
  195. package/lib/trade/liquidation/types.d.ts +43 -0
  196. package/lib/trade/liquidation/types.js +2 -0
  197. package/lib/trade/pnl/builder.d.ts +16 -0
  198. package/lib/trade/pnl/builder.js +44 -0
  199. package/lib/trade/pnl/converter.d.ts +47 -0
  200. package/lib/trade/pnl/converter.js +72 -0
  201. package/lib/trade/pnl/index.d.ts +89 -0
  202. package/lib/trade/pnl/index.js +302 -0
  203. package/lib/trade/pnl/types.d.ts +79 -0
  204. package/lib/trade/pnl/types.js +5 -0
  205. package/lib/trade/priceImpact/close/builder.d.ts +23 -0
  206. package/lib/trade/priceImpact/close/builder.js +45 -0
  207. package/lib/trade/priceImpact/close/index.d.ts +22 -0
  208. package/lib/trade/priceImpact/close/index.js +134 -0
  209. package/lib/trade/priceImpact/close/types.d.ts +47 -0
  210. package/lib/trade/priceImpact/close/types.js +5 -0
  211. package/lib/trade/priceImpact/cumulVol/builder.d.ts +22 -0
  212. package/lib/trade/priceImpact/cumulVol/builder.js +43 -0
  213. package/lib/trade/priceImpact/cumulVol/converter.d.ts +31 -0
  214. package/lib/trade/priceImpact/cumulVol/converter.js +59 -0
  215. package/lib/trade/priceImpact/cumulVol/index.d.ts +108 -0
  216. package/lib/trade/priceImpact/cumulVol/index.js +235 -0
  217. package/lib/trade/priceImpact/index.d.ts +21 -0
  218. package/lib/trade/priceImpact/index.js +79 -0
  219. package/lib/trade/priceImpact/open/builder.d.ts +21 -0
  220. package/lib/trade/priceImpact/open/builder.js +43 -0
  221. package/lib/trade/priceImpact/open/index.d.ts +23 -0
  222. package/lib/trade/priceImpact/open/index.js +78 -0
  223. package/lib/trade/priceImpact/open/types.d.ts +44 -0
  224. package/lib/trade/priceImpact/open/types.js +5 -0
  225. package/lib/trade/priceImpact/skew/builder.d.ts +12 -0
  226. package/lib/trade/priceImpact/skew/builder.js +28 -0
  227. package/lib/trade/priceImpact/skew/converter.d.ts +46 -0
  228. package/lib/trade/priceImpact/skew/converter.js +81 -0
  229. package/lib/trade/priceImpact/skew/fetcher.d.ts +60 -0
  230. package/lib/trade/priceImpact/skew/fetcher.js +169 -0
  231. package/lib/trade/priceImpact/skew/index.d.ts +53 -0
  232. package/lib/trade/priceImpact/skew/index.js +148 -0
  233. package/lib/trade/priceImpact/skew/types.d.ts +44 -0
  234. package/lib/trade/priceImpact/skew/types.js +5 -0
  235. package/lib/trade/spread.d.ts +5 -18
  236. package/lib/trade/spread.js +17 -106
  237. package/lib/trade/types.d.ts +109 -12
  238. package/lib/trade/types.js +0 -3
  239. package/lib/trade/utils.d.ts +18 -0
  240. package/lib/trade/utils.js +30 -0
  241. package/lib/vault/index.d.ts +3 -1
  242. package/lib/vault/index.js +2 -2
  243. package/package.json +2 -1
  244. package/lib/trade/liquidation.d.ts +0 -12
  245. package/lib/trade/liquidation.js +0 -55
  246. package/lib/trade/pnl.d.ts +0 -10
  247. package/lib/trade/pnl.js +0 -33
@@ -0,0 +1,309 @@
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
+ const types_1 = require("../../../contracts/types");
35
+ // Constants from contract
36
+ const FUNDING_APR_MULTIPLIER_CAP = 100; // Smaller side can earn up to 100x more APR
37
+ const ONE_YEAR = 365 * 24 * 60 * 60; // 1 year in seconds
38
+ /**
39
+ * @dev Calculates current funding velocity per year based on skew
40
+ * @param netExposureToken Net exposure (long - short) in tokens
41
+ * @param netExposureUsd Net exposure in USD
42
+ * @param skewCoefficientPerYear Skew coefficient per year from params
43
+ * @param absoluteVelocityPerYearCap Cap on velocity per year
44
+ * @param thetaThresholdUsd Minimum exposure USD to start charging funding fees
45
+ * @returns Current yearly funding velocity
46
+ */
47
+ const getCurrentFundingVelocityPerYear = (netExposureToken, netExposureUsd, skewCoefficientPerYear, absoluteVelocityPerYearCap, thetaThresholdUsd) => {
48
+ // If no exposure or skew coefficient 0 or velocity cap 0, velocity is 0
49
+ if (netExposureToken === 0 ||
50
+ skewCoefficientPerYear === 0 ||
51
+ absoluteVelocityPerYearCap === 0) {
52
+ return 0;
53
+ }
54
+ // Check theta threshold
55
+ const absNetExposureUsd = Math.abs(netExposureUsd);
56
+ if (absNetExposureUsd < thetaThresholdUsd) {
57
+ return 0;
58
+ }
59
+ // Calculate absolute velocity
60
+ const absoluteVelocityPerYear = Math.abs(netExposureToken) * skewCoefficientPerYear;
61
+ // Apply cap
62
+ const cappedAbsoluteVelocity = Math.min(absoluteVelocityPerYear, absoluteVelocityPerYearCap);
63
+ // Return with proper sign
64
+ return netExposureToken < 0
65
+ ? -cappedAbsoluteVelocity
66
+ : cappedAbsoluteVelocity;
67
+ };
68
+ exports.getCurrentFundingVelocityPerYear = getCurrentFundingVelocityPerYear;
69
+ /**
70
+ * @dev Calculates seconds until funding rate reaches zero
71
+ * @param lastFundingRatePerSecondP Last funding rate per second
72
+ * @param currentVelocityPerYear Current velocity per year
73
+ * @returns Seconds until rate reaches zero
74
+ */
75
+ const getSecondsToReachZeroRate = (lastFundingRatePerSecondP, currentVelocityPerYear) => {
76
+ if (currentVelocityPerYear === 0) {
77
+ throw new Error("Velocity cannot be zero when calculating time to reach zero rate");
78
+ }
79
+ const secondsToReachZeroRate = (-lastFundingRatePerSecondP * ONE_YEAR) / currentVelocityPerYear;
80
+ if (secondsToReachZeroRate < 0) {
81
+ throw new Error("Invalid calculation: seconds to reach zero rate cannot be negative");
82
+ }
83
+ return secondsToReachZeroRate;
84
+ };
85
+ exports.getSecondsToReachZeroRate = getSecondsToReachZeroRate;
86
+ /**
87
+ * @dev Calculates average and current funding rate per second
88
+ * @param lastFundingRatePerSecondP Last funding rate per second
89
+ * @param absoluteRatePerSecondCap Absolute cap on funding rate per second
90
+ * @param currentVelocityPerYear Current velocity per year
91
+ * @param secondsSinceLastUpdate Seconds elapsed since last update
92
+ * @returns Average and current funding rate per second
93
+ */
94
+ const getAvgFundingRatePerSecondP = (lastFundingRatePerSecondP, absoluteRatePerSecondCap, currentVelocityPerYear, secondsSinceLastUpdate) => {
95
+ // If cap is 0, there are no funding fees
96
+ if (absoluteRatePerSecondCap === 0) {
97
+ return { avgFundingRatePerSecondP: 0, currentFundingRatePerSecondP: 0 };
98
+ }
99
+ // If velocity is 0 or no time elapsed, funding rate is still the same
100
+ if (currentVelocityPerYear === 0 || secondsSinceLastUpdate === 0) {
101
+ return {
102
+ avgFundingRatePerSecondP: lastFundingRatePerSecondP,
103
+ currentFundingRatePerSecondP: lastFundingRatePerSecondP,
104
+ };
105
+ }
106
+ const ratePerSecondCap = absoluteRatePerSecondCap * (currentVelocityPerYear < 0 ? -1 : 1);
107
+ // If rate is already at cap, just return it
108
+ if (ratePerSecondCap === lastFundingRatePerSecondP) {
109
+ return {
110
+ avgFundingRatePerSecondP: ratePerSecondCap,
111
+ currentFundingRatePerSecondP: ratePerSecondCap,
112
+ };
113
+ }
114
+ const secondsToReachCap = ((ratePerSecondCap - lastFundingRatePerSecondP) * ONE_YEAR) /
115
+ currentVelocityPerYear;
116
+ if (secondsSinceLastUpdate > secondsToReachCap) {
117
+ // Rate reached cap during this period
118
+ const currentFundingRatePerSecondP = ratePerSecondCap;
119
+ // Weighted average: time to cap at average rate + time at cap
120
+ const avgFundingRatePerSecondP_1 = (lastFundingRatePerSecondP + ratePerSecondCap) / 2;
121
+ const avgFundingRatePerSecondP = (avgFundingRatePerSecondP_1 * secondsToReachCap +
122
+ ratePerSecondCap * (secondsSinceLastUpdate - secondsToReachCap)) /
123
+ secondsSinceLastUpdate;
124
+ return { avgFundingRatePerSecondP, currentFundingRatePerSecondP };
125
+ }
126
+ else {
127
+ // Rate didn't reach cap
128
+ const currentFundingRatePerSecondP = lastFundingRatePerSecondP +
129
+ (secondsSinceLastUpdate * currentVelocityPerYear) / ONE_YEAR;
130
+ const avgFundingRatePerSecondP = (lastFundingRatePerSecondP + currentFundingRatePerSecondP) / 2;
131
+ return { avgFundingRatePerSecondP, currentFundingRatePerSecondP };
132
+ }
133
+ };
134
+ exports.getAvgFundingRatePerSecondP = getAvgFundingRatePerSecondP;
135
+ /**
136
+ * @dev Calculates APR multipliers for long and short sides based on OI ratio
137
+ * @param avgFundingRatePerSecondP Average funding rate per second
138
+ * @param pairOiLongToken Long OI in tokens
139
+ * @param pairOiShortToken Short OI in tokens
140
+ * @param aprMultiplierEnabled Whether APR multiplier is enabled
141
+ * @returns Long and short APR multipliers
142
+ */
143
+ const getLongShortAprMultiplier = (avgFundingRatePerSecondP, pairOiLongToken, pairOiShortToken, aprMultiplierEnabled) => {
144
+ // If funding rate is 0, multipliers don't matter
145
+ if (avgFundingRatePerSecondP === 0) {
146
+ return { longAprMultiplier: 1, shortAprMultiplier: 1 };
147
+ }
148
+ const longsEarned = avgFundingRatePerSecondP < 0;
149
+ let longAprMultiplier = 1;
150
+ let shortAprMultiplier = 1;
151
+ if (aprMultiplierEnabled) {
152
+ if (longsEarned && pairOiLongToken > 0) {
153
+ longAprMultiplier = pairOiShortToken / pairOiLongToken;
154
+ }
155
+ else if (!longsEarned && pairOiShortToken > 0) {
156
+ shortAprMultiplier = pairOiLongToken / pairOiShortToken;
157
+ }
158
+ // Apply cap
159
+ longAprMultiplier = Math.min(longAprMultiplier, FUNDING_APR_MULTIPLIER_CAP);
160
+ shortAprMultiplier = Math.min(shortAprMultiplier, FUNDING_APR_MULTIPLIER_CAP);
161
+ }
162
+ return { longAprMultiplier, shortAprMultiplier };
163
+ };
164
+ exports.getLongShortAprMultiplier = getLongShortAprMultiplier;
165
+ /**
166
+ * @dev Calculates pending accumulated funding fees for a pair
167
+ * @param params Funding fee parameters
168
+ * @param data Current funding fee data
169
+ * @param currentPairPrice Current pair price
170
+ * @param pairOiToken Pair OI after v10
171
+ * @param netExposureToken Net exposure in tokens
172
+ * @param netExposureUsd Net exposure in USD
173
+ * @param currentTimestamp Current timestamp
174
+ * @returns Pending accumulated funding fees and current rate
175
+ */
176
+ const getPairPendingAccFundingFees = (params, data, currentPairPrice, pairOiToken, netExposureToken, netExposureUsd, currentTimestamp) => {
177
+ let accFundingFeeLongP = data.accFundingFeeLongP;
178
+ let accFundingFeeShortP = data.accFundingFeeShortP;
179
+ // If funding fees are disabled, return current values
180
+ if (!params.fundingFeesEnabled) {
181
+ return {
182
+ accFundingFeeLongP,
183
+ accFundingFeeShortP,
184
+ currentFundingRatePerSecondP: data.lastFundingRatePerSecondP,
185
+ };
186
+ }
187
+ const secondsSinceLastUpdate = currentTimestamp - data.lastFundingUpdateTs;
188
+ // Calculate current velocity
189
+ const currentVelocityPerYear = (0, exports.getCurrentFundingVelocityPerYear)(netExposureToken, netExposureUsd, params.skewCoefficientPerYear, params.absoluteVelocityPerYearCap, params.thetaThresholdUsd);
190
+ // Get average and current funding rates
191
+ const { avgFundingRatePerSecondP, currentFundingRatePerSecondP } = (0, exports.getAvgFundingRatePerSecondP)(data.lastFundingRatePerSecondP, params.absoluteRatePerSecondCap, currentVelocityPerYear, secondsSinceLastUpdate);
192
+ // Check if we need to handle rate sign change
193
+ const rateChangedSign = params.aprMultiplierEnabled &&
194
+ ((currentFundingRatePerSecondP > 0 && data.lastFundingRatePerSecondP < 0) ||
195
+ (currentFundingRatePerSecondP < 0 && data.lastFundingRatePerSecondP > 0));
196
+ if (rateChangedSign) {
197
+ // Split calculation into two periods: before and after sign change
198
+ // 1. From last update to rate = 0
199
+ const secondsToReachZeroRate = (0, exports.getSecondsToReachZeroRate)(data.lastFundingRatePerSecondP, currentVelocityPerYear);
200
+ const avgFundingRatePerSecondP_1 = data.lastFundingRatePerSecondP / 2;
201
+ const fundingFeesDeltaP_1 = avgFundingRatePerSecondP_1 * secondsToReachZeroRate * currentPairPrice;
202
+ const { longAprMultiplier: longMultiplier1, shortAprMultiplier: shortMultiplier1, } = (0, exports.getLongShortAprMultiplier)(avgFundingRatePerSecondP_1, pairOiToken.oiLongToken, pairOiToken.oiShortToken, true);
203
+ accFundingFeeLongP += fundingFeesDeltaP_1 * longMultiplier1;
204
+ accFundingFeeShortP -= fundingFeesDeltaP_1 * shortMultiplier1;
205
+ // 2. From rate = 0 to current rate
206
+ const avgFundingRatePerSecondP_2 = currentFundingRatePerSecondP / 2;
207
+ const fundingFeesDeltaP_2 = avgFundingRatePerSecondP_2 *
208
+ (secondsSinceLastUpdate - secondsToReachZeroRate) *
209
+ currentPairPrice;
210
+ const { longAprMultiplier: longMultiplier2, shortAprMultiplier: shortMultiplier2, } = (0, exports.getLongShortAprMultiplier)(avgFundingRatePerSecondP_2, pairOiToken.oiLongToken, pairOiToken.oiShortToken, true);
211
+ accFundingFeeLongP += fundingFeesDeltaP_2 * longMultiplier2;
212
+ accFundingFeeShortP -= fundingFeesDeltaP_2 * shortMultiplier2;
213
+ }
214
+ else {
215
+ // Single period calculation
216
+ const fundingFeesDeltaP = avgFundingRatePerSecondP * secondsSinceLastUpdate * currentPairPrice;
217
+ const { longAprMultiplier, shortAprMultiplier } = (0, exports.getLongShortAprMultiplier)(avgFundingRatePerSecondP, pairOiToken.oiLongToken, pairOiToken.oiShortToken, params.aprMultiplierEnabled);
218
+ accFundingFeeLongP += fundingFeesDeltaP * longAprMultiplier;
219
+ accFundingFeeShortP -= fundingFeesDeltaP * shortAprMultiplier;
220
+ }
221
+ return {
222
+ accFundingFeeLongP,
223
+ accFundingFeeShortP,
224
+ currentFundingRatePerSecondP,
225
+ };
226
+ };
227
+ exports.getPairPendingAccFundingFees = getPairPendingAccFundingFees;
228
+ /**
229
+ * @dev Calculates funding fees for a specific trade
230
+ * @param trade Trade parameters (collateral amount, leverage, open price, long/short)
231
+ * @param tradeInfo Trade info (contracts version)
232
+ * @param tradeFeesData Trade fees data containing initial acc funding fee
233
+ * @param currentPairPrice Current pair price
234
+ * @param context Pair-specific funding fee context
235
+ * @returns Funding fee in collateral tokens
236
+ */
237
+ const getTradeFundingFeesCollateral = (trade, tradeInfo, tradeFeesData, currentPairPrice, context) => {
238
+ if (tradeInfo.contractsVersion < types_1.ContractsVersion.V10) {
239
+ return 0;
240
+ }
241
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
242
+ if (!context.params.fundingFeesEnabled) {
243
+ return 0;
244
+ }
245
+ // Calculate pending accumulated fees
246
+ const { accFundingFeeLongP, accFundingFeeShortP } = (0, exports.getPairPendingAccFundingFees)(context.params, context.data, currentPairPrice, context.pairOi || { oiLongToken: 0, oiShortToken: 0 }, context.netExposureToken || 0, context.netExposureUsd || 0, context.currentTimestamp);
247
+ const currentAccFundingFeeP = trade.long
248
+ ? accFundingFeeLongP
249
+ : accFundingFeeShortP;
250
+ const fundingFeeDelta = currentAccFundingFeeP - tradeFeesData.initialAccFundingFeeP;
251
+ return (positionSizeCollateral * fundingFeeDelta) / trade.openPrice / 100;
252
+ };
253
+ exports.getTradeFundingFeesCollateral = getTradeFundingFeesCollateral;
254
+ /**
255
+ * @dev Main function to calculate funding fees for a trade within context
256
+ * @param input Trade funding fee input parameters
257
+ * @param context Funding fee context with params and data
258
+ * @returns Complete funding fee calculation result
259
+ */
260
+ const getTradeFundingFees = (input, context) => {
261
+ var _a, _b;
262
+ // Get params and data from context
263
+ const params = (_a = context.fundingParams[input.collateralIndex]) === null || _a === void 0 ? void 0 : _a[input.pairIndex];
264
+ const data = (_b = context.fundingData[input.collateralIndex]) === null || _b === void 0 ? void 0 : _b[input.pairIndex];
265
+ if (!params || !data) {
266
+ throw new Error(`Missing funding fee data for collateral ${input.collateralIndex} pair ${input.pairIndex}`);
267
+ }
268
+ // Calculate pending accumulated fees
269
+ const { accFundingFeeLongP, accFundingFeeShortP } = (0, exports.getPairPendingAccFundingFees)(params, data, input.currentPairPrice, input.pairOiToken, input.netExposureToken, input.netExposureUsd, context.currentTimestamp);
270
+ const currentAccFundingFeeP = input.trade.long
271
+ ? accFundingFeeLongP
272
+ : accFundingFeeShortP;
273
+ // Calculate funding fee in collateral
274
+ const fundingFeeCollateral = (0, exports.getTradeFundingFeesCollateralSimple)(input.trade, input.tradeInfo, input.initialAccFundingFeeP, currentAccFundingFeeP);
275
+ // Calculate funding fee as percentage
276
+ const fundingFeeP = input.trade.collateralAmount > 0
277
+ ? (fundingFeeCollateral / input.trade.collateralAmount) * 100
278
+ : 0;
279
+ return {
280
+ fundingFeeCollateral,
281
+ fundingFeeP,
282
+ currentAccFundingFeeP,
283
+ initialAccFundingFeeP: input.initialAccFundingFeeP,
284
+ };
285
+ };
286
+ exports.getTradeFundingFees = getTradeFundingFees;
287
+ /**
288
+ * @dev Simple version of getTradeFundingFeesCollateral for backward compatibility
289
+ * @param trade Trade parameters
290
+ * @param tradeInfo Trade info with contracts version
291
+ * @param initialAccFundingFeeP Initial accumulated funding fee
292
+ * @param currentAccFundingFeeP Current accumulated funding fee
293
+ * @returns Funding fee in collateral tokens
294
+ */
295
+ const getTradeFundingFeesCollateralSimple = (trade, tradeInfo, initialAccFundingFeeP, currentAccFundingFeeP) => {
296
+ // Funding fees are only charged on post-v10 trades
297
+ if (tradeInfo.contractsVersion < types_1.ContractsVersion.V10) {
298
+ return 0;
299
+ }
300
+ const positionSizeCollateral = trade.collateralAmount * trade.leverage;
301
+ const fundingFeeDelta = currentAccFundingFeeP - initialAccFundingFeeP;
302
+ return (positionSizeCollateral * fundingFeeDelta) / trade.openPrice / 100;
303
+ };
304
+ exports.getTradeFundingFeesCollateralSimple = getTradeFundingFeesCollateralSimple;
305
+ // Export namespace for types
306
+ exports.FundingFees = __importStar(require("./types"));
307
+ __exportStar(require("./fetcher"), exports);
308
+ __exportStar(require("./pairContext"), exports);
309
+ __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;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Pair-specific funding fee types and utilities
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPairPendingAccFundingFees = void 0;
7
+ const index_1 = require("./index");
8
+ /**
9
+ * @dev Calculate pending accumulated funding fees for a pair using pair-specific context
10
+ * @param currentPairPrice Current price of the pair
11
+ * @param context Pair-specific funding context
12
+ * @returns Pending accumulated funding fees
13
+ */
14
+ const getPairPendingAccFundingFees = (currentPairPrice, context) => {
15
+ return (0, index_1.getPairPendingAccFundingFees)(context.params, context.data, currentPairPrice, context.pairOi || { oiLongToken: 0, oiShortToken: 0 }, context.netExposureToken || 0, context.netExposureUsd || 0, context.currentTimestamp);
16
+ };
17
+ exports.getPairPendingAccFundingFees = getPairPendingAccFundingFees;
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @dev Funding fees types for v10+ trades
3
+ */
4
+ export type FundingFeeParams = {
5
+ skewCoefficientPerYear: number;
6
+ absoluteVelocityPerYearCap: number;
7
+ absoluteRatePerSecondCap: number;
8
+ thetaThresholdUsd: number;
9
+ fundingFeesEnabled: boolean;
10
+ aprMultiplierEnabled: boolean;
11
+ };
12
+ export type PairFundingFeeData = {
13
+ accFundingFeeLongP: number;
14
+ accFundingFeeShortP: number;
15
+ lastFundingRatePerSecondP: number;
16
+ lastFundingUpdateTs: number;
17
+ };
18
+ export type PairGlobalParams = {
19
+ maxSkewCollateral: number;
20
+ };
21
+ export type TradeInitialAccFundingFees = {
22
+ initialAccFundingFeeP: number;
23
+ };
24
+ export type PairAccumulatedFees = {
25
+ accPerOiLong: number;
26
+ accPerOiShort: number;
27
+ lastUpdateBlock: number;
28
+ };
29
+ export type TradeInitialAccFees = {
30
+ accPerOiLong: number;
31
+ accPerOiShort: number;
32
+ openBlock: number;
33
+ };
34
+ export type PairOiAfterV10 = {
35
+ oiLongToken: number;
36
+ oiShortToken: number;
37
+ };
38
+ export type FundingRateCalculation = {
39
+ pairOiToken: PairOiAfterV10;
40
+ netExposureToken: number;
41
+ netExposureUsd: number;
42
+ currentVelocityPerYear: number;
43
+ avgFundingRatePerSecondP: number;
44
+ currentFundingRatePerSecondP: number;
45
+ secondsSinceLastUpdate: number;
46
+ longAprMultiplier: number;
47
+ shortAprMultiplier: number;
48
+ };
49
+ export type GetFundingFeeContext = {
50
+ currentTimestamp: number;
51
+ fundingParams: {
52
+ [collateralIndex: number]: {
53
+ [pairIndex: number]: FundingFeeParams;
54
+ };
55
+ };
56
+ fundingData: {
57
+ [collateralIndex: number]: {
58
+ [pairIndex: number]: PairFundingFeeData;
59
+ };
60
+ };
61
+ globalParams?: {
62
+ [collateralIndex: number]: {
63
+ [pairIndex: number]: PairGlobalParams;
64
+ };
65
+ };
66
+ };
67
+ export type TradeFundingFeeResult = {
68
+ fundingFeeCollateral: number;
69
+ fundingFeeP: number;
70
+ currentAccFundingFeeP: number;
71
+ initialAccFundingFeeP: number;
72
+ };
73
+ export type PairPendingAccFundingFeesResult = {
74
+ accFundingFeeLongP: number;
75
+ accFundingFeeShortP: number;
76
+ currentFundingRatePerSecondP: number;
77
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Funding fees types for v10+ trades
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -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 });
@@ -1,4 +1,10 @@
1
- import { Fee, PairIndex } from "../types";
2
- export declare const getClosingFee: (posDai: number, leverage: number, pairIndex: PairIndex, pairFee: Fee | undefined, collateralPriceUsd?: number | undefined, feeMultiplier?: number | undefined) => number;
3
1
  export * from "./borrowing";
4
2
  export * from "./tiers";
3
+ export * from "./trading";
4
+ export * from "../../markets/holdingFees";
5
+ export { convertTradeFeesData, convertTradeFeesDataArray, convertUiRealizedPnlData, convertUiRealizedPnlDataArray, encodeTradeFeesData, encodeUiRealizedPnlData, } from "./converter";
6
+ export { BorrowingFeeV2, borrowingFeeV2Utils, getPairPendingAccBorrowingFees as getPairPendingAccBorrowingFeesV2, getTradeBorrowingFeesCollateral as getTradeBorrowingFeesCollateralV2, getPairBorrowingFees as getPairBorrowingFeesV2, MAX_BORROWING_RATE_PER_SECOND as MAX_BORROWING_RATE_PER_SECOND_V2, BORROWING_V2_PRECISION, } from "./borrowingV2";
7
+ export { convertBorrowingFeeParams as convertBorrowingFeeParamsV2, convertBorrowingFeeParamsArray as convertBorrowingFeeParamsArrayV2, convertPairBorrowingFeeData as convertPairBorrowingFeeDataV2, convertPairBorrowingFeeDataArray as convertPairBorrowingFeeDataArrayV2, convertTradeInitialAccFees as convertTradeInitialAccFeesV2, convertTradeInitialAccFeesArray as convertTradeInitialAccFeesArrayV2, createBorrowingV2Context, isValidBorrowingRate as isValidBorrowingRateV2, borrowingRateToAPR as borrowingRateToAPRV2, aprToBorrowingRate as aprToBorrowingRateV2, } from "./borrowingV2/converter";
8
+ export { fetchBorrowingFeeParamsV2, fetchPairBorrowingFeeDataV2, fetchTradeBorrowingFeesCollateralV2, fetchPairPendingAccBorrowingFeesV2, fetchAllBorrowingV2Data, createBorrowingV2ContextFromContract, createBorrowingV2ContextFromArrays, fetchBorrowingV2DataForPairs, } from "./borrowingV2/fetcher";
9
+ export { FundingFees, getCurrentFundingVelocityPerYear, getSecondsToReachZeroRate, getAvgFundingRatePerSecondP, getLongShortAprMultiplier, getPairPendingAccFundingFees, getTradeFundingFeesCollateral, getTradeFundingFeesCollateralSimple, getTradeFundingFees, } from "./fundingFees";
10
+ export { convertFundingFeeParams, convertFundingFeeParamsArray, convertPairFundingFeeData, convertPairFundingFeeDataArray, convertPairGlobalParams, convertPairGlobalParamsArray, convertTradeInitialAccFundingFees, createFundingFeeContext, isValidFundingRate, fundingRateToAPR, aprToFundingRate, calculateVelocityFromSkew, FUNDING_FEES_PRECISION, } from "./fundingFees/converter";