@metamask-previews/perps-controller 0.0.0-preview-e4aa1532 → 0.0.0-preview-6dfa4aeba

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 +1 -11
  2. package/dist/PerpsController.cjs +66 -2224
  3. package/dist/PerpsController.cjs.map +1 -1
  4. package/dist/PerpsController.d.cts +79 -933
  5. package/dist/PerpsController.d.cts.map +1 -1
  6. package/dist/PerpsController.d.mts +79 -933
  7. package/dist/PerpsController.d.mts.map +1 -1
  8. package/dist/PerpsController.mjs +64 -2221
  9. package/dist/PerpsController.mjs.map +1 -1
  10. package/dist/index.cjs +1 -32
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.d.cts +2 -6
  13. package/dist/index.d.cts.map +1 -1
  14. package/dist/index.d.mts +2 -6
  15. package/dist/index.d.mts.map +1 -1
  16. package/dist/index.mjs +1 -9
  17. package/dist/index.mjs.map +1 -1
  18. package/package.json +4 -19
  19. package/dist/__mocks__/hyperliquidMock.cjs +0 -68
  20. package/dist/__mocks__/hyperliquidMock.cjs.map +0 -1
  21. package/dist/__mocks__/hyperliquidMock.d.cts +0 -15
  22. package/dist/__mocks__/hyperliquidMock.d.cts.map +0 -1
  23. package/dist/__mocks__/hyperliquidMock.d.mts +0 -15
  24. package/dist/__mocks__/hyperliquidMock.d.mts.map +0 -1
  25. package/dist/__mocks__/hyperliquidMock.mjs +0 -65
  26. package/dist/__mocks__/hyperliquidMock.mjs.map +0 -1
  27. package/dist/__mocks__/providerMocks.cjs +0 -144
  28. package/dist/__mocks__/providerMocks.cjs.map +0 -1
  29. package/dist/__mocks__/providerMocks.d.cts +0 -44
  30. package/dist/__mocks__/providerMocks.d.cts.map +0 -1
  31. package/dist/__mocks__/providerMocks.d.mts +0 -44
  32. package/dist/__mocks__/providerMocks.d.mts.map +0 -1
  33. package/dist/__mocks__/providerMocks.mjs +0 -136
  34. package/dist/__mocks__/providerMocks.mjs.map +0 -1
  35. package/dist/__mocks__/serviceMocks.cjs +0 -187
  36. package/dist/__mocks__/serviceMocks.cjs.map +0 -1
  37. package/dist/__mocks__/serviceMocks.d.cts +0 -58
  38. package/dist/__mocks__/serviceMocks.d.cts.map +0 -1
  39. package/dist/__mocks__/serviceMocks.d.mts +0 -58
  40. package/dist/__mocks__/serviceMocks.d.mts.map +0 -1
  41. package/dist/__mocks__/serviceMocks.mjs +0 -180
  42. package/dist/__mocks__/serviceMocks.mjs.map +0 -1
  43. package/dist/aggregation/SubscriptionMultiplexer.cjs +0 -459
  44. package/dist/aggregation/SubscriptionMultiplexer.cjs.map +0 -1
  45. package/dist/aggregation/SubscriptionMultiplexer.d.cts +0 -222
  46. package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +0 -1
  47. package/dist/aggregation/SubscriptionMultiplexer.d.mts +0 -222
  48. package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +0 -1
  49. package/dist/aggregation/SubscriptionMultiplexer.mjs +0 -455
  50. package/dist/aggregation/SubscriptionMultiplexer.mjs.map +0 -1
  51. package/dist/aggregation/index.cjs +0 -9
  52. package/dist/aggregation/index.cjs.map +0 -1
  53. package/dist/aggregation/index.d.cts +0 -6
  54. package/dist/aggregation/index.d.cts.map +0 -1
  55. package/dist/aggregation/index.d.mts +0 -6
  56. package/dist/aggregation/index.d.mts.map +0 -1
  57. package/dist/aggregation/index.mjs +0 -5
  58. package/dist/aggregation/index.mjs.map +0 -1
  59. package/dist/constants/eventNames.cjs +0 -117
  60. package/dist/constants/eventNames.cjs.map +0 -1
  61. package/dist/constants/eventNames.d.cts +0 -106
  62. package/dist/constants/eventNames.d.cts.map +0 -1
  63. package/dist/constants/eventNames.d.mts +0 -106
  64. package/dist/constants/eventNames.d.mts.map +0 -1
  65. package/dist/constants/eventNames.mjs +0 -114
  66. package/dist/constants/eventNames.mjs.map +0 -1
  67. package/dist/constants/hyperLiquidConfig.cjs +0 -366
  68. package/dist/constants/hyperLiquidConfig.cjs.map +0 -1
  69. package/dist/constants/hyperLiquidConfig.d.cts +0 -276
  70. package/dist/constants/hyperLiquidConfig.d.cts.map +0 -1
  71. package/dist/constants/hyperLiquidConfig.d.mts +0 -276
  72. package/dist/constants/hyperLiquidConfig.d.mts.map +0 -1
  73. package/dist/constants/hyperLiquidConfig.mjs +0 -357
  74. package/dist/constants/hyperLiquidConfig.mjs.map +0 -1
  75. package/dist/constants/index.cjs +0 -23
  76. package/dist/constants/index.cjs.map +0 -1
  77. package/dist/constants/index.d.cts +0 -7
  78. package/dist/constants/index.d.cts.map +0 -1
  79. package/dist/constants/index.d.mts +0 -7
  80. package/dist/constants/index.d.mts.map +0 -1
  81. package/dist/constants/index.mjs +0 -7
  82. package/dist/constants/index.mjs.map +0 -1
  83. package/dist/constants/orderTypes.cjs +0 -31
  84. package/dist/constants/orderTypes.cjs.map +0 -1
  85. package/dist/constants/orderTypes.d.cts +0 -19
  86. package/dist/constants/orderTypes.d.cts.map +0 -1
  87. package/dist/constants/orderTypes.d.mts +0 -19
  88. package/dist/constants/orderTypes.d.mts.map +0 -1
  89. package/dist/constants/orderTypes.mjs +0 -27
  90. package/dist/constants/orderTypes.mjs.map +0 -1
  91. package/dist/constants/performanceMetrics.cjs +0 -61
  92. package/dist/constants/performanceMetrics.cjs.map +0 -1
  93. package/dist/constants/performanceMetrics.d.cts +0 -44
  94. package/dist/constants/performanceMetrics.d.cts.map +0 -1
  95. package/dist/constants/performanceMetrics.d.mts +0 -44
  96. package/dist/constants/performanceMetrics.d.mts.map +0 -1
  97. package/dist/constants/performanceMetrics.mjs +0 -58
  98. package/dist/constants/performanceMetrics.mjs.map +0 -1
  99. package/dist/constants/perpsConfig.cjs +0 -461
  100. package/dist/constants/perpsConfig.cjs.map +0 -1
  101. package/dist/constants/perpsConfig.d.cts +0 -343
  102. package/dist/constants/perpsConfig.d.cts.map +0 -1
  103. package/dist/constants/perpsConfig.d.mts +0 -343
  104. package/dist/constants/perpsConfig.d.mts.map +0 -1
  105. package/dist/constants/perpsConfig.mjs +0 -458
  106. package/dist/constants/perpsConfig.mjs.map +0 -1
  107. package/dist/constants/perpsErrorCodes.cjs +0 -79
  108. package/dist/constants/perpsErrorCodes.cjs.map +0 -1
  109. package/dist/constants/perpsErrorCodes.d.cts +0 -64
  110. package/dist/constants/perpsErrorCodes.d.cts.map +0 -1
  111. package/dist/constants/perpsErrorCodes.d.mts +0 -64
  112. package/dist/constants/perpsErrorCodes.d.mts.map +0 -1
  113. package/dist/constants/perpsErrorCodes.mjs +0 -76
  114. package/dist/constants/perpsErrorCodes.mjs.map +0 -1
  115. package/dist/platform-services/HyperLiquidClientService.cjs +0 -857
  116. package/dist/platform-services/HyperLiquidClientService.cjs.map +0 -1
  117. package/dist/platform-services/HyperLiquidClientService.d.cts +0 -263
  118. package/dist/platform-services/HyperLiquidClientService.d.cts.map +0 -1
  119. package/dist/platform-services/HyperLiquidClientService.d.mts +0 -263
  120. package/dist/platform-services/HyperLiquidClientService.d.mts.map +0 -1
  121. package/dist/platform-services/HyperLiquidClientService.mjs +0 -853
  122. package/dist/platform-services/HyperLiquidClientService.mjs.map +0 -1
  123. package/dist/platform-services/HyperLiquidSubscriptionService.cjs +0 -2170
  124. package/dist/platform-services/HyperLiquidSubscriptionService.cjs.map +0 -1
  125. package/dist/platform-services/HyperLiquidSubscriptionService.d.cts +0 -424
  126. package/dist/platform-services/HyperLiquidSubscriptionService.d.cts.map +0 -1
  127. package/dist/platform-services/HyperLiquidSubscriptionService.d.mts +0 -424
  128. package/dist/platform-services/HyperLiquidSubscriptionService.d.mts.map +0 -1
  129. package/dist/platform-services/HyperLiquidSubscriptionService.mjs +0 -2166
  130. package/dist/platform-services/HyperLiquidSubscriptionService.mjs.map +0 -1
  131. package/dist/platform-services/HyperLiquidWalletService.cjs +0 -140
  132. package/dist/platform-services/HyperLiquidWalletService.cjs.map +0 -1
  133. package/dist/platform-services/HyperLiquidWalletService.d.cts +0 -78
  134. package/dist/platform-services/HyperLiquidWalletService.d.cts.map +0 -1
  135. package/dist/platform-services/HyperLiquidWalletService.d.mts +0 -78
  136. package/dist/platform-services/HyperLiquidWalletService.d.mts.map +0 -1
  137. package/dist/platform-services/HyperLiquidWalletService.mjs +0 -136
  138. package/dist/platform-services/HyperLiquidWalletService.mjs.map +0 -1
  139. package/dist/providers/AggregatedPerpsProvider.cjs +0 -777
  140. package/dist/providers/AggregatedPerpsProvider.cjs.map +0 -1
  141. package/dist/providers/AggregatedPerpsProvider.d.cts +0 -466
  142. package/dist/providers/AggregatedPerpsProvider.d.cts.map +0 -1
  143. package/dist/providers/AggregatedPerpsProvider.d.mts +0 -466
  144. package/dist/providers/AggregatedPerpsProvider.d.mts.map +0 -1
  145. package/dist/providers/AggregatedPerpsProvider.mjs +0 -773
  146. package/dist/providers/AggregatedPerpsProvider.mjs.map +0 -1
  147. package/dist/providers/HyperLiquidProvider.cjs +0 -5172
  148. package/dist/providers/HyperLiquidProvider.cjs.map +0 -1
  149. package/dist/providers/HyperLiquidProvider.d.cts +0 -881
  150. package/dist/providers/HyperLiquidProvider.d.cts.map +0 -1
  151. package/dist/providers/HyperLiquidProvider.d.mts +0 -881
  152. package/dist/providers/HyperLiquidProvider.d.mts.map +0 -1
  153. package/dist/providers/HyperLiquidProvider.mjs +0 -5168
  154. package/dist/providers/HyperLiquidProvider.mjs.map +0 -1
  155. package/dist/providers/index.cjs +0 -11
  156. package/dist/providers/index.cjs.map +0 -1
  157. package/dist/providers/index.d.cts +0 -6
  158. package/dist/providers/index.d.cts.map +0 -1
  159. package/dist/providers/index.d.mts +0 -6
  160. package/dist/providers/index.d.mts.map +0 -1
  161. package/dist/providers/index.mjs +0 -6
  162. package/dist/providers/index.mjs.map +0 -1
  163. package/dist/routing/ProviderRouter.cjs +0 -148
  164. package/dist/routing/ProviderRouter.cjs.map +0 -1
  165. package/dist/routing/ProviderRouter.d.cts +0 -124
  166. package/dist/routing/ProviderRouter.d.cts.map +0 -1
  167. package/dist/routing/ProviderRouter.d.mts +0 -124
  168. package/dist/routing/ProviderRouter.d.mts.map +0 -1
  169. package/dist/routing/ProviderRouter.mjs +0 -144
  170. package/dist/routing/ProviderRouter.mjs.map +0 -1
  171. package/dist/routing/index.cjs +0 -9
  172. package/dist/routing/index.cjs.map +0 -1
  173. package/dist/routing/index.d.cts +0 -6
  174. package/dist/routing/index.d.cts.map +0 -1
  175. package/dist/routing/index.d.mts +0 -6
  176. package/dist/routing/index.d.mts.map +0 -1
  177. package/dist/routing/index.mjs +0 -5
  178. package/dist/routing/index.mjs.map +0 -1
  179. package/dist/selectors.cjs +0 -161
  180. package/dist/selectors.cjs.map +0 -1
  181. package/dist/selectors.d.cts +0 -345
  182. package/dist/selectors.d.cts.map +0 -1
  183. package/dist/selectors.d.mts +0 -345
  184. package/dist/selectors.d.mts.map +0 -1
  185. package/dist/selectors.mjs +0 -153
  186. package/dist/selectors.mjs.map +0 -1
  187. package/dist/services/AccountService.cjs +0 -313
  188. package/dist/services/AccountService.cjs.map +0 -1
  189. package/dist/services/AccountService.d.cts +0 -53
  190. package/dist/services/AccountService.d.cts.map +0 -1
  191. package/dist/services/AccountService.d.mts +0 -53
  192. package/dist/services/AccountService.d.mts.map +0 -1
  193. package/dist/services/AccountService.mjs +0 -309
  194. package/dist/services/AccountService.mjs.map +0 -1
  195. package/dist/services/DataLakeService.cjs +0 -219
  196. package/dist/services/DataLakeService.cjs.map +0 -1
  197. package/dist/services/DataLakeService.d.cts +0 -49
  198. package/dist/services/DataLakeService.d.cts.map +0 -1
  199. package/dist/services/DataLakeService.d.mts +0 -49
  200. package/dist/services/DataLakeService.d.mts.map +0 -1
  201. package/dist/services/DataLakeService.mjs +0 -215
  202. package/dist/services/DataLakeService.mjs.map +0 -1
  203. package/dist/services/DepositService.cjs +0 -96
  204. package/dist/services/DepositService.cjs.map +0 -1
  205. package/dist/services/DepositService.d.cts +0 -37
  206. package/dist/services/DepositService.d.cts.map +0 -1
  207. package/dist/services/DepositService.d.mts +0 -37
  208. package/dist/services/DepositService.d.mts.map +0 -1
  209. package/dist/services/DepositService.mjs +0 -92
  210. package/dist/services/DepositService.mjs.map +0 -1
  211. package/dist/services/EligibilityService.cjs +0 -156
  212. package/dist/services/EligibilityService.cjs.map +0 -1
  213. package/dist/services/EligibilityService.d.cts +0 -48
  214. package/dist/services/EligibilityService.d.cts.map +0 -1
  215. package/dist/services/EligibilityService.d.mts +0 -48
  216. package/dist/services/EligibilityService.d.mts.map +0 -1
  217. package/dist/services/EligibilityService.mjs +0 -152
  218. package/dist/services/EligibilityService.mjs.map +0 -1
  219. package/dist/services/FeatureFlagConfigurationService.cjs +0 -258
  220. package/dist/services/FeatureFlagConfigurationService.cjs.map +0 -1
  221. package/dist/services/FeatureFlagConfigurationService.d.cts +0 -100
  222. package/dist/services/FeatureFlagConfigurationService.d.cts.map +0 -1
  223. package/dist/services/FeatureFlagConfigurationService.d.mts +0 -100
  224. package/dist/services/FeatureFlagConfigurationService.d.mts.map +0 -1
  225. package/dist/services/FeatureFlagConfigurationService.mjs +0 -254
  226. package/dist/services/FeatureFlagConfigurationService.mjs.map +0 -1
  227. package/dist/services/MarketDataService.cjs +0 -875
  228. package/dist/services/MarketDataService.cjs.map +0 -1
  229. package/dist/services/MarketDataService.d.cts +0 -289
  230. package/dist/services/MarketDataService.d.cts.map +0 -1
  231. package/dist/services/MarketDataService.d.mts +0 -289
  232. package/dist/services/MarketDataService.d.mts.map +0 -1
  233. package/dist/services/MarketDataService.mjs +0 -871
  234. package/dist/services/MarketDataService.mjs.map +0 -1
  235. package/dist/services/RewardsIntegrationService.cjs +0 -94
  236. package/dist/services/RewardsIntegrationService.cjs.map +0 -1
  237. package/dist/services/RewardsIntegrationService.d.cts +0 -30
  238. package/dist/services/RewardsIntegrationService.d.cts.map +0 -1
  239. package/dist/services/RewardsIntegrationService.d.mts +0 -30
  240. package/dist/services/RewardsIntegrationService.d.mts.map +0 -1
  241. package/dist/services/RewardsIntegrationService.mjs +0 -90
  242. package/dist/services/RewardsIntegrationService.mjs.map +0 -1
  243. package/dist/services/ServiceContext.cjs +0 -3
  244. package/dist/services/ServiceContext.cjs.map +0 -1
  245. package/dist/services/ServiceContext.d.cts +0 -110
  246. package/dist/services/ServiceContext.d.cts.map +0 -1
  247. package/dist/services/ServiceContext.d.mts +0 -110
  248. package/dist/services/ServiceContext.d.mts.map +0 -1
  249. package/dist/services/ServiceContext.mjs +0 -2
  250. package/dist/services/ServiceContext.mjs.map +0 -1
  251. package/dist/services/TradingService.cjs +0 -1481
  252. package/dist/services/TradingService.cjs.map +0 -1
  253. package/dist/services/TradingService.d.cts +0 -308
  254. package/dist/services/TradingService.d.cts.map +0 -1
  255. package/dist/services/TradingService.d.mts +0 -308
  256. package/dist/services/TradingService.d.mts.map +0 -1
  257. package/dist/services/TradingService.mjs +0 -1477
  258. package/dist/services/TradingService.mjs.map +0 -1
  259. package/dist/services/index.cjs +0 -26
  260. package/dist/services/index.cjs.map +0 -1
  261. package/dist/services/index.d.cts +0 -11
  262. package/dist/services/index.d.cts.map +0 -1
  263. package/dist/services/index.d.mts +0 -11
  264. package/dist/services/index.d.mts.map +0 -1
  265. package/dist/services/index.mjs +0 -10
  266. package/dist/services/index.mjs.map +0 -1
  267. package/dist/services/utils.cjs +0 -16
  268. package/dist/services/utils.cjs.map +0 -1
  269. package/dist/services/utils.d.cts +0 -8
  270. package/dist/services/utils.d.cts.map +0 -1
  271. package/dist/services/utils.d.mts +0 -8
  272. package/dist/services/utils.d.mts.map +0 -1
  273. package/dist/services/utils.mjs +0 -12
  274. package/dist/services/utils.mjs.map +0 -1
  275. package/dist/types/chart.cjs +0 -42
  276. package/dist/types/chart.cjs.map +0 -1
  277. package/dist/types/chart.d.cts +0 -62
  278. package/dist/types/chart.d.cts.map +0 -1
  279. package/dist/types/chart.d.mts +0 -62
  280. package/dist/types/chart.d.mts.map +0 -1
  281. package/dist/types/chart.mjs +0 -39
  282. package/dist/types/chart.mjs.map +0 -1
  283. package/dist/types/hyperliquid-types.cjs +0 -3
  284. package/dist/types/hyperliquid-types.cjs.map +0 -1
  285. package/dist/types/hyperliquid-types.d.cts +0 -52
  286. package/dist/types/hyperliquid-types.d.cts.map +0 -1
  287. package/dist/types/hyperliquid-types.d.mts +0 -52
  288. package/dist/types/hyperliquid-types.d.mts.map +0 -1
  289. package/dist/types/hyperliquid-types.mjs +0 -2
  290. package/dist/types/hyperliquid-types.mjs.map +0 -1
  291. package/dist/types/index.cjs +0 -96
  292. package/dist/types/index.cjs.map +0 -1
  293. package/dist/types/index.d.cts +0 -1153
  294. package/dist/types/index.d.cts.map +0 -1
  295. package/dist/types/index.d.mts +0 -1153
  296. package/dist/types/index.d.mts.map +0 -1
  297. package/dist/types/index.mjs +0 -79
  298. package/dist/types/index.mjs.map +0 -1
  299. package/dist/types/transactionTypes.cjs +0 -28
  300. package/dist/types/transactionTypes.cjs.map +0 -1
  301. package/dist/types/transactionTypes.d.cts +0 -64
  302. package/dist/types/transactionTypes.d.cts.map +0 -1
  303. package/dist/types/transactionTypes.d.mts +0 -64
  304. package/dist/types/transactionTypes.d.mts.map +0 -1
  305. package/dist/types/transactionTypes.mjs +0 -23
  306. package/dist/types/transactionTypes.mjs.map +0 -1
  307. package/dist/utils/accountUtils.cjs +0 -65
  308. package/dist/utils/accountUtils.cjs.map +0 -1
  309. package/dist/utils/accountUtils.d.cts +0 -26
  310. package/dist/utils/accountUtils.d.cts.map +0 -1
  311. package/dist/utils/accountUtils.d.mts +0 -26
  312. package/dist/utils/accountUtils.d.mts.map +0 -1
  313. package/dist/utils/accountUtils.mjs +0 -61
  314. package/dist/utils/accountUtils.mjs.map +0 -1
  315. package/dist/utils/amountConversion.cjs +0 -61
  316. package/dist/utils/amountConversion.cjs.map +0 -1
  317. package/dist/utils/amountConversion.d.cts +0 -16
  318. package/dist/utils/amountConversion.d.cts.map +0 -1
  319. package/dist/utils/amountConversion.d.mts +0 -16
  320. package/dist/utils/amountConversion.d.mts.map +0 -1
  321. package/dist/utils/amountConversion.mjs +0 -54
  322. package/dist/utils/amountConversion.mjs.map +0 -1
  323. package/dist/utils/chartUtils.cjs +0 -98
  324. package/dist/utils/chartUtils.cjs.map +0 -1
  325. package/dist/utils/chartUtils.d.cts +0 -14
  326. package/dist/utils/chartUtils.d.cts.map +0 -1
  327. package/dist/utils/chartUtils.d.mts +0 -14
  328. package/dist/utils/chartUtils.d.mts.map +0 -1
  329. package/dist/utils/chartUtils.mjs +0 -94
  330. package/dist/utils/chartUtils.mjs.map +0 -1
  331. package/dist/utils/errorUtils.cjs +0 -22
  332. package/dist/utils/errorUtils.cjs.map +0 -1
  333. package/dist/utils/errorUtils.d.cts +0 -13
  334. package/dist/utils/errorUtils.d.cts.map +0 -1
  335. package/dist/utils/errorUtils.d.mts +0 -13
  336. package/dist/utils/errorUtils.d.mts.map +0 -1
  337. package/dist/utils/errorUtils.mjs +0 -18
  338. package/dist/utils/errorUtils.mjs.map +0 -1
  339. package/dist/utils/formatUtils.cjs +0 -987
  340. package/dist/utils/formatUtils.cjs.map +0 -1
  341. package/dist/utils/formatUtils.d.cts +0 -387
  342. package/dist/utils/formatUtils.d.cts.map +0 -1
  343. package/dist/utils/formatUtils.d.mts +0 -387
  344. package/dist/utils/formatUtils.d.mts.map +0 -1
  345. package/dist/utils/formatUtils.mjs +0 -966
  346. package/dist/utils/formatUtils.mjs.map +0 -1
  347. package/dist/utils/hyperLiquidAdapter.cjs +0 -454
  348. package/dist/utils/hyperLiquidAdapter.cjs.map +0 -1
  349. package/dist/utils/hyperLiquidAdapter.d.cts +0 -158
  350. package/dist/utils/hyperLiquidAdapter.d.cts.map +0 -1
  351. package/dist/utils/hyperLiquidAdapter.d.mts +0 -158
  352. package/dist/utils/hyperLiquidAdapter.d.mts.map +0 -1
  353. package/dist/utils/hyperLiquidAdapter.mjs +0 -439
  354. package/dist/utils/hyperLiquidAdapter.mjs.map +0 -1
  355. package/dist/utils/hyperLiquidOrderBookProcessor.cjs +0 -89
  356. package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +0 -1
  357. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +0 -58
  358. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +0 -1
  359. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +0 -58
  360. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +0 -1
  361. package/dist/utils/hyperLiquidOrderBookProcessor.mjs +0 -84
  362. package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +0 -1
  363. package/dist/utils/hyperLiquidValidation.cjs +0 -426
  364. package/dist/utils/hyperLiquidValidation.cjs.map +0 -1
  365. package/dist/utils/hyperLiquidValidation.d.cts +0 -143
  366. package/dist/utils/hyperLiquidValidation.d.cts.map +0 -1
  367. package/dist/utils/hyperLiquidValidation.d.mts +0 -143
  368. package/dist/utils/hyperLiquidValidation.d.mts.map +0 -1
  369. package/dist/utils/hyperLiquidValidation.mjs +0 -413
  370. package/dist/utils/hyperLiquidValidation.mjs.map +0 -1
  371. package/dist/utils/idUtils.cjs +0 -50
  372. package/dist/utils/idUtils.cjs.map +0 -1
  373. package/dist/utils/idUtils.d.cts +0 -38
  374. package/dist/utils/idUtils.d.cts.map +0 -1
  375. package/dist/utils/idUtils.d.mts +0 -38
  376. package/dist/utils/idUtils.d.mts.map +0 -1
  377. package/dist/utils/idUtils.mjs +0 -42
  378. package/dist/utils/idUtils.mjs.map +0 -1
  379. package/dist/utils/marginUtils.cjs +0 -137
  380. package/dist/utils/marginUtils.cjs.map +0 -1
  381. package/dist/utils/marginUtils.d.cts +0 -64
  382. package/dist/utils/marginUtils.d.cts.map +0 -1
  383. package/dist/utils/marginUtils.d.mts +0 -64
  384. package/dist/utils/marginUtils.d.mts.map +0 -1
  385. package/dist/utils/marginUtils.mjs +0 -131
  386. package/dist/utils/marginUtils.mjs.map +0 -1
  387. package/dist/utils/marketDataTransform.cjs +0 -227
  388. package/dist/utils/marketDataTransform.cjs.map +0 -1
  389. package/dist/utils/marketDataTransform.d.cts +0 -45
  390. package/dist/utils/marketDataTransform.d.cts.map +0 -1
  391. package/dist/utils/marketDataTransform.d.mts +0 -45
  392. package/dist/utils/marketDataTransform.d.mts.map +0 -1
  393. package/dist/utils/marketDataTransform.mjs +0 -220
  394. package/dist/utils/marketDataTransform.mjs.map +0 -1
  395. package/dist/utils/marketUtils.cjs +0 -420
  396. package/dist/utils/marketUtils.cjs.map +0 -1
  397. package/dist/utils/marketUtils.d.cts +0 -227
  398. package/dist/utils/marketUtils.d.cts.map +0 -1
  399. package/dist/utils/marketUtils.d.mts +0 -227
  400. package/dist/utils/marketUtils.d.mts.map +0 -1
  401. package/dist/utils/marketUtils.mjs +0 -404
  402. package/dist/utils/marketUtils.mjs.map +0 -1
  403. package/dist/utils/orderBookGrouping.cjs +0 -151
  404. package/dist/utils/orderBookGrouping.cjs.map +0 -1
  405. package/dist/utils/orderBookGrouping.d.cts +0 -76
  406. package/dist/utils/orderBookGrouping.d.cts.map +0 -1
  407. package/dist/utils/orderBookGrouping.d.mts +0 -76
  408. package/dist/utils/orderBookGrouping.d.mts.map +0 -1
  409. package/dist/utils/orderBookGrouping.mjs +0 -143
  410. package/dist/utils/orderBookGrouping.mjs.map +0 -1
  411. package/dist/utils/orderCalculations.cjs +0 -283
  412. package/dist/utils/orderCalculations.cjs.map +0 -1
  413. package/dist/utils/orderCalculations.d.cts +0 -107
  414. package/dist/utils/orderCalculations.d.cts.map +0 -1
  415. package/dist/utils/orderCalculations.d.mts +0 -107
  416. package/dist/utils/orderCalculations.d.mts.map +0 -1
  417. package/dist/utils/orderCalculations.mjs +0 -274
  418. package/dist/utils/orderCalculations.mjs.map +0 -1
  419. package/dist/utils/orderUtils.cjs +0 -159
  420. package/dist/utils/orderUtils.cjs.map +0 -1
  421. package/dist/utils/orderUtils.d.cts +0 -66
  422. package/dist/utils/orderUtils.d.cts.map +0 -1
  423. package/dist/utils/orderUtils.d.mts +0 -66
  424. package/dist/utils/orderUtils.d.mts.map +0 -1
  425. package/dist/utils/orderUtils.mjs +0 -151
  426. package/dist/utils/orderUtils.mjs.map +0 -1
  427. package/dist/utils/pnlCalculations.cjs +0 -107
  428. package/dist/utils/pnlCalculations.cjs.map +0 -1
  429. package/dist/utils/pnlCalculations.d.cts +0 -79
  430. package/dist/utils/pnlCalculations.d.cts.map +0 -1
  431. package/dist/utils/pnlCalculations.d.mts +0 -79
  432. package/dist/utils/pnlCalculations.d.mts.map +0 -1
  433. package/dist/utils/pnlCalculations.mjs +0 -97
  434. package/dist/utils/pnlCalculations.mjs.map +0 -1
  435. package/dist/utils/positionCalculations.cjs +0 -176
  436. package/dist/utils/positionCalculations.cjs.map +0 -1
  437. package/dist/utils/positionCalculations.d.cts +0 -85
  438. package/dist/utils/positionCalculations.d.cts.map +0 -1
  439. package/dist/utils/positionCalculations.d.mts +0 -85
  440. package/dist/utils/positionCalculations.d.mts.map +0 -1
  441. package/dist/utils/positionCalculations.mjs +0 -165
  442. package/dist/utils/positionCalculations.mjs.map +0 -1
  443. package/dist/utils/sortMarkets.cjs +0 -88
  444. package/dist/utils/sortMarkets.cjs.map +0 -1
  445. package/dist/utils/sortMarkets.d.cts +0 -21
  446. package/dist/utils/sortMarkets.d.cts.map +0 -1
  447. package/dist/utils/sortMarkets.d.mts +0 -21
  448. package/dist/utils/sortMarkets.d.mts.map +0 -1
  449. package/dist/utils/sortMarkets.mjs +0 -84
  450. package/dist/utils/sortMarkets.mjs.map +0 -1
  451. package/dist/utils/standaloneInfoClient.cjs +0 -34
  452. package/dist/utils/standaloneInfoClient.cjs.map +0 -1
  453. package/dist/utils/standaloneInfoClient.d.cts +0 -31
  454. package/dist/utils/standaloneInfoClient.d.cts.map +0 -1
  455. package/dist/utils/standaloneInfoClient.d.mts +0 -31
  456. package/dist/utils/standaloneInfoClient.d.mts.map +0 -1
  457. package/dist/utils/standaloneInfoClient.mjs +0 -30
  458. package/dist/utils/standaloneInfoClient.mjs.map +0 -1
  459. package/dist/utils/stringParseUtils.cjs +0 -49
  460. package/dist/utils/stringParseUtils.cjs.map +0 -1
  461. package/dist/utils/stringParseUtils.d.cts +0 -35
  462. package/dist/utils/stringParseUtils.d.cts.map +0 -1
  463. package/dist/utils/stringParseUtils.d.mts +0 -35
  464. package/dist/utils/stringParseUtils.d.mts.map +0 -1
  465. package/dist/utils/stringParseUtils.mjs +0 -44
  466. package/dist/utils/stringParseUtils.mjs.map +0 -1
  467. package/dist/utils/time.cjs +0 -37
  468. package/dist/utils/time.cjs.map +0 -1
  469. package/dist/utils/time.d.cts +0 -17
  470. package/dist/utils/time.d.cts.map +0 -1
  471. package/dist/utils/time.d.mts +0 -17
  472. package/dist/utils/time.d.mts.map +0 -1
  473. package/dist/utils/time.mjs +0 -33
  474. package/dist/utils/time.mjs.map +0 -1
  475. package/dist/utils/tpslValidation.cjs +0 -505
  476. package/dist/utils/tpslValidation.cjs.map +0 -1
  477. package/dist/utils/tpslValidation.d.cts +0 -182
  478. package/dist/utils/tpslValidation.d.cts.map +0 -1
  479. package/dist/utils/tpslValidation.d.mts +0 -182
  480. package/dist/utils/tpslValidation.d.mts.map +0 -1
  481. package/dist/utils/tpslValidation.mjs +0 -482
  482. package/dist/utils/tpslValidation.mjs.map +0 -1
  483. package/dist/utils/transactionUtils.cjs +0 -36
  484. package/dist/utils/transactionUtils.cjs.map +0 -1
  485. package/dist/utils/transactionUtils.d.cts +0 -17
  486. package/dist/utils/transactionUtils.d.cts.map +0 -1
  487. package/dist/utils/transactionUtils.d.mts +0 -17
  488. package/dist/utils/transactionUtils.d.mts.map +0 -1
  489. package/dist/utils/transactionUtils.mjs +0 -32
  490. package/dist/utils/transactionUtils.mjs.map +0 -1
  491. package/dist/utils/wait.cjs +0 -12
  492. package/dist/utils/wait.cjs.map +0 -1
  493. package/dist/utils/wait.d.cts +0 -8
  494. package/dist/utils/wait.d.cts.map +0 -1
  495. package/dist/utils/wait.d.mts +0 -8
  496. package/dist/utils/wait.d.mts.map +0 -1
  497. package/dist/utils/wait.mjs +0 -8
  498. package/dist/utils/wait.mjs.map +0 -1
