@gainsnetwork/sdk 0.0.0-me-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/lib/backend/globalTrades/index.d.ts +11 -0
  4. package/lib/backend/globalTrades/index.js +69 -0
  5. package/lib/backend/index.d.ts +3 -0
  6. package/lib/backend/index.js +28 -0
  7. package/lib/backend/tradingVariables/backend.types.d.ts +337 -0
  8. package/lib/backend/tradingVariables/backend.types.js +2 -0
  9. package/lib/backend/tradingVariables/converter.d.ts +38 -0
  10. package/lib/backend/tradingVariables/converter.js +359 -0
  11. package/lib/backend/tradingVariables/index.d.ts +5 -0
  12. package/lib/backend/tradingVariables/index.js +98 -0
  13. package/lib/backend/tradingVariables/types.d.ts +115 -0
  14. package/lib/backend/tradingVariables/types.js +14 -0
  15. package/lib/constants.d.ts +483 -0
  16. package/lib/constants.js +516 -0
  17. package/lib/contracts/addresses.d.ts +3 -0
  18. package/lib/contracts/addresses.js +35 -0
  19. package/lib/contracts/addresses.json +266 -0
  20. package/lib/contracts/index.d.ts +14 -0
  21. package/lib/contracts/index.js +92 -0
  22. package/lib/contracts/types/generated/GNSMultiCollatDiamond.d.ts +9327 -0
  23. package/lib/contracts/types/generated/GNSMultiCollatDiamond.js +2 -0
  24. package/lib/contracts/types/generated/GToken.d.ts +1917 -0
  25. package/lib/contracts/types/generated/GToken.js +2 -0
  26. package/lib/contracts/types/generated/GTokenOpenPnlFeed.d.ts +557 -0
  27. package/lib/contracts/types/generated/GTokenOpenPnlFeed.js +2 -0
  28. package/lib/contracts/types/generated/common.d.ts +22 -0
  29. package/lib/contracts/types/generated/common.js +2 -0
  30. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.d.ts +276 -0
  31. package/lib/contracts/types/generated/factories/GNSMultiCollatDiamond__factory.js +21557 -0
  32. package/lib/contracts/types/generated/factories/GTokenOpenPnlFeed__factory.d.ts +59 -0
  33. package/lib/contracts/types/generated/factories/GTokenOpenPnlFeed__factory.js +765 -0
  34. package/lib/contracts/types/generated/factories/GToken__factory.d.ts +121 -0
  35. package/lib/contracts/types/generated/factories/GToken__factory.js +2867 -0
  36. package/lib/contracts/types/generated/factories/index.d.ts +3 -0
  37. package/lib/contracts/types/generated/factories/index.js +12 -0
  38. package/lib/contracts/types/generated/index.d.ts +7 -0
  39. package/lib/contracts/types/generated/index.js +33 -0
  40. package/lib/contracts/types/index.d.ts +37 -0
  41. package/lib/contracts/types/index.js +30 -0
  42. package/lib/contracts/utils/borrowingFees.d.ts +9 -0
  43. package/lib/contracts/utils/borrowingFees.js +43 -0
  44. package/lib/contracts/utils/index.d.ts +3 -0
  45. package/lib/contracts/utils/index.js +19 -0
  46. package/lib/contracts/utils/openTrades.d.ts +12 -0
  47. package/lib/contracts/utils/openTrades.js +172 -0
  48. package/lib/contracts/utils/pairs.d.ts +18 -0
  49. package/lib/contracts/utils/pairs.js +602 -0
  50. package/lib/index.d.ts +10 -0
  51. package/lib/index.js +30 -0
  52. package/lib/markets/collateral/converter.d.ts +5 -0
  53. package/lib/markets/collateral/converter.js +11 -0
  54. package/lib/markets/collateral/index.d.ts +1 -0
  55. package/lib/markets/collateral/index.js +17 -0
  56. package/lib/markets/collateral/types.d.ts +7 -0
  57. package/lib/markets/collateral/types.js +2 -0
  58. package/lib/markets/commodities.d.ts +1 -0
  59. package/lib/markets/commodities.js +7 -0
  60. package/lib/markets/crypto.d.ts +1 -0
  61. package/lib/markets/crypto.js +6 -0
  62. package/lib/markets/forex.d.ts +3 -0
  63. package/lib/markets/forex.js +8 -0
  64. package/lib/markets/holdingFees/index.d.ts +46 -0
  65. package/lib/markets/holdingFees/index.js +104 -0
  66. package/lib/markets/holdingFees/types.d.ts +23 -0
  67. package/lib/markets/holdingFees/types.js +5 -0
  68. package/lib/markets/index.d.ts +11 -0
  69. package/lib/markets/index.js +27 -0
  70. package/lib/markets/indices.d.ts +1 -0
  71. package/lib/markets/indices.js +6 -0
  72. package/lib/markets/leverage/builder.d.ts +12 -0
  73. package/lib/markets/leverage/builder.js +25 -0
  74. package/lib/markets/leverage/getMarketLeverageRestrictions.d.ts +7 -0
  75. package/lib/markets/leverage/getMarketLeverageRestrictions.js +38 -0
  76. package/lib/markets/leverage/index.d.ts +3 -0
  77. package/lib/markets/leverage/index.js +19 -0
  78. package/lib/markets/leverage/types.d.ts +15 -0
  79. package/lib/markets/leverage/types.js +2 -0
  80. package/lib/markets/oi/converter.d.ts +62 -0
  81. package/lib/markets/oi/converter.js +111 -0
  82. package/lib/markets/oi/index.d.ts +49 -0
  83. package/lib/markets/oi/index.js +77 -0
  84. package/lib/markets/oi/types.d.ts +89 -0
  85. package/lib/markets/oi/types.js +6 -0
  86. package/lib/markets/price/builder.d.ts +25 -0
  87. package/lib/markets/price/builder.js +69 -0
  88. package/lib/markets/price/index.d.ts +7 -0
  89. package/lib/markets/price/index.js +23 -0
  90. package/lib/markets/price/marketPrice.d.ts +13 -0
  91. package/lib/markets/price/marketPrice.js +35 -0
  92. package/lib/markets/price/signedPrices.d.ts +36 -0
  93. package/lib/markets/price/signedPrices.js +181 -0
  94. package/lib/markets/price/types.d.ts +50 -0
  95. package/lib/markets/price/types.js +5 -0
  96. package/lib/markets/schedules/builders.d.ts +7 -0
  97. package/lib/markets/schedules/builders.js +81 -0
  98. package/lib/markets/schedules/checkers.d.ts +7 -0
  99. package/lib/markets/schedules/checkers.js +36 -0
  100. package/lib/markets/schedules/holidays.d.ts +4 -0
  101. package/lib/markets/schedules/holidays.js +77 -0
  102. package/lib/markets/schedules/index.d.ts +9 -0
  103. package/lib/markets/schedules/index.js +45 -0
  104. package/lib/markets/schedules/types.d.ts +43 -0
  105. package/lib/markets/schedules/types.js +37 -0
  106. package/lib/markets/stocks.d.ts +3 -0
  107. package/lib/markets/stocks.js +15 -0
  108. package/lib/pricing/depthBands.d.ts +39 -0
  109. package/lib/pricing/depthBands.js +94 -0
  110. package/lib/pricing/index.d.ts +4 -0
  111. package/lib/pricing/index.js +20 -0
  112. package/lib/trade/counterTrade/index.d.ts +2 -0
  113. package/lib/trade/counterTrade/index.js +18 -0
  114. package/lib/trade/counterTrade/types.d.ts +7 -0
  115. package/lib/trade/counterTrade/types.js +2 -0
  116. package/lib/trade/counterTrade/validateCounterTrade.d.ts +10 -0
  117. package/lib/trade/counterTrade/validateCounterTrade.js +29 -0
  118. package/lib/trade/effectiveLeverage/getTradeNewEffectiveLeverage.d.ts +20 -0
  119. package/lib/trade/effectiveLeverage/getTradeNewEffectiveLeverage.js +42 -0
  120. package/lib/trade/effectiveLeverage/index.d.ts +2 -0
  121. package/lib/trade/effectiveLeverage/index.js +21 -0
  122. package/lib/trade/effectiveLeverage/types.d.ts +30 -0
  123. package/lib/trade/effectiveLeverage/types.js +2 -0
  124. package/lib/trade/fees/borrowing/builder.d.ts +14 -0
  125. package/lib/trade/fees/borrowing/builder.js +33 -0
  126. package/lib/trade/fees/borrowing/converter.d.ts +17 -0
  127. package/lib/trade/fees/borrowing/converter.js +46 -0
  128. package/lib/trade/fees/borrowing/index.d.ts +81 -0
  129. package/lib/trade/fees/borrowing/index.js +259 -0
  130. package/lib/trade/fees/borrowing/types.d.ts +36 -0
  131. package/lib/trade/fees/borrowing/types.js +2 -0
  132. package/lib/trade/fees/borrowingV2/builder.d.ts +6 -0
  133. package/lib/trade/fees/borrowingV2/builder.js +23 -0
  134. package/lib/trade/fees/borrowingV2/converter.d.ts +75 -0
  135. package/lib/trade/fees/borrowingV2/converter.js +132 -0
  136. package/lib/trade/fees/borrowingV2/fetcher.d.ts +76 -0
  137. package/lib/trade/fees/borrowingV2/fetcher.js +179 -0
  138. package/lib/trade/fees/borrowingV2/index.d.ts +48 -0
  139. package/lib/trade/fees/borrowingV2/index.js +112 -0
  140. package/lib/trade/fees/borrowingV2/types.d.ts +95 -0
  141. package/lib/trade/fees/borrowingV2/types.js +5 -0
  142. package/lib/trade/fees/converter.d.ts +48 -0
  143. package/lib/trade/fees/converter.js +114 -0
  144. package/lib/trade/fees/fundingFees/builder.d.ts +9 -0
  145. package/lib/trade/fees/fundingFees/builder.js +38 -0
  146. package/lib/trade/fees/fundingFees/converter.d.ts +102 -0
  147. package/lib/trade/fees/fundingFees/converter.js +196 -0
  148. package/lib/trade/fees/fundingFees/fetcher.d.ts +66 -0
  149. package/lib/trade/fees/fundingFees/fetcher.js +141 -0
  150. package/lib/trade/fees/fundingFees/index.d.ts +124 -0
  151. package/lib/trade/fees/fundingFees/index.js +309 -0
  152. package/lib/trade/fees/fundingFees/pairContext.d.ts +33 -0
  153. package/lib/trade/fees/fundingFees/pairContext.js +17 -0
  154. package/lib/trade/fees/fundingFees/types.d.ts +77 -0
  155. package/lib/trade/fees/fundingFees/types.js +5 -0
  156. package/lib/trade/fees/index.d.ts +11 -0
  157. package/lib/trade/fees/index.js +87 -0
  158. package/lib/trade/fees/tiers/converter.d.ts +64 -0
  159. package/lib/trade/fees/tiers/converter.js +100 -0
  160. package/lib/trade/fees/tiers/index.d.ts +46 -0
  161. package/lib/trade/fees/tiers/index.js +135 -0
  162. package/lib/trade/fees/tiers/types.d.ts +22 -0
  163. package/lib/trade/fees/tiers/types.js +8 -0
  164. package/lib/trade/fees/trading/builder.d.ts +19 -0
  165. package/lib/trade/fees/trading/builder.js +21 -0
  166. package/lib/trade/fees/trading/converter.d.ts +32 -0
  167. package/lib/trade/fees/trading/converter.js +47 -0
  168. package/lib/trade/fees/trading/index.d.ts +62 -0
  169. package/lib/trade/fees/trading/index.js +157 -0
  170. package/lib/trade/fees/trading/types.d.ts +46 -0
  171. package/lib/trade/fees/trading/types.js +5 -0
  172. package/lib/trade/index.d.ts +10 -0
  173. package/lib/trade/index.js +26 -0
  174. package/lib/trade/liquidation/builder.d.ts +25 -0
  175. package/lib/trade/liquidation/builder.js +58 -0
  176. package/lib/trade/liquidation/converter.d.ts +23 -0
  177. package/lib/trade/liquidation/converter.js +46 -0
  178. package/lib/trade/liquidation/index.d.ts +29 -0
  179. package/lib/trade/liquidation/index.js +216 -0
  180. package/lib/trade/liquidation/types.d.ts +38 -0
  181. package/lib/trade/liquidation/types.js +2 -0
  182. package/lib/trade/oiWindows.d.ts +3 -0
  183. package/lib/trade/oiWindows.js +19 -0
  184. package/lib/trade/pnl/builder.d.ts +16 -0
  185. package/lib/trade/pnl/builder.js +43 -0
  186. package/lib/trade/pnl/converter.d.ts +47 -0
  187. package/lib/trade/pnl/converter.js +72 -0
  188. package/lib/trade/pnl/index.d.ts +91 -0
  189. package/lib/trade/pnl/index.js +301 -0
  190. package/lib/trade/pnl/types.d.ts +79 -0
  191. package/lib/trade/pnl/types.js +5 -0
  192. package/lib/trade/priceImpact/close/builder.d.ts +23 -0
  193. package/lib/trade/priceImpact/close/builder.js +44 -0
  194. package/lib/trade/priceImpact/close/index.d.ts +22 -0
  195. package/lib/trade/priceImpact/close/index.js +137 -0
  196. package/lib/trade/priceImpact/close/types.d.ts +47 -0
  197. package/lib/trade/priceImpact/close/types.js +5 -0
  198. package/lib/trade/priceImpact/cumulVol/builder.d.ts +22 -0
  199. package/lib/trade/priceImpact/cumulVol/builder.js +53 -0
  200. package/lib/trade/priceImpact/cumulVol/converter.d.ts +94 -0
  201. package/lib/trade/priceImpact/cumulVol/converter.js +155 -0
  202. package/lib/trade/priceImpact/cumulVol/index.d.ts +109 -0
  203. package/lib/trade/priceImpact/cumulVol/index.js +316 -0
  204. package/lib/trade/priceImpact/cumulVol/types.d.ts +11 -0
  205. package/lib/trade/priceImpact/cumulVol/types.js +2 -0
  206. package/lib/trade/priceImpact/index.d.ts +21 -0
  207. package/lib/trade/priceImpact/index.js +79 -0
  208. package/lib/trade/priceImpact/open/builder.d.ts +21 -0
  209. package/lib/trade/priceImpact/open/builder.js +42 -0
  210. package/lib/trade/priceImpact/open/index.d.ts +23 -0
  211. package/lib/trade/priceImpact/open/index.js +82 -0
  212. package/lib/trade/priceImpact/open/types.d.ts +45 -0
  213. package/lib/trade/priceImpact/open/types.js +5 -0
  214. package/lib/trade/priceImpact/skew/builder.d.ts +12 -0
  215. package/lib/trade/priceImpact/skew/builder.js +27 -0
  216. package/lib/trade/priceImpact/skew/converter.d.ts +46 -0
  217. package/lib/trade/priceImpact/skew/converter.js +81 -0
  218. package/lib/trade/priceImpact/skew/fetcher.d.ts +60 -0
  219. package/lib/trade/priceImpact/skew/fetcher.js +160 -0
  220. package/lib/trade/priceImpact/skew/index.d.ts +53 -0
  221. package/lib/trade/priceImpact/skew/index.js +148 -0
  222. package/lib/trade/priceImpact/skew/types.d.ts +44 -0
  223. package/lib/trade/priceImpact/skew/types.js +5 -0
  224. package/lib/trade/spread.d.ts +5 -0
  225. package/lib/trade/spread.js +19 -0
  226. package/lib/trade/types.d.ts +777 -0
  227. package/lib/trade/types.js +478 -0
  228. package/lib/trade/utils.d.ts +18 -0
  229. package/lib/trade/utils.js +30 -0
  230. package/lib/utils/index.d.ts +1 -0
  231. package/lib/utils/index.js +17 -0
  232. package/lib/utils/packing.d.ts +2 -0
  233. package/lib/utils/packing.js +39 -0
  234. package/lib/vault/index.d.ts +10 -0
  235. package/lib/vault/index.js +10 -0
  236. package/package.json +106 -0
