@gainsnetwork/sdk 0.0.0-v10.rc2 → 0.0.0-v10.rc21

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 (238) 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 +318 -0
  6. package/lib/backend/tradingVariables/backend.types.js +2 -0
  7. package/lib/backend/tradingVariables/converter.d.ts +34 -0
  8. package/lib/backend/tradingVariables/converter.js +338 -0
  9. package/lib/backend/tradingVariables/index.d.ts +5 -0
  10. package/lib/backend/tradingVariables/index.js +96 -0
  11. package/lib/backend/tradingVariables/types.d.ts +113 -0
  12. package/lib/backend/tradingVariables/types.js +14 -0
  13. package/lib/constants.d.ts +20 -0
  14. package/lib/constants.js +24 -3
  15. package/lib/contracts/addresses.json +20 -0
  16. package/lib/contracts/index.js +3 -1
  17. package/lib/contracts/types/generated/GFarmTradingStorageV5.d.ts +1911 -0
  18. package/lib/contracts/types/generated/GFarmTradingStorageV5.js +2 -0
  19. package/lib/contracts/types/generated/GNSBorrowingFees.d.ts +1067 -0
  20. package/lib/contracts/types/generated/GNSBorrowingFees.js +2 -0
  21. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.d.ts +979 -0
  22. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.js +2 -0
  23. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.d.ts +1058 -0
  24. package/lib/contracts/types/generated/GNSBorrowingFeesV6_4.js +2 -0
  25. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +7 -20
  26. package/lib/contracts/types/generated/GNSNftRewardsV6.d.ts +533 -0
  27. package/lib/contracts/types/generated/GNSNftRewardsV6.js +2 -0
  28. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +613 -0
  29. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +2 -0
  30. package/lib/contracts/types/generated/GNSPairInfosV6_1.d.ts +911 -0
  31. package/lib/contracts/types/generated/GNSPairInfosV6_1.js +2 -0
  32. package/lib/contracts/types/generated/GNSPairsStorageV6.d.ts +660 -0
  33. package/lib/contracts/types/generated/GNSPairsStorageV6.js +2 -0
  34. package/lib/contracts/types/generated/GNSTrading.d.ts +758 -0
  35. package/lib/contracts/types/generated/GNSTrading.js +2 -0
  36. package/lib/contracts/types/generated/GNSTradingCallbacks.d.ts +875 -0
  37. package/lib/contracts/types/generated/GNSTradingCallbacks.js +2 -0
  38. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.d.ts +806 -0
  39. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.js +2 -0
  40. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.d.ts +821 -0
  41. package/lib/contracts/types/generated/GNSTradingCallbacksV6_4.js +2 -0
  42. package/lib/contracts/types/generated/GNSTradingStorage.d.ts +1387 -0
  43. package/lib/contracts/types/generated/GNSTradingStorage.js +2 -0
  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.js +7 -16
  55. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +100 -0
  56. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +1116 -0
  57. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.d.ts +100 -0
  58. package/lib/contracts/types/generated/factories/GNSNftRewardsV6__factory.js +1003 -0
  59. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.d.ts +98 -0
  60. package/lib/contracts/types/generated/factories/GNSPairInfosV6_1__factory.js +1485 -0
  61. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.d.ts +117 -0
  62. package/lib/contracts/types/generated/factories/GNSPairsStorageV6__factory.js +1265 -0
  63. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.d.ts +82 -0
  64. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.js +1273 -0
  65. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.d.ts +82 -0
  66. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_4__factory.js +1326 -0
  67. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.d.ts +113 -0
  68. package/lib/contracts/types/generated/factories/GNSTradingCallbacks__factory.js +1428 -0
  69. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.d.ts +96 -0
  70. package/lib/contracts/types/generated/factories/GNSTradingStorage__factory.js +2241 -0
  71. package/lib/contracts/types/generated/factories/GNSTrading__factory.d.ts +95 -0
  72. package/lib/contracts/types/generated/factories/GNSTrading__factory.js +1071 -0
  73. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.d.ts +110 -0
  74. package/lib/contracts/types/generated/factories/GTokenV6_3_2__factory.js +2682 -0
  75. package/lib/contracts/types/generated/factories/GToken__factory.d.ts +7 -0
  76. package/lib/contracts/types/generated/factories/GToken__factory.js +4 -0
  77. package/lib/contracts/types/index.d.ts +2 -1
  78. package/lib/contracts/types/index.js +1 -0
  79. package/lib/contracts/utils/index.d.ts +0 -3
  80. package/lib/contracts/utils/index.js +0 -3
  81. package/lib/contracts/utils/openTrades.js +14 -30
  82. package/lib/contracts/utils/pairs.js +20 -0
  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 +12 -0
  120. package/lib/markets/price/marketPrice.js +34 -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 +15 -4
  140. package/lib/trade/fees/borrowing/index.js +42 -18
  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 +12 -3
  144. package/lib/trade/fees/borrowingV2/converter.js +29 -18
  145. package/lib/{contracts/fetch/fees/borrowingFeesV2.d.ts → trade/fees/borrowingV2/fetcher.d.ts} +2 -3
  146. package/lib/{contracts/fetch/fees/borrowingFeesV2.js → trade/fees/borrowingV2/fetcher.js} +6 -14
  147. package/lib/trade/fees/borrowingV2/index.d.ts +6 -17
  148. package/lib/trade/fees/borrowingV2/index.js +10 -37
  149. package/lib/trade/fees/borrowingV2/types.d.ts +22 -6
  150. package/lib/trade/fees/converter.d.ts +48 -0
  151. package/lib/trade/fees/converter.js +114 -0
  152. package/lib/trade/fees/fundingFees/builder.d.ts +9 -0
  153. package/lib/trade/fees/fundingFees/builder.js +35 -0
  154. package/lib/{contracts/fetch/fees/fundingFees.d.ts → trade/fees/fundingFees/fetcher.d.ts} +2 -2
  155. package/lib/trade/fees/fundingFees/index.d.ts +28 -39
  156. package/lib/trade/fees/fundingFees/index.js +33 -46
  157. package/lib/trade/fees/fundingFees/pairContext.d.ts +33 -0
  158. package/lib/trade/fees/fundingFees/pairContext.js +17 -0
  159. package/lib/trade/fees/holdingFees/index.d.ts +46 -0
  160. package/lib/trade/fees/holdingFees/index.js +105 -0
  161. package/lib/trade/fees/holdingFees/types.d.ts +23 -0
  162. package/lib/trade/fees/holdingFees/types.js +5 -0
  163. package/lib/trade/fees/index.d.ts +4 -2
  164. package/lib/trade/fees/index.js +45 -36
  165. package/lib/trade/fees/tiers/converter.d.ts +54 -0
  166. package/lib/trade/fees/tiers/converter.js +81 -0
  167. package/lib/trade/fees/tiers/index.d.ts +1 -0
  168. package/lib/trade/fees/tiers/index.js +1 -0
  169. package/lib/trade/fees/trading/builder.d.ts +18 -0
  170. package/lib/trade/fees/trading/builder.js +20 -0
  171. package/lib/trade/fees/trading/converter.d.ts +2 -0
  172. package/lib/trade/fees/trading/converter.js +5 -1
  173. package/lib/trade/fees/trading/holdingFees.d.ts +28 -0
  174. package/lib/trade/fees/trading/holdingFees.js +66 -0
  175. package/lib/trade/fees/trading/holdingFeesStructured.d.ts +28 -0
  176. package/lib/trade/fees/trading/holdingFeesStructured.js +66 -0
  177. package/lib/trade/fees/trading/index.d.ts +30 -2
  178. package/lib/trade/fees/trading/index.js +52 -1
  179. package/lib/trade/fees/trading/types.d.ts +9 -0
  180. package/lib/trade/index.d.ts +3 -1
  181. package/lib/trade/index.js +3 -1
  182. package/lib/trade/liquidation/builder.d.ts +25 -0
  183. package/lib/trade/liquidation/builder.js +59 -0
  184. package/lib/trade/liquidation/converter.d.ts +23 -0
  185. package/lib/trade/liquidation/converter.js +46 -0
  186. package/lib/trade/liquidation/index.d.ts +16 -0
  187. package/lib/trade/liquidation/index.js +123 -0
  188. package/lib/trade/liquidation/types.d.ts +42 -0
  189. package/lib/trade/liquidation/types.js +2 -0
  190. package/lib/trade/pnl/builder.d.ts +16 -0
  191. package/lib/trade/pnl/builder.js +44 -0
  192. package/lib/trade/pnl/converter.d.ts +47 -0
  193. package/lib/trade/pnl/converter.js +72 -0
  194. package/lib/trade/pnl/index.d.ts +88 -0
  195. package/lib/trade/pnl/index.js +286 -0
  196. package/lib/trade/pnl/types.d.ts +75 -0
  197. package/lib/trade/pnl/types.js +5 -0
  198. package/lib/trade/priceImpact/close/builder.d.ts +23 -0
  199. package/lib/trade/priceImpact/close/builder.js +45 -0
  200. package/lib/trade/priceImpact/close/index.d.ts +22 -0
  201. package/lib/trade/priceImpact/close/index.js +119 -0
  202. package/lib/trade/priceImpact/close/types.d.ts +44 -0
  203. package/lib/trade/priceImpact/close/types.js +5 -0
  204. package/lib/trade/priceImpact/cumulVol/builder.d.ts +22 -0
  205. package/lib/trade/priceImpact/cumulVol/builder.js +43 -0
  206. package/lib/trade/priceImpact/cumulVol/converter.d.ts +31 -0
  207. package/lib/trade/priceImpact/cumulVol/converter.js +59 -0
  208. package/lib/trade/priceImpact/cumulVol/index.d.ts +108 -0
  209. package/lib/trade/priceImpact/cumulVol/index.js +235 -0
  210. package/lib/trade/priceImpact/index.d.ts +18 -5
  211. package/lib/trade/priceImpact/index.js +57 -10
  212. package/lib/trade/priceImpact/open/builder.d.ts +21 -0
  213. package/lib/trade/priceImpact/open/builder.js +43 -0
  214. package/lib/trade/priceImpact/open/index.d.ts +23 -0
  215. package/lib/trade/priceImpact/open/index.js +74 -0
  216. package/lib/trade/priceImpact/open/types.d.ts +41 -0
  217. package/lib/trade/priceImpact/open/types.js +5 -0
  218. package/lib/trade/priceImpact/skew/builder.d.ts +12 -0
  219. package/lib/trade/priceImpact/skew/builder.js +28 -0
  220. package/lib/trade/priceImpact/skew/converter.d.ts +11 -42
  221. package/lib/trade/priceImpact/skew/converter.js +19 -109
  222. package/lib/{contracts/fetch/priceImpact/skew.d.ts → trade/priceImpact/skew/fetcher.d.ts} +9 -12
  223. package/lib/{contracts/fetch/priceImpact/skew.js → trade/priceImpact/skew/fetcher.js} +23 -22
  224. package/lib/trade/priceImpact/skew/index.d.ts +11 -15
  225. package/lib/trade/priceImpact/skew/index.js +22 -54
  226. package/lib/trade/priceImpact/skew/types.d.ts +2 -15
  227. package/lib/trade/spread.d.ts +5 -18
  228. package/lib/trade/spread.js +17 -106
  229. package/lib/trade/types.d.ts +30 -8
  230. package/lib/trade/types.js +20 -0
  231. package/lib/vault/index.d.ts +3 -1
  232. package/lib/vault/index.js +2 -2
  233. package/package.json +2 -2
  234. package/lib/trade/liquidation.d.ts +0 -42
  235. package/lib/trade/liquidation.js +0 -140
  236. package/lib/trade/pnl.d.ts +0 -10
  237. package/lib/trade/pnl.js +0 -38
  238. /package/lib/{contracts/fetch/fees/fundingFees.js → trade/fees/fundingFees/fetcher.js} +0 -0
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Cumulative volume price impact calculations
4
+ * @dev Mirrors contract's getTradeCumulVolPriceImpactP functionality
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.buildCumulVolContext = exports.convertOiWindowsSettingsArray = exports.convertOiWindows = exports.convertOiWindow = exports.convertOiWindowsSettings = exports.getSpreadWithPriceImpactP = exports.getCumulVolPriceImpact = exports.getSpreadWithCumulVolPriceImpactP = exports.getSpreadP = exports.getFixedSpreadP = exports.getTradeCumulVolPriceImpactP = exports.getLegacyFactor = exports.getCumulativeFactor = exports.isProtectionCloseFactorActive = exports.getProtectionCloseFactor = void 0;
8
+ const oiWindows_1 = require("../../oiWindows");
9
+ const constants_1 = require("../../../constants");
10
+ const types_1 = require("../../../contracts/types");
11
+ /**
12
+ * @dev Gets the protection close factor with user multiplier
13
+ * @param context Cumulative volume context
14
+ * @returns Protection close factor (1 = 100%)
15
+ */
16
+ const getProtectionCloseFactor = (context) => {
17
+ var _a;
18
+ const protectionCloseFactor = context === undefined ||
19
+ context.contractsVersion === types_1.ContractsVersion.BEFORE_V9_2 ||
20
+ context.isOpen === undefined ||
21
+ context.isPnlPositive === undefined ||
22
+ context.protectionCloseFactor === undefined ||
23
+ (0, exports.isProtectionCloseFactorActive)(context) !== true
24
+ ? constants_1.DEFAULT_PROTECTION_CLOSE_FACTOR
25
+ : context.protectionCloseFactor;
26
+ const protectionCloseFactorMultiplier = ((_a = context === null || context === void 0 ? void 0 : context.userPriceImpact) === null || _a === void 0 ? void 0 : _a.cumulVolPriceImpactMultiplier) !== undefined &&
27
+ context.userPriceImpact.cumulVolPriceImpactMultiplier > 0
28
+ ? context.userPriceImpact.cumulVolPriceImpactMultiplier
29
+ : 1;
30
+ return protectionCloseFactor * protectionCloseFactorMultiplier;
31
+ };
32
+ exports.getProtectionCloseFactor = getProtectionCloseFactor;
33
+ /**
34
+ * @dev Checks if protection close factor is active
35
+ * @param context Cumulative volume context
36
+ * @returns True if protection close factor should be applied
37
+ */
38
+ const isProtectionCloseFactorActive = (context) => {
39
+ if (context === undefined ||
40
+ context.currentBlock === undefined ||
41
+ context.createdBlock === undefined ||
42
+ context.protectionCloseFactorBlocks === undefined ||
43
+ context.protectionCloseFactor === undefined) {
44
+ return undefined;
45
+ }
46
+ return (context.isPnlPositive === true &&
47
+ context.isOpen === false &&
48
+ context.protectionCloseFactor > 0 &&
49
+ context.currentBlock <=
50
+ context.createdBlock + context.protectionCloseFactorBlocks &&
51
+ context.protectionCloseFactorWhitelist !== true);
52
+ };
53
+ exports.isProtectionCloseFactorActive = isProtectionCloseFactorActive;
54
+ /**
55
+ * @dev Gets the cumulative factor for price impact calculation
56
+ * @param context Cumulative volume context
57
+ * @returns Cumulative factor (default 1)
58
+ */
59
+ const getCumulativeFactor = (context) => {
60
+ if (context === undefined ||
61
+ context.cumulativeFactor === undefined ||
62
+ context.cumulativeFactor === 0) {
63
+ return constants_1.DEFAULT_CUMULATIVE_FACTOR;
64
+ }
65
+ return context.cumulativeFactor;
66
+ };
67
+ exports.getCumulativeFactor = getCumulativeFactor;
68
+ /**
69
+ * @dev Gets the legacy factor for v9.2 compatibility
70
+ * @param context Cumulative volume context
71
+ * @returns 1 for pre-v9.2, 2 for v9.2+
72
+ */
73
+ const getLegacyFactor = (context) => {
74
+ return (context === null || context === void 0 ? void 0 : context.contractsVersion) === types_1.ContractsVersion.BEFORE_V9_2 ? 1 : 2;
75
+ };
76
+ exports.getLegacyFactor = getLegacyFactor;
77
+ /**
78
+ * @dev Calculates cumulative volume price impact percentage
79
+ * @dev Mirrors contract's getTradeCumulVolPriceImpactP function
80
+ * @param trader Trader address
81
+ * @param pairIndex Trading pair index
82
+ * @param long True for long, false for short
83
+ * @param tradeOpenInterestUsd Position size in USD
84
+ * @param isPnlPositive Whether PnL is positive (only relevant when closing)
85
+ * @param open True for opening, false for closing
86
+ * @param lastPosIncreaseBlock Last block when position was increased (only relevant when closing)
87
+ * @param context Additional context with depths, OI data, and factors
88
+ * @returns Cumulative volume price impact percentage (not including spread)
89
+ */
90
+ const getTradeCumulVolPriceImpactP = (trader, pairIndex, long, tradeOpenInterestUsd, isPnlPositive, open, lastPosIncreaseBlock, context) => {
91
+ var _a, _b;
92
+ // Update context with passed parameters
93
+ const updatedContext = Object.assign(Object.assign({}, context), { isOpen: open, isPnlPositive: isPnlPositive, createdBlock: context.createdBlock || lastPosIncreaseBlock });
94
+ if (
95
+ // No price impact when closing pre-v9.2 trades
96
+ (!open && (context === null || context === void 0 ? void 0 : context.contractsVersion) === types_1.ContractsVersion.BEFORE_V9_2) ||
97
+ // No price impact for opens when `pair.exemptOnOpen` is true
98
+ (open && (context === null || context === void 0 ? void 0 : context.exemptOnOpen) === true) ||
99
+ // No price impact for closes after `protectionCloseFactor` has expired
100
+ // when `pair.exemptAfterProtectionCloseFactor` is true
101
+ (!open &&
102
+ (context === null || context === void 0 ? void 0 : context.exemptAfterProtectionCloseFactor) === true &&
103
+ (0, exports.isProtectionCloseFactorActive)(updatedContext) !== true)) {
104
+ return 0;
105
+ }
106
+ // Calculate trade skew direction (matches Solidity logic)
107
+ const tradePositiveSkew = (long && open) || (!long && !open);
108
+ const tradeSkewMultiplier = tradePositiveSkew ? 1 : -1;
109
+ // Select depth based on trade direction
110
+ // For positive skew (long open or short close), use depth above
111
+ // For negative skew (short open or long close), use depth below
112
+ const onePercentDepth = tradePositiveSkew
113
+ ? (_a = context.pairDepth) === null || _a === void 0 ? void 0 : _a.onePercentDepthAboveUsd
114
+ : (_b = context.pairDepth) === null || _b === void 0 ? void 0 : _b.onePercentDepthBelowUsd;
115
+ let activeOi = undefined;
116
+ if (context.oiWindowsSettings !== undefined) {
117
+ activeOi = (0, oiWindows_1.getActiveOi)((0, oiWindows_1.getCurrentOiWindowId)(context.oiWindowsSettings), context.oiWindowsSettings.windowsCount, context.oiWindows, open ? long : !long);
118
+ }
119
+ if (!onePercentDepth || activeOi === undefined) {
120
+ return 0;
121
+ }
122
+ // Apply trade skew multiplier to match Solidity's signed calculation
123
+ const signedActiveOi = activeOi * tradeSkewMultiplier;
124
+ const signedTradeOi = tradeOpenInterestUsd * tradeSkewMultiplier;
125
+ // Calculate impact with proper signs (matching Solidity's _getTradePriceImpactP)
126
+ const finalPriceImpactP = ((signedActiveOi * (0, exports.getCumulativeFactor)(updatedContext) +
127
+ signedTradeOi / 2) /
128
+ onePercentDepth /
129
+ (0, exports.getLegacyFactor)(updatedContext)) *
130
+ (0, exports.getProtectionCloseFactor)(updatedContext);
131
+ return finalPriceImpactP;
132
+ };
133
+ exports.getTradeCumulVolPriceImpactP = getTradeCumulVolPriceImpactP;
134
+ /**
135
+ * @dev Gets the fixed spread percentage with direction
136
+ * @dev Mirrors contract's getFixedSpreadP function
137
+ * @param spreadP Total spread percentage (includes base + user spread)
138
+ * @param long True for long position
139
+ * @param open True for opening, false for closing
140
+ * @returns Signed spread percentage (positive or negative based on direction)
141
+ */
142
+ const getFixedSpreadP = (spreadP, long, open) => {
143
+ // Reverse spread direction on close
144
+ const effectiveLong = open ? long : !long;
145
+ // Calculate half spread
146
+ const fixedSpreadP = spreadP / 2;
147
+ // Apply direction
148
+ return effectiveLong ? fixedSpreadP : -fixedSpreadP;
149
+ };
150
+ exports.getFixedSpreadP = getFixedSpreadP;
151
+ /**
152
+ * @dev Gets the base spread percentage
153
+ * @param pairSpreadP Pair spread percentage
154
+ * @param isLiquidation True if liquidation
155
+ * @param liquidationParams Liquidation parameters
156
+ * @param userPriceImpact User-specific price impact settings
157
+ * @returns Base spread percentage
158
+ * @todo Review if this function still makes sense or should use getFixedSpreadP pattern
159
+ * Currently it may double-count user fixed spread if pairSpreadP already includes it
160
+ */
161
+ const getSpreadP = (pairSpreadP, isLiquidation, liquidationParams, userPriceImpact) => {
162
+ var _a;
163
+ const fixedSpreadP = (_a = userPriceImpact === null || userPriceImpact === void 0 ? void 0 : userPriceImpact.fixedSpreadP) !== null && _a !== void 0 ? _a : 0;
164
+ if (pairSpreadP === undefined || (pairSpreadP === 0 && fixedSpreadP === 0)) {
165
+ return 0;
166
+ }
167
+ const spreadP = pairSpreadP / 2 + fixedSpreadP;
168
+ return isLiquidation === true &&
169
+ liquidationParams !== undefined &&
170
+ liquidationParams.maxLiqSpreadP > 0 &&
171
+ spreadP > liquidationParams.maxLiqSpreadP
172
+ ? liquidationParams.maxLiqSpreadP
173
+ : spreadP;
174
+ };
175
+ exports.getSpreadP = getSpreadP;
176
+ /**
177
+ * @dev Gets spread with cumulative volume price impact
178
+ * @dev This combines base spread + cumulative volume impact
179
+ * @param pairSpreadP Base pair spread percentage
180
+ * @param buy True for long, false for short
181
+ * @param collateral Collateral amount
182
+ * @param leverage Position leverage
183
+ * @param pairDepth 1% depth values for the pair
184
+ * @param oiWindowsSettings OI windows configuration
185
+ * @param oiWindows Current OI windows data
186
+ * @param context Additional context for the calculation
187
+ * @returns Total spread + cumulative volume price impact percentage
188
+ */
189
+ const getSpreadWithCumulVolPriceImpactP = (pairSpreadP, buy, collateral, leverage, pairDepth, oiWindowsSettings, oiWindows, context) => {
190
+ if (pairSpreadP === undefined) {
191
+ return 0;
192
+ }
193
+ const baseSpread = (0, exports.getSpreadP)(pairSpreadP, undefined, undefined, context === null || context === void 0 ? void 0 : context.userPriceImpact);
194
+ // Calculate position size in USD
195
+ const positionSizeUsd = collateral * leverage * ((context === null || context === void 0 ? void 0 : context.collateralPriceUsd) || 1);
196
+ const cumulVolImpact = (0, exports.getTradeCumulVolPriceImpactP)("", // trader - not used in calculation
197
+ 0, // pairIndex - not used in calculation
198
+ buy, positionSizeUsd, (context === null || context === void 0 ? void 0 : context.isPnlPositive) || false, (context === null || context === void 0 ? void 0 : context.isOpen) !== false, (context === null || context === void 0 ? void 0 : context.createdBlock) || 0, Object.assign(Object.assign({}, context), { pairDepth,
199
+ oiWindowsSettings,
200
+ oiWindows }));
201
+ // If no depth or OI data, return just half spread
202
+ if (cumulVolImpact === 0 && (!pairDepth || !oiWindowsSettings)) {
203
+ return pairSpreadP / 2;
204
+ }
205
+ return baseSpread + cumulVolImpact;
206
+ };
207
+ exports.getSpreadWithCumulVolPriceImpactP = getSpreadWithCumulVolPriceImpactP;
208
+ /**
209
+ * @dev Convenience function for calculating cumulative volume price impact
210
+ * @dev Uses collateral and leverage instead of USD position size
211
+ * @param buy True for long, false for short
212
+ * @param collateral Collateral amount
213
+ * @param leverage Position leverage
214
+ * @param open True for opening, false for closing
215
+ * @param context Full context including depths, OI data, and collateral price
216
+ * @returns Cumulative volume price impact percentage
217
+ */
218
+ const getCumulVolPriceImpact = (buy, collateral, leverage, open, context) => {
219
+ const positionSizeUsd = collateral * leverage * context.collateralPriceUsd;
220
+ return (0, exports.getTradeCumulVolPriceImpactP)("", // trader - not used in calculation
221
+ 0, // pairIndex - not used in calculation
222
+ buy, positionSizeUsd, context.isPnlPositive || false, open, context.createdBlock || 0, context);
223
+ };
224
+ exports.getCumulVolPriceImpact = getCumulVolPriceImpact;
225
+ // Legacy export for backward compatibility
226
+ exports.getSpreadWithPriceImpactP = exports.getSpreadWithCumulVolPriceImpactP;
227
+ // Export converters
228
+ var converter_1 = require("./converter");
229
+ Object.defineProperty(exports, "convertOiWindowsSettings", { enumerable: true, get: function () { return converter_1.convertOiWindowsSettings; } });
230
+ Object.defineProperty(exports, "convertOiWindow", { enumerable: true, get: function () { return converter_1.convertOiWindow; } });
231
+ Object.defineProperty(exports, "convertOiWindows", { enumerable: true, get: function () { return converter_1.convertOiWindows; } });
232
+ Object.defineProperty(exports, "convertOiWindowsSettingsArray", { enumerable: true, get: function () { return converter_1.convertOiWindowsSettingsArray; } });
233
+ // Export builder
234
+ var builder_1 = require("./builder");
235
+ Object.defineProperty(exports, "buildCumulVolContext", { enumerable: true, get: function () { return builder_1.buildCumulVolContext; } });
@@ -1,8 +1,21 @@
1
1
  /**
2
2
  * @dev Main price impact module
3
- * @dev Exports skew price impact functionality (v10+)
4
- * @dev Cumulative volume price impact remains in spread.ts for now
3
+ * @dev Exports cumulative volume, skew, and combined opening/closing price impact functionality
5
4
  */
