@metamask-previews/perps-controller 0.0.0-preview-ae46ab603 → 0.0.0-preview-e4aa1532

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 (498) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/PerpsController.cjs +2224 -66
  3. package/dist/PerpsController.cjs.map +1 -1
  4. package/dist/PerpsController.d.cts +933 -79
  5. package/dist/PerpsController.d.cts.map +1 -1
  6. package/dist/PerpsController.d.mts +933 -79
  7. package/dist/PerpsController.d.mts.map +1 -1
  8. package/dist/PerpsController.mjs +2221 -64
  9. package/dist/PerpsController.mjs.map +1 -1
  10. package/dist/__mocks__/hyperliquidMock.cjs +68 -0
  11. package/dist/__mocks__/hyperliquidMock.cjs.map +1 -0
  12. package/dist/__mocks__/hyperliquidMock.d.cts +15 -0
  13. package/dist/__mocks__/hyperliquidMock.d.cts.map +1 -0
  14. package/dist/__mocks__/hyperliquidMock.d.mts +15 -0
  15. package/dist/__mocks__/hyperliquidMock.d.mts.map +1 -0
  16. package/dist/__mocks__/hyperliquidMock.mjs +65 -0
  17. package/dist/__mocks__/hyperliquidMock.mjs.map +1 -0
  18. package/dist/__mocks__/providerMocks.cjs +144 -0
  19. package/dist/__mocks__/providerMocks.cjs.map +1 -0
  20. package/dist/__mocks__/providerMocks.d.cts +44 -0
  21. package/dist/__mocks__/providerMocks.d.cts.map +1 -0
  22. package/dist/__mocks__/providerMocks.d.mts +44 -0
  23. package/dist/__mocks__/providerMocks.d.mts.map +1 -0
  24. package/dist/__mocks__/providerMocks.mjs +136 -0
  25. package/dist/__mocks__/providerMocks.mjs.map +1 -0
  26. package/dist/__mocks__/serviceMocks.cjs +187 -0
  27. package/dist/__mocks__/serviceMocks.cjs.map +1 -0
  28. package/dist/__mocks__/serviceMocks.d.cts +58 -0
  29. package/dist/__mocks__/serviceMocks.d.cts.map +1 -0
  30. package/dist/__mocks__/serviceMocks.d.mts +58 -0
  31. package/dist/__mocks__/serviceMocks.d.mts.map +1 -0
  32. package/dist/__mocks__/serviceMocks.mjs +180 -0
  33. package/dist/__mocks__/serviceMocks.mjs.map +1 -0
  34. package/dist/aggregation/SubscriptionMultiplexer.cjs +459 -0
  35. package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -0
  36. package/dist/aggregation/SubscriptionMultiplexer.d.cts +222 -0
  37. package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -0
  38. package/dist/aggregation/SubscriptionMultiplexer.d.mts +222 -0
  39. package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -0
  40. package/dist/aggregation/SubscriptionMultiplexer.mjs +455 -0
  41. package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -0
  42. package/dist/aggregation/index.cjs +9 -0
  43. package/dist/aggregation/index.cjs.map +1 -0
  44. package/dist/aggregation/index.d.cts +6 -0
  45. package/dist/aggregation/index.d.cts.map +1 -0
  46. package/dist/aggregation/index.d.mts +6 -0
  47. package/dist/aggregation/index.d.mts.map +1 -0
  48. package/dist/aggregation/index.mjs +5 -0
  49. package/dist/aggregation/index.mjs.map +1 -0
  50. package/dist/constants/eventNames.cjs +117 -0
  51. package/dist/constants/eventNames.cjs.map +1 -0
  52. package/dist/constants/eventNames.d.cts +106 -0
  53. package/dist/constants/eventNames.d.cts.map +1 -0
  54. package/dist/constants/eventNames.d.mts +106 -0
  55. package/dist/constants/eventNames.d.mts.map +1 -0
  56. package/dist/constants/eventNames.mjs +114 -0
  57. package/dist/constants/eventNames.mjs.map +1 -0
  58. package/dist/constants/hyperLiquidConfig.cjs +366 -0
  59. package/dist/constants/hyperLiquidConfig.cjs.map +1 -0
  60. package/dist/constants/hyperLiquidConfig.d.cts +276 -0
  61. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -0
  62. package/dist/constants/hyperLiquidConfig.d.mts +276 -0
  63. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -0
  64. package/dist/constants/hyperLiquidConfig.mjs +357 -0
  65. package/dist/constants/hyperLiquidConfig.mjs.map +1 -0
  66. package/dist/constants/index.cjs +23 -0
  67. package/dist/constants/index.cjs.map +1 -0
  68. package/dist/constants/index.d.cts +7 -0
  69. package/dist/constants/index.d.cts.map +1 -0
  70. package/dist/constants/index.d.mts +7 -0
  71. package/dist/constants/index.d.mts.map +1 -0
  72. package/dist/constants/index.mjs +7 -0
  73. package/dist/constants/index.mjs.map +1 -0
  74. package/dist/constants/orderTypes.cjs +31 -0
  75. package/dist/constants/orderTypes.cjs.map +1 -0
  76. package/dist/constants/orderTypes.d.cts +19 -0
  77. package/dist/constants/orderTypes.d.cts.map +1 -0
  78. package/dist/constants/orderTypes.d.mts +19 -0
  79. package/dist/constants/orderTypes.d.mts.map +1 -0
  80. package/dist/constants/orderTypes.mjs +27 -0
  81. package/dist/constants/orderTypes.mjs.map +1 -0
  82. package/dist/constants/performanceMetrics.cjs +61 -0
  83. package/dist/constants/performanceMetrics.cjs.map +1 -0
  84. package/dist/constants/performanceMetrics.d.cts +44 -0
  85. package/dist/constants/performanceMetrics.d.cts.map +1 -0
  86. package/dist/constants/performanceMetrics.d.mts +44 -0
  87. package/dist/constants/performanceMetrics.d.mts.map +1 -0
  88. package/dist/constants/performanceMetrics.mjs +58 -0
  89. package/dist/constants/performanceMetrics.mjs.map +1 -0
  90. package/dist/constants/perpsConfig.cjs +461 -0
  91. package/dist/constants/perpsConfig.cjs.map +1 -0
  92. package/dist/constants/perpsConfig.d.cts +343 -0
  93. package/dist/constants/perpsConfig.d.cts.map +1 -0
  94. package/dist/constants/perpsConfig.d.mts +343 -0
  95. package/dist/constants/perpsConfig.d.mts.map +1 -0
  96. package/dist/constants/perpsConfig.mjs +458 -0
  97. package/dist/constants/perpsConfig.mjs.map +1 -0
  98. package/dist/constants/perpsErrorCodes.cjs +79 -0
  99. package/dist/constants/perpsErrorCodes.cjs.map +1 -0
  100. package/dist/constants/perpsErrorCodes.d.cts +64 -0
  101. package/dist/constants/perpsErrorCodes.d.cts.map +1 -0
  102. package/dist/constants/perpsErrorCodes.d.mts +64 -0
  103. package/dist/constants/perpsErrorCodes.d.mts.map +1 -0
  104. package/dist/constants/perpsErrorCodes.mjs +76 -0
  105. package/dist/constants/perpsErrorCodes.mjs.map +1 -0
  106. package/dist/index.cjs +32 -1
  107. package/dist/index.cjs.map +1 -1
  108. package/dist/index.d.cts +6 -2
  109. package/dist/index.d.cts.map +1 -1
  110. package/dist/index.d.mts +6 -2
  111. package/dist/index.d.mts.map +1 -1
  112. package/dist/index.mjs +9 -1
  113. package/dist/index.mjs.map +1 -1
  114. package/dist/platform-services/HyperLiquidClientService.cjs +857 -0
  115. package/dist/platform-services/HyperLiquidClientService.cjs.map +1 -0
  116. package/dist/platform-services/HyperLiquidClientService.d.cts +263 -0
  117. package/dist/platform-services/HyperLiquidClientService.d.cts.map +1 -0
  118. package/dist/platform-services/HyperLiquidClientService.d.mts +263 -0
  119. package/dist/platform-services/HyperLiquidClientService.d.mts.map +1 -0
  120. package/dist/platform-services/HyperLiquidClientService.mjs +853 -0
  121. package/dist/platform-services/HyperLiquidClientService.mjs.map +1 -0
  122. package/dist/platform-services/HyperLiquidSubscriptionService.cjs +2170 -0
  123. package/dist/platform-services/HyperLiquidSubscriptionService.cjs.map +1 -0
  124. package/dist/platform-services/HyperLiquidSubscriptionService.d.cts +424 -0
  125. package/dist/platform-services/HyperLiquidSubscriptionService.d.cts.map +1 -0
  126. package/dist/platform-services/HyperLiquidSubscriptionService.d.mts +424 -0
  127. package/dist/platform-services/HyperLiquidSubscriptionService.d.mts.map +1 -0
  128. package/dist/platform-services/HyperLiquidSubscriptionService.mjs +2166 -0
  129. package/dist/platform-services/HyperLiquidSubscriptionService.mjs.map +1 -0
  130. package/dist/platform-services/HyperLiquidWalletService.cjs +140 -0
  131. package/dist/platform-services/HyperLiquidWalletService.cjs.map +1 -0
  132. package/dist/platform-services/HyperLiquidWalletService.d.cts +78 -0
  133. package/dist/platform-services/HyperLiquidWalletService.d.cts.map +1 -0
  134. package/dist/platform-services/HyperLiquidWalletService.d.mts +78 -0
  135. package/dist/platform-services/HyperLiquidWalletService.d.mts.map +1 -0
  136. package/dist/platform-services/HyperLiquidWalletService.mjs +136 -0
  137. package/dist/platform-services/HyperLiquidWalletService.mjs.map +1 -0
  138. package/dist/providers/AggregatedPerpsProvider.cjs +777 -0
  139. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -0
  140. package/dist/providers/AggregatedPerpsProvider.d.cts +466 -0
  141. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -0
  142. package/dist/providers/AggregatedPerpsProvider.d.mts +466 -0
  143. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -0
  144. package/dist/providers/AggregatedPerpsProvider.mjs +773 -0
  145. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -0
  146. package/dist/providers/HyperLiquidProvider.cjs +5172 -0
  147. package/dist/providers/HyperLiquidProvider.cjs.map +1 -0
  148. package/dist/providers/HyperLiquidProvider.d.cts +881 -0
  149. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -0
  150. package/dist/providers/HyperLiquidProvider.d.mts +881 -0
  151. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -0
  152. package/dist/providers/HyperLiquidProvider.mjs +5168 -0
  153. package/dist/providers/HyperLiquidProvider.mjs.map +1 -0
  154. package/dist/providers/index.cjs +11 -0
  155. package/dist/providers/index.cjs.map +1 -0
  156. package/dist/providers/index.d.cts +6 -0
  157. package/dist/providers/index.d.cts.map +1 -0
  158. package/dist/providers/index.d.mts +6 -0
  159. package/dist/providers/index.d.mts.map +1 -0
  160. package/dist/providers/index.mjs +6 -0
  161. package/dist/providers/index.mjs.map +1 -0
  162. package/dist/routing/ProviderRouter.cjs +148 -0
  163. package/dist/routing/ProviderRouter.cjs.map +1 -0
  164. package/dist/routing/ProviderRouter.d.cts +124 -0
  165. package/dist/routing/ProviderRouter.d.cts.map +1 -0
  166. package/dist/routing/ProviderRouter.d.mts +124 -0
  167. package/dist/routing/ProviderRouter.d.mts.map +1 -0
  168. package/dist/routing/ProviderRouter.mjs +144 -0
  169. package/dist/routing/ProviderRouter.mjs.map +1 -0
  170. package/dist/routing/index.cjs +9 -0
  171. package/dist/routing/index.cjs.map +1 -0
  172. package/dist/routing/index.d.cts +6 -0
  173. package/dist/routing/index.d.cts.map +1 -0
  174. package/dist/routing/index.d.mts +6 -0
  175. package/dist/routing/index.d.mts.map +1 -0
  176. package/dist/routing/index.mjs +5 -0
  177. package/dist/routing/index.mjs.map +1 -0
  178. package/dist/selectors.cjs +161 -0
  179. package/dist/selectors.cjs.map +1 -0
  180. package/dist/selectors.d.cts +345 -0
  181. package/dist/selectors.d.cts.map +1 -0
  182. package/dist/selectors.d.mts +345 -0
  183. package/dist/selectors.d.mts.map +1 -0
  184. package/dist/selectors.mjs +153 -0
  185. package/dist/selectors.mjs.map +1 -0
  186. package/dist/services/AccountService.cjs +313 -0
  187. package/dist/services/AccountService.cjs.map +1 -0
  188. package/dist/services/AccountService.d.cts +53 -0
  189. package/dist/services/AccountService.d.cts.map +1 -0
  190. package/dist/services/AccountService.d.mts +53 -0
  191. package/dist/services/AccountService.d.mts.map +1 -0
  192. package/dist/services/AccountService.mjs +309 -0
  193. package/dist/services/AccountService.mjs.map +1 -0
  194. package/dist/services/DataLakeService.cjs +219 -0
  195. package/dist/services/DataLakeService.cjs.map +1 -0
  196. package/dist/services/DataLakeService.d.cts +49 -0
  197. package/dist/services/DataLakeService.d.cts.map +1 -0
  198. package/dist/services/DataLakeService.d.mts +49 -0
  199. package/dist/services/DataLakeService.d.mts.map +1 -0
  200. package/dist/services/DataLakeService.mjs +215 -0
  201. package/dist/services/DataLakeService.mjs.map +1 -0
  202. package/dist/services/DepositService.cjs +96 -0
  203. package/dist/services/DepositService.cjs.map +1 -0
  204. package/dist/services/DepositService.d.cts +37 -0
  205. package/dist/services/DepositService.d.cts.map +1 -0
  206. package/dist/services/DepositService.d.mts +37 -0
  207. package/dist/services/DepositService.d.mts.map +1 -0
  208. package/dist/services/DepositService.mjs +92 -0
  209. package/dist/services/DepositService.mjs.map +1 -0
  210. package/dist/services/EligibilityService.cjs +156 -0
  211. package/dist/services/EligibilityService.cjs.map +1 -0
  212. package/dist/services/EligibilityService.d.cts +48 -0
  213. package/dist/services/EligibilityService.d.cts.map +1 -0
  214. package/dist/services/EligibilityService.d.mts +48 -0
  215. package/dist/services/EligibilityService.d.mts.map +1 -0
  216. package/dist/services/EligibilityService.mjs +152 -0
  217. package/dist/services/EligibilityService.mjs.map +1 -0
  218. package/dist/services/FeatureFlagConfigurationService.cjs +258 -0
  219. package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -0
  220. package/dist/services/FeatureFlagConfigurationService.d.cts +100 -0
  221. package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -0
  222. package/dist/services/FeatureFlagConfigurationService.d.mts +100 -0
  223. package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -0
  224. package/dist/services/FeatureFlagConfigurationService.mjs +254 -0
  225. package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -0
  226. package/dist/services/MarketDataService.cjs +875 -0
  227. package/dist/services/MarketDataService.cjs.map +1 -0
  228. package/dist/services/MarketDataService.d.cts +289 -0
  229. package/dist/services/MarketDataService.d.cts.map +1 -0
  230. package/dist/services/MarketDataService.d.mts +289 -0
  231. package/dist/services/MarketDataService.d.mts.map +1 -0
  232. package/dist/services/MarketDataService.mjs +871 -0
  233. package/dist/services/MarketDataService.mjs.map +1 -0
  234. package/dist/services/RewardsIntegrationService.cjs +94 -0
  235. package/dist/services/RewardsIntegrationService.cjs.map +1 -0
  236. package/dist/services/RewardsIntegrationService.d.cts +30 -0
  237. package/dist/services/RewardsIntegrationService.d.cts.map +1 -0
  238. package/dist/services/RewardsIntegrationService.d.mts +30 -0
  239. package/dist/services/RewardsIntegrationService.d.mts.map +1 -0
  240. package/dist/services/RewardsIntegrationService.mjs +90 -0
  241. package/dist/services/RewardsIntegrationService.mjs.map +1 -0
  242. package/dist/services/ServiceContext.cjs +3 -0
  243. package/dist/services/ServiceContext.cjs.map +1 -0
  244. package/dist/services/ServiceContext.d.cts +110 -0
  245. package/dist/services/ServiceContext.d.cts.map +1 -0
  246. package/dist/services/ServiceContext.d.mts +110 -0
  247. package/dist/services/ServiceContext.d.mts.map +1 -0
  248. package/dist/services/ServiceContext.mjs +2 -0
  249. package/dist/services/ServiceContext.mjs.map +1 -0
  250. package/dist/services/TradingService.cjs +1481 -0
  251. package/dist/services/TradingService.cjs.map +1 -0
  252. package/dist/services/TradingService.d.cts +308 -0
  253. package/dist/services/TradingService.d.cts.map +1 -0
  254. package/dist/services/TradingService.d.mts +308 -0
  255. package/dist/services/TradingService.d.mts.map +1 -0
  256. package/dist/services/TradingService.mjs +1477 -0
  257. package/dist/services/TradingService.mjs.map +1 -0
  258. package/dist/services/index.cjs +26 -0
  259. package/dist/services/index.cjs.map +1 -0
  260. package/dist/services/index.d.cts +11 -0
  261. package/dist/services/index.d.cts.map +1 -0
  262. package/dist/services/index.d.mts +11 -0
  263. package/dist/services/index.d.mts.map +1 -0
  264. package/dist/services/index.mjs +10 -0
  265. package/dist/services/index.mjs.map +1 -0
  266. package/dist/services/utils.cjs +16 -0
  267. package/dist/services/utils.cjs.map +1 -0
  268. package/dist/services/utils.d.cts +8 -0
  269. package/dist/services/utils.d.cts.map +1 -0
  270. package/dist/services/utils.d.mts +8 -0
  271. package/dist/services/utils.d.mts.map +1 -0
  272. package/dist/services/utils.mjs +12 -0
  273. package/dist/services/utils.mjs.map +1 -0
  274. package/dist/types/chart.cjs +42 -0
  275. package/dist/types/chart.cjs.map +1 -0
  276. package/dist/types/chart.d.cts +62 -0
  277. package/dist/types/chart.d.cts.map +1 -0
  278. package/dist/types/chart.d.mts +62 -0
  279. package/dist/types/chart.d.mts.map +1 -0
  280. package/dist/types/chart.mjs +39 -0
  281. package/dist/types/chart.mjs.map +1 -0
  282. package/dist/types/hyperliquid-types.cjs +3 -0
  283. package/dist/types/hyperliquid-types.cjs.map +1 -0
  284. package/dist/types/hyperliquid-types.d.cts +52 -0
  285. package/dist/types/hyperliquid-types.d.cts.map +1 -0
  286. package/dist/types/hyperliquid-types.d.mts +52 -0
  287. package/dist/types/hyperliquid-types.d.mts.map +1 -0
  288. package/dist/types/hyperliquid-types.mjs +2 -0
  289. package/dist/types/hyperliquid-types.mjs.map +1 -0
  290. package/dist/types/index.cjs +96 -0
  291. package/dist/types/index.cjs.map +1 -0
  292. package/dist/types/index.d.cts +1153 -0
  293. package/dist/types/index.d.cts.map +1 -0
  294. package/dist/types/index.d.mts +1153 -0
  295. package/dist/types/index.d.mts.map +1 -0
  296. package/dist/types/index.mjs +79 -0
  297. package/dist/types/index.mjs.map +1 -0
  298. package/dist/types/transactionTypes.cjs +28 -0
  299. package/dist/types/transactionTypes.cjs.map +1 -0
  300. package/dist/types/transactionTypes.d.cts +64 -0
  301. package/dist/types/transactionTypes.d.cts.map +1 -0
  302. package/dist/types/transactionTypes.d.mts +64 -0
  303. package/dist/types/transactionTypes.d.mts.map +1 -0
  304. package/dist/types/transactionTypes.mjs +23 -0
  305. package/dist/types/transactionTypes.mjs.map +1 -0
  306. package/dist/utils/accountUtils.cjs +65 -0
  307. package/dist/utils/accountUtils.cjs.map +1 -0
  308. package/dist/utils/accountUtils.d.cts +26 -0
  309. package/dist/utils/accountUtils.d.cts.map +1 -0
  310. package/dist/utils/accountUtils.d.mts +26 -0
  311. package/dist/utils/accountUtils.d.mts.map +1 -0
  312. package/dist/utils/accountUtils.mjs +61 -0
  313. package/dist/utils/accountUtils.mjs.map +1 -0
  314. package/dist/utils/amountConversion.cjs +61 -0
  315. package/dist/utils/amountConversion.cjs.map +1 -0
  316. package/dist/utils/amountConversion.d.cts +16 -0
  317. package/dist/utils/amountConversion.d.cts.map +1 -0
  318. package/dist/utils/amountConversion.d.mts +16 -0
  319. package/dist/utils/amountConversion.d.mts.map +1 -0
  320. package/dist/utils/amountConversion.mjs +54 -0
  321. package/dist/utils/amountConversion.mjs.map +1 -0
  322. package/dist/utils/chartUtils.cjs +98 -0
  323. package/dist/utils/chartUtils.cjs.map +1 -0
  324. package/dist/utils/chartUtils.d.cts +14 -0
  325. package/dist/utils/chartUtils.d.cts.map +1 -0
  326. package/dist/utils/chartUtils.d.mts +14 -0
  327. package/dist/utils/chartUtils.d.mts.map +1 -0
  328. package/dist/utils/chartUtils.mjs +94 -0
  329. package/dist/utils/chartUtils.mjs.map +1 -0
  330. package/dist/utils/errorUtils.cjs +22 -0
  331. package/dist/utils/errorUtils.cjs.map +1 -0
  332. package/dist/utils/errorUtils.d.cts +13 -0
  333. package/dist/utils/errorUtils.d.cts.map +1 -0
  334. package/dist/utils/errorUtils.d.mts +13 -0
  335. package/dist/utils/errorUtils.d.mts.map +1 -0
  336. package/dist/utils/errorUtils.mjs +18 -0
  337. package/dist/utils/errorUtils.mjs.map +1 -0
  338. package/dist/utils/formatUtils.cjs +987 -0
  339. package/dist/utils/formatUtils.cjs.map +1 -0
  340. package/dist/utils/formatUtils.d.cts +387 -0
  341. package/dist/utils/formatUtils.d.cts.map +1 -0
  342. package/dist/utils/formatUtils.d.mts +387 -0
  343. package/dist/utils/formatUtils.d.mts.map +1 -0
  344. package/dist/utils/formatUtils.mjs +966 -0
  345. package/dist/utils/formatUtils.mjs.map +1 -0
  346. package/dist/utils/hyperLiquidAdapter.cjs +454 -0
  347. package/dist/utils/hyperLiquidAdapter.cjs.map +1 -0
  348. package/dist/utils/hyperLiquidAdapter.d.cts +158 -0
  349. package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -0
  350. package/dist/utils/hyperLiquidAdapter.d.mts +158 -0
  351. package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -0
  352. package/dist/utils/hyperLiquidAdapter.mjs +439 -0
  353. package/dist/utils/hyperLiquidAdapter.mjs.map +1 -0
  354. package/dist/utils/hyperLiquidOrderBookProcessor.cjs +89 -0
  355. package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -0
  356. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +58 -0
  357. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -0
  358. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +58 -0
  359. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -0
  360. package/dist/utils/hyperLiquidOrderBookProcessor.mjs +84 -0
  361. package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +1 -0
  362. package/dist/utils/hyperLiquidValidation.cjs +426 -0
  363. package/dist/utils/hyperLiquidValidation.cjs.map +1 -0
  364. package/dist/utils/hyperLiquidValidation.d.cts +143 -0
  365. package/dist/utils/hyperLiquidValidation.d.cts.map +1 -0
  366. package/dist/utils/hyperLiquidValidation.d.mts +143 -0
  367. package/dist/utils/hyperLiquidValidation.d.mts.map +1 -0
  368. package/dist/utils/hyperLiquidValidation.mjs +413 -0
  369. package/dist/utils/hyperLiquidValidation.mjs.map +1 -0
  370. package/dist/utils/idUtils.cjs +50 -0
  371. package/dist/utils/idUtils.cjs.map +1 -0
  372. package/dist/utils/idUtils.d.cts +38 -0
  373. package/dist/utils/idUtils.d.cts.map +1 -0
  374. package/dist/utils/idUtils.d.mts +38 -0
  375. package/dist/utils/idUtils.d.mts.map +1 -0
  376. package/dist/utils/idUtils.mjs +42 -0
  377. package/dist/utils/idUtils.mjs.map +1 -0
  378. package/dist/utils/marginUtils.cjs +137 -0
  379. package/dist/utils/marginUtils.cjs.map +1 -0
  380. package/dist/utils/marginUtils.d.cts +64 -0
  381. package/dist/utils/marginUtils.d.cts.map +1 -0
  382. package/dist/utils/marginUtils.d.mts +64 -0
  383. package/dist/utils/marginUtils.d.mts.map +1 -0
  384. package/dist/utils/marginUtils.mjs +131 -0
  385. package/dist/utils/marginUtils.mjs.map +1 -0
  386. package/dist/utils/marketDataTransform.cjs +227 -0
  387. package/dist/utils/marketDataTransform.cjs.map +1 -0
  388. package/dist/utils/marketDataTransform.d.cts +45 -0
  389. package/dist/utils/marketDataTransform.d.cts.map +1 -0
  390. package/dist/utils/marketDataTransform.d.mts +45 -0
  391. package/dist/utils/marketDataTransform.d.mts.map +1 -0
  392. package/dist/utils/marketDataTransform.mjs +220 -0
  393. package/dist/utils/marketDataTransform.mjs.map +1 -0
  394. package/dist/utils/marketUtils.cjs +420 -0
  395. package/dist/utils/marketUtils.cjs.map +1 -0
  396. package/dist/utils/marketUtils.d.cts +227 -0
  397. package/dist/utils/marketUtils.d.cts.map +1 -0
  398. package/dist/utils/marketUtils.d.mts +227 -0
  399. package/dist/utils/marketUtils.d.mts.map +1 -0
  400. package/dist/utils/marketUtils.mjs +404 -0
  401. package/dist/utils/marketUtils.mjs.map +1 -0
  402. package/dist/utils/orderBookGrouping.cjs +151 -0
  403. package/dist/utils/orderBookGrouping.cjs.map +1 -0
  404. package/dist/utils/orderBookGrouping.d.cts +76 -0
  405. package/dist/utils/orderBookGrouping.d.cts.map +1 -0
  406. package/dist/utils/orderBookGrouping.d.mts +76 -0
  407. package/dist/utils/orderBookGrouping.d.mts.map +1 -0
  408. package/dist/utils/orderBookGrouping.mjs +143 -0
  409. package/dist/utils/orderBookGrouping.mjs.map +1 -0
  410. package/dist/utils/orderCalculations.cjs +283 -0
  411. package/dist/utils/orderCalculations.cjs.map +1 -0
  412. package/dist/utils/orderCalculations.d.cts +107 -0
  413. package/dist/utils/orderCalculations.d.cts.map +1 -0
  414. package/dist/utils/orderCalculations.d.mts +107 -0
  415. package/dist/utils/orderCalculations.d.mts.map +1 -0
  416. package/dist/utils/orderCalculations.mjs +274 -0
  417. package/dist/utils/orderCalculations.mjs.map +1 -0
  418. package/dist/utils/orderUtils.cjs +159 -0
  419. package/dist/utils/orderUtils.cjs.map +1 -0
  420. package/dist/utils/orderUtils.d.cts +66 -0
  421. package/dist/utils/orderUtils.d.cts.map +1 -0
  422. package/dist/utils/orderUtils.d.mts +66 -0
  423. package/dist/utils/orderUtils.d.mts.map +1 -0
  424. package/dist/utils/orderUtils.mjs +151 -0
  425. package/dist/utils/orderUtils.mjs.map +1 -0
  426. package/dist/utils/pnlCalculations.cjs +107 -0
  427. package/dist/utils/pnlCalculations.cjs.map +1 -0
  428. package/dist/utils/pnlCalculations.d.cts +79 -0
  429. package/dist/utils/pnlCalculations.d.cts.map +1 -0
  430. package/dist/utils/pnlCalculations.d.mts +79 -0
  431. package/dist/utils/pnlCalculations.d.mts.map +1 -0
  432. package/dist/utils/pnlCalculations.mjs +97 -0
  433. package/dist/utils/pnlCalculations.mjs.map +1 -0
  434. package/dist/utils/positionCalculations.cjs +176 -0
  435. package/dist/utils/positionCalculations.cjs.map +1 -0
  436. package/dist/utils/positionCalculations.d.cts +85 -0
  437. package/dist/utils/positionCalculations.d.cts.map +1 -0
  438. package/dist/utils/positionCalculations.d.mts +85 -0
  439. package/dist/utils/positionCalculations.d.mts.map +1 -0
  440. package/dist/utils/positionCalculations.mjs +165 -0
  441. package/dist/utils/positionCalculations.mjs.map +1 -0
  442. package/dist/utils/sortMarkets.cjs +88 -0
  443. package/dist/utils/sortMarkets.cjs.map +1 -0
  444. package/dist/utils/sortMarkets.d.cts +21 -0
  445. package/dist/utils/sortMarkets.d.cts.map +1 -0
  446. package/dist/utils/sortMarkets.d.mts +21 -0
  447. package/dist/utils/sortMarkets.d.mts.map +1 -0
  448. package/dist/utils/sortMarkets.mjs +84 -0
  449. package/dist/utils/sortMarkets.mjs.map +1 -0
  450. package/dist/utils/standaloneInfoClient.cjs +34 -0
  451. package/dist/utils/standaloneInfoClient.cjs.map +1 -0
  452. package/dist/utils/standaloneInfoClient.d.cts +31 -0
  453. package/dist/utils/standaloneInfoClient.d.cts.map +1 -0
  454. package/dist/utils/standaloneInfoClient.d.mts +31 -0
  455. package/dist/utils/standaloneInfoClient.d.mts.map +1 -0
  456. package/dist/utils/standaloneInfoClient.mjs +30 -0
  457. package/dist/utils/standaloneInfoClient.mjs.map +1 -0
  458. package/dist/utils/stringParseUtils.cjs +49 -0
  459. package/dist/utils/stringParseUtils.cjs.map +1 -0
  460. package/dist/utils/stringParseUtils.d.cts +35 -0
  461. package/dist/utils/stringParseUtils.d.cts.map +1 -0
  462. package/dist/utils/stringParseUtils.d.mts +35 -0
  463. package/dist/utils/stringParseUtils.d.mts.map +1 -0
  464. package/dist/utils/stringParseUtils.mjs +44 -0
  465. package/dist/utils/stringParseUtils.mjs.map +1 -0
  466. package/dist/utils/time.cjs +37 -0
  467. package/dist/utils/time.cjs.map +1 -0
  468. package/dist/utils/time.d.cts +17 -0
  469. package/dist/utils/time.d.cts.map +1 -0
  470. package/dist/utils/time.d.mts +17 -0
  471. package/dist/utils/time.d.mts.map +1 -0
  472. package/dist/utils/time.mjs +33 -0
  473. package/dist/utils/time.mjs.map +1 -0
  474. package/dist/utils/tpslValidation.cjs +505 -0
  475. package/dist/utils/tpslValidation.cjs.map +1 -0
  476. package/dist/utils/tpslValidation.d.cts +182 -0
  477. package/dist/utils/tpslValidation.d.cts.map +1 -0
  478. package/dist/utils/tpslValidation.d.mts +182 -0
  479. package/dist/utils/tpslValidation.d.mts.map +1 -0
  480. package/dist/utils/tpslValidation.mjs +482 -0
  481. package/dist/utils/tpslValidation.mjs.map +1 -0
  482. package/dist/utils/transactionUtils.cjs +36 -0
  483. package/dist/utils/transactionUtils.cjs.map +1 -0
  484. package/dist/utils/transactionUtils.d.cts +17 -0
  485. package/dist/utils/transactionUtils.d.cts.map +1 -0
  486. package/dist/utils/transactionUtils.d.mts +17 -0
  487. package/dist/utils/transactionUtils.d.mts.map +1 -0
  488. package/dist/utils/transactionUtils.mjs +32 -0
  489. package/dist/utils/transactionUtils.mjs.map +1 -0
  490. package/dist/utils/wait.cjs +12 -0
  491. package/dist/utils/wait.cjs.map +1 -0
  492. package/dist/utils/wait.d.cts +8 -0
  493. package/dist/utils/wait.d.cts.map +1 -0
  494. package/dist/utils/wait.d.mts +8 -0
  495. package/dist/utils/wait.d.mts.map +1 -0
  496. package/dist/utils/wait.mjs +8 -0
  497. package/dist/utils/wait.mjs.map +1 -0
  498. package/package.json +19 -4
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateNewLiquidationPrice = exports.calculateMaxRemovableMargin = exports.assessMarginRemovalRisk = void 0;
4
+ /**
5
+ * Margin adjustment calculation utilities
6
+ * Provides risk assessment and margin calculation functions for position management
7
+ */
8
+ const perpsConfig_1 = require("../constants/perpsConfig.cjs");
9
+ /**
10
+ * Assess liquidation risk after margin removal
11
+ * Compares new liquidation price against current market price to determine risk level
12
+ *
13
+ * @param params - New liquidation price, current market price, and position direction
14
+ * @returns Risk assessment with level (safe/warning/danger), price difference, and risk ratio
15
+ */
16
+ function assessMarginRemovalRisk(params) {
17
+ const { newLiquidationPrice, currentPrice, isLong } = params;
18
+ if (!newLiquidationPrice ||
19
+ !currentPrice ||
20
+ isNaN(newLiquidationPrice) ||
21
+ isNaN(currentPrice)) {
22
+ return { riskLevel: 'safe', priceDiff: 0, riskRatio: 0 };
23
+ }
24
+ // Calculate price difference based on position direction
25
+ // For long: current price should be above liquidation price
26
+ // For short: liquidation price should be above current price
27
+ const priceDiff = isLong
28
+ ? currentPrice - newLiquidationPrice
29
+ : newLiquidationPrice - currentPrice;
30
+ // Risk ratio: how far away is price from liquidation, relative to liquidation price
31
+ // Higher ratio = safer (price is far from liquidation)
32
+ // Lower ratio = riskier (price is close to liquidation)
33
+ const riskRatio = priceDiff / newLiquidationPrice;
34
+ let riskLevel;
35
+ if (riskRatio < perpsConfig_1.MARGIN_ADJUSTMENT_CONFIG.LiquidationRiskThreshold - 1) {
36
+ riskLevel = 'danger'; // <20% buffer - critical risk
37
+ }
38
+ else if (riskRatio <
39
+ perpsConfig_1.MARGIN_ADJUSTMENT_CONFIG.LiquidationWarningThreshold - 1) {
40
+ riskLevel = 'warning'; // <50% buffer - moderate risk
41
+ }
42
+ else {
43
+ riskLevel = 'safe'; // >=50% buffer - safe
44
+ }
45
+ return { riskLevel, priceDiff, riskRatio };
46
+ }
47
+ exports.assessMarginRemovalRisk = assessMarginRemovalRisk;
48
+ /**
49
+ * Calculate maximum margin that can be safely removed from a position
50
+ *
51
+ * HyperLiquid enforces: transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)
52
+ * See: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margin-and-pnl
53
+ * See also: docs/perps/hyperliquid/margining.md
54
+ *
55
+ * Key insight from Hyperliquid support (Xulian, Dec 6, 2025):
56
+ * "you need to account for initial margin for withdrawal, maintenance is what is needed to not be liquidated"
57
+ *
58
+ * The initial margin is calculated using the POSITION'S leverage (not the asset's max leverage).
59
+ * For example, a position opened at 10x leverage requires 10% initial margin,
60
+ * not 2% (which would be for 50x max leverage).
61
+ *
62
+ * @param params - Current margin, position size, prices, and position leverage
63
+ * @returns Maximum removable margin amount in USD
64
+ */
65
+ function calculateMaxRemovableMargin(params) {
66
+ const { currentMargin, positionSize, currentPrice, positionLeverage, notionalValue: providedNotionalValue, } = params;
67
+ // Validate inputs
68
+ if (isNaN(currentMargin) ||
69
+ isNaN(positionLeverage) ||
70
+ currentMargin <= 0 ||
71
+ positionLeverage <= 0) {
72
+ return 0;
73
+ }
74
+ // Use provided notional value (e.g., from position.positionValue) or calculate from price
75
+ // This allows immediate display before live prices load
76
+ let notionalValue = providedNotionalValue;
77
+ if (notionalValue === undefined ||
78
+ isNaN(notionalValue) ||
79
+ notionalValue <= 0) {
80
+ // Fall back to calculating from price if not provided or invalid
81
+ if (isNaN(positionSize) ||
82
+ isNaN(currentPrice) ||
83
+ positionSize <= 0 ||
84
+ currentPrice <= 0) {
85
+ return 0;
86
+ }
87
+ notionalValue = positionSize * currentPrice;
88
+ }
89
+ // Hyperliquid's transfer margin requirement formula:
90
+ // transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)
91
+ //
92
+ // IMPORTANT: Use the position's actual leverage, not the asset's max leverage
93
+ // A position at 10x leverage needs 10% initial margin ($100 for $1000 notional)
94
+ // NOT the 2% that 50x max leverage would imply
95
+ const initialMarginRequired = notionalValue / positionLeverage;
96
+ const tenPercentMargin = notionalValue * perpsConfig_1.MARGIN_ADJUSTMENT_CONFIG.MarginRemovalSafetyBuffer;
97
+ // Transfer margin required is the MAX of these two constraints
98
+ const transferMarginRequired = Math.max(initialMarginRequired, tenPercentMargin);
99
+ // Note: Unrealized PnL is NOT counted as part of "remaining margin" for withdrawals
100
+ // Per Hyperliquid docs, unrealized PnL helps prevent liquidation but doesn't
101
+ // increase your available withdrawal limit for margin transfers
102
+ // Maximum removable = current margin - required (must be non-negative)
103
+ return Math.max(0, currentMargin - transferMarginRequired);
104
+ }
105
+ exports.calculateMaxRemovableMargin = calculateMaxRemovableMargin;
106
+ /**
107
+ * Calculate new liquidation price after margin adjustment
108
+ * Estimates where the liquidation price will move based on margin change
109
+ * Note: This is a simplified calculation; actual liquidation price may vary based on protocol
110
+ *
111
+ * @param params - New margin amount, position size, entry price, direction, and current liquidation price
112
+ * @returns Estimated new liquidation price
113
+ */
114
+ function calculateNewLiquidationPrice(params) {
115
+ const { newMargin, positionSize, entryPrice, isLong, currentLiquidationPrice, } = params;
116
+ // Validate inputs
117
+ if (isNaN(newMargin) ||
118
+ isNaN(positionSize) ||
119
+ isNaN(entryPrice) ||
120
+ newMargin <= 0 ||
121
+ positionSize <= 0 ||
122
+ entryPrice <= 0) {
123
+ return currentLiquidationPrice; // Return current if invalid inputs
124
+ }
125
+ // Calculate margin per unit of position
126
+ const marginPerUnit = newMargin / positionSize;
127
+ // For long positions: liquidation price is below entry price
128
+ // liquidationPrice = entryPrice - marginPerUnit
129
+ // For short positions: liquidation price is above entry price
130
+ // liquidationPrice = entryPrice + marginPerUnit
131
+ if (isLong) {
132
+ return Math.max(0, entryPrice - marginPerUnit);
133
+ }
134
+ return entryPrice + marginPerUnit;
135
+ }
136
+ exports.calculateNewLiquidationPrice = calculateNewLiquidationPrice;
137
+ //# sourceMappingURL=marginUtils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marginUtils.cjs","sourceRoot":"","sources":["../../src/utils/marginUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Margin adjustment calculation utilities\n * Provides risk assessment and margin calculation functions for position management\n */\nimport { MARGIN_ADJUSTMENT_CONFIG } from '../constants/perpsConfig';\n\nexport type RiskLevel = 'safe' | 'warning' | 'danger';\n\nexport type MarginRiskAssessment = {\n riskLevel: RiskLevel;\n priceDiff: number;\n riskRatio: number;\n};\n\nexport type AssessMarginRemovalRiskParams = {\n newLiquidationPrice: number;\n currentPrice: number;\n isLong: boolean;\n};\n\nexport type CalculateMaxRemovableMarginParams = {\n currentMargin: number;\n positionSize: number;\n entryPrice: number;\n currentPrice: number;\n /** The actual leverage of the position (not the asset's max leverage) */\n positionLeverage: number;\n /** Optional pre-calculated notional value (e.g., from position.positionValue) for immediate display before live prices load */\n notionalValue?: number;\n};\n\nexport type CalculateNewLiquidationPriceParams = {\n newMargin: number;\n positionSize: number;\n entryPrice: number;\n isLong: boolean;\n currentLiquidationPrice: number;\n};\n\n/**\n * Assess liquidation risk after margin removal\n * Compares new liquidation price against current market price to determine risk level\n *\n * @param params - New liquidation price, current market price, and position direction\n * @returns Risk assessment with level (safe/warning/danger), price difference, and risk ratio\n */\nexport function assessMarginRemovalRisk(\n params: AssessMarginRemovalRiskParams,\n): MarginRiskAssessment {\n const { newLiquidationPrice, currentPrice, isLong } = params;\n\n if (\n !newLiquidationPrice ||\n !currentPrice ||\n isNaN(newLiquidationPrice) ||\n isNaN(currentPrice)\n ) {\n return { riskLevel: 'safe', priceDiff: 0, riskRatio: 0 };\n }\n\n // Calculate price difference based on position direction\n // For long: current price should be above liquidation price\n // For short: liquidation price should be above current price\n const priceDiff = isLong\n ? currentPrice - newLiquidationPrice\n : newLiquidationPrice - currentPrice;\n\n // Risk ratio: how far away is price from liquidation, relative to liquidation price\n // Higher ratio = safer (price is far from liquidation)\n // Lower ratio = riskier (price is close to liquidation)\n const riskRatio = priceDiff / newLiquidationPrice;\n\n let riskLevel: RiskLevel;\n if (riskRatio < MARGIN_ADJUSTMENT_CONFIG.LiquidationRiskThreshold - 1) {\n riskLevel = 'danger'; // <20% buffer - critical risk\n } else if (\n riskRatio <\n MARGIN_ADJUSTMENT_CONFIG.LiquidationWarningThreshold - 1\n ) {\n riskLevel = 'warning'; // <50% buffer - moderate risk\n } else {\n riskLevel = 'safe'; // >=50% buffer - safe\n }\n\n return { riskLevel, priceDiff, riskRatio };\n}\n\n/**\n * Calculate maximum margin that can be safely removed from a position\n *\n * HyperLiquid enforces: transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)\n * See: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margin-and-pnl\n * See also: docs/perps/hyperliquid/margining.md\n *\n * Key insight from Hyperliquid support (Xulian, Dec 6, 2025):\n * \"you need to account for initial margin for withdrawal, maintenance is what is needed to not be liquidated\"\n *\n * The initial margin is calculated using the POSITION'S leverage (not the asset's max leverage).\n * For example, a position opened at 10x leverage requires 10% initial margin,\n * not 2% (which would be for 50x max leverage).\n *\n * @param params - Current margin, position size, prices, and position leverage\n * @returns Maximum removable margin amount in USD\n */\nexport function calculateMaxRemovableMargin(\n params: CalculateMaxRemovableMarginParams,\n): number {\n const {\n currentMargin,\n positionSize,\n currentPrice,\n positionLeverage,\n notionalValue: providedNotionalValue,\n } = params;\n\n // Validate inputs\n if (\n isNaN(currentMargin) ||\n isNaN(positionLeverage) ||\n currentMargin <= 0 ||\n positionLeverage <= 0\n ) {\n return 0;\n }\n\n // Use provided notional value (e.g., from position.positionValue) or calculate from price\n // This allows immediate display before live prices load\n let notionalValue = providedNotionalValue;\n if (\n notionalValue === undefined ||\n isNaN(notionalValue) ||\n notionalValue <= 0\n ) {\n // Fall back to calculating from price if not provided or invalid\n if (\n isNaN(positionSize) ||\n isNaN(currentPrice) ||\n positionSize <= 0 ||\n currentPrice <= 0\n ) {\n return 0;\n }\n notionalValue = positionSize * currentPrice;\n }\n\n // Hyperliquid's transfer margin requirement formula:\n // transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)\n //\n // IMPORTANT: Use the position's actual leverage, not the asset's max leverage\n // A position at 10x leverage needs 10% initial margin ($100 for $1000 notional)\n // NOT the 2% that 50x max leverage would imply\n const initialMarginRequired = notionalValue / positionLeverage;\n const tenPercentMargin =\n notionalValue * MARGIN_ADJUSTMENT_CONFIG.MarginRemovalSafetyBuffer;\n\n // Transfer margin required is the MAX of these two constraints\n const transferMarginRequired = Math.max(\n initialMarginRequired,\n tenPercentMargin,\n );\n\n // Note: Unrealized PnL is NOT counted as part of \"remaining margin\" for withdrawals\n // Per Hyperliquid docs, unrealized PnL helps prevent liquidation but doesn't\n // increase your available withdrawal limit for margin transfers\n // Maximum removable = current margin - required (must be non-negative)\n return Math.max(0, currentMargin - transferMarginRequired);\n}\n\n/**\n * Calculate new liquidation price after margin adjustment\n * Estimates where the liquidation price will move based on margin change\n * Note: This is a simplified calculation; actual liquidation price may vary based on protocol\n *\n * @param params - New margin amount, position size, entry price, direction, and current liquidation price\n * @returns Estimated new liquidation price\n */\nexport function calculateNewLiquidationPrice(\n params: CalculateNewLiquidationPriceParams,\n): number {\n const {\n newMargin,\n positionSize,\n entryPrice,\n isLong,\n currentLiquidationPrice,\n } = params;\n\n // Validate inputs\n if (\n isNaN(newMargin) ||\n isNaN(positionSize) ||\n isNaN(entryPrice) ||\n newMargin <= 0 ||\n positionSize <= 0 ||\n entryPrice <= 0\n ) {\n return currentLiquidationPrice; // Return current if invalid inputs\n }\n\n // Calculate margin per unit of position\n const marginPerUnit = newMargin / positionSize;\n\n // For long positions: liquidation price is below entry price\n // liquidationPrice = entryPrice - marginPerUnit\n // For short positions: liquidation price is above entry price\n // liquidationPrice = entryPrice + marginPerUnit\n if (isLong) {\n return Math.max(0, entryPrice - marginPerUnit);\n }\n return entryPrice + marginPerUnit;\n}\n"]}
@@ -0,0 +1,64 @@
1
+ export type RiskLevel = 'safe' | 'warning' | 'danger';
2
+ export type MarginRiskAssessment = {
3
+ riskLevel: RiskLevel;
4
+ priceDiff: number;
5
+ riskRatio: number;
6
+ };
7
+ export type AssessMarginRemovalRiskParams = {
8
+ newLiquidationPrice: number;
9
+ currentPrice: number;
10
+ isLong: boolean;
11
+ };
12
+ export type CalculateMaxRemovableMarginParams = {
13
+ currentMargin: number;
14
+ positionSize: number;
15
+ entryPrice: number;
16
+ currentPrice: number;
17
+ /** The actual leverage of the position (not the asset's max leverage) */
18
+ positionLeverage: number;
19
+ /** Optional pre-calculated notional value (e.g., from position.positionValue) for immediate display before live prices load */
20
+ notionalValue?: number;
21
+ };
22
+ export type CalculateNewLiquidationPriceParams = {
23
+ newMargin: number;
24
+ positionSize: number;
25
+ entryPrice: number;
26
+ isLong: boolean;
27
+ currentLiquidationPrice: number;
28
+ };
29
+ /**
30
+ * Assess liquidation risk after margin removal
31
+ * Compares new liquidation price against current market price to determine risk level
32
+ *
33
+ * @param params - New liquidation price, current market price, and position direction
34
+ * @returns Risk assessment with level (safe/warning/danger), price difference, and risk ratio
35
+ */
36
+ export declare function assessMarginRemovalRisk(params: AssessMarginRemovalRiskParams): MarginRiskAssessment;
37
+ /**
38
+ * Calculate maximum margin that can be safely removed from a position
39
+ *
40
+ * HyperLiquid enforces: transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)
41
+ * See: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margin-and-pnl
42
+ * See also: docs/perps/hyperliquid/margining.md
43
+ *
44
+ * Key insight from Hyperliquid support (Xulian, Dec 6, 2025):
45
+ * "you need to account for initial margin for withdrawal, maintenance is what is needed to not be liquidated"
46
+ *
47
+ * The initial margin is calculated using the POSITION'S leverage (not the asset's max leverage).
48
+ * For example, a position opened at 10x leverage requires 10% initial margin,
49
+ * not 2% (which would be for 50x max leverage).
50
+ *
51
+ * @param params - Current margin, position size, prices, and position leverage
52
+ * @returns Maximum removable margin amount in USD
53
+ */
54
+ export declare function calculateMaxRemovableMargin(params: CalculateMaxRemovableMarginParams): number;
55
+ /**
56
+ * Calculate new liquidation price after margin adjustment
57
+ * Estimates where the liquidation price will move based on margin change
58
+ * Note: This is a simplified calculation; actual liquidation price may vary based on protocol
59
+ *
60
+ * @param params - New margin amount, position size, entry price, direction, and current liquidation price
61
+ * @returns Estimated new liquidation price
62
+ */
63
+ export declare function calculateNewLiquidationPrice(params: CalculateNewLiquidationPriceParams): number;
64
+ //# sourceMappingURL=marginUtils.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marginUtils.d.cts","sourceRoot":"","sources":["../../src/utils/marginUtils.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,+HAA+H;IAC/H,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,6BAA6B,GACpC,oBAAoB,CAqCtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,iCAAiC,GACxC,MAAM,CA4DR;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kCAAkC,GACzC,MAAM,CAgCR"}
@@ -0,0 +1,64 @@
1
+ export type RiskLevel = 'safe' | 'warning' | 'danger';
2
+ export type MarginRiskAssessment = {
3
+ riskLevel: RiskLevel;
4
+ priceDiff: number;
5
+ riskRatio: number;
6
+ };
7
+ export type AssessMarginRemovalRiskParams = {
8
+ newLiquidationPrice: number;
9
+ currentPrice: number;
10
+ isLong: boolean;
11
+ };
12
+ export type CalculateMaxRemovableMarginParams = {
13
+ currentMargin: number;
14
+ positionSize: number;
15
+ entryPrice: number;
16
+ currentPrice: number;
17
+ /** The actual leverage of the position (not the asset's max leverage) */
18
+ positionLeverage: number;
19
+ /** Optional pre-calculated notional value (e.g., from position.positionValue) for immediate display before live prices load */
20
+ notionalValue?: number;
21
+ };
22
+ export type CalculateNewLiquidationPriceParams = {
23
+ newMargin: number;
24
+ positionSize: number;
25
+ entryPrice: number;
26
+ isLong: boolean;
27
+ currentLiquidationPrice: number;
28
+ };
29
+ /**
30
+ * Assess liquidation risk after margin removal
31
+ * Compares new liquidation price against current market price to determine risk level
32
+ *
33
+ * @param params - New liquidation price, current market price, and position direction
34
+ * @returns Risk assessment with level (safe/warning/danger), price difference, and risk ratio
35
+ */
36
+ export declare function assessMarginRemovalRisk(params: AssessMarginRemovalRiskParams): MarginRiskAssessment;
37
+ /**
38
+ * Calculate maximum margin that can be safely removed from a position
39
+ *
40
+ * HyperLiquid enforces: transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)
41
+ * See: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margin-and-pnl
42
+ * See also: docs/perps/hyperliquid/margining.md
43
+ *
44
+ * Key insight from Hyperliquid support (Xulian, Dec 6, 2025):
45
+ * "you need to account for initial margin for withdrawal, maintenance is what is needed to not be liquidated"
46
+ *
47
+ * The initial margin is calculated using the POSITION'S leverage (not the asset's max leverage).
48
+ * For example, a position opened at 10x leverage requires 10% initial margin,
49
+ * not 2% (which would be for 50x max leverage).
50
+ *
51
+ * @param params - Current margin, position size, prices, and position leverage
52
+ * @returns Maximum removable margin amount in USD
53
+ */
54
+ export declare function calculateMaxRemovableMargin(params: CalculateMaxRemovableMarginParams): number;
55
+ /**
56
+ * Calculate new liquidation price after margin adjustment
57
+ * Estimates where the liquidation price will move based on margin change
58
+ * Note: This is a simplified calculation; actual liquidation price may vary based on protocol
59
+ *
60
+ * @param params - New margin amount, position size, entry price, direction, and current liquidation price
61
+ * @returns Estimated new liquidation price
62
+ */
63
+ export declare function calculateNewLiquidationPrice(params: CalculateNewLiquidationPriceParams): number;
64
+ //# sourceMappingURL=marginUtils.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marginUtils.d.mts","sourceRoot":"","sources":["../../src/utils/marginUtils.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG;IAC1C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,+HAA+H;IAC/H,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,6BAA6B,GACpC,oBAAoB,CAqCtB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,iCAAiC,GACxC,MAAM,CA4DR;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kCAAkC,GACzC,MAAM,CAgCR"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Margin adjustment calculation utilities
3
+ * Provides risk assessment and margin calculation functions for position management
4
+ */
5
+ import { MARGIN_ADJUSTMENT_CONFIG } from "../constants/perpsConfig.mjs";
6
+ /**
7
+ * Assess liquidation risk after margin removal
8
+ * Compares new liquidation price against current market price to determine risk level
9
+ *
10
+ * @param params - New liquidation price, current market price, and position direction
11
+ * @returns Risk assessment with level (safe/warning/danger), price difference, and risk ratio
12
+ */
13
+ export function assessMarginRemovalRisk(params) {
14
+ const { newLiquidationPrice, currentPrice, isLong } = params;
15
+ if (!newLiquidationPrice ||
16
+ !currentPrice ||
17
+ isNaN(newLiquidationPrice) ||
18
+ isNaN(currentPrice)) {
19
+ return { riskLevel: 'safe', priceDiff: 0, riskRatio: 0 };
20
+ }
21
+ // Calculate price difference based on position direction
22
+ // For long: current price should be above liquidation price
23
+ // For short: liquidation price should be above current price
24
+ const priceDiff = isLong
25
+ ? currentPrice - newLiquidationPrice
26
+ : newLiquidationPrice - currentPrice;
27
+ // Risk ratio: how far away is price from liquidation, relative to liquidation price
28
+ // Higher ratio = safer (price is far from liquidation)
29
+ // Lower ratio = riskier (price is close to liquidation)
30
+ const riskRatio = priceDiff / newLiquidationPrice;
31
+ let riskLevel;
32
+ if (riskRatio < MARGIN_ADJUSTMENT_CONFIG.LiquidationRiskThreshold - 1) {
33
+ riskLevel = 'danger'; // <20% buffer - critical risk
34
+ }
35
+ else if (riskRatio <
36
+ MARGIN_ADJUSTMENT_CONFIG.LiquidationWarningThreshold - 1) {
37
+ riskLevel = 'warning'; // <50% buffer - moderate risk
38
+ }
39
+ else {
40
+ riskLevel = 'safe'; // >=50% buffer - safe
41
+ }
42
+ return { riskLevel, priceDiff, riskRatio };
43
+ }
44
+ /**
45
+ * Calculate maximum margin that can be safely removed from a position
46
+ *
47
+ * HyperLiquid enforces: transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)
48
+ * See: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margin-and-pnl
49
+ * See also: docs/perps/hyperliquid/margining.md
50
+ *
51
+ * Key insight from Hyperliquid support (Xulian, Dec 6, 2025):
52
+ * "you need to account for initial margin for withdrawal, maintenance is what is needed to not be liquidated"
53
+ *
54
+ * The initial margin is calculated using the POSITION'S leverage (not the asset's max leverage).
55
+ * For example, a position opened at 10x leverage requires 10% initial margin,
56
+ * not 2% (which would be for 50x max leverage).
57
+ *
58
+ * @param params - Current margin, position size, prices, and position leverage
59
+ * @returns Maximum removable margin amount in USD
60
+ */
61
+ export function calculateMaxRemovableMargin(params) {
62
+ const { currentMargin, positionSize, currentPrice, positionLeverage, notionalValue: providedNotionalValue, } = params;
63
+ // Validate inputs
64
+ if (isNaN(currentMargin) ||
65
+ isNaN(positionLeverage) ||
66
+ currentMargin <= 0 ||
67
+ positionLeverage <= 0) {
68
+ return 0;
69
+ }
70
+ // Use provided notional value (e.g., from position.positionValue) or calculate from price
71
+ // This allows immediate display before live prices load
72
+ let notionalValue = providedNotionalValue;
73
+ if (notionalValue === undefined ||
74
+ isNaN(notionalValue) ||
75
+ notionalValue <= 0) {
76
+ // Fall back to calculating from price if not provided or invalid
77
+ if (isNaN(positionSize) ||
78
+ isNaN(currentPrice) ||
79
+ positionSize <= 0 ||
80
+ currentPrice <= 0) {
81
+ return 0;
82
+ }
83
+ notionalValue = positionSize * currentPrice;
84
+ }
85
+ // Hyperliquid's transfer margin requirement formula:
86
+ // transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)
87
+ //
88
+ // IMPORTANT: Use the position's actual leverage, not the asset's max leverage
89
+ // A position at 10x leverage needs 10% initial margin ($100 for $1000 notional)
90
+ // NOT the 2% that 50x max leverage would imply
91
+ const initialMarginRequired = notionalValue / positionLeverage;
92
+ const tenPercentMargin = notionalValue * MARGIN_ADJUSTMENT_CONFIG.MarginRemovalSafetyBuffer;
93
+ // Transfer margin required is the MAX of these two constraints
94
+ const transferMarginRequired = Math.max(initialMarginRequired, tenPercentMargin);
95
+ // Note: Unrealized PnL is NOT counted as part of "remaining margin" for withdrawals
96
+ // Per Hyperliquid docs, unrealized PnL helps prevent liquidation but doesn't
97
+ // increase your available withdrawal limit for margin transfers
98
+ // Maximum removable = current margin - required (must be non-negative)
99
+ return Math.max(0, currentMargin - transferMarginRequired);
100
+ }
101
+ /**
102
+ * Calculate new liquidation price after margin adjustment
103
+ * Estimates where the liquidation price will move based on margin change
104
+ * Note: This is a simplified calculation; actual liquidation price may vary based on protocol
105
+ *
106
+ * @param params - New margin amount, position size, entry price, direction, and current liquidation price
107
+ * @returns Estimated new liquidation price
108
+ */
109
+ export function calculateNewLiquidationPrice(params) {
110
+ const { newMargin, positionSize, entryPrice, isLong, currentLiquidationPrice, } = params;
111
+ // Validate inputs
112
+ if (isNaN(newMargin) ||
113
+ isNaN(positionSize) ||
114
+ isNaN(entryPrice) ||
115
+ newMargin <= 0 ||
116
+ positionSize <= 0 ||
117
+ entryPrice <= 0) {
118
+ return currentLiquidationPrice; // Return current if invalid inputs
119
+ }
120
+ // Calculate margin per unit of position
121
+ const marginPerUnit = newMargin / positionSize;
122
+ // For long positions: liquidation price is below entry price
123
+ // liquidationPrice = entryPrice - marginPerUnit
124
+ // For short positions: liquidation price is above entry price
125
+ // liquidationPrice = entryPrice + marginPerUnit
126
+ if (isLong) {
127
+ return Math.max(0, entryPrice - marginPerUnit);
128
+ }
129
+ return entryPrice + marginPerUnit;
130
+ }
131
+ //# sourceMappingURL=marginUtils.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marginUtils.mjs","sourceRoot":"","sources":["../../src/utils/marginUtils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Margin adjustment calculation utilities\n * Provides risk assessment and margin calculation functions for position management\n */\nimport { MARGIN_ADJUSTMENT_CONFIG } from '../constants/perpsConfig';\n\nexport type RiskLevel = 'safe' | 'warning' | 'danger';\n\nexport type MarginRiskAssessment = {\n riskLevel: RiskLevel;\n priceDiff: number;\n riskRatio: number;\n};\n\nexport type AssessMarginRemovalRiskParams = {\n newLiquidationPrice: number;\n currentPrice: number;\n isLong: boolean;\n};\n\nexport type CalculateMaxRemovableMarginParams = {\n currentMargin: number;\n positionSize: number;\n entryPrice: number;\n currentPrice: number;\n /** The actual leverage of the position (not the asset's max leverage) */\n positionLeverage: number;\n /** Optional pre-calculated notional value (e.g., from position.positionValue) for immediate display before live prices load */\n notionalValue?: number;\n};\n\nexport type CalculateNewLiquidationPriceParams = {\n newMargin: number;\n positionSize: number;\n entryPrice: number;\n isLong: boolean;\n currentLiquidationPrice: number;\n};\n\n/**\n * Assess liquidation risk after margin removal\n * Compares new liquidation price against current market price to determine risk level\n *\n * @param params - New liquidation price, current market price, and position direction\n * @returns Risk assessment with level (safe/warning/danger), price difference, and risk ratio\n */\nexport function assessMarginRemovalRisk(\n params: AssessMarginRemovalRiskParams,\n): MarginRiskAssessment {\n const { newLiquidationPrice, currentPrice, isLong } = params;\n\n if (\n !newLiquidationPrice ||\n !currentPrice ||\n isNaN(newLiquidationPrice) ||\n isNaN(currentPrice)\n ) {\n return { riskLevel: 'safe', priceDiff: 0, riskRatio: 0 };\n }\n\n // Calculate price difference based on position direction\n // For long: current price should be above liquidation price\n // For short: liquidation price should be above current price\n const priceDiff = isLong\n ? currentPrice - newLiquidationPrice\n : newLiquidationPrice - currentPrice;\n\n // Risk ratio: how far away is price from liquidation, relative to liquidation price\n // Higher ratio = safer (price is far from liquidation)\n // Lower ratio = riskier (price is close to liquidation)\n const riskRatio = priceDiff / newLiquidationPrice;\n\n let riskLevel: RiskLevel;\n if (riskRatio < MARGIN_ADJUSTMENT_CONFIG.LiquidationRiskThreshold - 1) {\n riskLevel = 'danger'; // <20% buffer - critical risk\n } else if (\n riskRatio <\n MARGIN_ADJUSTMENT_CONFIG.LiquidationWarningThreshold - 1\n ) {\n riskLevel = 'warning'; // <50% buffer - moderate risk\n } else {\n riskLevel = 'safe'; // >=50% buffer - safe\n }\n\n return { riskLevel, priceDiff, riskRatio };\n}\n\n/**\n * Calculate maximum margin that can be safely removed from a position\n *\n * HyperLiquid enforces: transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)\n * See: https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margin-and-pnl\n * See also: docs/perps/hyperliquid/margining.md\n *\n * Key insight from Hyperliquid support (Xulian, Dec 6, 2025):\n * \"you need to account for initial margin for withdrawal, maintenance is what is needed to not be liquidated\"\n *\n * The initial margin is calculated using the POSITION'S leverage (not the asset's max leverage).\n * For example, a position opened at 10x leverage requires 10% initial margin,\n * not 2% (which would be for 50x max leverage).\n *\n * @param params - Current margin, position size, prices, and position leverage\n * @returns Maximum removable margin amount in USD\n */\nexport function calculateMaxRemovableMargin(\n params: CalculateMaxRemovableMarginParams,\n): number {\n const {\n currentMargin,\n positionSize,\n currentPrice,\n positionLeverage,\n notionalValue: providedNotionalValue,\n } = params;\n\n // Validate inputs\n if (\n isNaN(currentMargin) ||\n isNaN(positionLeverage) ||\n currentMargin <= 0 ||\n positionLeverage <= 0\n ) {\n return 0;\n }\n\n // Use provided notional value (e.g., from position.positionValue) or calculate from price\n // This allows immediate display before live prices load\n let notionalValue = providedNotionalValue;\n if (\n notionalValue === undefined ||\n isNaN(notionalValue) ||\n notionalValue <= 0\n ) {\n // Fall back to calculating from price if not provided or invalid\n if (\n isNaN(positionSize) ||\n isNaN(currentPrice) ||\n positionSize <= 0 ||\n currentPrice <= 0\n ) {\n return 0;\n }\n notionalValue = positionSize * currentPrice;\n }\n\n // Hyperliquid's transfer margin requirement formula:\n // transfer_margin_required = max(initial_margin_required, 0.1 * total_position_value)\n //\n // IMPORTANT: Use the position's actual leverage, not the asset's max leverage\n // A position at 10x leverage needs 10% initial margin ($100 for $1000 notional)\n // NOT the 2% that 50x max leverage would imply\n const initialMarginRequired = notionalValue / positionLeverage;\n const tenPercentMargin =\n notionalValue * MARGIN_ADJUSTMENT_CONFIG.MarginRemovalSafetyBuffer;\n\n // Transfer margin required is the MAX of these two constraints\n const transferMarginRequired = Math.max(\n initialMarginRequired,\n tenPercentMargin,\n );\n\n // Note: Unrealized PnL is NOT counted as part of \"remaining margin\" for withdrawals\n // Per Hyperliquid docs, unrealized PnL helps prevent liquidation but doesn't\n // increase your available withdrawal limit for margin transfers\n // Maximum removable = current margin - required (must be non-negative)\n return Math.max(0, currentMargin - transferMarginRequired);\n}\n\n/**\n * Calculate new liquidation price after margin adjustment\n * Estimates where the liquidation price will move based on margin change\n * Note: This is a simplified calculation; actual liquidation price may vary based on protocol\n *\n * @param params - New margin amount, position size, entry price, direction, and current liquidation price\n * @returns Estimated new liquidation price\n */\nexport function calculateNewLiquidationPrice(\n params: CalculateNewLiquidationPriceParams,\n): number {\n const {\n newMargin,\n positionSize,\n entryPrice,\n isLong,\n currentLiquidationPrice,\n } = params;\n\n // Validate inputs\n if (\n isNaN(newMargin) ||\n isNaN(positionSize) ||\n isNaN(entryPrice) ||\n newMargin <= 0 ||\n positionSize <= 0 ||\n entryPrice <= 0\n ) {\n return currentLiquidationPrice; // Return current if invalid inputs\n }\n\n // Calculate margin per unit of position\n const marginPerUnit = newMargin / positionSize;\n\n // For long positions: liquidation price is below entry price\n // liquidationPrice = entryPrice - marginPerUnit\n // For short positions: liquidation price is above entry price\n // liquidationPrice = entryPrice + marginPerUnit\n if (isLong) {\n return Math.max(0, entryPrice - marginPerUnit);\n }\n return entryPrice + marginPerUnit;\n}\n"]}