@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,107 @@
1
+ import type { PerpsDebugLogger } from "../types/index.cjs";
2
+ import type { SDKOrderParams } from "../types/hyperliquid-types.cjs";
3
+ /**
4
+ * Optional debug logger for order calculation functions.
5
+ * When provided, enables detailed logging for debugging.
6
+ */
7
+ export type OrderCalculationsDebugLogger = PerpsDebugLogger | undefined;
8
+ type PositionSizeParams = {
9
+ amount: string;
10
+ price: number;
11
+ szDecimals: number;
12
+ };
13
+ type MarginRequiredParams = {
14
+ amount: string;
15
+ leverage: number;
16
+ };
17
+ type MaxAllowedAmountParams = {
18
+ availableBalance: number;
19
+ assetPrice: number;
20
+ assetSzDecimals: number;
21
+ leverage: number;
22
+ };
23
+ export type CalculateFinalPositionSizeParams = {
24
+ usdAmount?: string;
25
+ size?: string;
26
+ currentPrice: number;
27
+ priceAtCalculation?: number;
28
+ maxSlippageBps?: number;
29
+ szDecimals: number;
30
+ leverage?: number;
31
+ debugLogger?: OrderCalculationsDebugLogger;
32
+ };
33
+ export type CalculateFinalPositionSizeResult = {
34
+ finalPositionSize: number;
35
+ };
36
+ export type CalculateOrderPriceAndSizeParams = {
37
+ orderType: 'market' | 'limit';
38
+ isBuy: boolean;
39
+ finalPositionSize: number;
40
+ currentPrice: number;
41
+ limitPrice?: string;
42
+ slippage?: number;
43
+ szDecimals: number;
44
+ };
45
+ export type CalculateOrderPriceAndSizeResult = {
46
+ orderPrice: number;
47
+ formattedSize: string;
48
+ formattedPrice: string;
49
+ };
50
+ export type BuildOrdersArrayParams = {
51
+ assetId: number;
52
+ isBuy: boolean;
53
+ formattedPrice: string;
54
+ formattedSize: string;
55
+ reduceOnly: boolean;
56
+ orderType: 'market' | 'limit';
57
+ clientOrderId?: string;
58
+ takeProfitPrice?: string;
59
+ stopLossPrice?: string;
60
+ szDecimals: number;
61
+ grouping?: 'na' | 'normalTpsl' | 'positionTpsl';
62
+ };
63
+ export type BuildOrdersArrayResult = {
64
+ orders: SDKOrderParams[];
65
+ grouping: 'na' | 'normalTpsl' | 'positionTpsl';
66
+ };
67
+ /**
68
+ * Calculate position size based on USD amount and asset price
69
+ *
70
+ * @param params - Amount in USD, current asset price, and required decimal precision
71
+ * @returns Position size formatted to the asset's decimal precision
72
+ */
73
+ export declare function calculatePositionSize(params: PositionSizeParams): string;
74
+ /**
75
+ * Calculate margin required for a position
76
+ *
77
+ * @param params - Position amount and leverage
78
+ * @returns Margin required formatted to 2 decimal places
79
+ */
80
+ export declare function calculateMarginRequired(params: MarginRequiredParams): string;
81
+ export declare function getMaxAllowedAmount(params: MaxAllowedAmountParams): number;
82
+ /**
83
+ * Calculates final position size using USD as source of truth with price validation
84
+ *
85
+ * This function implements the hybrid approach where USD is the source of truth,
86
+ * but includes price staleness validation and proper rounding to prevent precision loss.
87
+ *
88
+ * @param params - USD amount, size, prices, and configuration
89
+ * @returns Final position size as a number
90
+ */
91
+ export declare function calculateFinalPositionSize(params: CalculateFinalPositionSizeParams): CalculateFinalPositionSizeResult;
92
+ /**
93
+ * Calculates order price and formatted size based on order type
94
+ *
95
+ * @param params - Order parameters including type, direction, size, and prices
96
+ * @returns Formatted order price, size, and price string
97
+ */
98
+ export declare function calculateOrderPriceAndSize(params: CalculateOrderPriceAndSizeParams): CalculateOrderPriceAndSizeResult;
99
+ /**
100
+ * Builds orders array including main order and optional TP/SL orders
101
+ *
102
+ * @param params - Order construction parameters
103
+ * @returns Array of SDK order params and grouping type
104
+ */
105
+ export declare function buildOrdersArray(params: BuildOrdersArrayParams): BuildOrdersArrayResult;
106
+ export {};
107
+ //# sourceMappingURL=orderCalculations.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderCalculations.d.cts","sourceRoot":"","sources":["../../src/utils/orderCalculations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import type { PerpsDebugLogger } from "../types/index.mjs";
2
+ import type { SDKOrderParams } from "../types/hyperliquid-types.mjs";
3
+ /**
4
+ * Optional debug logger for order calculation functions.
5
+ * When provided, enables detailed logging for debugging.
6
+ */
7
+ export type OrderCalculationsDebugLogger = PerpsDebugLogger | undefined;
8
+ type PositionSizeParams = {
9
+ amount: string;
10
+ price: number;
11
+ szDecimals: number;
12
+ };
13
+ type MarginRequiredParams = {
14
+ amount: string;
15
+ leverage: number;
16
+ };
17
+ type MaxAllowedAmountParams = {
18
+ availableBalance: number;
19
+ assetPrice: number;
20
+ assetSzDecimals: number;
21
+ leverage: number;
22
+ };
23
+ export type CalculateFinalPositionSizeParams = {
24
+ usdAmount?: string;
25
+ size?: string;
26
+ currentPrice: number;
27
+ priceAtCalculation?: number;
28
+ maxSlippageBps?: number;
29
+ szDecimals: number;
30
+ leverage?: number;
31
+ debugLogger?: OrderCalculationsDebugLogger;
32
+ };
33
+ export type CalculateFinalPositionSizeResult = {
34
+ finalPositionSize: number;
35
+ };
36
+ export type CalculateOrderPriceAndSizeParams = {
37
+ orderType: 'market' | 'limit';
38
+ isBuy: boolean;
39
+ finalPositionSize: number;
40
+ currentPrice: number;
41
+ limitPrice?: string;
42
+ slippage?: number;
43
+ szDecimals: number;
44
+ };
45
+ export type CalculateOrderPriceAndSizeResult = {
46
+ orderPrice: number;
47
+ formattedSize: string;
48
+ formattedPrice: string;
49
+ };
50
+ export type BuildOrdersArrayParams = {
51
+ assetId: number;
52
+ isBuy: boolean;
53
+ formattedPrice: string;
54
+ formattedSize: string;
55
+ reduceOnly: boolean;
56
+ orderType: 'market' | 'limit';
57
+ clientOrderId?: string;
58
+ takeProfitPrice?: string;
59
+ stopLossPrice?: string;
60
+ szDecimals: number;
61
+ grouping?: 'na' | 'normalTpsl' | 'positionTpsl';
62
+ };
63
+ export type BuildOrdersArrayResult = {
64
+ orders: SDKOrderParams[];
65
+ grouping: 'na' | 'normalTpsl' | 'positionTpsl';
66
+ };
67
+ /**
68
+ * Calculate position size based on USD amount and asset price
69
+ *
70
+ * @param params - Amount in USD, current asset price, and required decimal precision
71
+ * @returns Position size formatted to the asset's decimal precision
72
+ */
73
+ export declare function calculatePositionSize(params: PositionSizeParams): string;
74
+ /**
75
+ * Calculate margin required for a position
76
+ *
77
+ * @param params - Position amount and leverage
78
+ * @returns Margin required formatted to 2 decimal places
79
+ */
80
+ export declare function calculateMarginRequired(params: MarginRequiredParams): string;
81
+ export declare function getMaxAllowedAmount(params: MaxAllowedAmountParams): number;
82
+ /**
83
+ * Calculates final position size using USD as source of truth with price validation
84
+ *
85
+ * This function implements the hybrid approach where USD is the source of truth,
86
+ * but includes price staleness validation and proper rounding to prevent precision loss.
87
+ *
88
+ * @param params - USD amount, size, prices, and configuration
89
+ * @returns Final position size as a number
90
+ */
91
+ export declare function calculateFinalPositionSize(params: CalculateFinalPositionSizeParams): CalculateFinalPositionSizeResult;
92
+ /**
93
+ * Calculates order price and formatted size based on order type
94
+ *
95
+ * @param params - Order parameters including type, direction, size, and prices
96
+ * @returns Formatted order price, size, and price string
97
+ */
98
+ export declare function calculateOrderPriceAndSize(params: CalculateOrderPriceAndSizeParams): CalculateOrderPriceAndSizeResult;
99
+ /**
100
+ * Builds orders array including main order and optional TP/SL orders
101
+ *
102
+ * @param params - Order construction parameters
103
+ * @returns Array of SDK order params and grouping type
104
+ */
105
+ export declare function buildOrdersArray(params: BuildOrdersArrayParams): BuildOrdersArrayResult;
106
+ export {};
107
+ //# sourceMappingURL=orderCalculations.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderCalculations.d.mts","sourceRoot":"","sources":["../../src/utils/orderCalculations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,274 @@
1
+ import { formatHyperLiquidPrice, formatHyperLiquidSize } from "./hyperLiquidAdapter.mjs";
2
+ import { ORDER_SLIPPAGE_CONFIG } from "../constants/perpsConfig.mjs";
3
+ import { PERPS_ERROR_CODES } from "../constants/perpsErrorCodes.mjs";
4
+ /**
5
+ * Calculate position size based on USD amount and asset price
6
+ *
7
+ * @param params - Amount in USD, current asset price, and required decimal precision
8
+ * @returns Position size formatted to the asset's decimal precision
9
+ */
10
+ export function calculatePositionSize(params) {
11
+ const { amount, price, szDecimals } = params;
12
+ // Validate required parameters
13
+ if (szDecimals === undefined || szDecimals === null) {
14
+ throw new Error('szDecimals is required for position size calculation');
15
+ }
16
+ if (szDecimals < 0) {
17
+ throw new Error(`szDecimals must be >= 0, got: ${szDecimals}`);
18
+ }
19
+ const amountNum = parseFloat(amount || '0');
20
+ if (isNaN(amountNum) || isNaN(price) || amountNum === 0 || price === 0) {
21
+ return (0).toFixed(szDecimals);
22
+ }
23
+ const positionSize = amountNum / price;
24
+ const multiplier = Math.pow(10, szDecimals);
25
+ let rounded = Math.round(positionSize * multiplier) / multiplier;
26
+ // Ensure rounded size meets requested USD (fix validation gap)
27
+ const actualUsd = rounded * price;
28
+ if (actualUsd < amountNum) {
29
+ rounded += 1 / multiplier;
30
+ }
31
+ return rounded.toFixed(szDecimals);
32
+ }
33
+ /**
34
+ * Calculate margin required for a position
35
+ *
36
+ * @param params - Position amount and leverage
37
+ * @returns Margin required formatted to 2 decimal places
38
+ */
39
+ export function calculateMarginRequired(params) {
40
+ const { amount, leverage } = params;
41
+ const amountNum = parseFloat(amount || '0');
42
+ if (isNaN(amountNum) ||
43
+ isNaN(leverage) ||
44
+ amountNum === 0 ||
45
+ leverage === 0) {
46
+ return '0.00';
47
+ }
48
+ return (amountNum / leverage).toFixed(2);
49
+ }
50
+ export function getMaxAllowedAmount(params) {
51
+ const { availableBalance, assetPrice, assetSzDecimals, leverage } = params;
52
+ if (availableBalance === 0 || !assetPrice || assetSzDecimals === undefined) {
53
+ return 0;
54
+ }
55
+ // The theoretical maximum is simply availableBalance * leverage
56
+ const theoreticalMax = availableBalance * leverage;
57
+ // But we need to account for position size rounding
58
+ // Find the largest whole dollar amount that fits within this limit
59
+ let maxAmount = Math.floor(theoreticalMax);
60
+ // Verify this amount doesn't exceed available balance after rounding
61
+ const testPositionSize = calculatePositionSize({
62
+ amount: maxAmount.toString(),
63
+ price: assetPrice,
64
+ szDecimals: assetSzDecimals,
65
+ });
66
+ const actualNotionalValue = parseFloat(testPositionSize) * assetPrice;
67
+ const requiredMargin = actualNotionalValue / leverage;
68
+ // If rounding caused us to exceed available balance, step down by one position increment
69
+ if (requiredMargin > availableBalance) {
70
+ const minPositionSizeIncrement = 1 / Math.pow(10, assetSzDecimals);
71
+ const positionSizeIncrementUsd = Math.ceil(minPositionSizeIncrement * assetPrice);
72
+ maxAmount -= positionSizeIncrementUsd;
73
+ }
74
+ return Math.max(0, maxAmount);
75
+ }
76
+ /**
77
+ * Calculates final position size using USD as source of truth with price validation
78
+ *
79
+ * This function implements the hybrid approach where USD is the source of truth,
80
+ * but includes price staleness validation and proper rounding to prevent precision loss.
81
+ *
82
+ * @param params - USD amount, size, prices, and configuration
83
+ * @returns Final position size as a number
84
+ */
85
+ export function calculateFinalPositionSize(params) {
86
+ const { usdAmount, size, currentPrice, priceAtCalculation, maxSlippageBps, szDecimals, leverage, debugLogger, } = params;
87
+ let finalPositionSize;
88
+ if (usdAmount && parseFloat(usdAmount) > 0) {
89
+ // USD amount provided - use it as source of truth
90
+ const usdValue = parseFloat(usdAmount);
91
+ // 1. Validate price staleness if priceAtCalculation provided
92
+ if (priceAtCalculation) {
93
+ const priceDeltaBps = Math.abs(((currentPrice - priceAtCalculation) / priceAtCalculation) * 10000);
94
+ const maxSlippageBpsValue = maxSlippageBps ?? ORDER_SLIPPAGE_CONFIG.DefaultMarketSlippageBps;
95
+ if (priceDeltaBps > maxSlippageBpsValue) {
96
+ throw new Error(`Price moved too much: ${priceDeltaBps.toFixed(0)} bps (max: ${maxSlippageBpsValue} bps). ` +
97
+ `Expected: ${priceAtCalculation.toFixed(2)}, Current: ${currentPrice.toFixed(2)}`);
98
+ }
99
+ debugLogger?.log('Price validation passed:', {
100
+ priceAtCalculation,
101
+ currentPrice,
102
+ deltaBps: priceDeltaBps.toFixed(2),
103
+ maxSlippageBps: maxSlippageBpsValue,
104
+ });
105
+ }
106
+ // 2. Recalculate position size with fresh price
107
+ finalPositionSize = usdValue / currentPrice;
108
+ // 3. Apply size decimals rounding
109
+ const multiplier = Math.pow(10, szDecimals);
110
+ finalPositionSize = Math.round(finalPositionSize * multiplier) / multiplier;
111
+ // 4. Ensure rounded size meets requested USD (fix validation gap)
112
+ let actualNotionalValue = finalPositionSize * currentPrice;
113
+ if (actualNotionalValue < usdValue) {
114
+ // Add 1 minimum increment to meet requested USD
115
+ finalPositionSize += 1 / multiplier;
116
+ actualNotionalValue = finalPositionSize * currentPrice;
117
+ debugLogger?.log('Position size adjusted to meet USD minimum:', {
118
+ requestedUsd: usdValue,
119
+ beforeAdjustment: finalPositionSize - 1 / multiplier,
120
+ afterAdjustment: finalPositionSize,
121
+ actualUsd: actualNotionalValue,
122
+ });
123
+ }
124
+ const requiredMargin = actualNotionalValue / (leverage ?? 1);
125
+ // Log if rounding caused significant difference
126
+ const usdDifference = Math.abs(actualNotionalValue - usdValue);
127
+ if (usdDifference > 0.01) {
128
+ debugLogger?.log('Position size rounding caused USD difference (acceptable):', {
129
+ requestedUsd: usdValue,
130
+ actualUsd: actualNotionalValue,
131
+ difference: usdDifference,
132
+ positionSize: finalPositionSize,
133
+ });
134
+ }
135
+ debugLogger?.log('Recalculated position size with fresh price:', {
136
+ usdAmount: usdValue,
137
+ priceAtCalculation,
138
+ currentPrice,
139
+ originalSize: size,
140
+ recalculatedSize: finalPositionSize,
141
+ requiredMargin,
142
+ minIncrement: 1 / multiplier,
143
+ });
144
+ }
145
+ else {
146
+ // Legacy: Use provided size (backward compatibility)
147
+ finalPositionSize = parseFloat(size ?? '0');
148
+ debugLogger?.log('Using legacy size calculation (no USD amount provided):', {
149
+ providedSize: size,
150
+ finalSize: finalPositionSize,
151
+ });
152
+ }
153
+ return { finalPositionSize };
154
+ }
155
+ /**
156
+ * Calculates order price and formatted size based on order type
157
+ *
158
+ * @param params - Order parameters including type, direction, size, and prices
159
+ * @returns Formatted order price, size, and price string
160
+ */
161
+ export function calculateOrderPriceAndSize(params) {
162
+ const { orderType, isBuy, finalPositionSize, currentPrice, limitPrice, slippage, szDecimals, } = params;
163
+ let orderPrice;
164
+ let formattedSize;
165
+ if (orderType === 'market') {
166
+ // Market orders: add slippage (3% conservative default)
167
+ const slippageValue = slippage ?? ORDER_SLIPPAGE_CONFIG.DefaultMarketSlippageBps / 10000;
168
+ orderPrice = isBuy
169
+ ? currentPrice * (1 + slippageValue)
170
+ : currentPrice * (1 - slippageValue);
171
+ formattedSize = formatHyperLiquidSize({
172
+ size: finalPositionSize,
173
+ szDecimals,
174
+ });
175
+ }
176
+ else {
177
+ // Limit orders: use provided price (no slippage applied)
178
+ if (!limitPrice) {
179
+ throw new Error(PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED);
180
+ }
181
+ orderPrice = parseFloat(limitPrice);
182
+ formattedSize = formatHyperLiquidSize({
183
+ size: finalPositionSize,
184
+ szDecimals,
185
+ });
186
+ }
187
+ const formattedPrice = formatHyperLiquidPrice({
188
+ price: orderPrice,
189
+ szDecimals,
190
+ });
191
+ return { orderPrice, formattedSize, formattedPrice };
192
+ }
193
+ /**
194
+ * Builds orders array including main order and optional TP/SL orders
195
+ *
196
+ * @param params - Order construction parameters
197
+ * @returns Array of SDK order params and grouping type
198
+ */
199
+ export function buildOrdersArray(params) {
200
+ const { assetId, isBuy, formattedPrice, formattedSize, reduceOnly, orderType, clientOrderId, takeProfitPrice, stopLossPrice, szDecimals, grouping, } = params;
201
+ const orders = [];
202
+ // 1. Main order
203
+ const mainOrder = {
204
+ a: assetId,
205
+ b: isBuy,
206
+ p: formattedPrice,
207
+ s: formattedSize,
208
+ r: reduceOnly || false,
209
+ t: orderType === 'limit'
210
+ ? { limit: { tif: 'Gtc' } }
211
+ : { limit: { tif: 'FrontendMarket' } },
212
+ c: clientOrderId ? clientOrderId : undefined,
213
+ };
214
+ orders.push(mainOrder);
215
+ // 2. Take Profit order
216
+ if (takeProfitPrice) {
217
+ const tpOrder = {
218
+ a: assetId,
219
+ b: !isBuy,
220
+ p: formatHyperLiquidPrice({
221
+ price: parseFloat(takeProfitPrice),
222
+ szDecimals,
223
+ }),
224
+ s: formattedSize,
225
+ r: true,
226
+ t: {
227
+ trigger: {
228
+ isMarket: false,
229
+ triggerPx: formatHyperLiquidPrice({
230
+ price: parseFloat(takeProfitPrice),
231
+ szDecimals,
232
+ }),
233
+ tpsl: 'tp',
234
+ },
235
+ },
236
+ };
237
+ orders.push(tpOrder);
238
+ }
239
+ // 3. Stop Loss order
240
+ if (stopLossPrice) {
241
+ // Apply 10% slippage to SL limit price (executes as market order when triggered)
242
+ // HyperLiquid recommended: 10% for TP/SL orders
243
+ const stopLossPriceNum = parseFloat(stopLossPrice);
244
+ const slippageValue = ORDER_SLIPPAGE_CONFIG.DefaultTpslSlippageBps / 10000;
245
+ const limitPriceWithSlippage = isBuy
246
+ ? stopLossPriceNum * (1 - slippageValue) // Selling to close long: willing to accept LESS (slippage protection)
247
+ : stopLossPriceNum * (1 + slippageValue); // Buying to close short: willing to pay MORE (slippage protection)
248
+ const slOrder = {
249
+ a: assetId,
250
+ b: !isBuy,
251
+ p: formatHyperLiquidPrice({
252
+ price: limitPriceWithSlippage,
253
+ szDecimals,
254
+ }),
255
+ s: formattedSize,
256
+ r: true,
257
+ t: {
258
+ trigger: {
259
+ isMarket: true,
260
+ triggerPx: formatHyperLiquidPrice({
261
+ price: stopLossPriceNum,
262
+ szDecimals,
263
+ }),
264
+ tpsl: 'sl',
265
+ },
266
+ },
267
+ };
268
+ orders.push(slOrder);
269
+ }
270
+ // Determine grouping
271
+ const finalGrouping = grouping ?? ((takeProfitPrice ?? stopLossPrice) ? 'normalTpsl' : 'na');
272
+ return { orders, grouping: finalGrouping };
273
+ }
274
+ //# sourceMappingURL=orderCalculations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orderCalculations.mjs","sourceRoot":"","sources":["../../src/utils/orderCalculations.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nimport {\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n} from './hyperLiquidAdapter';\nimport { ORDER_SLIPPAGE_CONFIG } from '../constants/perpsConfig';\nimport { PERPS_ERROR_CODES } from '../constants/perpsErrorCodes';\nimport type { PerpsDebugLogger } from '../types';\nimport type { SDKOrderParams } from '../types/hyperliquid-types';\n\n/**\n * Optional debug logger for order calculation functions.\n * When provided, enables detailed logging for debugging.\n */\nexport type OrderCalculationsDebugLogger = PerpsDebugLogger | undefined;\n\ntype PositionSizeParams = {\n amount: string;\n price: number;\n szDecimals: number;\n};\n\ntype MarginRequiredParams = {\n amount: string;\n leverage: number;\n};\n\ntype MaxAllowedAmountParams = {\n availableBalance: number;\n assetPrice: number;\n assetSzDecimals: number;\n leverage: number;\n};\n\n// Advanced order calculation interfaces\nexport type CalculateFinalPositionSizeParams = {\n usdAmount?: string;\n size?: string;\n currentPrice: number;\n priceAtCalculation?: number;\n maxSlippageBps?: number;\n szDecimals: number;\n leverage?: number;\n debugLogger?: OrderCalculationsDebugLogger;\n};\n\nexport type CalculateFinalPositionSizeResult = {\n finalPositionSize: number;\n};\n\nexport type CalculateOrderPriceAndSizeParams = {\n orderType: 'market' | 'limit';\n isBuy: boolean;\n finalPositionSize: number;\n currentPrice: number;\n limitPrice?: string;\n slippage?: number;\n szDecimals: number;\n};\n\nexport type CalculateOrderPriceAndSizeResult = {\n orderPrice: number;\n formattedSize: string;\n formattedPrice: string;\n};\n\nexport type BuildOrdersArrayParams = {\n assetId: number;\n isBuy: boolean;\n formattedPrice: string;\n formattedSize: string;\n reduceOnly: boolean;\n orderType: 'market' | 'limit';\n clientOrderId?: string;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n szDecimals: number;\n grouping?: 'na' | 'normalTpsl' | 'positionTpsl';\n};\n\nexport type BuildOrdersArrayResult = {\n orders: SDKOrderParams[];\n grouping: 'na' | 'normalTpsl' | 'positionTpsl';\n};\n\n/**\n * Calculate position size based on USD amount and asset price\n *\n * @param params - Amount in USD, current asset price, and required decimal precision\n * @returns Position size formatted to the asset's decimal precision\n */\nexport function calculatePositionSize(params: PositionSizeParams): string {\n const { amount, price, szDecimals } = params;\n\n // Validate required parameters\n if (szDecimals === undefined || szDecimals === null) {\n throw new Error('szDecimals is required for position size calculation');\n }\n if (szDecimals < 0) {\n throw new Error(`szDecimals must be >= 0, got: ${szDecimals}`);\n }\n\n const amountNum = parseFloat(amount || '0');\n\n if (isNaN(amountNum) || isNaN(price) || amountNum === 0 || price === 0) {\n return (0).toFixed(szDecimals);\n }\n\n const positionSize = amountNum / price;\n const multiplier = Math.pow(10, szDecimals);\n let rounded = Math.round(positionSize * multiplier) / multiplier;\n\n // Ensure rounded size meets requested USD (fix validation gap)\n const actualUsd = rounded * price;\n if (actualUsd < amountNum) {\n rounded += 1 / multiplier;\n }\n\n return rounded.toFixed(szDecimals);\n}\n\n/**\n * Calculate margin required for a position\n *\n * @param params - Position amount and leverage\n * @returns Margin required formatted to 2 decimal places\n */\nexport function calculateMarginRequired(params: MarginRequiredParams): string {\n const { amount, leverage } = params;\n const amountNum = parseFloat(amount || '0');\n\n if (\n isNaN(amountNum) ||\n isNaN(leverage) ||\n amountNum === 0 ||\n leverage === 0\n ) {\n return '0.00';\n }\n\n return (amountNum / leverage).toFixed(2);\n}\n\nexport function getMaxAllowedAmount(params: MaxAllowedAmountParams): number {\n const { availableBalance, assetPrice, assetSzDecimals, leverage } = params;\n if (availableBalance === 0 || !assetPrice || assetSzDecimals === undefined) {\n return 0;\n }\n\n // The theoretical maximum is simply availableBalance * leverage\n const theoreticalMax = availableBalance * leverage;\n\n // But we need to account for position size rounding\n // Find the largest whole dollar amount that fits within this limit\n let maxAmount = Math.floor(theoreticalMax);\n\n // Verify this amount doesn't exceed available balance after rounding\n const testPositionSize = calculatePositionSize({\n amount: maxAmount.toString(),\n price: assetPrice,\n szDecimals: assetSzDecimals,\n });\n\n const actualNotionalValue = parseFloat(testPositionSize) * assetPrice;\n const requiredMargin = actualNotionalValue / leverage;\n\n // If rounding caused us to exceed available balance, step down by one position increment\n if (requiredMargin > availableBalance) {\n const minPositionSizeIncrement = 1 / Math.pow(10, assetSzDecimals);\n const positionSizeIncrementUsd = Math.ceil(\n minPositionSizeIncrement * assetPrice,\n );\n maxAmount -= positionSizeIncrementUsd;\n }\n\n return Math.max(0, maxAmount);\n}\n\n/**\n * Calculates final position size using USD as source of truth with price validation\n *\n * This function implements the hybrid approach where USD is the source of truth,\n * but includes price staleness validation and proper rounding to prevent precision loss.\n *\n * @param params - USD amount, size, prices, and configuration\n * @returns Final position size as a number\n */\nexport function calculateFinalPositionSize(\n params: CalculateFinalPositionSizeParams,\n): CalculateFinalPositionSizeResult {\n const {\n usdAmount,\n size,\n currentPrice,\n priceAtCalculation,\n maxSlippageBps,\n szDecimals,\n leverage,\n debugLogger,\n } = params;\n\n let finalPositionSize: number;\n\n if (usdAmount && parseFloat(usdAmount) > 0) {\n // USD amount provided - use it as source of truth\n const usdValue = parseFloat(usdAmount);\n\n // 1. Validate price staleness if priceAtCalculation provided\n if (priceAtCalculation) {\n const priceDeltaBps = Math.abs(\n ((currentPrice - priceAtCalculation) / priceAtCalculation) * 10000,\n );\n const maxSlippageBpsValue =\n maxSlippageBps ?? ORDER_SLIPPAGE_CONFIG.DefaultMarketSlippageBps;\n\n if (priceDeltaBps > maxSlippageBpsValue) {\n throw new Error(\n `Price moved too much: ${priceDeltaBps.toFixed(0)} bps (max: ${maxSlippageBpsValue} bps). ` +\n `Expected: ${priceAtCalculation.toFixed(2)}, Current: ${currentPrice.toFixed(2)}`,\n );\n }\n\n debugLogger?.log('Price validation passed:', {\n priceAtCalculation,\n currentPrice,\n deltaBps: priceDeltaBps.toFixed(2),\n maxSlippageBps: maxSlippageBpsValue,\n });\n }\n\n // 2. Recalculate position size with fresh price\n finalPositionSize = usdValue / currentPrice;\n\n // 3. Apply size decimals rounding\n const multiplier = Math.pow(10, szDecimals);\n finalPositionSize = Math.round(finalPositionSize * multiplier) / multiplier;\n\n // 4. Ensure rounded size meets requested USD (fix validation gap)\n let actualNotionalValue = finalPositionSize * currentPrice;\n if (actualNotionalValue < usdValue) {\n // Add 1 minimum increment to meet requested USD\n finalPositionSize += 1 / multiplier;\n actualNotionalValue = finalPositionSize * currentPrice;\n\n debugLogger?.log('Position size adjusted to meet USD minimum:', {\n requestedUsd: usdValue,\n beforeAdjustment: finalPositionSize - 1 / multiplier,\n afterAdjustment: finalPositionSize,\n actualUsd: actualNotionalValue,\n });\n }\n\n const requiredMargin = actualNotionalValue / (leverage ?? 1);\n\n // Log if rounding caused significant difference\n const usdDifference = Math.abs(actualNotionalValue - usdValue);\n if (usdDifference > 0.01) {\n debugLogger?.log(\n 'Position size rounding caused USD difference (acceptable):',\n {\n requestedUsd: usdValue,\n actualUsd: actualNotionalValue,\n difference: usdDifference,\n positionSize: finalPositionSize,\n },\n );\n }\n\n debugLogger?.log('Recalculated position size with fresh price:', {\n usdAmount: usdValue,\n priceAtCalculation,\n currentPrice,\n originalSize: size,\n recalculatedSize: finalPositionSize,\n requiredMargin,\n minIncrement: 1 / multiplier,\n });\n } else {\n // Legacy: Use provided size (backward compatibility)\n finalPositionSize = parseFloat(size ?? '0');\n\n debugLogger?.log(\n 'Using legacy size calculation (no USD amount provided):',\n {\n providedSize: size,\n finalSize: finalPositionSize,\n },\n );\n }\n\n return { finalPositionSize };\n}\n\n/**\n * Calculates order price and formatted size based on order type\n *\n * @param params - Order parameters including type, direction, size, and prices\n * @returns Formatted order price, size, and price string\n */\nexport function calculateOrderPriceAndSize(\n params: CalculateOrderPriceAndSizeParams,\n): CalculateOrderPriceAndSizeResult {\n const {\n orderType,\n isBuy,\n finalPositionSize,\n currentPrice,\n limitPrice,\n slippage,\n szDecimals,\n } = params;\n\n let orderPrice: number;\n let formattedSize: string;\n\n if (orderType === 'market') {\n // Market orders: add slippage (3% conservative default)\n const slippageValue =\n slippage ?? ORDER_SLIPPAGE_CONFIG.DefaultMarketSlippageBps / 10000;\n orderPrice = isBuy\n ? currentPrice * (1 + slippageValue)\n : currentPrice * (1 - slippageValue);\n formattedSize = formatHyperLiquidSize({\n size: finalPositionSize,\n szDecimals,\n });\n } else {\n // Limit orders: use provided price (no slippage applied)\n if (!limitPrice) {\n throw new Error(PERPS_ERROR_CODES.ORDER_LIMIT_PRICE_REQUIRED);\n }\n orderPrice = parseFloat(limitPrice);\n formattedSize = formatHyperLiquidSize({\n size: finalPositionSize,\n szDecimals,\n });\n }\n\n const formattedPrice = formatHyperLiquidPrice({\n price: orderPrice,\n szDecimals,\n });\n\n return { orderPrice, formattedSize, formattedPrice };\n}\n\n/**\n * Builds orders array including main order and optional TP/SL orders\n *\n * @param params - Order construction parameters\n * @returns Array of SDK order params and grouping type\n */\nexport function buildOrdersArray(\n params: BuildOrdersArrayParams,\n): BuildOrdersArrayResult {\n const {\n assetId,\n isBuy,\n formattedPrice,\n formattedSize,\n reduceOnly,\n orderType,\n clientOrderId,\n takeProfitPrice,\n stopLossPrice,\n szDecimals,\n grouping,\n } = params;\n\n const orders: SDKOrderParams[] = [];\n\n // 1. Main order\n const mainOrder: SDKOrderParams = {\n a: assetId,\n b: isBuy,\n p: formattedPrice,\n s: formattedSize,\n r: reduceOnly || false,\n t:\n orderType === 'limit'\n ? { limit: { tif: 'Gtc' } }\n : { limit: { tif: 'FrontendMarket' } },\n c: clientOrderId ? (clientOrderId as Hex) : undefined,\n };\n orders.push(mainOrder);\n\n // 2. Take Profit order\n if (takeProfitPrice) {\n const tpOrder: SDKOrderParams = {\n a: assetId,\n b: !isBuy,\n p: formatHyperLiquidPrice({\n price: parseFloat(takeProfitPrice),\n szDecimals,\n }),\n s: formattedSize,\n r: true,\n t: {\n trigger: {\n isMarket: false,\n triggerPx: formatHyperLiquidPrice({\n price: parseFloat(takeProfitPrice),\n szDecimals,\n }),\n tpsl: 'tp',\n },\n },\n };\n orders.push(tpOrder);\n }\n\n // 3. Stop Loss order\n if (stopLossPrice) {\n // Apply 10% slippage to SL limit price (executes as market order when triggered)\n // HyperLiquid recommended: 10% for TP/SL orders\n const stopLossPriceNum = parseFloat(stopLossPrice);\n const slippageValue = ORDER_SLIPPAGE_CONFIG.DefaultTpslSlippageBps / 10000;\n const limitPriceWithSlippage = isBuy\n ? stopLossPriceNum * (1 - slippageValue) // Selling to close long: willing to accept LESS (slippage protection)\n : stopLossPriceNum * (1 + slippageValue); // Buying to close short: willing to pay MORE (slippage protection)\n\n const slOrder: SDKOrderParams = {\n a: assetId,\n b: !isBuy,\n p: formatHyperLiquidPrice({\n price: limitPriceWithSlippage,\n szDecimals,\n }),\n s: formattedSize,\n r: true,\n t: {\n trigger: {\n isMarket: true,\n triggerPx: formatHyperLiquidPrice({\n price: stopLossPriceNum,\n szDecimals,\n }),\n tpsl: 'sl',\n },\n },\n };\n orders.push(slOrder);\n }\n\n // Determine grouping\n const finalGrouping: 'na' | 'normalTpsl' | 'positionTpsl' =\n grouping ?? ((takeProfitPrice ?? stopLossPrice) ? 'normalTpsl' : 'na');\n\n return { orders, grouping: finalGrouping };\n}\n"]}