6
- export { getNetSkewToken, getNetSkewCollateral, getTradeSkewDirection, calculateSkewPriceImpactP, getTradeSkewPriceImpact, getTradeSkewPriceImpactWithChecks, calculatePartialSizeToken, SkewPriceImpact, } from "./skew";
7
- export { convertPairOiToken, convertPairOiTokenArray, convertPairOiCollateral, convertPairOiCollateralArray, normalizeSkewDepth, createSkewDepth, createSkewPriceImpactContext, isValidSkewDepth, convertSkewDepthsArray, mergeSkewPriceImpactContexts, } from "./skew/converter";
8
- export type { PairOiToken, PairOiCollateral, SkewDepth, SkewPriceImpactInput, SkewPriceImpactResult, SkewPriceImpactContext, TradeSkewParams, PositionSizeResult, } from "./skew/types";
5
+ /**
6
+ * @dev Calculates price after impact using the same formula as the Solidity contract
7
+ * @dev Mirrors contract's getPriceAfterImpact function
8
+ * @param oraclePrice Base oracle price (no decimals requirement)
9
+ * @param totalPriceImpactP Total price impact percentage (can be positive or negative)
10
+ * @returns Price after impact has been applied
11
+ */
12
+ export declare const getPriceAfterImpact: (oraclePrice: number, totalPriceImpactP: number) => number;
13
+ export { getTradeOpeningPriceImpact, getTradeOpeningPriceImpactAtMarket, buildTradeOpeningPriceImpactContext, TradeOpeningPriceImpactInput, TradeOpeningPriceImpactContext, TradeOpeningPriceImpactResult, } from "./open";
14
+ export { getTradeClosingPriceImpact, getTradeClosingPriceImpactAtOracle, buildTradeClosingPriceImpactContext, TradeClosingPriceImpactInput, TradeClosingPriceImpactContext, TradeClosingPriceImpactResult, } from "./close";
15
+ export { getTradeCumulVolPriceImpactP, getCumulVolPriceImpact, // Convenience function
16
+ getSpreadWithCumulVolPriceImpactP, getSpreadWithPriceImpactP, // Legacy alias
17
+ getProtectionCloseFactor, isProtectionCloseFactorActive, getCumulativeFactor, getLegacyFactor, getFixedSpreadP, getSpreadP, convertOiWindowsSettings, convertOiWindow, convertOiWindows, convertOiWindowsSettingsArray, buildCumulVolContext, CumulVolContext, } from "./cumulVol";
18
+ export { getNetSkewToken, getNetSkewCollateral, getTradeSkewDirection, calculateSkewPriceImpactP, getTradeSkewPriceImpact, calculatePartialSizeToken, SkewPriceImpact, } from "./skew";
19
+ export { convertPairOiToken, convertPairOiTokenArray, convertPairOiCollateral, convertPairOiCollateralArray, convertSkewDepth, convertPairSkewDepths, } from "./skew/converter";
20
+ export { buildSkewPriceImpactContext } from "./skew/builder";
21
+ export type { PairOiToken, PairOiCollateral, SkewPriceImpactInput, SkewPriceImpactResult, SkewPriceImpactContext, TradeSkewParams, PositionSizeResult, } from "./skew/types";
@@ -1,11 +1,60 @@
1
1
  "use strict";