@@ -0,0 +1,316 @@
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
+ const protectionCloseFactor = context === undefined ||
18
+ context.contractsVersion === types_1.ContractsVersion.BEFORE_V9_2 ||
19
+ context.isOpen === undefined ||
20
+ context.isPnlPositive === undefined ||
21
+ context.protectionCloseFactor === undefined ||
22
+ (0, exports.isProtectionCloseFactorActive)(context) !== true
23
+ ? constants_1.DEFAULT_PROTECTION_CLOSE_FACTOR
24
+ : context.protectionCloseFactor;
25
+ const protectionCloseFactorMultiplier = context?.userPriceImpact?.cumulVolPriceImpactMultiplier !== undefined &&
26
+ context.userPriceImpact.cumulVolPriceImpactMultiplier > 0
27
+ ? context.userPriceImpact.cumulVolPriceImpactMultiplier
28
+ : 1;
29
+ return protectionCloseFactor * protectionCloseFactorMultiplier;
30
+ };
31
+ exports.getProtectionCloseFactor = getProtectionCloseFactor;
32
+ /**
33
+ * @dev Checks if protection close factor is active
34
+ * @param context Cumulative volume context
35
+ * @returns True if protection close factor should be applied
36
+ */
37
+ const isProtectionCloseFactorActive = (context) => {
38
+ if (context === undefined ||
39
+ context.currentBlock === undefined ||
40
+ context.createdBlock === undefined ||
41
+ context.protectionCloseFactorBlocks === undefined ||
42
+ context.protectionCloseFactor === undefined) {
43
+ return undefined;
44
+ }
45
+ return (context.isPnlPositive === true &&
46
+ context.isOpen === false &&
47
+ context.protectionCloseFactor > 0 &&
48
+ context.currentBlock <=
49
+ context.createdBlock + context.protectionCloseFactorBlocks &&
50
+ context.protectionCloseFactorWhitelist !== true);
51
+ };
52
+ exports.isProtectionCloseFactorActive = isProtectionCloseFactorActive;
53
+ /**
54
+ * @dev Gets the cumulative factor for price impact calculation
55
+ * @param context Cumulative volume context
56
+ * @returns Cumulative factor (default 1)
57
+ */
58
+ const getCumulativeFactor = (context) => {
59
+ if (context === undefined ||
60
+ context.cumulativeFactor === undefined ||
61
+ context.cumulativeFactor === 0) {
62
+ return constants_1.DEFAULT_CUMULATIVE_FACTOR;
63
+ }
64
+ return context.cumulativeFactor;
65
+ };
66
+ exports.getCumulativeFactor = getCumulativeFactor;
67
+ /**
68
+ * @dev Gets the legacy factor for v9.2 compatibility
69
+ * @param context Cumulative volume context
70
+ * @returns 1 for pre-v9.2, 2 for v9.2+
71
+ */
72
+ const getLegacyFactor = (context) => {
73
+ return context?.contractsVersion === types_1.ContractsVersion.BEFORE_V9_2 ? 1 : 2;
74
+ };
75
+ exports.getLegacyFactor = getLegacyFactor;
76
+ /**
77
+ * @dev Mirrors contract's _calculateDepthBandsPriceImpact function
78
+ * @param tradeSizeUsd Trade size in USD (always positive here)
79
+ * @param depthBandParams Depth band parameters
80
+ * @returns Price impact percentage
81
+ */
82
+ const _calculateDepthBandsPriceImpact = (tradeSizeUsd, depthBandParams) => {
83
+ const totalDepthUsd = depthBandParams.depthBands.totalDepthUsd;
84
+ if (totalDepthUsd === 0 || tradeSizeUsd === 0)
85
+ return 0;
86
+ let remainingSizeUsd = tradeSizeUsd;
87
+ let totalWeightedPriceImpactP = 0;
88
+ let prevBandDepthUsd = 0;
89
+ let topOfPrevBandOffsetPpm = 0;
90
+ for (let i = 0; i < 30 && remainingSizeUsd !== 0; i++) {
91
+ const bandLiquidityPercentageBps = depthBandParams.depthBands.bands[i]; // Already in 0-1 format
92
+ const topOfBandOffsetPpm = depthBandParams.depthBandsMapping.bands[i]; // Already in 0-1 format
93
+ const bandDepthUsd = bandLiquidityPercentageBps * totalDepthUsd;
94
+ // Skip if band has same depth as previous (would cause division by zero)
95
+ if (bandDepthUsd <= prevBandDepthUsd) {
96
+ prevBandDepthUsd = bandDepthUsd;
97
+ topOfPrevBandOffsetPpm = topOfBandOffsetPpm;
98
+ continue;
99
+ }
100
+ // Since bandDepthUsd represents liquidity from mid price to top of band, we need to subtract previous band depth
101
+ const bandAvailableDepthUsd = bandDepthUsd - prevBandDepthUsd;
102
+ let depthConsumedUsd;
103
+ // At 100% band always consume all remaining size, even if more than band available depth
104
+ if (bandLiquidityPercentageBps === 1 ||
105
+ remainingSizeUsd <= bandAvailableDepthUsd) {
106
+ depthConsumedUsd = remainingSizeUsd;
107
+ remainingSizeUsd = 0;
108
+ }
109
+ else {
110
+ // Normal case: consume entire band and continue to next
111
+ depthConsumedUsd = bandAvailableDepthUsd;
112
+ remainingSizeUsd -= bandAvailableDepthUsd;
113
+ }
114
+ // Calculate impact contribution from this band using trapezoidal rule
115
+ // Low = previous band's price offset, High = current band's price offset
116
+ const lowOffsetP = topOfPrevBandOffsetPpm;
117
+ const offsetRangeP = topOfBandOffsetPpm - topOfPrevBandOffsetPpm;
118
+ // Calculate average impact using trapezoidal rule: low + (range * fraction / 2)
119
+ const avgImpactP = lowOffsetP +
120
+ (offsetRangeP * depthConsumedUsd) / bandAvailableDepthUsd / 2;
121
+ totalWeightedPriceImpactP += avgImpactP * depthConsumedUsd;
122
+ // Update previous values for next iteration
123
+ topOfPrevBandOffsetPpm = topOfBandOffsetPpm;
124
+ prevBandDepthUsd = bandDepthUsd;
125
+ }
126
+ return totalWeightedPriceImpactP / tradeSizeUsd;
127
+ };
128
+ /**
129
+ * @dev Mirrors contract's _getDepthBandsPriceImpactP function
130
+ * @param cumulativeVolumeUsd Cumulative volume in USD (can be negative)
131
+ * @param tradeSizeUsd Trade size in USD (can be negative)
132
+ * @param depthBandParams Depth band parameters (contains both pair bands and global mapping)
133
+ * @param priceImpactFactor Price impact factor (protection close factor)
134
+ * @param cumulativeFactor Cumulative factor for volume impact
135
+ * @returns Price impact percentage (can be negative)
136
+ */
137
+ const _getDepthBandsPriceImpactP = (cumulativeVolumeUsd, tradeSizeUsd, depthBandParams, priceImpactFactor, cumulativeFactor) => {
138
+ // Check for opposite signs
139
+ if ((cumulativeVolumeUsd > 0 && tradeSizeUsd < 0) ||
140
+ (cumulativeVolumeUsd < 0 && tradeSizeUsd > 0)) {
141
+ throw new Error("Wrong params: cumulative volume and trade size have opposite signs");
142
+ }
143
+ const effectiveCumulativeVolumeUsd = cumulativeVolumeUsd * cumulativeFactor;
144
+ const totalSizeLookupUsd = effectiveCumulativeVolumeUsd + tradeSizeUsd;
145
+ const isNegative = totalSizeLookupUsd < 0;
146
+ const effectiveCumulativeVolumeUsdUint = isNegative
147
+ ? -effectiveCumulativeVolumeUsd
148
+ : effectiveCumulativeVolumeUsd;
149
+ const totalSizeLookupUsdUint = isNegative
150
+ ? -totalSizeLookupUsd
151
+ : totalSizeLookupUsd;
152
+ const cumulativeVolPriceImpactP = _calculateDepthBandsPriceImpact(effectiveCumulativeVolumeUsdUint, depthBandParams);
153
+ const totalSizePriceImpactP = _calculateDepthBandsPriceImpact(totalSizeLookupUsdUint, depthBandParams);
154
+ const unscaledPriceImpactP = cumulativeVolPriceImpactP +
155
+ (totalSizePriceImpactP - cumulativeVolPriceImpactP) / 2;
156
+ const scaledPriceImpactP = unscaledPriceImpactP * priceImpactFactor;
157
+ return isNegative ? -scaledPriceImpactP : scaledPriceImpactP;
158
+ };
159
+ /**
160
+ * @dev Calculates cumulative volume price impact percentage
161
+ * @dev Mirrors contract's getTradeCumulVolPriceImpactP function
162
+ * @param trader Trader address
163
+ * @param pairIndex Trading pair index
164
+ * @param long True for long, false for short
165
+ * @param tradeOpenInterestUsd Position size in USD
166
+ * @param isPnlPositive Whether PnL is positive (only relevant when closing)
167
+ * @param open True for opening, false for closing
168
+ * @param lastPosIncreaseBlock Last block when position was increased (only relevant when closing)
169
+ * @param context Additional context with depths, OI data, and factors
170
+ * @returns Cumulative volume price impact percentage (not including spread)
171
+ */
172
+ const getTradeCumulVolPriceImpactP = (_trader, // Unused - kept for compatibility
173
+ _pairIndex, // Unused - kept for compatibility
174
+ long, tradeOpenInterestUsd, isPnlPositive, open, lastPosIncreaseBlock, context) => {
175
+ // Update context with passed parameters
176
+ const updatedContext = {
177
+ ...context,
178
+ isOpen: open,
179
+ isPnlPositive: isPnlPositive,
180
+ createdBlock: context.createdBlock || lastPosIncreaseBlock,
181
+ };
182
+ if (
183
+ // No price impact when closing pre-v9.2 trades
184
+ (!open && context?.contractsVersion === types_1.ContractsVersion.BEFORE_V9_2) ||
185
+ // No price impact for opens when `pair.exemptOnOpen` is true
186
+ (open && context?.exemptOnOpen === true) ||
187
+ // No price impact for closes after `protectionCloseFactor` has expired
188
+ // when `pair.exemptAfterProtectionCloseFactor` is true
189
+ (!open &&
190
+ context?.exemptAfterProtectionCloseFactor === true &&
191
+ (0, exports.isProtectionCloseFactorActive)(updatedContext) !== true)) {
192
+ return 0;
193
+ }
194
+ const tradePositiveSkew = (long && open) || (!long && !open);
195
+ const tradeSkewMultiplier = tradePositiveSkew ? 1 : -1;
196
+ if (!context.pairDepthBands || !context.depthBandsMapping) {
197
+ return 0;
198
+ }
199
+ // Select depth bands based on trade direction
200
+ const depthBands = tradePositiveSkew
201
+ ? context.pairDepthBands.above
202
+ : context.pairDepthBands.below;
203
+ // Return 0 if no depth bands configured (matching contract lines 588-590)
204
+ if (!depthBands || depthBands.totalDepthUsd === 0) {
205
+ return 0;
206
+ }
207
+ // Get active OI for cumulative volume calculation
208
+ let activeOi = 0;
209
+ if (context.oiWindowsSettings !== undefined) {
210
+ activeOi =
211
+ (0, oiWindows_1.getActiveOi)((0, oiWindows_1.getCurrentOiWindowId)(context.oiWindowsSettings), context.oiWindowsSettings.windowsCount, context.oiWindows, open ? long : !long) || 0;
212
+ }
213
+ const signedActiveOi = activeOi * tradeSkewMultiplier;
214
+ const signedTradeOi = tradeOpenInterestUsd * tradeSkewMultiplier;
215
+ // Calculate price impact using depth bands
216
+ const priceImpactP = _getDepthBandsPriceImpactP(signedActiveOi, signedTradeOi, {
217
+ depthBands: depthBands,
218
+ depthBandsMapping: context.depthBandsMapping,
219
+ }, (0, exports.getProtectionCloseFactor)(updatedContext), (0, exports.getCumulativeFactor)(updatedContext));
220
+ return priceImpactP;
221
+ };
222
+ exports.getTradeCumulVolPriceImpactP = getTradeCumulVolPriceImpactP;
223
+ /**
224
+ * @dev Gets the fixed spread percentage with direction
225
+ * @dev Mirrors contract's getFixedSpreadP function
226
+ * @param spreadP Total spread percentage (includes base + user spread)
227
+ * @param long True for long position
228
+ * @param open True for opening, false for closing
229
+ * @returns Signed spread percentage (positive or negative based on direction)
230
+ */
231
+ const getFixedSpreadP = (spreadP, long, open) => {
232
+ // Reverse spread direction on close
233
+ const effectiveLong = open ? long : !long;
234
+ // Calculate half spread
235
+ const fixedSpreadP = spreadP / 2;
236
+ // Apply direction
237
+ return effectiveLong ? fixedSpreadP : -fixedSpreadP;
238
+ };
239
+ exports.getFixedSpreadP = getFixedSpreadP;
240
+ /**
241
+ * @dev Gets the base spread percentage
242
+ * @param pairSpreadP Pair spread percentage
243
+ * @param isLiquidation True if liquidation
244
+ * @param liquidationParams Liquidation parameters
245
+ * @param userPriceImpact User-specific price impact settings
246
+ * @returns Base spread percentage
247
+ * @todo Review if this function still makes sense or should use getFixedSpreadP pattern
248
+ * Currently it may double-count user fixed spread if pairSpreadP already includes it
249
+ */
250
+ const getSpreadP = (pairSpreadP, isLiquidation, liquidationParams, userPriceImpact) => {
251
+ const fixedSpreadP = userPriceImpact?.fixedSpreadP ?? 0;
252
+ if (pairSpreadP === undefined || (pairSpreadP === 0 && fixedSpreadP === 0)) {
253
+ return 0;
254
+ }
255
+ const spreadP = pairSpreadP / 2 + fixedSpreadP;
256
+ return isLiquidation === true &&
257
+ liquidationParams !== undefined &&
258
+ liquidationParams.maxLiqSpreadP > 0 &&
259
+ spreadP > liquidationParams.maxLiqSpreadP
260
+ ? liquidationParams.maxLiqSpreadP
261
+ : spreadP;
262
+ };
263
+ exports.getSpreadP = getSpreadP;
264
+ /**
265
+ * @dev Gets spread with cumulative volume price impact
266
+ * @dev This combines base spread + cumulative volume impact
267
+ * @param pairSpreadP Base pair spread percentage
268
+ * @param buy True for long, false for short
269
+ * @param collateral Collateral amount
270
+ * @param leverage Position leverage
271
+ * @param oiWindowsSettings OI windows configuration
272
+ * @param oiWindows Current OI windows data
273
+ * @param context Additional context for the calculation
274
+ * @returns Total spread + cumulative volume price impact percentage
275
+ */
276
+ const getSpreadWithCumulVolPriceImpactP = (pairSpreadP, buy, collateral, leverage, context) => {
277
+ if (pairSpreadP === undefined) {
278
+ return 0;
279
+ }
280
+ const baseSpread = (0, exports.getSpreadP)(pairSpreadP, undefined, undefined, context?.userPriceImpact);
281
+ // Calculate position size in USD
282
+ const positionSizeUsd = collateral * leverage * (context?.collateralPriceUsd || 1);
283
+ const cumulVolImpact = (0, exports.getTradeCumulVolPriceImpactP)("", // trader - not used in calculation
284
+ 0, // pairIndex - not used in calculation
285
+ buy, positionSizeUsd, context?.isPnlPositive || false, context?.isOpen !== false, context?.createdBlock || 0, context);
286
+ return baseSpread + cumulVolImpact;
287
+ };
288
+ exports.getSpreadWithCumulVolPriceImpactP = getSpreadWithCumulVolPriceImpactP;
289
+ /**
290
+ * @dev Convenience function for calculating cumulative volume price impact
291
+ * @dev Uses collateral and leverage instead of USD position size
292
+ * @param buy True for long, false for short
293
+ * @param collateral Collateral amount
294
+ * @param leverage Position leverage
295
+ * @param open True for opening, false for closing
296
+ * @param context Full context including depths, OI data, and collateral price
297
+ * @returns Cumulative volume price impact percentage
298
+ */
299
+ const getCumulVolPriceImpact = (buy, collateral, leverage, open, context) => {
300
+ const positionSizeUsd = collateral * leverage * context.collateralPriceUsd;
301
+ return (0, exports.getTradeCumulVolPriceImpactP)("", // trader - not used in calculation
302
+ 0, // pairIndex - not used in calculation
303
+ buy, positionSizeUsd, context.isPnlPositive || false, open, context.createdBlock || 0, context);
304
+ };
305
+ exports.getCumulVolPriceImpact = getCumulVolPriceImpact;
306
+ // Legacy export for backward compatibility
307
+ exports.getSpreadWithPriceImpactP = exports.getSpreadWithCumulVolPriceImpactP;
308
+ // Export converters
309
+ var converter_1 = require("./converter");
310
+ Object.defineProperty(exports, "convertOiWindowsSettings", { enumerable: true, get: function () { return converter_1.convertOiWindowsSettings; } });
311
+ Object.defineProperty(exports, "convertOiWindow", { enumerable: true, get: function () { return converter_1.convertOiWindow; } });
312
+ Object.defineProperty(exports, "convertOiWindows", { enumerable: true, get: function () { return converter_1.convertOiWindows; } });
313
+ Object.defineProperty(exports, "convertOiWindowsSettingsArray", { enumerable: true, get: function () { return converter_1.convertOiWindowsSettingsArray; } });
314
+ // Export builder
315
+ var builder_1 = require("./builder");
316
+ Object.defineProperty(exports, "buildCumulVolContext", { enumerable: true, get: function () { return builder_1.buildCumulVolContext; } });
@@ -0,0 +1,11 @@
1
+ export type DepthBands = {
2
+ totalDepthUsd: number;
3
+ bands: number[];
4
+ };
5
+ export type PairDepthBands = {
6
+ above: DepthBands | undefined;
7
+ below: DepthBands | undefined;
8
+ };
9
+ export type DepthBandsMapping = {
10
+ bands: number[];
11
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @dev Main price impact module
3
+ * @dev Exports cumulative volume, skew, and combined opening/closing price impact functionality
4
+ */
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";
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * @dev Main price impact module
4
+ * @dev Exports cumulative volume, skew, and combined opening/closing price impact functionality
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
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; } });
58
+ // Export skew price impact functionality
59
+ var skew_1 = require("./skew");
60
+ // Core functions
61
+ Object.defineProperty(exports, "getNetSkewToken", { enumerable: true, get: function () { return skew_1.getNetSkewToken; } });
62
+ Object.defineProperty(exports, "getNetSkewCollateral", { enumerable: true, get: function () { return skew_1.getNetSkewCollateral; } });
63
+ Object.defineProperty(exports, "getTradeSkewDirection", { enumerable: true, get: function () { return skew_1.getTradeSkewDirection; } });
64
+ Object.defineProperty(exports, "calculateSkewPriceImpactP", { enumerable: true, get: function () { return skew_1.calculateSkewPriceImpactP; } });
65
+ Object.defineProperty(exports, "getTradeSkewPriceImpact", { enumerable: true, get: function () { return skew_1.getTradeSkewPriceImpact; } });
66
+ Object.defineProperty(exports, "calculatePartialSizeToken", { enumerable: true, get: function () { return skew_1.calculatePartialSizeToken; } });
67
+ // Types namespace
68
+ Object.defineProperty(exports, "SkewPriceImpact", { enumerable: true, get: function () { return skew_1.SkewPriceImpact; } });
69
+ // Export converters
70
+ var converter_1 = require("./skew/converter");
71
+ Object.defineProperty(exports, "convertPairOiToken", { enumerable: true, get: function () { return converter_1.convertPairOiToken; } });
72
+ Object.defineProperty(exports, "convertPairOiTokenArray", { enumerable: true, get: function () { return converter_1.convertPairOiTokenArray; } });
73
+ Object.defineProperty(exports, "convertPairOiCollateral", { enumerable: true, get: function () { return converter_1.convertPairOiCollateral; } });
74
+ Object.defineProperty(exports, "convertPairOiCollateralArray", { enumerable: true, get: function () { return converter_1.convertPairOiCollateralArray; } });
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,42 @@
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
+ const collateral = globalTradingVariables.collaterals[collateralIndex - 1];
17
+ if (!collateral) {
18
+ return undefined;
19
+ }
20
+ // Build cumulative volume subcontext
21
+ const cumulVolContext = (0, builder_1.buildCumulVolContext)(globalTradingVariables, collateralIndex, pairIndex, {
22
+ currentBlock: additionalParams.currentBlock,
23
+ contractsVersion: additionalParams.contractsVersion,
24
+ isPnlPositive: false,
25
+ isOpen: true,
26
+ createdBlock: undefined,
27
+ userPriceImpact: additionalParams.userPriceImpact,
28
+ protectionCloseFactorWhitelist: additionalParams.protectionCloseFactorWhitelist,
29
+ });
30
+ // Build skew price impact subcontext
31
+ const skewContext = (0, builder_2.buildSkewPriceImpactContext)(collateral, pairIndex);
32
+ if (!cumulVolContext || !skewContext) {
33
+ return undefined;
34
+ }
35
+ // Return structured context with proper subcontexts
36
+ return {
37
+ collateralPriceUsd: collateral.prices?.collateralPriceUsd || 1,
38
+ cumulVolContext,
39
+ skewContext,
40
+ };
41
+ };
42
+ 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,82 @@
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 skewPriceImpactObject = (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 = skewPriceImpactObject.totalPriceImpactP;
47
+ // Total price impact (signed - can be positive or negative)
48
+ const totalPriceImpactP = spreadP + cumulVolPriceImpactP + skewPriceImpactP;
49
+ const totalPriceImpactPFromMarketPrice = spreadP + cumulVolPriceImpactP + skewPriceImpactObject.tradePriceImpactP;
50
+ // Calculate final price after impact using the same formula as Solidity
51
+ const priceAfterImpact = (0, __1.getPriceAfterImpact)(input.openPrice, totalPriceImpactP);
52
+ // Calculate percent profit from impact
53
+ // For longs: negative impact = profit (price goes down, good for buyer)
54
+ // For shorts: positive impact = profit (price goes up, good for seller)
55
+ const percentProfitP = -totalPriceImpactP;
56
+ return {
57
+ priceAfterImpact,
58
+ percentProfitP,
59
+ fixedSpreadP: spreadP,
60
+ cumulVolPriceImpactP,
61
+ baseSkewPriceImpactP: skewPriceImpactObject.basePriceImpactP,
62
+ tradeSkewPriceImpactP: skewPriceImpactObject.tradePriceImpactP,
63
+ totalSkewPriceImpactP: skewPriceImpactObject.totalPriceImpactP,
64
+ totalPriceImpactP,
65
+ totalPriceImpactPFromMarketPrice,
66
+ };
67
+ };
68
+ exports.getTradeOpeningPriceImpact = getTradeOpeningPriceImpact;
69
+ /**
70
+ * @dev Simplified version using current market price
71
+ * @param input Trade parameters
72
+ * @param context Combined context
73
+ * @param currentMarketPrice Current market price to use as open price
74
+ * @returns Price impact breakdown and final price
75
+ */
76
+ const getTradeOpeningPriceImpactAtMarket = (input, context, currentMarketPrice) => {
77
+ return (0, exports.getTradeOpeningPriceImpact)({
78
+ ...input,
79
+ openPrice: currentMarketPrice,
80
+ }, context);
81
+ };
82
+ exports.getTradeOpeningPriceImpactAtMarket = getTradeOpeningPriceImpactAtMarket;
@@ -0,0 +1,45 @@
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
+ fixedSpreadP: number;
39
+ cumulVolPriceImpactP: number;
40
+ baseSkewPriceImpactP: number;
41
+ tradeSkewPriceImpactP: number;
42
+ totalSkewPriceImpactP: number;
43
+ totalPriceImpactP: number;
44
+ totalPriceImpactPFromMarketPrice: number;
45
+ };