@@ -1,404 +0,0 @@
1
- import { HYPERLIQUID_ASSET_ICONS_BASE_URL, METAMASK_PERPS_ICONS_BASE_URL } from "../constants/hyperLiquidConfig.mjs";
2
- /**
3
- * Maximum length for market filter patterns (prevents DoS attacks)
4
- */
5
- const MAX_MARKET_PATTERN_LENGTH = 100;
6
- /**
7
- * Escape special regex characters in a string
8
- *
9
- * @param str - String to escape
10
- * @returns Escaped string safe for regex
11
- */
12
- export const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&');
13
- /**
14
- * Validate market filter pattern for safety
15
- * Prevents regex DoS attacks from malicious patterns
16
- *
17
- * @param pattern - Pattern to validate
18
- * @returns true if pattern is safe
19
- * @throws Error if pattern is unsafe
20
- *
21
- * @example Valid patterns
22
- * validateMarketPattern("BTC") // → true
23
- * validateMarketPattern("xyz:TSLA") // → true
24
- * validateMarketPattern("xyz:*") // → true
25
- *
26
- * @example Invalid patterns
27
- * validateMarketPattern("") // → throws Error
28
- * validateMarketPattern("xyz:.*") // → throws Error (regex chars)
29
- * validateMarketPattern("BTC#SCAM") // → throws Error (invalid char)
30
- */
31
- export const validateMarketPattern = (pattern) => {
32
- // Reject empty patterns
33
- if (!pattern || pattern.trim().length === 0) {
34
- throw new Error('Market pattern cannot be empty');
35
- }
36
- // Trim whitespace and normalize the pattern
37
- const normalizedPattern = pattern.trim();
38
- // Reject patterns that are too long (potential DoS)
39
- if (normalizedPattern.length > MAX_MARKET_PATTERN_LENGTH) {
40
- throw new Error(`Market pattern exceeds maximum length (${MAX_MARKET_PATTERN_LENGTH} chars): ${normalizedPattern}`);
41
- }
42
- // Reject patterns with suspicious regex control characters
43
- // Allow only colon and asterisk for our pattern syntax
44
- const dangerousChars = /[\\()[\]{}^$+?.|]/u;
45
- if (dangerousChars.test(normalizedPattern)) {
46
- throw new Error(`Market pattern contains invalid regex characters: ${normalizedPattern}`);
47
- }
48
- // Allow only: alphanumeric, colon, hyphen, underscore, asterisk
49
- const validPattern = /^[a-zA-Z0-9:_\-*]+$/u;
50
- if (!validPattern.test(normalizedPattern)) {
51
- throw new Error(`Market pattern contains invalid characters: ${normalizedPattern}`);
52
- }
53
- return true;
54
- };
55
- /**
56
- * Compile market filter pattern into optimized matcher
57
- * Supports wildcards ("xyz:*"), DEX shorthand ("xyz"), and exact matches ("xyz:TSLA")
58
- *
59
- * Note: Main DEX markets (no prefix) don't need filtering - they're always included.
60
- * Patterns without colons are treated as HIP-3 DEX shorthand.
61
- *
62
- * @param pattern - Pattern string (e.g., "xyz:*", "xyz:TSLA", "xyz")
63
- * @returns Compiled matcher (RegExp for wildcards/shorthand, string for exact match)
64
- *
65
- * @example Wildcard - matches all markets from a DEX
66
- * compileMarketPattern("xyz:*") // → /^xyz:/
67
- *
68
- * @example DEX shorthand - equivalent to wildcard
69
- * compileMarketPattern("xyz") // → /^xyz:/ (matches all xyz markets)
70
- *
71
- * @example Exact match - matches specific market
72
- * compileMarketPattern("xyz:TSLA") // → "xyz:TSLA"
73
- */
74
- export const compileMarketPattern = (pattern) => {
75
- // Trim and validate pattern before compilation to prevent regex DoS
76
- const normalizedPattern = pattern.trim();
77
- validateMarketPattern(normalizedPattern);
78
- if (normalizedPattern.endsWith(':*')) {
79
- // Wildcard: "xyz:*" → regex /^xyz:/
80
- const prefix = normalizedPattern.slice(0, -2);
81
- return new RegExp(`^${escapeRegex(prefix)}:`, 'u');
82
- }
83
- if (!normalizedPattern.includes(':')) {
84
- // DEX shorthand: "xyz" → regex /^xyz:/
85
- return new RegExp(`^${escapeRegex(normalizedPattern)}:`, 'u');
86
- }
87
- // Exact match: just use string (fastest)
88
- return normalizedPattern;
89
- };
90
- /**
91
- * Check if a symbol matches a compiled pattern matcher
92
- *
93
- * @param symbol - Market symbol (e.g., "BTC", "xyz:TSLA")
94
- * @param matcher - Compiled matcher (string or RegExp)
95
- * @returns true if symbol matches the pattern
96
- */
97
- export const matchesMarketPattern = (symbol, matcher) => {
98
- if (typeof matcher === 'string') {
99
- // Exact match - fastest
100
- return symbol === matcher;
101
- }
102
- // RegExp match - still very fast
103
- return matcher.test(symbol);
104
- };
105
- /**
106
- * Check if a market should be included based on HIP-3 master switch and whitelist/blacklist patterns
107
- * Main DEX markets (null dex) are ALWAYS included (no filtering)
108
- *
109
- * Logic: Check master switch → apply whitelist (if non-empty) → apply blacklist
110
- *
111
- * @param symbol - Market symbol (e.g., "BTC", "xyz:TSLA")
112
- * @param dex - DEX identifier (null for main DEX, "xyz" for HIP-3 DEX)
113
- * @param hip3Enabled - Master switch for HIP-3 markets (false = block all HIP-3)
114
- * @param compiledEnabledPatterns - Pre-compiled whitelist patterns (empty = allow all)
115
- * @param compiledBlockedPatterns - Pre-compiled blacklist patterns (empty = block none)
116
- * @returns true if market should be shown to users
117
- *
118
- * @example Main DEX market (always included)
119
- * shouldIncludeMarket("BTC", null, true, [...], [...]) // → true
120
- *
121
- * @example HIP-3 when master switch is OFF
122
- * shouldIncludeMarket("xyz:TSLA", "xyz", false, [...], [...]) // → false (HIP-3 disabled)
123
- *
124
- * @example HIP-3 with empty whitelist (discovery mode)
125
- * shouldIncludeMarket("xyz:TSLA", "xyz", true, [], []) // → true (allow all)
126
- *
127
- * @example HIP-3 with whitelist
128
- * shouldIncludeMarket("xyz:TSLA", "xyz", true,
129
- * [{pattern: "xyz:*", matcher: /^xyz:/}], []) // → true (matches whitelist)
130
- *
131
- * @example HIP-3 with blacklist
132
- * shouldIncludeMarket("xyz:SCAM", "xyz", true, [],
133
- * [{pattern: "xyz:SCAM", matcher: "xyz:SCAM"}]) // → false (blocked)
134
- */
135
- export const shouldIncludeMarket = (symbol, dex, hip3Enabled, compiledEnabledPatterns, compiledBlockedPatterns) => {
136
- // ALWAYS include main DEX markets (no filtering)
137
- if (dex === null) {
138
- return true;
139
- }
140
- // Enforce HIP-3 master switch: if disabled, block ALL HIP-3 markets
141
- if (!hip3Enabled) {
142
- return false;
143
- }
144
- // Step 1: Apply whitelist only if non-empty
145
- if (compiledEnabledPatterns.length > 0) {
146
- const whitelisted = compiledEnabledPatterns.some(({ matcher }) => matchesMarketPattern(symbol, matcher));
147
- if (!whitelisted) {
148
- return false;
149
- }
150
- }
151
- // Step 2: Apply blacklist ONLY if non-empty (early return optimization)
152
- if (compiledBlockedPatterns.length === 0) {
153
- return true; // No blacklist to check - accept immediately
154
- }
155
- // Only reach here if blacklist has values
156
- const blacklisted = compiledBlockedPatterns.some(({ matcher }) => matchesMarketPattern(symbol, matcher));
157
- return !blacklisted;
158
- };
159
- /**
160
- * Extract the display symbol from a full symbol string
161
- * Strips DEX prefix for HIP-3 markets (e.g., "xyz:XYZ100" -> "XYZ100")
162
- * Returns the symbol unchanged if no DEX prefix is present
163
- *
164
- * @param symbol - Full symbol (e.g., "BTC" or "xyz:XYZ100")
165
- * @returns Display symbol without DEX prefix (e.g., "BTC" or "XYZ100")
166
- */
167
- export const getPerpsDisplaySymbol = (symbol) => {
168
- if (!symbol || typeof symbol !== 'string') {
169
- return symbol;
170
- }
171
- // Check for DEX prefix pattern (dex:symbol)
172
- const colonIndex = symbol.indexOf(':');
173
- if (colonIndex > 0 && colonIndex < symbol.length - 1) {
174
- // Return everything after the colon
175
- return symbol.substring(colonIndex + 1);
176
- }
177
- // No DEX prefix found, return original symbol
178
- return symbol;
179
- };
180
- /**
181
- * Extract the DEX identifier from a full symbol string
182
- * Returns the DEX prefix for HIP-3 markets (e.g., "xyz:XYZ100" -> "xyz")
183
- * Returns null if no DEX prefix is present (main DEX market)
184
- *
185
- * @param symbol - Full symbol (e.g., "BTC" or "xyz:XYZ100")
186
- * @returns DEX identifier or null if main DEX (e.g., "xyz" or null)
187
- */
188
- export const getPerpsDexFromSymbol = (symbol) => {
189
- if (!symbol || typeof symbol !== 'string') {
190
- return null;
191
- }
192
- // Check for DEX prefix pattern (dex:symbol)
193
- const colonIndex = symbol.indexOf(':');
194
- if (colonIndex > 0 && colonIndex < symbol.length - 1) {
195
- // Return the DEX prefix (everything before the colon)
196
- return symbol.substring(0, colonIndex);
197
- }
198
- // No DEX prefix found, this is a main DEX market
199
- return null;
200
- };
201
- /**
202
- * Calculate the time until the next funding period.
203
- * Supports market-specific funding times when provided.
204
- * Falls back to default HyperLiquid 1-hour periods (funding paid every hour).
205
- *
206
- * @param params - Optional funding countdown parameters
207
- * @returns Formatted countdown string in HH:MM:SS format
208
- */
209
- export const calculateFundingCountdown = (params) => {
210
- const now = new Date();
211
- const nowMs = now.getTime();
212
- // If we have a specific next funding time, check if it's reasonable for HyperLiquid's hourly funding
213
- if (params?.nextFundingTime && params.nextFundingTime > nowMs) {
214
- const msUntilFunding = params.nextFundingTime - nowMs;
215
- const hoursUntilFunding = msUntilFunding / (1000 * 60 * 60);
216
- // If API shows >1.1 hours, it's likely incorrect for HyperLiquid's hourly funding
217
- // Use fallback calculation instead to show time until next hour
218
- if (hoursUntilFunding <= 1.1) {
219
- const totalSeconds = Math.floor(msUntilFunding / 1000);
220
- const hours = Math.floor(totalSeconds / 3600);
221
- const minutes = Math.floor((totalSeconds % 3600) / 60);
222
- const seconds = totalSeconds % 60;
223
- // Format as HH:MM:SS
224
- const formattedHours = String(hours).padStart(2, '0');
225
- const formattedMinutes = String(minutes).padStart(2, '0');
226
- const formattedSeconds = String(seconds).padStart(2, '0');
227
- return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
228
- }
229
- // If >1.1 hours, fall through to use hourly calculation instead
230
- }
231
- // Fall back to default calculation for HyperLiquid (1-hour periods)
232
- // HyperLiquid pays funding every hour, so next funding is at the next hour
233
- const utcMinutes = now.getUTCMinutes();
234
- const utcSeconds = now.getUTCSeconds();
235
- // Calculate time remaining until next hour (next funding time)
236
- const minutesUntilNextHour = 59 - utcMinutes;
237
- const secondsUntilNextHour = 60 - utcSeconds;
238
- // Handle edge case where seconds equals 60
239
- const finalSeconds = secondsUntilNextHour === 60 ? 0 : secondsUntilNextHour;
240
- const finalMinutes = secondsUntilNextHour === 60
241
- ? minutesUntilNextHour + 1
242
- : minutesUntilNextHour;
243
- // For HyperLiquid 1-hour funding, hours should always be 0
244
- // (countdown should never exceed 59:59 since funding happens every hour)
245
- const finalHours = finalMinutes === 60 ? 1 : 0;
246
- const adjustedMinutes = finalMinutes === 60 ? 0 : finalMinutes;
247
- // Format as HH:MM:SS
248
- const formattedHours = String(finalHours).padStart(2, '0');
249
- const formattedMinutes = String(adjustedMinutes).padStart(2, '0');
250
- const formattedSeconds = String(finalSeconds).padStart(2, '0');
251
- return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
252
- };
253
- /**
254
- * Calculate 24h high and low from candlestick data.
255
- *
256
- * @param candleData - Candlestick data containing price candles
257
- * @returns Object with high and low prices for the last 24 hours
258
- */
259
- export const calculate24hHighLow = (candleData) => {
260
- if (!candleData?.candles || candleData.candles.length === 0) {
261
- return { high: 0, low: 0 };
262
- }
263
- // Get candles from last 24 hours
264
- const now = Date.now();
265
- const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;
266
- let last24hCandles = candleData.candles.filter((candle) => candle.time >= twentyFourHoursAgo);
267
- if (last24hCandles.length === 0) {
268
- // If no 24h data, use all available candles
269
- last24hCandles = [...candleData.candles];
270
- }
271
- const highs = last24hCandles.map((candle) => parseFloat(candle.high));
272
- const lows = last24hCandles.map((candle) => parseFloat(candle.low));
273
- return {
274
- high: Math.max(...highs),
275
- low: Math.min(...lows),
276
- };
277
- };
278
- /**
279
- * Determine badge type for a market based on its metadata
280
- * Prioritizes explicit marketType over generic experimental badge
281
- *
282
- * @param market - Market data object (only needs marketType and marketSource fields)
283
- * @returns Badge type to display, or undefined for no badge (main DEX)
284
- *
285
- * @example Main DEX
286
- * getMarketBadgeType({ symbol: 'BTC', marketSource: null }) // → undefined
287
- *
288
- * @example Mapped HIP-3 DEX
289
- * getMarketBadgeType({ symbol: 'xyz:XYZ100', marketSource: 'xyz', marketType: 'equity' }) // → 'equity'
290
- *
291
- * @example Unmapped HIP-3 DEX
292
- * getMarketBadgeType({ symbol: 'abc:ABC100', marketSource: 'abc' }) // → 'experimental'
293
- */
294
- export const getMarketBadgeType = (market) =>
295
- // Prioritize explicit marketType (e.g., 'equity' for xyz DEX)
296
- // Fall back to 'experimental' for unmapped HIP-3 DEXs
297
- // Main DEX markets without marketType show no badge
298
- market.marketType ?? (market.marketSource ? 'experimental' : undefined);
299
- /**
300
- * Filter markets by search query
301
- * Searches through both symbol and name fields (case-insensitive)
302
- *
303
- * @param markets - Array of markets to filter
304
- * @param searchQuery - Search query string
305
- * @returns Filtered array of markets matching the query
306
- *
307
- * @example
308
- * filterMarketsByQuery([{ symbol: 'BTC', name: 'Bitcoin' }], 'btc') // → [{ symbol: 'BTC', name: 'Bitcoin' }]
309
- * filterMarketsByQuery([{ symbol: 'BTC', name: 'Bitcoin' }], 'coin') // → [{ symbol: 'BTC', name: 'Bitcoin' }]
310
- * filterMarketsByQuery([{ symbol: 'BTC', name: 'Bitcoin' }], '') // → [{ symbol: 'BTC', name: 'Bitcoin' }]
311
- */
312
- export const filterMarketsByQuery = (markets, searchQuery) => {
313
- // Return all markets if query is empty
314
- if (!searchQuery?.trim()) {
315
- return markets;
316
- }
317
- const lowerQuery = searchQuery.toLowerCase().trim();
318
- return markets.filter((market) => market.symbol?.toLowerCase().includes(lowerQuery) ||
319
- market.name?.toLowerCase().includes(lowerQuery));
320
- };
321
- /**
322
- * Generate the appropriate icon URL for an asset symbol
323
- * Handles both regular assets and HIP-3 assets (dex:symbol format)
324
- *
325
- * @param symbol - Asset symbol (e.g., "BTC" or "xyz:TSLA")
326
- * @param kPrefixAssets - Optional set of assets that have a 'k' prefix to remove
327
- * @returns Icon URL for the asset
328
- *
329
- * @example Regular asset
330
- * getAssetIconUrl('BTC') // → 'https://app.hyperliquid.xyz/coins/BTC.svg'
331
- *
332
- * @example HIP-3 asset
333
- * getAssetIconUrl('xyz:TSLA') // → 'https://raw.githubusercontent.com/.../hip3%3Axyz_TSLA.svg'
334
- *
335
- * @example With k-prefix handling
336
- * getAssetIconUrl('kBONK', new Set(['KBONK'])) // → 'https://app.hyperliquid.xyz/coins/BONK.svg'
337
- */
338
- export const getAssetIconUrl = (symbol, kPrefixAssets) => {
339
- if (!symbol) {
340
- return '';
341
- }
342
- // Check for HIP-3 asset (contains colon) BEFORE uppercasing
343
- if (symbol.includes(':')) {
344
- const [dex, assetSymbol] = symbol.split(':');
345
- return `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${dex.toLowerCase()}:${assetSymbol.toUpperCase()}.svg`;
346
- }
347
- // For regular assets, uppercase the entire symbol
348
- let processedSymbol = symbol.toUpperCase();
349
- // Remove 'k' prefix only for specific assets if provided
350
- if (kPrefixAssets?.has(processedSymbol)) {
351
- processedSymbol = processedSymbol.substring(1);
352
- }
353
- // Regular asset
354
- return `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${processedSymbol}.svg`;
355
- };
356
- /**
357
- * Generate icon URLs for an asset symbol with fallback support
358
- *
359
- * Resolution order:
360
- * 1. Primary: MetaMask contract-metadata repo (manually curated)
361
- * 2. Fallback: HyperLiquid CDN (always available)
362
- *
363
- * @param symbol - Asset symbol (e.g., "BTC" or "xyz:TSLA")
364
- * @param kPrefixAssets - Optional set of assets that have a 'k' prefix to remove
365
- * @returns Object with primary and fallback URLs, or null if no symbol
366
- *
367
- * @example Regular asset
368
- * getAssetIconUrls('BTC')
369
- * // → { primary: 'https://raw.githubusercontent.com/.../BTC.svg',
370
- * // fallback: 'https://app.hyperliquid.xyz/coins/BTC.svg' }
371
- *
372
- * @example HIP-3 asset
373
- * getAssetIconUrls('xyz:TSLA')
374
- * // → { primary: 'https://raw.githubusercontent.com/.../hip3:xyz_TSLA.svg',
375
- * // fallback: 'https://app.hyperliquid.xyz/coins/xyz:TSLA.svg' }
376
- */
377
- export const getAssetIconUrls = (symbol, kPrefixAssets) => {
378
- if (!symbol) {
379
- return null;
380
- }
381
- // Check for HIP-3 asset (contains colon) BEFORE uppercasing
382
- if (symbol.includes(':')) {
383
- const [dex, assetSymbol] = symbol.split(':');
384
- // HyperLiquid uses dex:SYMBOL format
385
- const hyperliquidFormat = `${dex.toLowerCase()}:${assetSymbol.toUpperCase()}`;
386
- // MetaMask contract-metadata uses hip3:dex_SYMBOL format
387
- const metamaskFormat = `hip3:${dex.toLowerCase()}_${assetSymbol.toUpperCase()}`;
388
- return {
389
- primary: `${METAMASK_PERPS_ICONS_BASE_URL}${metamaskFormat}.svg`,
390
- fallback: `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${hyperliquidFormat}.svg`,
391
- };
392
- }
393
- // For regular assets, uppercase the entire symbol
394
- let processedSymbol = symbol.toUpperCase();
395
- // Remove 'k' prefix only for specific assets if provided
396
- if (kPrefixAssets?.has(processedSymbol)) {
397
- processedSymbol = processedSymbol.substring(1);
398
- }
399
- return {
400
- primary: `${METAMASK_PERPS_ICONS_BASE_URL}${processedSymbol}.svg`,
401
- fallback: `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${processedSymbol}.svg`,
402
- };
403
- };
404
- //# sourceMappingURL=marketUtils.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"marketUtils.mjs","sourceRoot":"","sources":["../../src/utils/marketUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n HYPERLIQUID_ASSET_ICONS_BASE_URL,\n METAMASK_PERPS_ICONS_BASE_URL,\n} from '../constants/hyperLiquidConfig';\nimport type {\n BadgeType,\n CandleData,\n CandleStick,\n PerpsMarketData,\n} from '../types';\n\n/**\n * Maximum length for market filter patterns (prevents DoS attacks)\n */\nconst MAX_MARKET_PATTERN_LENGTH = 100;\n\n/**\n * Pattern matcher type - either string (exact match) or RegExp (wildcard)\n */\nexport type MarketPatternMatcher = RegExp | string;\n\n/**\n * Pre-compiled pattern with original pattern string and matcher\n */\nexport type CompiledMarketPattern = {\n pattern: string;\n matcher: MarketPatternMatcher;\n};\n\n/**\n * Escape special regex characters in a string\n *\n * @param str - String to escape\n * @returns Escaped string safe for regex\n */\nexport const escapeRegex = (str: string): string =>\n str.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&');\n\n/**\n * Validate market filter pattern for safety\n * Prevents regex DoS attacks from malicious patterns\n *\n * @param pattern - Pattern to validate\n * @returns true if pattern is safe\n * @throws Error if pattern is unsafe\n *\n * @example Valid patterns\n * validateMarketPattern(\"BTC\") // → true\n * validateMarketPattern(\"xyz:TSLA\") // → true\n * validateMarketPattern(\"xyz:*\") // → true\n *\n * @example Invalid patterns\n * validateMarketPattern(\"\") // → throws Error\n * validateMarketPattern(\"xyz:.*\") // → throws Error (regex chars)\n * validateMarketPattern(\"BTC#SCAM\") // → throws Error (invalid char)\n */\nexport const validateMarketPattern = (pattern: string): boolean => {\n // Reject empty patterns\n if (!pattern || pattern.trim().length === 0) {\n throw new Error('Market pattern cannot be empty');\n }\n\n // Trim whitespace and normalize the pattern\n const normalizedPattern = pattern.trim();\n\n // Reject patterns that are too long (potential DoS)\n if (normalizedPattern.length > MAX_MARKET_PATTERN_LENGTH) {\n throw new Error(\n `Market pattern exceeds maximum length (${MAX_MARKET_PATTERN_LENGTH} chars): ${normalizedPattern}`,\n );\n }\n\n // Reject patterns with suspicious regex control characters\n // Allow only colon and asterisk for our pattern syntax\n const dangerousChars = /[\\\\()[\\]{}^$+?.|]/u;\n if (dangerousChars.test(normalizedPattern)) {\n throw new Error(\n `Market pattern contains invalid regex characters: ${normalizedPattern}`,\n );\n }\n\n // Allow only: alphanumeric, colon, hyphen, underscore, asterisk\n const validPattern = /^[a-zA-Z0-9:_\\-*]+$/u;\n if (!validPattern.test(normalizedPattern)) {\n throw new Error(\n `Market pattern contains invalid characters: ${normalizedPattern}`,\n );\n }\n\n return true;\n};\n\n/**\n * Compile market filter pattern into optimized matcher\n * Supports wildcards (\"xyz:*\"), DEX shorthand (\"xyz\"), and exact matches (\"xyz:TSLA\")\n *\n * Note: Main DEX markets (no prefix) don't need filtering - they're always included.\n * Patterns without colons are treated as HIP-3 DEX shorthand.\n *\n * @param pattern - Pattern string (e.g., \"xyz:*\", \"xyz:TSLA\", \"xyz\")\n * @returns Compiled matcher (RegExp for wildcards/shorthand, string for exact match)\n *\n * @example Wildcard - matches all markets from a DEX\n * compileMarketPattern(\"xyz:*\") // → /^xyz:/\n *\n * @example DEX shorthand - equivalent to wildcard\n * compileMarketPattern(\"xyz\") // → /^xyz:/ (matches all xyz markets)\n *\n * @example Exact match - matches specific market\n * compileMarketPattern(\"xyz:TSLA\") // → \"xyz:TSLA\"\n */\nexport const compileMarketPattern = (pattern: string): MarketPatternMatcher => {\n // Trim and validate pattern before compilation to prevent regex DoS\n const normalizedPattern = pattern.trim();\n validateMarketPattern(normalizedPattern);\n\n if (normalizedPattern.endsWith(':*')) {\n // Wildcard: \"xyz:*\" → regex /^xyz:/\n const prefix = normalizedPattern.slice(0, -2);\n return new RegExp(`^${escapeRegex(prefix)}:`, 'u');\n }\n\n if (!normalizedPattern.includes(':')) {\n // DEX shorthand: \"xyz\" → regex /^xyz:/\n return new RegExp(`^${escapeRegex(normalizedPattern)}:`, 'u');\n }\n\n // Exact match: just use string (fastest)\n return normalizedPattern;\n};\n\n/**\n * Check if a symbol matches a compiled pattern matcher\n *\n * @param symbol - Market symbol (e.g., \"BTC\", \"xyz:TSLA\")\n * @param matcher - Compiled matcher (string or RegExp)\n * @returns true if symbol matches the pattern\n */\nexport const matchesMarketPattern = (\n symbol: string,\n matcher: MarketPatternMatcher,\n): boolean => {\n if (typeof matcher === 'string') {\n // Exact match - fastest\n return symbol === matcher;\n }\n\n // RegExp match - still very fast\n return matcher.test(symbol);\n};\n\n/**\n * Check if a market should be included based on HIP-3 master switch and whitelist/blacklist patterns\n * Main DEX markets (null dex) are ALWAYS included (no filtering)\n *\n * Logic: Check master switch → apply whitelist (if non-empty) → apply blacklist\n *\n * @param symbol - Market symbol (e.g., \"BTC\", \"xyz:TSLA\")\n * @param dex - DEX identifier (null for main DEX, \"xyz\" for HIP-3 DEX)\n * @param hip3Enabled - Master switch for HIP-3 markets (false = block all HIP-3)\n * @param compiledEnabledPatterns - Pre-compiled whitelist patterns (empty = allow all)\n * @param compiledBlockedPatterns - Pre-compiled blacklist patterns (empty = block none)\n * @returns true if market should be shown to users\n *\n * @example Main DEX market (always included)\n * shouldIncludeMarket(\"BTC\", null, true, [...], [...]) // → true\n *\n * @example HIP-3 when master switch is OFF\n * shouldIncludeMarket(\"xyz:TSLA\", \"xyz\", false, [...], [...]) // → false (HIP-3 disabled)\n *\n * @example HIP-3 with empty whitelist (discovery mode)\n * shouldIncludeMarket(\"xyz:TSLA\", \"xyz\", true, [], []) // → true (allow all)\n *\n * @example HIP-3 with whitelist\n * shouldIncludeMarket(\"xyz:TSLA\", \"xyz\", true,\n * [{pattern: \"xyz:*\", matcher: /^xyz:/}], []) // → true (matches whitelist)\n *\n * @example HIP-3 with blacklist\n * shouldIncludeMarket(\"xyz:SCAM\", \"xyz\", true, [],\n * [{pattern: \"xyz:SCAM\", matcher: \"xyz:SCAM\"}]) // → false (blocked)\n */\nexport const shouldIncludeMarket = (\n symbol: string,\n dex: string | null,\n hip3Enabled: boolean,\n compiledEnabledPatterns: CompiledMarketPattern[],\n compiledBlockedPatterns: CompiledMarketPattern[],\n): boolean => {\n // ALWAYS include main DEX markets (no filtering)\n if (dex === null) {\n return true;\n }\n\n // Enforce HIP-3 master switch: if disabled, block ALL HIP-3 markets\n if (!hip3Enabled) {\n return false;\n }\n\n // Step 1: Apply whitelist only if non-empty\n if (compiledEnabledPatterns.length > 0) {\n const whitelisted = compiledEnabledPatterns.some(({ matcher }) =>\n matchesMarketPattern(symbol, matcher),\n );\n if (!whitelisted) {\n return false;\n }\n }\n\n // Step 2: Apply blacklist ONLY if non-empty (early return optimization)\n if (compiledBlockedPatterns.length === 0) {\n return true; // No blacklist to check - accept immediately\n }\n\n // Only reach here if blacklist has values\n const blacklisted = compiledBlockedPatterns.some(({ matcher }) =>\n matchesMarketPattern(symbol, matcher),\n );\n\n return !blacklisted;\n};\n\n/**\n * Extract the display symbol from a full symbol string\n * Strips DEX prefix for HIP-3 markets (e.g., \"xyz:XYZ100\" -> \"XYZ100\")\n * Returns the symbol unchanged if no DEX prefix is present\n *\n * @param symbol - Full symbol (e.g., \"BTC\" or \"xyz:XYZ100\")\n * @returns Display symbol without DEX prefix (e.g., \"BTC\" or \"XYZ100\")\n */\nexport const getPerpsDisplaySymbol = (symbol: string): string => {\n if (!symbol || typeof symbol !== 'string') {\n return symbol;\n }\n\n // Check for DEX prefix pattern (dex:symbol)\n const colonIndex = symbol.indexOf(':');\n if (colonIndex > 0 && colonIndex < symbol.length - 1) {\n // Return everything after the colon\n return symbol.substring(colonIndex + 1);\n }\n\n // No DEX prefix found, return original symbol\n return symbol;\n};\n\n/**\n * Extract the DEX identifier from a full symbol string\n * Returns the DEX prefix for HIP-3 markets (e.g., \"xyz:XYZ100\" -> \"xyz\")\n * Returns null if no DEX prefix is present (main DEX market)\n *\n * @param symbol - Full symbol (e.g., \"BTC\" or \"xyz:XYZ100\")\n * @returns DEX identifier or null if main DEX (e.g., \"xyz\" or null)\n */\nexport const getPerpsDexFromSymbol = (symbol: string): string | null => {\n if (!symbol || typeof symbol !== 'string') {\n return null;\n }\n\n // Check for DEX prefix pattern (dex:symbol)\n const colonIndex = symbol.indexOf(':');\n if (colonIndex > 0 && colonIndex < symbol.length - 1) {\n // Return the DEX prefix (everything before the colon)\n return symbol.substring(0, colonIndex);\n }\n\n // No DEX prefix found, this is a main DEX market\n return null;\n};\n\ntype FundingCountdownParams = {\n /**\n * Next funding time in milliseconds since epoch (optional, market-specific)\n */\n nextFundingTime?: number;\n /**\n * Funding interval in hours (optional, market-specific)\n * Default is 1 hour for HyperLiquid (funding is paid every hour)\n */\n fundingIntervalHours?: number;\n};\n\n/**\n * Calculate the time until the next funding period.\n * Supports market-specific funding times when provided.\n * Falls back to default HyperLiquid 1-hour periods (funding paid every hour).\n *\n * @param params - Optional funding countdown parameters\n * @returns Formatted countdown string in HH:MM:SS format\n */\nexport const calculateFundingCountdown = (\n params?: FundingCountdownParams,\n): string => {\n const now = new Date();\n const nowMs = now.getTime();\n\n // If we have a specific next funding time, check if it's reasonable for HyperLiquid's hourly funding\n if (params?.nextFundingTime && params.nextFundingTime > nowMs) {\n const msUntilFunding = params.nextFundingTime - nowMs;\n const hoursUntilFunding = msUntilFunding / (1000 * 60 * 60);\n\n // If API shows >1.1 hours, it's likely incorrect for HyperLiquid's hourly funding\n // Use fallback calculation instead to show time until next hour\n if (hoursUntilFunding <= 1.1) {\n const totalSeconds = Math.floor(msUntilFunding / 1000);\n\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n\n // Format as HH:MM:SS\n const formattedHours = String(hours).padStart(2, '0');\n const formattedMinutes = String(minutes).padStart(2, '0');\n const formattedSeconds = String(seconds).padStart(2, '0');\n\n return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;\n }\n // If >1.1 hours, fall through to use hourly calculation instead\n }\n\n // Fall back to default calculation for HyperLiquid (1-hour periods)\n // HyperLiquid pays funding every hour, so next funding is at the next hour\n const utcMinutes = now.getUTCMinutes();\n const utcSeconds = now.getUTCSeconds();\n\n // Calculate time remaining until next hour (next funding time)\n const minutesUntilNextHour = 59 - utcMinutes;\n const secondsUntilNextHour = 60 - utcSeconds;\n\n // Handle edge case where seconds equals 60\n const finalSeconds = secondsUntilNextHour === 60 ? 0 : secondsUntilNextHour;\n const finalMinutes =\n secondsUntilNextHour === 60\n ? minutesUntilNextHour + 1\n : minutesUntilNextHour;\n\n // For HyperLiquid 1-hour funding, hours should always be 0\n // (countdown should never exceed 59:59 since funding happens every hour)\n const finalHours = finalMinutes === 60 ? 1 : 0;\n const adjustedMinutes = finalMinutes === 60 ? 0 : finalMinutes;\n\n // Format as HH:MM:SS\n const formattedHours = String(finalHours).padStart(2, '0');\n const formattedMinutes = String(adjustedMinutes).padStart(2, '0');\n const formattedSeconds = String(finalSeconds).padStart(2, '0');\n\n return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;\n};\n\n/**\n * Calculate 24h high and low from candlestick data.\n *\n * @param candleData - Candlestick data containing price candles\n * @returns Object with high and low prices for the last 24 hours\n */\nexport const calculate24hHighLow = (\n candleData: CandleData | null,\n): { high: number; low: number } => {\n if (!candleData?.candles || candleData.candles.length === 0) {\n return { high: 0, low: 0 };\n }\n\n // Get candles from last 24 hours\n const now = Date.now();\n const twentyFourHoursAgo = now - 24 * 60 * 60 * 1000;\n\n let last24hCandles = candleData.candles.filter(\n (candle: CandleStick) => candle.time >= twentyFourHoursAgo,\n );\n\n if (last24hCandles.length === 0) {\n // If no 24h data, use all available candles\n last24hCandles = [...candleData.candles];\n }\n\n const highs = last24hCandles.map((candle: CandleStick) =>\n parseFloat(candle.high),\n );\n const lows = last24hCandles.map((candle: CandleStick) =>\n parseFloat(candle.low),\n );\n\n return {\n high: Math.max(...highs),\n low: Math.min(...lows),\n };\n};\n\n/**\n * Determine badge type for a market based on its metadata\n * Prioritizes explicit marketType over generic experimental badge\n *\n * @param market - Market data object (only needs marketType and marketSource fields)\n * @returns Badge type to display, or undefined for no badge (main DEX)\n *\n * @example Main DEX\n * getMarketBadgeType({ symbol: 'BTC', marketSource: null }) // → undefined\n *\n * @example Mapped HIP-3 DEX\n * getMarketBadgeType({ symbol: 'xyz:XYZ100', marketSource: 'xyz', marketType: 'equity' }) // → 'equity'\n *\n * @example Unmapped HIP-3 DEX\n * getMarketBadgeType({ symbol: 'abc:ABC100', marketSource: 'abc' }) // → 'experimental'\n */\nexport const getMarketBadgeType = (\n market: Pick<PerpsMarketData, 'marketType' | 'marketSource'>,\n): BadgeType | undefined =>\n // Prioritize explicit marketType (e.g., 'equity' for xyz DEX)\n // Fall back to 'experimental' for unmapped HIP-3 DEXs\n // Main DEX markets without marketType show no badge\n market.marketType ?? (market.marketSource ? 'experimental' : undefined);\n\n/**\n * Filter markets by search query\n * Searches through both symbol and name fields (case-insensitive)\n *\n * @param markets - Array of markets to filter\n * @param searchQuery - Search query string\n * @returns Filtered array of markets matching the query\n *\n * @example\n * filterMarketsByQuery([{ symbol: 'BTC', name: 'Bitcoin' }], 'btc') // → [{ symbol: 'BTC', name: 'Bitcoin' }]\n * filterMarketsByQuery([{ symbol: 'BTC', name: 'Bitcoin' }], 'coin') // → [{ symbol: 'BTC', name: 'Bitcoin' }]\n * filterMarketsByQuery([{ symbol: 'BTC', name: 'Bitcoin' }], '') // → [{ symbol: 'BTC', name: 'Bitcoin' }]\n */\nexport const filterMarketsByQuery = (\n markets: PerpsMarketData[],\n searchQuery: string,\n): PerpsMarketData[] => {\n // Return all markets if query is empty\n if (!searchQuery?.trim()) {\n return markets;\n }\n\n const lowerQuery = searchQuery.toLowerCase().trim();\n\n return markets.filter(\n (market) =>\n market.symbol?.toLowerCase().includes(lowerQuery) ||\n market.name?.toLowerCase().includes(lowerQuery),\n );\n};\n\n/**\n * Generate the appropriate icon URL for an asset symbol\n * Handles both regular assets and HIP-3 assets (dex:symbol format)\n *\n * @param symbol - Asset symbol (e.g., \"BTC\" or \"xyz:TSLA\")\n * @param kPrefixAssets - Optional set of assets that have a 'k' prefix to remove\n * @returns Icon URL for the asset\n *\n * @example Regular asset\n * getAssetIconUrl('BTC') // → 'https://app.hyperliquid.xyz/coins/BTC.svg'\n *\n * @example HIP-3 asset\n * getAssetIconUrl('xyz:TSLA') // → 'https://raw.githubusercontent.com/.../hip3%3Axyz_TSLA.svg'\n *\n * @example With k-prefix handling\n * getAssetIconUrl('kBONK', new Set(['KBONK'])) // → 'https://app.hyperliquid.xyz/coins/BONK.svg'\n */\nexport const getAssetIconUrl = (\n symbol: string,\n kPrefixAssets?: Set<string>,\n): string => {\n if (!symbol) {\n return '';\n }\n\n // Check for HIP-3 asset (contains colon) BEFORE uppercasing\n if (symbol.includes(':')) {\n const [dex, assetSymbol] = symbol.split(':');\n return `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${dex.toLowerCase()}:${assetSymbol.toUpperCase()}.svg`;\n }\n\n // For regular assets, uppercase the entire symbol\n let processedSymbol = symbol.toUpperCase();\n\n // Remove 'k' prefix only for specific assets if provided\n if (kPrefixAssets?.has(processedSymbol)) {\n processedSymbol = processedSymbol.substring(1);\n }\n\n // Regular asset\n return `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${processedSymbol}.svg`;\n};\n\n/**\n * Icon URLs with primary (MetaMask-hosted) and fallback (HyperLiquid) sources\n */\nexport type AssetIconUrls = {\n /** MetaMask contract-metadata repo (preferred source) */\n primary: string;\n /** HyperLiquid CDN (fallback source) */\n fallback: string;\n};\n\n/**\n * Generate icon URLs for an asset symbol with fallback support\n *\n * Resolution order:\n * 1. Primary: MetaMask contract-metadata repo (manually curated)\n * 2. Fallback: HyperLiquid CDN (always available)\n *\n * @param symbol - Asset symbol (e.g., \"BTC\" or \"xyz:TSLA\")\n * @param kPrefixAssets - Optional set of assets that have a 'k' prefix to remove\n * @returns Object with primary and fallback URLs, or null if no symbol\n *\n * @example Regular asset\n * getAssetIconUrls('BTC')\n * // → { primary: 'https://raw.githubusercontent.com/.../BTC.svg',\n * // fallback: 'https://app.hyperliquid.xyz/coins/BTC.svg' }\n *\n * @example HIP-3 asset\n * getAssetIconUrls('xyz:TSLA')\n * // → { primary: 'https://raw.githubusercontent.com/.../hip3:xyz_TSLA.svg',\n * // fallback: 'https://app.hyperliquid.xyz/coins/xyz:TSLA.svg' }\n */\nexport const getAssetIconUrls = (\n symbol: string,\n kPrefixAssets?: Set<string>,\n): AssetIconUrls | null => {\n if (!symbol) {\n return null;\n }\n\n // Check for HIP-3 asset (contains colon) BEFORE uppercasing\n if (symbol.includes(':')) {\n const [dex, assetSymbol] = symbol.split(':');\n // HyperLiquid uses dex:SYMBOL format\n const hyperliquidFormat = `${dex.toLowerCase()}:${assetSymbol.toUpperCase()}`;\n // MetaMask contract-metadata uses hip3:dex_SYMBOL format\n const metamaskFormat = `hip3:${dex.toLowerCase()}_${assetSymbol.toUpperCase()}`;\n return {\n primary: `${METAMASK_PERPS_ICONS_BASE_URL}${metamaskFormat}.svg`,\n fallback: `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${hyperliquidFormat}.svg`,\n };\n }\n\n // For regular assets, uppercase the entire symbol\n let processedSymbol = symbol.toUpperCase();\n\n // Remove 'k' prefix only for specific assets if provided\n if (kPrefixAssets?.has(processedSymbol)) {\n processedSymbol = processedSymbol.substring(1);\n }\n\n return {\n primary: `${METAMASK_PERPS_ICONS_BASE_URL}${processedSymbol}.svg`,\n fallback: `${HYPERLIQUID_ASSET_ICONS_BASE_URL}${processedSymbol}.svg`,\n };\n};\n"]}
@@ -1,151 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.aggregateOrderBookLevels = exports.selectDefaultGrouping = exports.formatGroupingLabel = exports.calculateGroupingOptions = exports.calculateAggregationParams = exports.MAX_ORDER_BOOK_LEVELS = void 0;
4
- /**
5
- * Maximum API levels to request from Hyperliquid L2Book API.
6
- * The API returns at most ~20 levels per side when using nSigFigs aggregation.
7
- */
8
- exports.MAX_ORDER_BOOK_LEVELS = 20;
9
- /**
10
- * Calculate nSigFigs and mantissa based on grouping and price.
11
- * These parameters match Hyperliquid's L2Book API aggregation:
12
- * - nSigFigs: 5, mantissa: 2 → finest granularity (~$1-2 for BTC)
13
- * - nSigFigs: 5, mantissa: 5 → ~$5 increments for BTC
14
- * - nSigFigs: 4 → ~$10 increments for BTC
15
- * - nSigFigs: 3 → ~$100 increments for BTC
16
- * - nSigFigs: 2 → ~$1000 increments for BTC (widest range)
17
- *
18
- * mantissa is only applicable when nSigFigs is 5.
19
- *
20
- * @param grouping - The price grouping increment
21
- * @param price - The current mid price
22
- * @returns Aggregation parameters for the API
23
- */
24
- function calculateAggregationParams(grouping, price) {
25
- // Guard against invalid inputs that would cause Math.log10 to return -Infinity or NaN
26
- if (price <= 0 || grouping <= 0) {
27
- return { nSigFigs: 5 };
28
- }
29
- const magnitude = Math.floor(Math.log10(price));
30
- const groupingMagnitude = Math.floor(Math.log10(grouping));
31
- const baseNSigFigs = magnitude - groupingMagnitude + 1;
32
- if (baseNSigFigs >= 5) {
33
- // Finest granularity needs mantissa
34
- // Derive mantissa from the first digit of grouping
35
- const firstDigit = Math.floor(grouping / Math.pow(10, groupingMagnitude));
36
- const mantissa = firstDigit <= 2 ? 2 : 5;
37
- return { nSigFigs: 5, mantissa };
38
- }
39
- // Clamp nSigFigs between 2 and 5 (API only supports these values)
40
- const clampedNSigFigs = Math.max(2, Math.min(5, baseNSigFigs));
41
- return { nSigFigs: clampedNSigFigs };
42
- }
43
- exports.calculateAggregationParams = calculateAggregationParams;
44
- /**
45
- * Calculate dynamic grouping options based on asset's mid price.
46
- * Uses "1-2-5 per decade" scale anchored to price magnitude.
47
- *
48
- * @param midPrice - The current mid price of the asset
49
- * @returns Array of grouping options suitable for the price magnitude
50
- * @example
51
- * calculateGroupingOptions(87000) → [1, 2, 5, 10, 100, 1000] // BTC
52
- * calculateGroupingOptions(33) → [0.001, 0.002, 0.005, 0.01, 0.1, 1] // HYPE
53
- * calculateGroupingOptions(0.002) → [0.000001, 0.00001, 0.0001] // PUMP
54
- */
55
- function calculateGroupingOptions(midPrice) {
56
- if (midPrice <= 0) {
57
- return [0.01, 0.1, 1]; // Fallback for invalid prices
58
- }
59
- const priceExponent = Math.floor(Math.log10(midPrice));
60
- const base = Math.pow(10, priceExponent - 4);
61
- const multipliers = [1, 2, 5, 10, 100, 1000];
62
- return multipliers.map((multiplier) => base * multiplier);
63
- }
64
- exports.calculateGroupingOptions = calculateGroupingOptions;
65
- /**
66
- * Format grouping value for display (e.g., "0.001", "1", "100").
67
- *
68
- * @param value - The grouping value to format
69
- * @returns Formatted string representation
70
- */
71
- function formatGroupingLabel(value) {
72
- if (value >= 1) {
73
- return value.toString();
74
- }
75
- // Calculate decimal places needed
76
- const decimals = Math.max(0, Math.ceil(-Math.log10(value)));
77
- return value.toFixed(decimals);
78
- }
79
- exports.formatGroupingLabel = formatGroupingLabel;
80
- /**
81
- * Select a sensible default grouping option.
82
- * Picks a middle option that gives reasonable granularity.
83
- *
84
- * @param options - Array of available grouping options
85
- * @returns The recommended default grouping value
86
- */
87
- function selectDefaultGrouping(options) {
88
- // Pick the 4th option (index 3) which is typically a good balance
89
- // For BTC: 10, for HYPE: 0.01, etc.
90
- return options[3] ?? options[Math.floor(options.length / 2)] ?? options[0];
91
- }
92
- exports.selectDefaultGrouping = selectDefaultGrouping;
93
- /**
94
- * Aggregate order book levels by price grouping.
95
- * Groups prices into buckets, sums sizes, and recalculates cumulative totals.
96
- *
97
- * @param levels - Raw order book levels from API
98
- * @param groupingSize - Price bucket size (e.g., 10 means group by $10 increments)
99
- * @param side - 'bid' rounds down to bucket, 'ask' rounds up to bucket
100
- * @returns Aggregated order book levels
101
- */
102
- function aggregateOrderBookLevels(levels, groupingSize, side) {
103
- if (!levels.length || groupingSize <= 0) {
104
- return levels;
105
- }
106
- // Group levels by price bucket
107
- const buckets = new Map();
108
- for (const level of levels) {
109
- const price = parseFloat(level.price);
110
- const size = parseFloat(level.size);
111
- const notional = parseFloat(level.notional);
112
- // Round price to bucket
113
- // Bids: round down (floor) to include in lower bucket
114
- // Asks: round up (ceil) to include in higher bucket
115
- let bucketPrice;
116
- if (side === 'bid') {
117
- bucketPrice = Math.floor(price / groupingSize) * groupingSize;
118
- }
119
- else {
120
- bucketPrice = Math.ceil(price / groupingSize) * groupingSize;
121
- }
122
- const existing = buckets.get(bucketPrice);
123
- if (existing) {
124
- existing.size += size;
125
- existing.notional += notional;
126
- }
127
- else {
128
- buckets.set(bucketPrice, { size, notional, price: bucketPrice });
129
- }
130
- }
131
- // Convert buckets to array and sort
132
- const sortedBuckets = Array.from(buckets.values()).sort((bucketA, bucketB) => side === 'bid'
133
- ? bucketB.price - bucketA.price
134
- : bucketA.price - bucketB.price);
135
- // Calculate cumulative totals
136
- let cumulativeSize = 0;
137
- let cumulativeNotional = 0;
138
- return sortedBuckets.map((bucket) => {
139
- cumulativeSize += bucket.size;
140
- cumulativeNotional += bucket.notional;
141
- return {
142
- price: bucket.price.toString(),
143
- size: bucket.size.toString(),
144
- total: cumulativeSize.toString(),
145
- notional: bucket.notional.toFixed(2),
146
- totalNotional: cumulativeNotional.toFixed(2),
147
- };
148
- });
149
- }
150
- exports.aggregateOrderBookLevels = aggregateOrderBookLevels;
151
- //# sourceMappingURL=orderBookGrouping.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orderBookGrouping.cjs","sourceRoot":"","sources":["../../src/utils/orderBookGrouping.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Order book level structure for grouping\n */\nexport type OrderBookLevel = {\n price: string;\n size: string;\n total: string;\n notional: string;\n totalNotional: string;\n};\n\n/**\n * Maximum API levels to request from Hyperliquid L2Book API.\n * The API returns at most ~20 levels per side when using nSigFigs aggregation.\n */\nexport const MAX_ORDER_BOOK_LEVELS = 20;\n\n/**\n * Parameters for Hyperliquid L2Book API aggregation.\n */\nexport type AggregationParams = {\n nSigFigs: 2 | 3 | 4 | 5;\n mantissa?: 2 | 5;\n};\n\n/**\n * Calculate nSigFigs and mantissa based on grouping and price.\n * These parameters match Hyperliquid's L2Book API aggregation:\n * - nSigFigs: 5, mantissa: 2 → finest granularity (~$1-2 for BTC)\n * - nSigFigs: 5, mantissa: 5 → ~$5 increments for BTC\n * - nSigFigs: 4 → ~$10 increments for BTC\n * - nSigFigs: 3 → ~$100 increments for BTC\n * - nSigFigs: 2 → ~$1000 increments for BTC (widest range)\n *\n * mantissa is only applicable when nSigFigs is 5.\n *\n * @param grouping - The price grouping increment\n * @param price - The current mid price\n * @returns Aggregation parameters for the API\n */\nexport function calculateAggregationParams(\n grouping: number,\n price: number,\n): AggregationParams {\n // Guard against invalid inputs that would cause Math.log10 to return -Infinity or NaN\n if (price <= 0 || grouping <= 0) {\n return { nSigFigs: 5 };\n }\n\n const magnitude = Math.floor(Math.log10(price));\n const groupingMagnitude = Math.floor(Math.log10(grouping));\n const baseNSigFigs = magnitude - groupingMagnitude + 1;\n\n if (baseNSigFigs >= 5) {\n // Finest granularity needs mantissa\n // Derive mantissa from the first digit of grouping\n const firstDigit = Math.floor(grouping / Math.pow(10, groupingMagnitude));\n const mantissa = firstDigit <= 2 ? 2 : 5;\n return { nSigFigs: 5, mantissa };\n }\n\n // Clamp nSigFigs between 2 and 5 (API only supports these values)\n const clampedNSigFigs = Math.max(2, Math.min(5, baseNSigFigs)) as\n | 2\n | 3\n | 4\n | 5;\n return { nSigFigs: clampedNSigFigs };\n}\n\n/**\n * Calculate dynamic grouping options based on asset's mid price.\n * Uses \"1-2-5 per decade\" scale anchored to price magnitude.\n *\n * @param midPrice - The current mid price of the asset\n * @returns Array of grouping options suitable for the price magnitude\n * @example\n * calculateGroupingOptions(87000) → [1, 2, 5, 10, 100, 1000] // BTC\n * calculateGroupingOptions(33) → [0.001, 0.002, 0.005, 0.01, 0.1, 1] // HYPE\n * calculateGroupingOptions(0.002) → [0.000001, 0.00001, 0.0001] // PUMP\n */\nexport function calculateGroupingOptions(midPrice: number): number[] {\n if (midPrice <= 0) {\n return [0.01, 0.1, 1]; // Fallback for invalid prices\n }\n\n const priceExponent = Math.floor(Math.log10(midPrice));\n const base = Math.pow(10, priceExponent - 4);\n const multipliers = [1, 2, 5, 10, 100, 1000];\n\n return multipliers.map((multiplier) => base * multiplier);\n}\n\n/**\n * Format grouping value for display (e.g., \"0.001\", \"1\", \"100\").\n *\n * @param value - The grouping value to format\n * @returns Formatted string representation\n */\nexport function formatGroupingLabel(value: number): string {\n if (value >= 1) {\n return value.toString();\n }\n // Calculate decimal places needed\n const decimals = Math.max(0, Math.ceil(-Math.log10(value)));\n return value.toFixed(decimals);\n}\n\n/**\n * Select a sensible default grouping option.\n * Picks a middle option that gives reasonable granularity.\n *\n * @param options - Array of available grouping options\n * @returns The recommended default grouping value\n */\nexport function selectDefaultGrouping(options: number[]): number {\n // Pick the 4th option (index 3) which is typically a good balance\n // For BTC: 10, for HYPE: 0.01, etc.\n return options[3] ?? options[Math.floor(options.length / 2)] ?? options[0];\n}\n\n/**\n * Aggregate order book levels by price grouping.\n * Groups prices into buckets, sums sizes, and recalculates cumulative totals.\n *\n * @param levels - Raw order book levels from API\n * @param groupingSize - Price bucket size (e.g., 10 means group by $10 increments)\n * @param side - 'bid' rounds down to bucket, 'ask' rounds up to bucket\n * @returns Aggregated order book levels\n */\nexport function aggregateOrderBookLevels(\n levels: OrderBookLevel[],\n groupingSize: number,\n side: 'bid' | 'ask',\n): OrderBookLevel[] {\n if (!levels.length || groupingSize <= 0) {\n return levels;\n }\n\n // Group levels by price bucket\n const buckets = new Map<\n number,\n { size: number; notional: number; price: number }\n >();\n\n for (const level of levels) {\n const price = parseFloat(level.price);\n const size = parseFloat(level.size);\n const notional = parseFloat(level.notional);\n\n // Round price to bucket\n // Bids: round down (floor) to include in lower bucket\n // Asks: round up (ceil) to include in higher bucket\n let bucketPrice: number;\n if (side === 'bid') {\n bucketPrice = Math.floor(price / groupingSize) * groupingSize;\n } else {\n bucketPrice = Math.ceil(price / groupingSize) * groupingSize;\n }\n\n const existing = buckets.get(bucketPrice);\n if (existing) {\n existing.size += size;\n existing.notional += notional;\n } else {\n buckets.set(bucketPrice, { size, notional, price: bucketPrice });\n }\n }\n\n // Convert buckets to array and sort\n const sortedBuckets = Array.from(buckets.values()).sort((bucketA, bucketB) =>\n side === 'bid'\n ? bucketB.price - bucketA.price\n : bucketA.price - bucketB.price,\n );\n\n // Calculate cumulative totals\n let cumulativeSize = 0;\n let cumulativeNotional = 0;\n\n return sortedBuckets.map((bucket) => {\n cumulativeSize += bucket.size;\n cumulativeNotional += bucket.notional;\n\n return {\n price: bucket.price.toString(),\n size: bucket.size.toString(),\n total: cumulativeSize.toString(),\n notional: bucket.notional.toFixed(2),\n totalNotional: cumulativeNotional.toFixed(2),\n };\n });\n}\n"]}