2
2
  /**
3
3
  * @dev Main price impact module
4
- * @dev Exports skew price impact functionality (v10+)
5
- * @dev Cumulative volume price impact remains in spread.ts for now
4
+ * @dev Exports cumulative volume, skew, and combined opening/closing price impact functionality
6
5
  */
7
6
  Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.mergeSkewPriceImpactContexts = exports.convertSkewDepthsArray = exports.isValidSkewDepth = exports.createSkewPriceImpactContext = exports.createSkewDepth = exports.normalizeSkewDepth = exports.convertPairOiCollateralArray = exports.convertPairOiCollateral = exports.convertPairOiTokenArray = exports.convertPairOiToken = exports.SkewPriceImpact = exports.calculatePartialSizeToken = exports.getTradeSkewPriceImpactWithChecks = exports.getTradeSkewPriceImpact = exports.calculateSkewPriceImpactP = exports.getTradeSkewDirection = exports.getNetSkewCollateral = exports.getNetSkewToken = void 0;
7
+ exports.buildSkewPriceImpactContext = exports.convertPairSkewDepths = exports.convertSkewDepth = exports.convertPairOiCollateralArray = exports.convertPairOiCollateral = exports.convertPairOiTokenArray = exports.convertPairOiToken = exports.SkewPriceImpact = exports.calculatePartialSizeToken = exports.getTradeSkewPriceImpact = exports.calculateSkewPriceImpactP = exports.getTradeSkewDirection = exports.getNetSkewCollateral = exports.getNetSkewToken = exports.buildCumulVolContext = exports.convertOiWindowsSettingsArray = exports.convertOiWindows = exports.convertOiWindow = exports.convertOiWindowsSettings = exports.getSpreadP = exports.getFixedSpreadP = exports.getLegacyFactor = exports.getCumulativeFactor = exports.isProtectionCloseFactorActive = exports.getProtectionCloseFactor = exports.getSpreadWithPriceImpactP = exports.getSpreadWithCumulVolPriceImpactP = exports.getCumulVolPriceImpact = exports.getTradeCumulVolPriceImpactP = exports.buildTradeClosingPriceImpactContext = exports.getTradeClosingPriceImpactAtOracle = exports.getTradeClosingPriceImpact = exports.buildTradeOpeningPriceImpactContext = exports.getTradeOpeningPriceImpactAtMarket = exports.getTradeOpeningPriceImpact = exports.getPriceAfterImpact = void 0;
8
+ /**
9
+ * @dev Calculates price after impact using the same formula as the Solidity contract
10
+ * @dev Mirrors contract's getPriceAfterImpact function
11
+ * @param oraclePrice Base oracle price (no decimals requirement)
12
+ * @param totalPriceImpactP Total price impact percentage (can be positive or negative)
13
+ * @returns Price after impact has been applied
14
+ */
15
+ const getPriceAfterImpact = (oraclePrice, totalPriceImpactP) => {
16
+ // Match Solidity: price = oraclePrice + (oraclePrice * totalPriceImpactP / 100)
17
+ const priceAfterImpact = oraclePrice * (1 + totalPriceImpactP / 100);
18
+ if (priceAfterImpact <= 0) {
19
+ throw new Error("Price after impact must be positive");
20
+ }
21
+ return priceAfterImpact;
22
+ };
23
+ exports.getPriceAfterImpact = getPriceAfterImpact;
24
+ // Export trade opening price impact functionality
25
+ var open_1 = require("./open");
26
+ // Core functions
27
+ Object.defineProperty(exports, "getTradeOpeningPriceImpact", { enumerable: true, get: function () { return open_1.getTradeOpeningPriceImpact; } });
28
+ Object.defineProperty(exports, "getTradeOpeningPriceImpactAtMarket", { enumerable: true, get: function () { return open_1.getTradeOpeningPriceImpactAtMarket; } });
29
+ // Builder
30
+ Object.defineProperty(exports, "buildTradeOpeningPriceImpactContext", { enumerable: true, get: function () { return open_1.buildTradeOpeningPriceImpactContext; } });
31
+ // Export trade closing price impact functionality
32
+ var close_1 = require("./close");
33
+ // Core functions
34
+ Object.defineProperty(exports, "getTradeClosingPriceImpact", { enumerable: true, get: function () { return close_1.getTradeClosingPriceImpact; } });
35
+ Object.defineProperty(exports, "getTradeClosingPriceImpactAtOracle", { enumerable: true, get: function () { return close_1.getTradeClosingPriceImpactAtOracle; } });
36
+ // Builder
37
+ Object.defineProperty(exports, "buildTradeClosingPriceImpactContext", { enumerable: true, get: function () { return close_1.buildTradeClosingPriceImpactContext; } });
38
+ // Export cumulative volume price impact functionality
39
+ var cumulVol_1 = require("./cumulVol");
40
+ // Core functions
41
+ Object.defineProperty(exports, "getTradeCumulVolPriceImpactP", { enumerable: true, get: function () { return cumulVol_1.getTradeCumulVolPriceImpactP; } });
42
+ Object.defineProperty(exports, "getCumulVolPriceImpact", { enumerable: true, get: function () { return cumulVol_1.getCumulVolPriceImpact; } });
43
+ Object.defineProperty(exports, "getSpreadWithCumulVolPriceImpactP", { enumerable: true, get: function () { return cumulVol_1.getSpreadWithCumulVolPriceImpactP; } });
44
+ Object.defineProperty(exports, "getSpreadWithPriceImpactP", { enumerable: true, get: function () { return cumulVol_1.getSpreadWithPriceImpactP; } });
45
+ Object.defineProperty(exports, "getProtectionCloseFactor", { enumerable: true, get: function () { return cumulVol_1.getProtectionCloseFactor; } });
46
+ Object.defineProperty(exports, "isProtectionCloseFactorActive", { enumerable: true, get: function () { return cumulVol_1.isProtectionCloseFactorActive; } });
47
+ Object.defineProperty(exports, "getCumulativeFactor", { enumerable: true, get: function () { return cumulVol_1.getCumulativeFactor; } });
48
+ Object.defineProperty(exports, "getLegacyFactor", { enumerable: true, get: function () { return cumulVol_1.getLegacyFactor; } });
49
+ Object.defineProperty(exports, "getFixedSpreadP", { enumerable: true, get: function () { return cumulVol_1.getFixedSpreadP; } });
50
+ Object.defineProperty(exports, "getSpreadP", { enumerable: true, get: function () { return cumulVol_1.getSpreadP; } });
51
+ // Converters
52
+ Object.defineProperty(exports, "convertOiWindowsSettings", { enumerable: true, get: function () { return cumulVol_1.convertOiWindowsSettings; } });
53
+ Object.defineProperty(exports, "convertOiWindow", { enumerable: true, get: function () { return cumulVol_1.convertOiWindow; } });
54
+ Object.defineProperty(exports, "convertOiWindows", { enumerable: true, get: function () { return cumulVol_1.convertOiWindows; } });
55
+ Object.defineProperty(exports, "convertOiWindowsSettingsArray", { enumerable: true, get: function () { return cumulVol_1.convertOiWindowsSettingsArray; } });
56
+ // Builder
57
+ Object.defineProperty(exports, "buildCumulVolContext", { enumerable: true, get: function () { return cumulVol_1.buildCumulVolContext; } });
9
58
  // Export skew price impact functionality
10
59
  var skew_1 = require("./skew");
11
60
  // Core functions
@@ -14,7 +63,6 @@ Object.defineProperty(exports, "getNetSkewCollateral", { enumerable: true, get:
14
63
  Object.defineProperty(exports, "getTradeSkewDirection", { enumerable: true, get: function () { return skew_1.getTradeSkewDirection; } });
15
64
  Object.defineProperty(exports, "calculateSkewPriceImpactP", { enumerable: true, get: function () { return skew_1.calculateSkewPriceImpactP; } });
16
65
  Object.defineProperty(exports, "getTradeSkewPriceImpact", { enumerable: true, get: function () { return skew_1.getTradeSkewPriceImpact; } });
17
- Object.defineProperty(exports, "getTradeSkewPriceImpactWithChecks", { enumerable: true, get: function () { return skew_1.getTradeSkewPriceImpactWithChecks; } });
18
66
  Object.defineProperty(exports, "calculatePartialSizeToken", { enumerable: true, get: function () { return skew_1.calculatePartialSizeToken; } });
19
67
  // Types namespace
20
68
  Object.defineProperty(exports, "SkewPriceImpact", { enumerable: true, get: function () { return skew_1.SkewPriceImpact; } });
@@ -24,9 +72,8 @@ Object.defineProperty(exports, "convertPairOiToken", { enumerable: true, get: fu
24
72
  Object.defineProperty(exports, "convertPairOiTokenArray", { enumerable: true, get: function () { return converter_1.convertPairOiTokenArray; } });
25
73
  Object.defineProperty(exports, "convertPairOiCollateral", { enumerable: true, get: function () { return converter_1.convertPairOiCollateral; } });
26
74
  Object.defineProperty(exports, "convertPairOiCollateralArray", { enumerable: true, get: function () { return converter_1.convertPairOiCollateralArray; } });
27
- Object.defineProperty(exports, "normalizeSkewDepth", { enumerable: true, get: function () { return converter_1.normalizeSkewDepth; } });
28
- Object.defineProperty(exports, "createSkewDepth", { enumerable: true, get: function () { return converter_1.createSkewDepth; } });
29
- Object.defineProperty(exports, "createSkewPriceImpactContext", { enumerable: true, get: function () { return converter_1.createSkewPriceImpactContext; } });
30
- Object.defineProperty(exports, "isValidSkewDepth", { enumerable: true, get: function () { return converter_1.isValidSkewDepth; } });
31
- Object.defineProperty(exports, "convertSkewDepthsArray", { enumerable: true, get: function () { return converter_1.convertSkewDepthsArray; } });
32
- Object.defineProperty(exports, "mergeSkewPriceImpactContexts", { enumerable: true, get: function () { return converter_1.mergeSkewPriceImpactContexts; } });
75
+ Object.defineProperty(exports, "convertSkewDepth", { enumerable: true, get: function () { return converter_1.convertSkewDepth; } });
76
+ Object.defineProperty(exports, "convertPairSkewDepths", { enumerable: true, get: function () { return converter_1.convertPairSkewDepths; } });
77
+ // Export builders
78
+ var builder_1 = require("./skew/builder");
79
+ Object.defineProperty(exports, "buildSkewPriceImpactContext", { enumerable: true, get: function () { return builder_1.buildSkewPriceImpactContext; } });
@@ -0,0 +1,21 @@
1
+ import { GlobalTradingVariablesType } from "../../../backend/tradingVariables/types";
2
+ import { TradeOpeningPriceImpactContext } from "./types";
3
+ /**
4
+ * @dev Builds a complete context for trade opening price impact calculations
5
+ * @dev Uses sub-context builders to create properly scoped contexts
6
+ * @param globalTradingVariables The transformed global trading variables from backend
7
+ * @param collateralIndex The collateral index (1-based)
8
+ * @param pairIndex The pair index
9
+ * @param additionalParams Additional parameters not available in trading variables
10
+ * @returns Complete context ready for getTradeOpeningPriceImpact
11
+ */
12
+ export declare const buildTradeOpeningPriceImpactContext: (globalTradingVariables: GlobalTradingVariablesType, collateralIndex: number, pairIndex: number, additionalParams: {
13
+ currentBlock: number;
14
+ contractsVersion?: number;
15
+ trader?: string;
16
+ userPriceImpact?: {
17
+ cumulVolPriceImpactMultiplier: number;
18
+ fixedSpreadP: number;
19
+ };
20
+ protectionCloseFactorWhitelist?: boolean;
21
+ }) => TradeOpeningPriceImpactContext | undefined;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildTradeOpeningPriceImpactContext = void 0;
4
+ const builder_1 = require("../cumulVol/builder");
5
+ const builder_2 = require("../skew/builder");
6
+ /**
7
+ * @dev Builds a complete context for trade opening price impact calculations
8
+ * @dev Uses sub-context builders to create properly scoped contexts
9
+ * @param globalTradingVariables The transformed global trading variables from backend
10
+ * @param collateralIndex The collateral index (1-based)
11
+ * @param pairIndex The pair index
12
+ * @param additionalParams Additional parameters not available in trading variables
13
+ * @returns Complete context ready for getTradeOpeningPriceImpact
14
+ */
15
+ const buildTradeOpeningPriceImpactContext = (globalTradingVariables, collateralIndex, pairIndex, additionalParams) => {
16
+ var _a;
17
+ const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
18
+ if (!collateral) {
19
+ return undefined;
20
+ }
21
+ // Build cumulative volume subcontext
22
+ const cumulVolContext = (0, builder_1.buildCumulVolContext)(globalTradingVariables, collateralIndex, pairIndex, {
23
+ currentBlock: additionalParams.currentBlock,
24
+ contractsVersion: additionalParams.contractsVersion,
25
+ isPnlPositive: false,
26
+ isOpen: true,
27
+ createdBlock: undefined,
28
+ userPriceImpact: additionalParams.userPriceImpact,
29
+ protectionCloseFactorWhitelist: additionalParams.protectionCloseFactorWhitelist,
30
+ });
31
+ // Build skew price impact subcontext
32
+ const skewContext = (0, builder_2.buildSkewPriceImpactContext)(collateral, pairIndex);
33
+ if (!cumulVolContext || !skewContext) {
34
+ return undefined;
35
+ }
36
+ // Return structured context with proper subcontexts
37
+ return {
38
+ collateralPriceUsd: ((_a = collateral.prices) === null || _a === void 0 ? void 0 : _a.collateralPriceUsd) || 1,
39
+ cumulVolContext,
40
+ skewContext,
41
+ };
42
+ };
43
+ exports.buildTradeOpeningPriceImpactContext = buildTradeOpeningPriceImpactContext;
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @dev Trade opening price impact calculations
3
+ * @dev Mirrors contract's TradingCommonUtils.getTradeOpeningPriceImpact
4
+ */
5
+ import { TradeOpeningPriceImpactInput, TradeOpeningPriceImpactContext, TradeOpeningPriceImpactResult } from "./types";
6
+ export type { TradeOpeningPriceImpactInput, TradeOpeningPriceImpactContext, TradeOpeningPriceImpactResult, };
7
+ export { buildTradeOpeningPriceImpactContext } from "./builder";
8
+ /**
9
+ * @dev Calculates all price impacts for trade opening
10
+ * @dev Mirrors contract's getTradeOpeningPriceImpact function
11
+ * @param input Trade parameters
12
+ * @param context Combined context for calculations
13
+ * @returns Price impact breakdown and final price
14
+ */
15
+ export declare const getTradeOpeningPriceImpact: (input: TradeOpeningPriceImpactInput, context: TradeOpeningPriceImpactContext) => TradeOpeningPriceImpactResult;
16
+ /**
17
+ * @dev Simplified version using current market price
18
+ * @param input Trade parameters
19
+ * @param context Combined context
20
+ * @param currentMarketPrice Current market price to use as open price
21
+ * @returns Price impact breakdown and final price
22
+ */
23
+ export declare const getTradeOpeningPriceImpactAtMarket: (input: Omit<TradeOpeningPriceImpactInput, "openPrice">, context: TradeOpeningPriceImpactContext, currentMarketPrice: number) => TradeOpeningPriceImpactResult;
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Trade opening price impact calculations
4
+ * @dev Mirrors contract's TradingCommonUtils.getTradeOpeningPriceImpact
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getTradeOpeningPriceImpactAtMarket = exports.getTradeOpeningPriceImpact = exports.buildTradeOpeningPriceImpactContext = void 0;
8
+ const cumulVol_1 = require("../cumulVol");
9
+ const skew_1 = require("../skew");
10
+ const __1 = require("../");
11
+ // Export builder
12
+ var builder_1 = require("./builder");
13
+ Object.defineProperty(exports, "buildTradeOpeningPriceImpactContext", { enumerable: true, get: function () { return builder_1.buildTradeOpeningPriceImpactContext; } });
14
+ /**
15
+ * @dev Calculates all price impacts for trade opening
16
+ * @dev Mirrors contract's getTradeOpeningPriceImpact function
17
+ * @param input Trade parameters
18
+ * @param context Combined context for calculations
19
+ * @returns Price impact breakdown and final price
20
+ */
21
+ const getTradeOpeningPriceImpact = (input, context) => {
22
+ const positionSizeCollateral = input.collateralAmount * input.leverage;
23
+ // Calculate fixed spread
24
+ const spreadP = (0, cumulVol_1.getFixedSpreadP)(input.pairSpreadP, input.long, true // opening
25
+ );
26
+ // Calculate position size in USD
27
+ const positionSizeUsd = positionSizeCollateral * context.collateralPriceUsd;
28
+ // Calculate cumulative volume price impact
29
+ const cumulVolPriceImpactP = (0, cumulVol_1.getTradeCumulVolPriceImpactP)("", // trader - not needed for calculation
30
+ input.pairIndex, input.long, positionSizeUsd, false, // isPnlPositive - not relevant for opening
31
+ true, // open
32
+ 0, // lastPosIncreaseBlock - not relevant for opening
33
+ context.cumulVolContext);
34
+ // Calculate price after spread and cumulative volume impact (before skew)
35
+ const priceAfterSpreadAndCumulVolPriceImpact = (0, __1.getPriceAfterImpact)(input.openPrice, spreadP + cumulVolPriceImpactP);
36
+ // Calculate position size in tokens using the price after fixed spread and cumul vol impact
37
+ const positionSizeToken = positionSizeCollateral / priceAfterSpreadAndCumulVolPriceImpact;
38
+ // Calculate skew price impact (v10+ only)
39
+ const skewResult = (0, skew_1.getTradeSkewPriceImpact)({
40
+ collateralIndex: input.collateralIndex,
41
+ pairIndex: input.pairIndex,
42
+ long: input.long,
43
+ open: true,
44
+ positionSizeToken,
45
+ }, context.skewContext);
46
+ const skewPriceImpactP = skewResult.priceImpactP;
47
+ // Total price impact (signed - can be positive or negative)
48
+ const totalPriceImpactP = spreadP + cumulVolPriceImpactP + skewPriceImpactP;
49
+ // Calculate final price after impact using the same formula as Solidity
50
+ const priceAfterImpact = (0, __1.getPriceAfterImpact)(input.openPrice, totalPriceImpactP);
51
+ // Calculate percent profit from impact
52
+ // For longs: negative impact = profit (price goes down, good for buyer)
53
+ // For shorts: positive impact = profit (price goes up, good for seller)
54
+ const percentProfitP = -totalPriceImpactP;
55
+ return {
56
+ priceAfterImpact,
57
+ percentProfitP,
58
+ cumulVolPriceImpactP,
59
+ skewPriceImpactP,
60
+ totalPriceImpactP,
61
+ };
62
+ };
63
+ exports.getTradeOpeningPriceImpact = getTradeOpeningPriceImpact;
64
+ /**
65
+ * @dev Simplified version using current market price
66
+ * @param input Trade parameters
67
+ * @param context Combined context
68
+ * @param currentMarketPrice Current market price to use as open price
69
+ * @returns Price impact breakdown and final price
70
+ */
71
+ const getTradeOpeningPriceImpactAtMarket = (input, context, currentMarketPrice) => {
72
+ return (0, exports.getTradeOpeningPriceImpact)(Object.assign(Object.assign({}, input), { openPrice: currentMarketPrice }), context);
73
+ };
74
+ exports.getTradeOpeningPriceImpactAtMarket = getTradeOpeningPriceImpactAtMarket;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @dev Types for trade opening price impact calculations
3
+ */
4
+ import { CumulVolContext } from "../cumulVol";
5
+ import { SkewPriceImpactContext } from "../skew/types";
6
+ import { Fee, PairIndex } from "../../types";
7
+ /**
8
+ * @dev Input parameters for trade opening price impact
9
+ */
10
+ export type TradeOpeningPriceImpactInput = {
11
+ collateralIndex: number;
12
+ pairIndex: PairIndex;
13
+ long: boolean;
14
+ collateralAmount: number;
15
+ leverage: number;
16
+ openPrice: number;
17
+ pairSpreadP: number;
18
+ fee: Fee;
19
+ contractsVersion: number;
20
+ isCounterTrade?: boolean;
21
+ };
22
+ /**
23
+ * @dev Context for trade opening price impact calculation
24
+ * Combines contexts from spread, cumul vol, and skew
25
+ */
26
+ export type TradeOpeningPriceImpactContext = {
27
+ collateralPriceUsd: number;
28
+ cumulVolContext: CumulVolContext;
29
+ skewContext: SkewPriceImpactContext;
30
+ };
31
+ /**
32
+ * @dev Result of trade opening price impact calculation
33
+ * Mirrors contract's PriceImpact struct
34
+ */
35
+ export type TradeOpeningPriceImpactResult = {
36
+ priceAfterImpact: number;
37
+ percentProfitP: number;
38
+ cumulVolPriceImpactP: number;
39
+ skewPriceImpactP: number;
40
+ totalPriceImpactP: number;
41
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Types for trade opening price impact calculations
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @dev Builders for skew price impact contexts
3
+ */
4
+ import { TradingVariablesCollateral } from "../../../backend/tradingVariables/types";
5
+ import { SkewPriceImpactContext } from "./types";
6
+ /**
7
+ * @dev Builds skew price impact context from trading variables for a specific pair
8
+ * @param tradingVariables Trading variables containing collateral data
9
+ * @param pairIndex Index of the pair to build context for
10
+ * @returns Skew price impact context for the pair
11
+ */
12
+ export declare const buildSkewPriceImpactContext: (tradingVariables: TradingVariablesCollateral, pairIndex: number) => SkewPriceImpactContext;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Builders for skew price impact contexts
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildSkewPriceImpactContext = void 0;
7
+ /**
8
+ * @dev Builds skew price impact context from trading variables for a specific pair
9
+ * @param tradingVariables Trading variables containing collateral data
10
+ * @param pairIndex Index of the pair to build context for
11
+ * @returns Skew price impact context for the pair
12
+ */
13
+ const buildSkewPriceImpactContext = (tradingVariables, pairIndex) => {
14
+ var _a, _b, _c;
15
+ const skewDepth = (_b = (_a = tradingVariables.pairSkewDepths) === null || _a === void 0 ? void 0 : _a[pairIndex]) !== null && _b !== void 0 ? _b : 0;
16
+ const pairOi = (_c = tradingVariables.pairOis) === null || _c === void 0 ? void 0 : _c[pairIndex];
17
+ if (!pairOi) {
18
+ throw new Error(`Pair OI data not found for pair index ${pairIndex}`);
19
+ }
20
+ return {
21
+ skewDepth,
22
+ pairOiToken: {
23
+ oiLongToken: pairOi.token.long,
24
+ oiShortToken: pairOi.token.short,
25
+ },
26
+ };
27
+ };
28
+ exports.buildSkewPriceImpactContext = buildSkewPriceImpactContext;