@metamask-previews/perps-controller 0.0.0-preview-685dbf46b → 1.0.0-preview-bc00f2c

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 (482) hide show
  1. package/CHANGELOG.md +30 -2
  2. package/dist/PerpsController.cjs +3077 -65
  3. package/dist/PerpsController.cjs.map +1 -1
  4. package/dist/PerpsController.d.cts +969 -82
  5. package/dist/PerpsController.d.cts.map +1 -1
  6. package/dist/PerpsController.d.mts +969 -82
  7. package/dist/PerpsController.d.mts.map +1 -1
  8. package/dist/PerpsController.mjs +3073 -62
  9. package/dist/PerpsController.mjs.map +1 -1
  10. package/dist/aggregation/SubscriptionMultiplexer.cjs +441 -0
  11. package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -0
  12. package/dist/aggregation/SubscriptionMultiplexer.d.cts +171 -0
  13. package/dist/aggregation/SubscriptionMultiplexer.d.cts.map +1 -0
  14. package/dist/aggregation/SubscriptionMultiplexer.d.mts +171 -0
  15. package/dist/aggregation/SubscriptionMultiplexer.d.mts.map +1 -0
  16. package/dist/aggregation/SubscriptionMultiplexer.mjs +437 -0
  17. package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -0
  18. package/dist/aggregation/index.cjs +9 -0
  19. package/dist/aggregation/index.cjs.map +1 -0
  20. package/dist/aggregation/index.d.cts +6 -0
  21. package/dist/aggregation/index.d.cts.map +1 -0
  22. package/dist/aggregation/index.d.mts +6 -0
  23. package/dist/aggregation/index.d.mts.map +1 -0
  24. package/dist/aggregation/index.mjs +5 -0
  25. package/dist/aggregation/index.mjs.map +1 -0
  26. package/dist/constants/chartConfig.cjs +227 -0
  27. package/dist/constants/chartConfig.cjs.map +1 -0
  28. package/dist/constants/chartConfig.d.cts +216 -0
  29. package/dist/constants/chartConfig.d.cts.map +1 -0
  30. package/dist/constants/chartConfig.d.mts +216 -0
  31. package/dist/constants/chartConfig.d.mts.map +1 -0
  32. package/dist/constants/chartConfig.mjs +221 -0
  33. package/dist/constants/chartConfig.mjs.map +1 -0
  34. package/dist/constants/eventNames.cjs +436 -0
  35. package/dist/constants/eventNames.cjs.map +1 -0
  36. package/dist/constants/eventNames.d.cts +387 -0
  37. package/dist/constants/eventNames.d.cts.map +1 -0
  38. package/dist/constants/eventNames.d.mts +387 -0
  39. package/dist/constants/eventNames.d.mts.map +1 -0
  40. package/dist/constants/eventNames.mjs +433 -0
  41. package/dist/constants/eventNames.mjs.map +1 -0
  42. package/dist/constants/hyperLiquidConfig.cjs +380 -0
  43. package/dist/constants/hyperLiquidConfig.cjs.map +1 -0
  44. package/dist/constants/hyperLiquidConfig.d.cts +236 -0
  45. package/dist/constants/hyperLiquidConfig.d.cts.map +1 -0
  46. package/dist/constants/hyperLiquidConfig.d.mts +236 -0
  47. package/dist/constants/hyperLiquidConfig.d.mts.map +1 -0
  48. package/dist/constants/hyperLiquidConfig.mjs +371 -0
  49. package/dist/constants/hyperLiquidConfig.mjs.map +1 -0
  50. package/dist/constants/index.cjs +28 -0
  51. package/dist/constants/index.cjs.map +1 -0
  52. package/dist/constants/index.d.cts +12 -0
  53. package/dist/constants/index.d.cts.map +1 -0
  54. package/dist/constants/index.d.mts +12 -0
  55. package/dist/constants/index.d.mts.map +1 -0
  56. package/dist/constants/index.mjs +12 -0
  57. package/dist/constants/index.mjs.map +1 -0
  58. package/dist/constants/myxConfig.cjs +229 -0
  59. package/dist/constants/myxConfig.cjs.map +1 -0
  60. package/dist/constants/myxConfig.d.cts +106 -0
  61. package/dist/constants/myxConfig.d.cts.map +1 -0
  62. package/dist/constants/myxConfig.d.mts +106 -0
  63. package/dist/constants/myxConfig.d.mts.map +1 -0
  64. package/dist/constants/myxConfig.mjs +219 -0
  65. package/dist/constants/myxConfig.mjs.map +1 -0
  66. package/dist/constants/orderTypes.cjs +31 -0
  67. package/dist/constants/orderTypes.cjs.map +1 -0
  68. package/dist/constants/orderTypes.d.cts +19 -0
  69. package/dist/constants/orderTypes.d.cts.map +1 -0
  70. package/dist/constants/orderTypes.d.mts +19 -0
  71. package/dist/constants/orderTypes.d.mts.map +1 -0
  72. package/dist/constants/orderTypes.mjs +27 -0
  73. package/dist/constants/orderTypes.mjs.map +1 -0
  74. package/dist/constants/performanceMetrics.cjs +63 -0
  75. package/dist/constants/performanceMetrics.cjs.map +1 -0
  76. package/dist/constants/performanceMetrics.d.cts +46 -0
  77. package/dist/constants/performanceMetrics.d.cts.map +1 -0
  78. package/dist/constants/performanceMetrics.d.mts +46 -0
  79. package/dist/constants/performanceMetrics.d.mts.map +1 -0
  80. package/dist/constants/performanceMetrics.mjs +60 -0
  81. package/dist/constants/performanceMetrics.mjs.map +1 -0
  82. package/dist/constants/perpsConfig.cjs +295 -0
  83. package/dist/constants/perpsConfig.cjs.map +1 -0
  84. package/dist/constants/perpsConfig.d.cts +221 -0
  85. package/dist/constants/perpsConfig.d.cts.map +1 -0
  86. package/dist/constants/perpsConfig.d.mts +221 -0
  87. package/dist/constants/perpsConfig.d.mts.map +1 -0
  88. package/dist/constants/perpsConfig.mjs +292 -0
  89. package/dist/constants/perpsConfig.mjs.map +1 -0
  90. package/dist/constants/transactionsHistoryConfig.cjs +19 -0
  91. package/dist/constants/transactionsHistoryConfig.cjs.map +1 -0
  92. package/dist/constants/transactionsHistoryConfig.d.cts +16 -0
  93. package/dist/constants/transactionsHistoryConfig.d.cts.map +1 -0
  94. package/dist/constants/transactionsHistoryConfig.d.mts +16 -0
  95. package/dist/constants/transactionsHistoryConfig.d.mts.map +1 -0
  96. package/dist/constants/transactionsHistoryConfig.mjs +16 -0
  97. package/dist/constants/transactionsHistoryConfig.mjs.map +1 -0
  98. package/dist/index.cjs +63 -1
  99. package/dist/index.cjs.map +1 -1
  100. package/dist/index.d.cts +38 -2
  101. package/dist/index.d.cts.map +1 -1
  102. package/dist/index.d.mts +38 -2
  103. package/dist/index.d.mts.map +1 -1
  104. package/dist/index.mjs +46 -1
  105. package/dist/index.mjs.map +1 -1
  106. package/dist/perpsErrorCodes.cjs +80 -0
  107. package/dist/perpsErrorCodes.cjs.map +1 -0
  108. package/dist/perpsErrorCodes.d.cts +65 -0
  109. package/dist/perpsErrorCodes.d.cts.map +1 -0
  110. package/dist/perpsErrorCodes.d.mts +65 -0
  111. package/dist/perpsErrorCodes.d.mts.map +1 -0
  112. package/dist/perpsErrorCodes.mjs +77 -0
  113. package/dist/perpsErrorCodes.mjs.map +1 -0
  114. package/dist/providers/AggregatedPerpsProvider.cjs +508 -0
  115. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -0
  116. package/dist/providers/AggregatedPerpsProvider.d.cts +171 -0
  117. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -0
  118. package/dist/providers/AggregatedPerpsProvider.d.mts +171 -0
  119. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -0
  120. package/dist/providers/AggregatedPerpsProvider.mjs +504 -0
  121. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -0
  122. package/dist/providers/HyperLiquidProvider.cjs +5679 -0
  123. package/dist/providers/HyperLiquidProvider.cjs.map +1 -0
  124. package/dist/providers/HyperLiquidProvider.d.cts +516 -0
  125. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -0
  126. package/dist/providers/HyperLiquidProvider.d.mts +516 -0
  127. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -0
  128. package/dist/providers/HyperLiquidProvider.mjs +5675 -0
  129. package/dist/providers/HyperLiquidProvider.mjs.map +1 -0
  130. package/dist/providers/MYXProvider.cjs +514 -0
  131. package/dist/providers/MYXProvider.cjs.map +1 -0
  132. package/dist/providers/MYXProvider.d.cts +105 -0
  133. package/dist/providers/MYXProvider.d.cts.map +1 -0
  134. package/dist/providers/MYXProvider.d.mts +105 -0
  135. package/dist/providers/MYXProvider.d.mts.map +1 -0
  136. package/dist/providers/MYXProvider.mjs +510 -0
  137. package/dist/providers/MYXProvider.mjs.map +1 -0
  138. package/dist/routing/ProviderRouter.cjs +154 -0
  139. package/dist/routing/ProviderRouter.cjs.map +1 -0
  140. package/dist/routing/ProviderRouter.d.cts +112 -0
  141. package/dist/routing/ProviderRouter.d.cts.map +1 -0
  142. package/dist/routing/ProviderRouter.d.mts +112 -0
  143. package/dist/routing/ProviderRouter.d.mts.map +1 -0
  144. package/dist/routing/ProviderRouter.mjs +150 -0
  145. package/dist/routing/ProviderRouter.mjs.map +1 -0
  146. package/dist/routing/index.cjs +9 -0
  147. package/dist/routing/index.cjs.map +1 -0
  148. package/dist/routing/index.d.cts +6 -0
  149. package/dist/routing/index.d.cts.map +1 -0
  150. package/dist/routing/index.d.mts +6 -0
  151. package/dist/routing/index.d.mts.map +1 -0
  152. package/dist/routing/index.mjs +5 -0
  153. package/dist/routing/index.mjs.map +1 -0
  154. package/dist/selectors.cjs +166 -0
  155. package/dist/selectors.cjs.map +1 -0
  156. package/dist/selectors.d.cts +362 -0
  157. package/dist/selectors.d.cts.map +1 -0
  158. package/dist/selectors.d.mts +362 -0
  159. package/dist/selectors.d.mts.map +1 -0
  160. package/dist/selectors.mjs +158 -0
  161. package/dist/selectors.mjs.map +1 -0
  162. package/dist/services/AccountService.cjs +324 -0
  163. package/dist/services/AccountService.cjs.map +1 -0
  164. package/dist/services/AccountService.d.cts +56 -0
  165. package/dist/services/AccountService.d.cts.map +1 -0
  166. package/dist/services/AccountService.d.mts +56 -0
  167. package/dist/services/AccountService.d.mts.map +1 -0
  168. package/dist/services/AccountService.mjs +320 -0
  169. package/dist/services/AccountService.mjs.map +1 -0
  170. package/dist/services/DataLakeService.cjs +233 -0
  171. package/dist/services/DataLakeService.cjs.map +1 -0
  172. package/dist/services/DataLakeService.d.cts +51 -0
  173. package/dist/services/DataLakeService.d.cts.map +1 -0
  174. package/dist/services/DataLakeService.d.mts +51 -0
  175. package/dist/services/DataLakeService.d.mts.map +1 -0
  176. package/dist/services/DataLakeService.mjs +229 -0
  177. package/dist/services/DataLakeService.mjs.map +1 -0
  178. package/dist/services/DepositService.cjs +98 -0
  179. package/dist/services/DepositService.cjs.map +1 -0
  180. package/dist/services/DepositService.d.cts +39 -0
  181. package/dist/services/DepositService.d.cts.map +1 -0
  182. package/dist/services/DepositService.d.mts +39 -0
  183. package/dist/services/DepositService.d.mts.map +1 -0
  184. package/dist/services/DepositService.mjs +94 -0
  185. package/dist/services/DepositService.mjs.map +1 -0
  186. package/dist/services/EligibilityService.cjs +173 -0
  187. package/dist/services/EligibilityService.cjs.map +1 -0
  188. package/dist/services/EligibilityService.d.cts +39 -0
  189. package/dist/services/EligibilityService.d.cts.map +1 -0
  190. package/dist/services/EligibilityService.d.mts +39 -0
  191. package/dist/services/EligibilityService.d.mts.map +1 -0
  192. package/dist/services/EligibilityService.mjs +169 -0
  193. package/dist/services/EligibilityService.mjs.map +1 -0
  194. package/dist/services/FeatureFlagConfigurationService.cjs +257 -0
  195. package/dist/services/FeatureFlagConfigurationService.cjs.map +1 -0
  196. package/dist/services/FeatureFlagConfigurationService.d.cts +73 -0
  197. package/dist/services/FeatureFlagConfigurationService.d.cts.map +1 -0
  198. package/dist/services/FeatureFlagConfigurationService.d.mts +73 -0
  199. package/dist/services/FeatureFlagConfigurationService.d.mts.map +1 -0
  200. package/dist/services/FeatureFlagConfigurationService.mjs +253 -0
  201. package/dist/services/FeatureFlagConfigurationService.mjs.map +1 -0
  202. package/dist/services/HyperLiquidClientService.cjs +867 -0
  203. package/dist/services/HyperLiquidClientService.cjs.map +1 -0
  204. package/dist/services/HyperLiquidClientService.d.cts +214 -0
  205. package/dist/services/HyperLiquidClientService.d.cts.map +1 -0
  206. package/dist/services/HyperLiquidClientService.d.mts +214 -0
  207. package/dist/services/HyperLiquidClientService.d.mts.map +1 -0
  208. package/dist/services/HyperLiquidClientService.mjs +862 -0
  209. package/dist/services/HyperLiquidClientService.mjs.map +1 -0
  210. package/dist/services/HyperLiquidSubscriptionService.cjs +2199 -0
  211. package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -0
  212. package/dist/services/HyperLiquidSubscriptionService.d.cts +187 -0
  213. package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -0
  214. package/dist/services/HyperLiquidSubscriptionService.d.mts +187 -0
  215. package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -0
  216. package/dist/services/HyperLiquidSubscriptionService.mjs +2195 -0
  217. package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -0
  218. package/dist/services/HyperLiquidWalletService.cjs +163 -0
  219. package/dist/services/HyperLiquidWalletService.cjs.map +1 -0
  220. package/dist/services/HyperLiquidWalletService.d.cts +78 -0
  221. package/dist/services/HyperLiquidWalletService.d.cts.map +1 -0
  222. package/dist/services/HyperLiquidWalletService.d.mts +78 -0
  223. package/dist/services/HyperLiquidWalletService.d.mts.map +1 -0
  224. package/dist/services/HyperLiquidWalletService.mjs +159 -0
  225. package/dist/services/HyperLiquidWalletService.mjs.map +1 -0
  226. package/dist/services/MYXClientService.cjs +304 -0
  227. package/dist/services/MYXClientService.cjs.map +1 -0
  228. package/dist/services/MYXClientService.d.cts +81 -0
  229. package/dist/services/MYXClientService.d.cts.map +1 -0
  230. package/dist/services/MYXClientService.d.mts +81 -0
  231. package/dist/services/MYXClientService.d.mts.map +1 -0
  232. package/dist/services/MYXClientService.mjs +300 -0
  233. package/dist/services/MYXClientService.mjs.map +1 -0
  234. package/dist/services/MarketDataService.cjs +848 -0
  235. package/dist/services/MarketDataService.cjs.map +1 -0
  236. package/dist/services/MarketDataService.d.cts +291 -0
  237. package/dist/services/MarketDataService.d.cts.map +1 -0
  238. package/dist/services/MarketDataService.d.mts +291 -0
  239. package/dist/services/MarketDataService.d.mts.map +1 -0
  240. package/dist/services/MarketDataService.mjs +844 -0
  241. package/dist/services/MarketDataService.mjs.map +1 -0
  242. package/dist/services/RewardsIntegrationService.cjs +120 -0
  243. package/dist/services/RewardsIntegrationService.cjs.map +1 -0
  244. package/dist/services/RewardsIntegrationService.d.cts +28 -0
  245. package/dist/services/RewardsIntegrationService.d.cts.map +1 -0
  246. package/dist/services/RewardsIntegrationService.d.mts +28 -0
  247. package/dist/services/RewardsIntegrationService.d.mts.map +1 -0
  248. package/dist/services/RewardsIntegrationService.mjs +116 -0
  249. package/dist/services/RewardsIntegrationService.mjs.map +1 -0
  250. package/dist/services/ServiceContext.cjs +3 -0
  251. package/dist/services/ServiceContext.cjs.map +1 -0
  252. package/dist/services/ServiceContext.d.cts +86 -0
  253. package/dist/services/ServiceContext.d.cts.map +1 -0
  254. package/dist/services/ServiceContext.d.mts +86 -0
  255. package/dist/services/ServiceContext.d.mts.map +1 -0
  256. package/dist/services/ServiceContext.mjs +2 -0
  257. package/dist/services/ServiceContext.mjs.map +1 -0
  258. package/dist/services/TradingReadinessCache.cjs +288 -0
  259. package/dist/services/TradingReadinessCache.cjs.map +1 -0
  260. package/dist/services/TradingReadinessCache.d.cts +174 -0
  261. package/dist/services/TradingReadinessCache.d.cts.map +1 -0
  262. package/dist/services/TradingReadinessCache.d.mts +174 -0
  263. package/dist/services/TradingReadinessCache.d.mts.map +1 -0
  264. package/dist/services/TradingReadinessCache.mjs +285 -0
  265. package/dist/services/TradingReadinessCache.mjs.map +1 -0
  266. package/dist/services/TradingService.cjs +1457 -0
  267. package/dist/services/TradingService.cjs.map +1 -0
  268. package/dist/services/TradingService.d.cts +195 -0
  269. package/dist/services/TradingService.d.cts.map +1 -0
  270. package/dist/services/TradingService.d.mts +195 -0
  271. package/dist/services/TradingService.d.mts.map +1 -0
  272. package/dist/services/TradingService.mjs +1453 -0
  273. package/dist/services/TradingService.mjs.map +1 -0
  274. package/dist/types/config.cjs +3 -0
  275. package/dist/types/config.cjs.map +1 -0
  276. package/dist/types/config.d.cts +49 -0
  277. package/dist/types/config.d.cts.map +1 -0
  278. package/dist/types/config.d.mts +49 -0
  279. package/dist/types/config.d.mts.map +1 -0
  280. package/dist/types/config.mjs +2 -0
  281. package/dist/types/config.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 +20 -0
  285. package/dist/types/hyperliquid-types.d.cts.map +1 -0
  286. package/dist/types/hyperliquid-types.d.mts +20 -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 +115 -0
  291. package/dist/types/index.cjs.map +1 -0
  292. package/dist/types/index.d.cts +1262 -0
  293. package/dist/types/index.d.cts.map +1 -0
  294. package/dist/types/index.d.mts +1262 -0
  295. package/dist/types/index.d.mts.map +1 -0
  296. package/dist/types/index.mjs +97 -0
  297. package/dist/types/index.mjs.map +1 -0
  298. package/dist/types/messenger.cjs +3 -0
  299. package/dist/types/messenger.cjs.map +1 -0
  300. package/dist/types/messenger.d.cts +27 -0
  301. package/dist/types/messenger.d.cts.map +1 -0
  302. package/dist/types/messenger.d.mts +27 -0
  303. package/dist/types/messenger.d.mts.map +1 -0
  304. package/dist/types/messenger.mjs +2 -0
  305. package/dist/types/messenger.mjs.map +1 -0
  306. package/dist/types/myx-types.cjs +25 -0
  307. package/dist/types/myx-types.cjs.map +1 -0
  308. package/dist/types/myx-types.d.cts +63 -0
  309. package/dist/types/myx-types.d.cts.map +1 -0
  310. package/dist/types/myx-types.d.mts +63 -0
  311. package/dist/types/myx-types.d.mts.map +1 -0
  312. package/dist/types/myx-types.mjs +22 -0
  313. package/dist/types/myx-types.mjs.map +1 -0
  314. package/dist/types/perps-types.cjs +4 -0
  315. package/dist/types/perps-types.cjs.map +1 -0
  316. package/dist/types/perps-types.d.cts +105 -0
  317. package/dist/types/perps-types.d.cts.map +1 -0
  318. package/dist/types/perps-types.d.mts +105 -0
  319. package/dist/types/perps-types.d.mts.map +1 -0
  320. package/dist/types/perps-types.mjs +2 -0
  321. package/dist/types/perps-types.mjs.map +1 -0
  322. package/dist/types/token.cjs +3 -0
  323. package/dist/types/token.cjs.map +1 -0
  324. package/dist/types/token.d.cts +25 -0
  325. package/dist/types/token.d.cts.map +1 -0
  326. package/dist/types/token.d.mts +25 -0
  327. package/dist/types/token.d.mts.map +1 -0
  328. package/dist/types/token.mjs +2 -0
  329. package/dist/types/token.mjs.map +1 -0
  330. package/dist/types/transactionTypes.cjs +28 -0
  331. package/dist/types/transactionTypes.cjs.map +1 -0
  332. package/dist/types/transactionTypes.d.cts +64 -0
  333. package/dist/types/transactionTypes.d.cts.map +1 -0
  334. package/dist/types/transactionTypes.d.mts +64 -0
  335. package/dist/types/transactionTypes.d.mts.map +1 -0
  336. package/dist/types/transactionTypes.mjs +23 -0
  337. package/dist/types/transactionTypes.mjs.map +1 -0
  338. package/dist/utils/accountUtils.cjs +100 -0
  339. package/dist/utils/accountUtils.cjs.map +1 -0
  340. package/dist/utils/accountUtils.d.cts +30 -0
  341. package/dist/utils/accountUtils.d.cts.map +1 -0
  342. package/dist/utils/accountUtils.d.mts +30 -0
  343. package/dist/utils/accountUtils.d.mts.map +1 -0
  344. package/dist/utils/accountUtils.mjs +92 -0
  345. package/dist/utils/accountUtils.mjs.map +1 -0
  346. package/dist/utils/errorUtils.cjs +35 -0
  347. package/dist/utils/errorUtils.cjs.map +1 -0
  348. package/dist/utils/errorUtils.d.cts +15 -0
  349. package/dist/utils/errorUtils.d.cts.map +1 -0
  350. package/dist/utils/errorUtils.d.mts +15 -0
  351. package/dist/utils/errorUtils.d.mts.map +1 -0
  352. package/dist/utils/errorUtils.mjs +31 -0
  353. package/dist/utils/errorUtils.mjs.map +1 -0
  354. package/dist/utils/hyperLiquidAdapter.cjs +331 -0
  355. package/dist/utils/hyperLiquidAdapter.cjs.map +1 -0
  356. package/dist/utils/hyperLiquidAdapter.d.cts +42 -0
  357. package/dist/utils/hyperLiquidAdapter.d.cts.map +1 -0
  358. package/dist/utils/hyperLiquidAdapter.d.mts +42 -0
  359. package/dist/utils/hyperLiquidAdapter.d.mts.map +1 -0
  360. package/dist/utils/hyperLiquidAdapter.mjs +316 -0
  361. package/dist/utils/hyperLiquidAdapter.mjs.map +1 -0
  362. package/dist/utils/hyperLiquidOrderBookProcessor.cjs +83 -0
  363. package/dist/utils/hyperLiquidOrderBookProcessor.cjs.map +1 -0
  364. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts +55 -0
  365. package/dist/utils/hyperLiquidOrderBookProcessor.d.cts.map +1 -0
  366. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts +55 -0
  367. package/dist/utils/hyperLiquidOrderBookProcessor.d.mts.map +1 -0
  368. package/dist/utils/hyperLiquidOrderBookProcessor.mjs +78 -0
  369. package/dist/utils/hyperLiquidOrderBookProcessor.mjs.map +1 -0
  370. package/dist/utils/hyperLiquidValidation.cjs +426 -0
  371. package/dist/utils/hyperLiquidValidation.cjs.map +1 -0
  372. package/dist/utils/hyperLiquidValidation.d.cts +143 -0
  373. package/dist/utils/hyperLiquidValidation.d.cts.map +1 -0
  374. package/dist/utils/hyperLiquidValidation.d.mts +143 -0
  375. package/dist/utils/hyperLiquidValidation.d.mts.map +1 -0
  376. package/dist/utils/hyperLiquidValidation.mjs +413 -0
  377. package/dist/utils/hyperLiquidValidation.mjs.map +1 -0
  378. package/dist/utils/idUtils.cjs +18 -0
  379. package/dist/utils/idUtils.cjs.map +1 -0
  380. package/dist/utils/idUtils.d.cts +6 -0
  381. package/dist/utils/idUtils.d.cts.map +1 -0
  382. package/dist/utils/idUtils.d.mts +6 -0
  383. package/dist/utils/idUtils.d.mts.map +1 -0
  384. package/dist/utils/idUtils.mjs +10 -0
  385. package/dist/utils/idUtils.mjs.map +1 -0
  386. package/dist/utils/index.cjs +59 -0
  387. package/dist/utils/index.cjs.map +1 -0
  388. package/dist/utils/index.d.cts +25 -0
  389. package/dist/utils/index.d.cts.map +1 -0
  390. package/dist/utils/index.d.mts +25 -0
  391. package/dist/utils/index.d.mts.map +1 -0
  392. package/dist/utils/index.mjs +30 -0
  393. package/dist/utils/index.mjs.map +1 -0
  394. package/dist/utils/marketDataTransform.cjs +211 -0
  395. package/dist/utils/marketDataTransform.cjs.map +1 -0
  396. package/dist/utils/marketDataTransform.d.cts +40 -0
  397. package/dist/utils/marketDataTransform.d.cts.map +1 -0
  398. package/dist/utils/marketDataTransform.d.mts +40 -0
  399. package/dist/utils/marketDataTransform.d.mts.map +1 -0
  400. package/dist/utils/marketDataTransform.mjs +205 -0
  401. package/dist/utils/marketDataTransform.mjs.map +1 -0
  402. package/dist/utils/marketUtils.cjs +151 -0
  403. package/dist/utils/marketUtils.cjs.map +1 -0
  404. package/dist/utils/marketUtils.d.cts +30 -0
  405. package/dist/utils/marketUtils.d.cts.map +1 -0
  406. package/dist/utils/marketUtils.d.mts +30 -0
  407. package/dist/utils/marketUtils.d.mts.map +1 -0
  408. package/dist/utils/marketUtils.mjs +138 -0
  409. package/dist/utils/marketUtils.mjs.map +1 -0
  410. package/dist/utils/myxAdapter.cjs +224 -0
  411. package/dist/utils/myxAdapter.cjs.map +1 -0
  412. package/dist/utils/myxAdapter.d.cts +81 -0
  413. package/dist/utils/myxAdapter.d.cts.map +1 -0
  414. package/dist/utils/myxAdapter.d.mts +81 -0
  415. package/dist/utils/myxAdapter.d.mts.map +1 -0
  416. package/dist/utils/myxAdapter.mjs +213 -0
  417. package/dist/utils/myxAdapter.mjs.map +1 -0
  418. package/dist/utils/orderCalculations.cjs +283 -0
  419. package/dist/utils/orderCalculations.cjs.map +1 -0
  420. package/dist/utils/orderCalculations.d.cts +107 -0
  421. package/dist/utils/orderCalculations.d.cts.map +1 -0
  422. package/dist/utils/orderCalculations.d.mts +107 -0
  423. package/dist/utils/orderCalculations.d.mts.map +1 -0
  424. package/dist/utils/orderCalculations.mjs +274 -0
  425. package/dist/utils/orderCalculations.mjs.map +1 -0
  426. package/dist/utils/rewardsUtils.cjs +98 -0
  427. package/dist/utils/rewardsUtils.cjs.map +1 -0
  428. package/dist/utils/rewardsUtils.d.cts +33 -0
  429. package/dist/utils/rewardsUtils.d.cts.map +1 -0
  430. package/dist/utils/rewardsUtils.d.mts +33 -0
  431. package/dist/utils/rewardsUtils.d.mts.map +1 -0
  432. package/dist/utils/rewardsUtils.mjs +92 -0
  433. package/dist/utils/rewardsUtils.mjs.map +1 -0
  434. package/dist/utils/significantFigures.cjs +88 -0
  435. package/dist/utils/significantFigures.cjs.map +1 -0
  436. package/dist/utils/significantFigures.d.cts +25 -0
  437. package/dist/utils/significantFigures.d.cts.map +1 -0
  438. package/dist/utils/significantFigures.d.mts +25 -0
  439. package/dist/utils/significantFigures.d.mts.map +1 -0
  440. package/dist/utils/significantFigures.mjs +82 -0
  441. package/dist/utils/significantFigures.mjs.map +1 -0
  442. package/dist/utils/sortMarkets.cjs +93 -0
  443. package/dist/utils/sortMarkets.cjs.map +1 -0
  444. package/dist/utils/sortMarkets.d.cts +27 -0
  445. package/dist/utils/sortMarkets.d.cts.map +1 -0
  446. package/dist/utils/sortMarkets.d.mts +27 -0
  447. package/dist/utils/sortMarkets.d.mts.map +1 -0
  448. package/dist/utils/sortMarkets.mjs +88 -0
  449. package/dist/utils/sortMarkets.mjs.map +1 -0
  450. package/dist/utils/standaloneInfoClient.cjs +70 -0
  451. package/dist/utils/standaloneInfoClient.cjs.map +1 -0
  452. package/dist/utils/standaloneInfoClient.d.cts +37 -0
  453. package/dist/utils/standaloneInfoClient.d.cts.map +1 -0
  454. package/dist/utils/standaloneInfoClient.d.mts +37 -0
  455. package/dist/utils/standaloneInfoClient.d.mts.map +1 -0
  456. package/dist/utils/standaloneInfoClient.mjs +64 -0
  457. package/dist/utils/standaloneInfoClient.mjs.map +1 -0
  458. package/dist/utils/stringParseUtils.cjs +18 -0
  459. package/dist/utils/stringParseUtils.cjs.map +1 -0
  460. package/dist/utils/stringParseUtils.d.cts +3 -0
  461. package/dist/utils/stringParseUtils.d.cts.map +1 -0
  462. package/dist/utils/stringParseUtils.d.mts +3 -0
  463. package/dist/utils/stringParseUtils.d.mts.map +1 -0
  464. package/dist/utils/stringParseUtils.mjs +13 -0
  465. package/dist/utils/stringParseUtils.mjs.map +1 -0
  466. package/dist/utils/transferData.cjs +33 -0
  467. package/dist/utils/transferData.cjs.map +1 -0
  468. package/dist/utils/transferData.d.cts +9 -0
  469. package/dist/utils/transferData.d.cts.map +1 -0
  470. package/dist/utils/transferData.d.mts +9 -0
  471. package/dist/utils/transferData.d.mts.map +1 -0
  472. package/dist/utils/transferData.mjs +29 -0
  473. package/dist/utils/transferData.mjs.map +1 -0
  474. package/dist/utils/wait.cjs +6 -0
  475. package/dist/utils/wait.cjs.map +1 -0
  476. package/dist/utils/wait.d.cts +2 -0
  477. package/dist/utils/wait.d.cts.map +1 -0
  478. package/dist/utils/wait.d.mts +2 -0
  479. package/dist/utils/wait.d.mts.map +1 -0
  480. package/dist/utils/wait.mjs +2 -0
  481. package/dist/utils/wait.mjs.map +1 -0
  482. package/package.json +16 -2
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Barrel re-export for all portable utilities in controllers/utils/
3
+ *
4
+ * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.
5
+ * We use selective exports to avoid the name collision.
6
+ */
7
+ export * from "./accountUtils.mjs";
8
+ export * from "./errorUtils.mjs";
9
+ export { adaptOrderToSDK, adaptPositionFromSDK, adaptOrderFromSDK, adaptMarketFromSDK, adaptAccountStateFromSDK, buildAssetMapping, formatHyperLiquidPrice, formatHyperLiquidSize, calculateHip3AssetId, parseAssetName, adaptHyperLiquidLedgerUpdateToUserHistoryItem, } from "./hyperLiquidAdapter.mjs";
10
+ export * from "./hyperLiquidOrderBookProcessor.mjs";
11
+ export * from "./hyperLiquidValidation.mjs";
12
+ export * from "./idUtils.mjs";
13
+ export * from "./marketDataTransform.mjs";
14
+ export * from "./myxAdapter.mjs";
15
+ export * from "./marketUtils.mjs";
16
+ export * from "./orderCalculations.mjs";
17
+ export * from "./rewardsUtils.mjs";
18
+ export * from "./significantFigures.mjs";
19
+ export * from "./sortMarkets.mjs";
20
+ export * from "./standaloneInfoClient.mjs";
21
+ export * from "./stringParseUtils.mjs";
22
+ export * from "./transferData.mjs";
23
+ export * from "./wait.mjs";
24
+ export declare const getEnvironment: () => 'DEV' | 'PROD';
25
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAE7B,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,GAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,iCAA6B;AAC7B,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAGvB,eAAO,MAAM,cAAc,QAAO,KAAK,GAAG,MAGzC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Barrel re-export for all portable utilities in controllers/utils/
3
+ *
4
+ * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.
5
+ * We use selective exports to avoid the name collision.
6
+ */
7
+ export * from "./accountUtils.mjs";
8
+ export * from "./errorUtils.mjs";
9
+ // hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations
10
+ export { adaptOrderToSDK, adaptPositionFromSDK, adaptOrderFromSDK, adaptMarketFromSDK, adaptAccountStateFromSDK, buildAssetMapping, formatHyperLiquidPrice, formatHyperLiquidSize, calculateHip3AssetId, parseAssetName, adaptHyperLiquidLedgerUpdateToUserHistoryItem } from "./hyperLiquidAdapter.mjs";
11
+ export * from "./hyperLiquidOrderBookProcessor.mjs";
12
+ export * from "./hyperLiquidValidation.mjs";
13
+ export * from "./idUtils.mjs";
14
+ export * from "./marketDataTransform.mjs";
15
+ export * from "./myxAdapter.mjs";
16
+ export * from "./marketUtils.mjs";
17
+ export * from "./orderCalculations.mjs";
18
+ export * from "./rewardsUtils.mjs";
19
+ export * from "./significantFigures.mjs";
20
+ export * from "./sortMarkets.mjs";
21
+ export * from "./standaloneInfoClient.mjs";
22
+ export * from "./stringParseUtils.mjs";
23
+ export * from "./transferData.mjs";
24
+ export * from "./wait.mjs";
25
+ // Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)
26
+ export const getEnvironment = () => {
27
+ const env = globalThis.process?.env?.NODE_ENV ?? 'production';
28
+ return env === 'production' ? 'PROD' : 'DEV';
29
+ };
30
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,mCAA+B;AAC/B,iCAA6B;AAC7B,mGAAmG;AACnG,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,6CAA6C,EAC9C,iCAA6B;AAC9B,oDAAgD;AAChD,4CAAwC;AACxC,8BAA0B;AAC1B,0CAAsC;AACtC,iCAA6B;AAC7B,kCAA8B;AAC9B,wCAAoC;AACpC,mCAA+B;AAC/B,yCAAqC;AACrC,kCAA8B;AAC9B,2CAAuC;AACvC,uCAAmC;AACnC,mCAA+B;AAC/B,2BAAuB;AAEvB,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAG,GAAmB,EAAE;IACjD,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,IAAI,YAAY,CAAC;IAC9D,OAAO,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC","sourcesContent":["/**\n * Barrel re-export for all portable utilities in controllers/utils/\n *\n * Note: hyperLiquidAdapter and orderCalculations both export calculatePositionSize.\n * We use selective exports to avoid the name collision.\n */\nexport * from './accountUtils';\nexport * from './errorUtils';\n// hyperLiquidAdapter: selective export to avoid calculatePositionSize clash with orderCalculations\nexport {\n adaptOrderToSDK,\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptMarketFromSDK,\n adaptAccountStateFromSDK,\n buildAssetMapping,\n formatHyperLiquidPrice,\n formatHyperLiquidSize,\n calculateHip3AssetId,\n parseAssetName,\n adaptHyperLiquidLedgerUpdateToUserHistoryItem,\n} from './hyperLiquidAdapter';\nexport * from './hyperLiquidOrderBookProcessor';\nexport * from './hyperLiquidValidation';\nexport * from './idUtils';\nexport * from './marketDataTransform';\nexport * from './myxAdapter';\nexport * from './marketUtils';\nexport * from './orderCalculations';\nexport * from './rewardsUtils';\nexport * from './significantFigures';\nexport * from './sortMarkets';\nexport * from './standaloneInfoClient';\nexport * from './stringParseUtils';\nexport * from './transferData';\nexport * from './wait';\n\n// Inline from former utils.ts (getEnvironment was previously at perps/utils.ts root)\nexport const getEnvironment = (): 'DEV' | 'PROD' => {\n const env = globalThis.process?.env?.NODE_ENV ?? 'production';\n return env === 'production' ? 'PROD' : 'DEV';\n};\n"]}
@@ -0,0 +1,211 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatChange = exports.transformMarketData = exports.calculateOpenInterestUSD = void 0;
4
+ /**
5
+ * Market data transformation utilities.
6
+ *
7
+ * Portable: no mobile-specific imports.
8
+ * Formatters are injected via MarketDataFormatters interface.
9
+ */
10
+ const hyperLiquidAdapter_1 = require("./hyperLiquidAdapter.cjs");
11
+ const hyperLiquidConfig_1 = require("../constants/hyperLiquidConfig.cjs");
12
+ const perpsConfig_1 = require("../constants/perpsConfig.cjs");
13
+ /**
14
+ * Calculate open interest in USD
15
+ * Open interest from HyperLiquid is in contracts/units, not USD
16
+ * To get USD value, multiply by current price
17
+ *
18
+ * @param openInterest - Raw open interest value in contracts/units
19
+ * @param currentPrice - Current price of the asset
20
+ * @returns Open interest in USD, or NaN if invalid
21
+ */
22
+ function calculateOpenInterestUSD(openInterest, currentPrice) {
23
+ if (openInterest === undefined || currentPrice === undefined) {
24
+ return NaN;
25
+ }
26
+ const openInterestNum = typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;
27
+ const priceNum = typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;
28
+ if (isNaN(openInterestNum) || isNaN(priceNum)) {
29
+ return NaN;
30
+ }
31
+ return openInterestNum * priceNum;
32
+ }
33
+ exports.calculateOpenInterestUSD = calculateOpenInterestUSD;
34
+ /**
35
+ * Calculate 24h percentage change
36
+ * Shows -100% when current price is missing but previous price exists
37
+ *
38
+ * @param params - The parameters for calculating the 24h change.
39
+ * @returns The 24h percentage change value.
40
+ */
41
+ function calculateChange24hPercent(params) {
42
+ const { hasCurrentPrice, currentPrice, prevDayPrice } = params;
43
+ if (!hasCurrentPrice) {
44
+ return prevDayPrice > 0 ? -100 : 0;
45
+ }
46
+ if (prevDayPrice <= 0) {
47
+ return 0;
48
+ }
49
+ return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;
50
+ }
51
+ /**
52
+ * Extract funding data for a symbol from predicted fundings.
53
+ * Looks for specified exchange first, falls back to first available.
54
+ *
55
+ * @param params - Parameters for extracting funding data
56
+ * @param params.predictedFundings - Array of predicted funding data
57
+ * @param params.symbol - Asset symbol to extract funding for
58
+ * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')
59
+ * @returns Funding data including next funding time, interval, and predicted rate
60
+ */
61
+ function extractFundingData(params) {
62
+ const { predictedFundings, symbol, exchangeName = hyperLiquidConfig_1.HYPERLIQUID_CONFIG.ExchangeName, } = params;
63
+ const result = {};
64
+ if (!predictedFundings) {
65
+ return result;
66
+ }
67
+ const fundingData = predictedFundings.find(([assetSymbol]) => assetSymbol === symbol);
68
+ if (!fundingData?.[1] ||
69
+ !Array.isArray(fundingData[1]) ||
70
+ fundingData[1].length === 0) {
71
+ return result;
72
+ }
73
+ // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)
74
+ const targetExchange = fundingData[1].find((exchange) => Array.isArray(exchange) && exchange[0] === exchangeName);
75
+ if (targetExchange?.[1]) {
76
+ result.nextFundingTime = targetExchange[1].nextFundingTime;
77
+ result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;
78
+ result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);
79
+ return result;
80
+ }
81
+ // Fallback to first exchange if target not found
82
+ const firstExchange = fundingData[1][0];
83
+ if (Array.isArray(firstExchange) && firstExchange[1]) {
84
+ result.nextFundingTime = firstExchange[1].nextFundingTime;
85
+ result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;
86
+ }
87
+ return result;
88
+ }
89
+ /**
90
+ * Transform raw HyperLiquid market data to UI-friendly format
91
+ *
92
+ * @param hyperLiquidData - Raw data from HyperLiquid API
93
+ * @param formatters - Injectable formatters for platform-agnostic formatting
94
+ * @param assetMarketTypes - Optional mapping of asset symbols to market types
95
+ * @returns Transformed market data ready for UI consumption
96
+ */
97
+ function transformMarketData(hyperLiquidData, formatters, assetMarketTypes) {
98
+ const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;
99
+ return universe.map((asset, index) => {
100
+ const symbol = asset.name;
101
+ const currentPrice = parseFloat(allMids[symbol]);
102
+ // Find matching asset context for additional data
103
+ // The assetCtxs array is aligned with universe array by index
104
+ const assetCtx = assetCtxs[index];
105
+ // Calculate 24h change
106
+ const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;
107
+ // Handle missing current price data
108
+ const hasCurrentPrice = !isNaN(currentPrice);
109
+ const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;
110
+ // For dollar change: show $0.00 when current price is missing
111
+ const change24h = hasCurrentPrice
112
+ ? effectiveCurrentPrice - prevDayPrice
113
+ : 0;
114
+ // For percentage: show -100% when current price is missing but previous price exists
115
+ const change24hPercent = calculateChange24hPercent({
116
+ hasCurrentPrice,
117
+ currentPrice: effectiveCurrentPrice,
118
+ prevDayPrice,
119
+ });
120
+ // Format volume (dayNtlVlm is daily notional volume)
121
+ // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data
122
+ const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;
123
+ // Calculate open interest in USD
124
+ const openInterest = calculateOpenInterestUSD(assetCtx?.openInterest, currentPrice);
125
+ // Get current funding rate from assetCtx - this is the actual current funding rate
126
+ let fundingRate;
127
+ if (assetCtx && 'funding' in assetCtx) {
128
+ fundingRate = parseFloat(assetCtx.funding);
129
+ }
130
+ // Extract funding timing and predicted rate
131
+ const fundingData = extractFundingData({
132
+ predictedFundings,
133
+ symbol,
134
+ });
135
+ // Use current funding rate from assetCtx, not predicted
136
+ // The predicted rate is for the next funding period
137
+ if (!fundingRate && fundingData.predictedFundingRate !== undefined) {
138
+ fundingRate = fundingData.predictedFundingRate;
139
+ }
140
+ // Extract DEX and base symbol for display
141
+ // e.g., "flx:TSLA" → { dex: "flx", symbol: "TSLA" }
142
+ const { dex } = (0, hyperLiquidAdapter_1.parseAssetName)(symbol);
143
+ const marketSource = dex ?? undefined;
144
+ // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)
145
+ // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)
146
+ const isHip3 = Boolean(dex);
147
+ // Determine market type from explicit mapping only
148
+ // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')
149
+ // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to "New" tab
150
+ // Main DEX crypto also has no marketType
151
+ const explicitMarketType = assetMarketTypes?.[symbol];
152
+ const marketType = explicitMarketType;
153
+ // Mark as "new" if it's a HIP-3 market but not explicitly categorized
154
+ // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet
155
+ const isNewMarket = isHip3 && !explicitMarketType;
156
+ return {
157
+ symbol,
158
+ name: symbol,
159
+ maxLeverage: `${asset.maxLeverage}x`,
160
+ price: isNaN(currentPrice)
161
+ ? perpsConfig_1.PERPS_CONSTANTS.FallbackPriceDisplay
162
+ : formatters.formatPerpsFiat(currentPrice, {
163
+ ranges: formatters.priceRangesUniversal,
164
+ }),
165
+ change24h: isNaN(change24h)
166
+ ? perpsConfig_1.PERPS_CONSTANTS.ZeroAmountDetailedDisplay
167
+ : formatChange(change24h, formatters),
168
+ change24hPercent: isNaN(change24hPercent)
169
+ ? '0.00%'
170
+ : formatters.formatPercentage(change24hPercent),
171
+ volume: isNaN(volume)
172
+ ? perpsConfig_1.PERPS_CONSTANTS.FallbackPriceDisplay
173
+ : formatters.formatVolume(volume),
174
+ openInterest: isNaN(openInterest)
175
+ ? perpsConfig_1.PERPS_CONSTANTS.FallbackPriceDisplay
176
+ : formatters.formatVolume(openInterest),
177
+ nextFundingTime: fundingData.nextFundingTime,
178
+ fundingIntervalHours: fundingData.fundingIntervalHours,
179
+ fundingRate,
180
+ marketSource,
181
+ marketType,
182
+ isHip3,
183
+ isNewMarket,
184
+ };
185
+ });
186
+ }
187
+ exports.transformMarketData = transformMarketData;
188
+ /**
189
+ * Format 24h change with sign.
190
+ * Uses more decimal places for smaller amounts to show meaningful precision.
191
+ *
192
+ * @param change - The price change value to format
193
+ * @param formatters - Injectable formatters
194
+ * @returns Formatted change string with sign and dollar symbol
195
+ */
196
+ function formatChange(change, formatters) {
197
+ if (isNaN(change) || !isFinite(change)) {
198
+ return '$0.00';
199
+ }
200
+ if (change === 0) {
201
+ return '$0.00';
202
+ }
203
+ const formatted = formatters.formatPerpsFiat(Math.abs(change), {
204
+ ranges: formatters.priceRangesUniversal,
205
+ });
206
+ // Remove $ sign and add it back with proper sign placement
207
+ const valueWithoutDollar = formatted.replace('$', '');
208
+ return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;
209
+ }
210
+ exports.formatChange = formatChange;
211
+ //# sourceMappingURL=marketDataTransform.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketDataTransform.cjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Market data transformation utilities.\n *\n * Portable: no mobile-specific imports.\n * Formatters are injected via MarketDataFormatters interface.\n */\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type {\n PerpsMarketData,\n MarketType,\n MarketDataFormatters,\n} from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (openInterest === undefined || currentPrice === undefined) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change\n * Shows -100% when current price is missing but previous price exists\n *\n * @param params - The parameters for calculating the 24h change.\n * @returns The 24h percentage change value.\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param formatters - Injectable formatters for platform-agnostic formatting\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n formatters: MarketDataFormatters,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && 'funding' in assetCtx) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)\n // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)\n const isHip3 = Boolean(dex);\n\n // Determine market type from explicit mapping only\n // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')\n // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to \"New\" tab\n // Main DEX crypto also has no marketType\n const explicitMarketType = assetMarketTypes?.[symbol];\n const marketType: MarketType | undefined = explicitMarketType;\n\n // Mark as \"new\" if it's a HIP-3 market but not explicitly categorized\n // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet\n const isNewMarket = isHip3 && !explicitMarketType;\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatPerpsFiat(currentPrice, {\n ranges: formatters.priceRangesUniversal,\n }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h, formatters),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatters.formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n isHip3,\n isNewMarket,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @param formatters - Injectable formatters\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(\n change: number,\n formatters: MarketDataFormatters,\n): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatters.formatPerpsFiat(Math.abs(change), {\n ranges: formatters.priceRangesUniversal,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n"]}
@@ -0,0 +1,40 @@
1
+ import type { PerpsMarketData, MarketType, MarketDataFormatters } from "../types/index.cjs";
2
+ import type { AllMidsResponse, PerpsUniverse, PerpsAssetCtx, PredictedFunding } from "../types/hyperliquid-types.cjs";
3
+ /**
4
+ * Calculate open interest in USD
5
+ * Open interest from HyperLiquid is in contracts/units, not USD
6
+ * To get USD value, multiply by current price
7
+ *
8
+ * @param openInterest - Raw open interest value in contracts/units
9
+ * @param currentPrice - Current price of the asset
10
+ * @returns Open interest in USD, or NaN if invalid
11
+ */
12
+ export declare function calculateOpenInterestUSD(openInterest: string | number | undefined, currentPrice: string | number | undefined): number;
13
+ /**
14
+ * HyperLiquid-specific market data structure
15
+ */
16
+ export type HyperLiquidMarketData = {
17
+ universe: PerpsUniverse[];
18
+ assetCtxs: PerpsAssetCtx[];
19
+ allMids: AllMidsResponse;
20
+ predictedFundings?: PredictedFunding[];
21
+ };
22
+ /**
23
+ * Transform raw HyperLiquid market data to UI-friendly format
24
+ *
25
+ * @param hyperLiquidData - Raw data from HyperLiquid API
26
+ * @param formatters - Injectable formatters for platform-agnostic formatting
27
+ * @param assetMarketTypes - Optional mapping of asset symbols to market types
28
+ * @returns Transformed market data ready for UI consumption
29
+ */
30
+ export declare function transformMarketData(hyperLiquidData: HyperLiquidMarketData, formatters: MarketDataFormatters, assetMarketTypes?: Record<string, MarketType>): PerpsMarketData[];
31
+ /**
32
+ * Format 24h change with sign.
33
+ * Uses more decimal places for smaller amounts to show meaningful precision.
34
+ *
35
+ * @param change - The price change value to format
36
+ * @param formatters - Injectable formatters
37
+ * @returns Formatted change string with sign and dollar symbol
38
+ */
39
+ export declare function formatChange(change: number, formatters: MarketDataFormatters): string;
40
+ //# sourceMappingURL=marketDataTransform.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketDataTransform.d.cts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,2BAAiB;AAClB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CA6GnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CAeR"}
@@ -0,0 +1,40 @@
1
+ import type { PerpsMarketData, MarketType, MarketDataFormatters } from "../types/index.mjs";
2
+ import type { AllMidsResponse, PerpsUniverse, PerpsAssetCtx, PredictedFunding } from "../types/hyperliquid-types.mjs";
3
+ /**
4
+ * Calculate open interest in USD
5
+ * Open interest from HyperLiquid is in contracts/units, not USD
6
+ * To get USD value, multiply by current price
7
+ *
8
+ * @param openInterest - Raw open interest value in contracts/units
9
+ * @param currentPrice - Current price of the asset
10
+ * @returns Open interest in USD, or NaN if invalid
11
+ */
12
+ export declare function calculateOpenInterestUSD(openInterest: string | number | undefined, currentPrice: string | number | undefined): number;
13
+ /**
14
+ * HyperLiquid-specific market data structure
15
+ */
16
+ export type HyperLiquidMarketData = {
17
+ universe: PerpsUniverse[];
18
+ assetCtxs: PerpsAssetCtx[];
19
+ allMids: AllMidsResponse;
20
+ predictedFundings?: PredictedFunding[];
21
+ };
22
+ /**
23
+ * Transform raw HyperLiquid market data to UI-friendly format
24
+ *
25
+ * @param hyperLiquidData - Raw data from HyperLiquid API
26
+ * @param formatters - Injectable formatters for platform-agnostic formatting
27
+ * @param assetMarketTypes - Optional mapping of asset symbols to market types
28
+ * @returns Transformed market data ready for UI consumption
29
+ */
30
+ export declare function transformMarketData(hyperLiquidData: HyperLiquidMarketData, formatters: MarketDataFormatters, assetMarketTypes?: Record<string, MarketType>): PerpsMarketData[];
31
+ /**
32
+ * Format 24h change with sign.
33
+ * Uses more decimal places for smaller amounts to show meaningful precision.
34
+ *
35
+ * @param change - The price change value to format
36
+ * @param formatters - Injectable formatters
37
+ * @returns Formatted change string with sign and dollar symbol
38
+ */
39
+ export declare function formatChange(change: number, formatters: MarketDataFormatters): string;
40
+ //# sourceMappingURL=marketDataTransform.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketDataTransform.d.mts","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,oBAAoB,EACrB,2BAAiB;AAClB,OAAO,KAAK,EACV,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,uCAAmC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACzC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GACxC,MAAM,CAeR;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;CACxC,CAAC;AA8GF;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,qBAAqB,EACtC,UAAU,EAAE,oBAAoB,EAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAC5C,eAAe,EAAE,CA6GnB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,oBAAoB,GAC/B,MAAM,CAeR"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * Market data transformation utilities.
3
+ *
4
+ * Portable: no mobile-specific imports.
5
+ * Formatters are injected via MarketDataFormatters interface.
6
+ */
7
+ import { parseAssetName } from "./hyperLiquidAdapter.mjs";
8
+ import { HYPERLIQUID_CONFIG } from "../constants/hyperLiquidConfig.mjs";
9
+ import { PERPS_CONSTANTS } from "../constants/perpsConfig.mjs";
10
+ /**
11
+ * Calculate open interest in USD
12
+ * Open interest from HyperLiquid is in contracts/units, not USD
13
+ * To get USD value, multiply by current price
14
+ *
15
+ * @param openInterest - Raw open interest value in contracts/units
16
+ * @param currentPrice - Current price of the asset
17
+ * @returns Open interest in USD, or NaN if invalid
18
+ */
19
+ export function calculateOpenInterestUSD(openInterest, currentPrice) {
20
+ if (openInterest === undefined || currentPrice === undefined) {
21
+ return NaN;
22
+ }
23
+ const openInterestNum = typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;
24
+ const priceNum = typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;
25
+ if (isNaN(openInterestNum) || isNaN(priceNum)) {
26
+ return NaN;
27
+ }
28
+ return openInterestNum * priceNum;
29
+ }
30
+ /**
31
+ * Calculate 24h percentage change
32
+ * Shows -100% when current price is missing but previous price exists
33
+ *
34
+ * @param params - The parameters for calculating the 24h change.
35
+ * @returns The 24h percentage change value.
36
+ */
37
+ function calculateChange24hPercent(params) {
38
+ const { hasCurrentPrice, currentPrice, prevDayPrice } = params;
39
+ if (!hasCurrentPrice) {
40
+ return prevDayPrice > 0 ? -100 : 0;
41
+ }
42
+ if (prevDayPrice <= 0) {
43
+ return 0;
44
+ }
45
+ return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;
46
+ }
47
+ /**
48
+ * Extract funding data for a symbol from predicted fundings.
49
+ * Looks for specified exchange first, falls back to first available.
50
+ *
51
+ * @param params - Parameters for extracting funding data
52
+ * @param params.predictedFundings - Array of predicted funding data
53
+ * @param params.symbol - Asset symbol to extract funding for
54
+ * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')
55
+ * @returns Funding data including next funding time, interval, and predicted rate
56
+ */
57
+ function extractFundingData(params) {
58
+ const { predictedFundings, symbol, exchangeName = HYPERLIQUID_CONFIG.ExchangeName, } = params;
59
+ const result = {};
60
+ if (!predictedFundings) {
61
+ return result;
62
+ }
63
+ const fundingData = predictedFundings.find(([assetSymbol]) => assetSymbol === symbol);
64
+ if (!fundingData?.[1] ||
65
+ !Array.isArray(fundingData[1]) ||
66
+ fundingData[1].length === 0) {
67
+ return result;
68
+ }
69
+ // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)
70
+ const targetExchange = fundingData[1].find((exchange) => Array.isArray(exchange) && exchange[0] === exchangeName);
71
+ if (targetExchange?.[1]) {
72
+ result.nextFundingTime = targetExchange[1].nextFundingTime;
73
+ result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;
74
+ result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);
75
+ return result;
76
+ }
77
+ // Fallback to first exchange if target not found
78
+ const firstExchange = fundingData[1][0];
79
+ if (Array.isArray(firstExchange) && firstExchange[1]) {
80
+ result.nextFundingTime = firstExchange[1].nextFundingTime;
81
+ result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;
82
+ }
83
+ return result;
84
+ }
85
+ /**
86
+ * Transform raw HyperLiquid market data to UI-friendly format
87
+ *
88
+ * @param hyperLiquidData - Raw data from HyperLiquid API
89
+ * @param formatters - Injectable formatters for platform-agnostic formatting
90
+ * @param assetMarketTypes - Optional mapping of asset symbols to market types
91
+ * @returns Transformed market data ready for UI consumption
92
+ */
93
+ export function transformMarketData(hyperLiquidData, formatters, assetMarketTypes) {
94
+ const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;
95
+ return universe.map((asset, index) => {
96
+ const symbol = asset.name;
97
+ const currentPrice = parseFloat(allMids[symbol]);
98
+ // Find matching asset context for additional data
99
+ // The assetCtxs array is aligned with universe array by index
100
+ const assetCtx = assetCtxs[index];
101
+ // Calculate 24h change
102
+ const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;
103
+ // Handle missing current price data
104
+ const hasCurrentPrice = !isNaN(currentPrice);
105
+ const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;
106
+ // For dollar change: show $0.00 when current price is missing
107
+ const change24h = hasCurrentPrice
108
+ ? effectiveCurrentPrice - prevDayPrice
109
+ : 0;
110
+ // For percentage: show -100% when current price is missing but previous price exists
111
+ const change24hPercent = calculateChange24hPercent({
112
+ hasCurrentPrice,
113
+ currentPrice: effectiveCurrentPrice,
114
+ prevDayPrice,
115
+ });
116
+ // Format volume (dayNtlVlm is daily notional volume)
117
+ // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data
118
+ const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;
119
+ // Calculate open interest in USD
120
+ const openInterest = calculateOpenInterestUSD(assetCtx?.openInterest, currentPrice);
121
+ // Get current funding rate from assetCtx - this is the actual current funding rate
122
+ let fundingRate;
123
+ if (assetCtx && 'funding' in assetCtx) {
124
+ fundingRate = parseFloat(assetCtx.funding);
125
+ }
126
+ // Extract funding timing and predicted rate
127
+ const fundingData = extractFundingData({
128
+ predictedFundings,
129
+ symbol,
130
+ });
131
+ // Use current funding rate from assetCtx, not predicted
132
+ // The predicted rate is for the next funding period
133
+ if (!fundingRate && fundingData.predictedFundingRate !== undefined) {
134
+ fundingRate = fundingData.predictedFundingRate;
135
+ }
136
+ // Extract DEX and base symbol for display
137
+ // e.g., "flx:TSLA" → { dex: "flx", symbol: "TSLA" }
138
+ const { dex } = parseAssetName(symbol);
139
+ const marketSource = dex ?? undefined;
140
+ // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)
141
+ // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)
142
+ const isHip3 = Boolean(dex);
143
+ // Determine market type from explicit mapping only
144
+ // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')
145
+ // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to "New" tab
146
+ // Main DEX crypto also has no marketType
147
+ const explicitMarketType = assetMarketTypes?.[symbol];
148
+ const marketType = explicitMarketType;
149
+ // Mark as "new" if it's a HIP-3 market but not explicitly categorized
150
+ // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet
151
+ const isNewMarket = isHip3 && !explicitMarketType;
152
+ return {
153
+ symbol,
154
+ name: symbol,
155
+ maxLeverage: `${asset.maxLeverage}x`,
156
+ price: isNaN(currentPrice)
157
+ ? PERPS_CONSTANTS.FallbackPriceDisplay
158
+ : formatters.formatPerpsFiat(currentPrice, {
159
+ ranges: formatters.priceRangesUniversal,
160
+ }),
161
+ change24h: isNaN(change24h)
162
+ ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay
163
+ : formatChange(change24h, formatters),
164
+ change24hPercent: isNaN(change24hPercent)
165
+ ? '0.00%'
166
+ : formatters.formatPercentage(change24hPercent),
167
+ volume: isNaN(volume)
168
+ ? PERPS_CONSTANTS.FallbackPriceDisplay
169
+ : formatters.formatVolume(volume),
170
+ openInterest: isNaN(openInterest)
171
+ ? PERPS_CONSTANTS.FallbackPriceDisplay
172
+ : formatters.formatVolume(openInterest),
173
+ nextFundingTime: fundingData.nextFundingTime,
174
+ fundingIntervalHours: fundingData.fundingIntervalHours,
175
+ fundingRate,
176
+ marketSource,
177
+ marketType,
178
+ isHip3,
179
+ isNewMarket,
180
+ };
181
+ });
182
+ }
183
+ /**
184
+ * Format 24h change with sign.
185
+ * Uses more decimal places for smaller amounts to show meaningful precision.
186
+ *
187
+ * @param change - The price change value to format
188
+ * @param formatters - Injectable formatters
189
+ * @returns Formatted change string with sign and dollar symbol
190
+ */
191
+ export function formatChange(change, formatters) {
192
+ if (isNaN(change) || !isFinite(change)) {
193
+ return '$0.00';
194
+ }
195
+ if (change === 0) {
196
+ return '$0.00';
197
+ }
198
+ const formatted = formatters.formatPerpsFiat(Math.abs(change), {
199
+ ranges: formatters.priceRangesUniversal,
200
+ });
201
+ // Remove $ sign and add it back with proper sign placement
202
+ const valueWithoutDollar = formatted.replace('$', '');
203
+ return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;
204
+ }
205
+ //# sourceMappingURL=marketDataTransform.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketDataTransform.mjs","sourceRoot":"","sources":["../../src/utils/marketDataTransform.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Market data transformation utilities.\n *\n * Portable: no mobile-specific imports.\n * Formatters are injected via MarketDataFormatters interface.\n */\nimport { parseAssetName } from './hyperLiquidAdapter';\nimport { HYPERLIQUID_CONFIG } from '../constants/hyperLiquidConfig';\nimport { PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport type {\n PerpsMarketData,\n MarketType,\n MarketDataFormatters,\n} from '../types';\nimport type {\n AllMidsResponse,\n PerpsUniverse,\n PerpsAssetCtx,\n PredictedFunding,\n} from '../types/hyperliquid-types';\n\n/**\n * Calculate open interest in USD\n * Open interest from HyperLiquid is in contracts/units, not USD\n * To get USD value, multiply by current price\n *\n * @param openInterest - Raw open interest value in contracts/units\n * @param currentPrice - Current price of the asset\n * @returns Open interest in USD, or NaN if invalid\n */\nexport function calculateOpenInterestUSD(\n openInterest: string | number | undefined,\n currentPrice: string | number | undefined,\n): number {\n if (openInterest === undefined || currentPrice === undefined) {\n return NaN;\n }\n\n const openInterestNum =\n typeof openInterest === 'string' ? parseFloat(openInterest) : openInterest;\n const priceNum =\n typeof currentPrice === 'string' ? parseFloat(currentPrice) : currentPrice;\n\n if (isNaN(openInterestNum) || isNaN(priceNum)) {\n return NaN;\n }\n\n return openInterestNum * priceNum;\n}\n\n/**\n * HyperLiquid-specific market data structure\n */\nexport type HyperLiquidMarketData = {\n universe: PerpsUniverse[];\n assetCtxs: PerpsAssetCtx[];\n allMids: AllMidsResponse;\n predictedFundings?: PredictedFunding[];\n};\n\n/**\n * Parameters for calculating 24h percentage change\n */\ntype CalculateChange24hPercentParams = {\n hasCurrentPrice: boolean;\n currentPrice: number;\n prevDayPrice: number;\n};\n\n/**\n * Calculate 24h percentage change\n * Shows -100% when current price is missing but previous price exists\n *\n * @param params - The parameters for calculating the 24h change.\n * @returns The 24h percentage change value.\n */\nfunction calculateChange24hPercent(\n params: CalculateChange24hPercentParams,\n): number {\n const { hasCurrentPrice, currentPrice, prevDayPrice } = params;\n\n if (!hasCurrentPrice) {\n return prevDayPrice > 0 ? -100 : 0;\n }\n\n if (prevDayPrice <= 0) {\n return 0;\n }\n\n return ((currentPrice - prevDayPrice) / prevDayPrice) * 100;\n}\n\n/**\n * Funding data extracted from predicted fundings\n */\ntype FundingData = {\n nextFundingTime?: number;\n fundingIntervalHours?: number;\n predictedFundingRate?: number;\n};\n\n/**\n * Parameters for extracting funding data\n */\ntype ExtractFundingDataParams = {\n predictedFundings?: PredictedFunding[];\n symbol: string;\n exchangeName?: string;\n};\n\n/**\n * Extract funding data for a symbol from predicted fundings.\n * Looks for specified exchange first, falls back to first available.\n *\n * @param params - Parameters for extracting funding data\n * @param params.predictedFundings - Array of predicted funding data\n * @param params.symbol - Asset symbol to extract funding for\n * @param params.exchangeName - Exchange to prioritize (defaults to HyperLiquid's 'HlPerp')\n * @returns Funding data including next funding time, interval, and predicted rate\n */\nfunction extractFundingData(params: ExtractFundingDataParams): FundingData {\n const {\n predictedFundings,\n symbol,\n exchangeName = HYPERLIQUID_CONFIG.ExchangeName,\n } = params;\n\n const result: FundingData = {};\n\n if (!predictedFundings) {\n return result;\n }\n\n const fundingData = predictedFundings.find(\n ([assetSymbol]) => assetSymbol === symbol,\n );\n\n if (\n !fundingData?.[1] ||\n !Array.isArray(fundingData[1]) ||\n fundingData[1].length === 0\n ) {\n return result;\n }\n\n // Look for specified exchange (e.g., 'HlPerp' for HyperLiquid)\n const targetExchange = fundingData[1].find(\n (exchange: unknown) =>\n Array.isArray(exchange) && exchange[0] === exchangeName,\n );\n\n if (targetExchange?.[1]) {\n result.nextFundingTime = targetExchange[1].nextFundingTime;\n result.fundingIntervalHours = targetExchange[1].fundingIntervalHours;\n result.predictedFundingRate = parseFloat(targetExchange[1].fundingRate);\n return result;\n }\n\n // Fallback to first exchange if target not found\n const firstExchange = fundingData[1][0];\n if (Array.isArray(firstExchange) && firstExchange[1]) {\n result.nextFundingTime = firstExchange[1].nextFundingTime;\n result.fundingIntervalHours = firstExchange[1].fundingIntervalHours;\n }\n\n return result;\n}\n\n/**\n * Transform raw HyperLiquid market data to UI-friendly format\n *\n * @param hyperLiquidData - Raw data from HyperLiquid API\n * @param formatters - Injectable formatters for platform-agnostic formatting\n * @param assetMarketTypes - Optional mapping of asset symbols to market types\n * @returns Transformed market data ready for UI consumption\n */\nexport function transformMarketData(\n hyperLiquidData: HyperLiquidMarketData,\n formatters: MarketDataFormatters,\n assetMarketTypes?: Record<string, MarketType>,\n): PerpsMarketData[] {\n const { universe, assetCtxs, allMids, predictedFundings } = hyperLiquidData;\n\n return universe.map((asset, index) => {\n const symbol = asset.name;\n const currentPrice = parseFloat(allMids[symbol]);\n\n // Find matching asset context for additional data\n // The assetCtxs array is aligned with universe array by index\n const assetCtx = assetCtxs[index];\n\n // Calculate 24h change\n const prevDayPrice = assetCtx ? parseFloat(assetCtx.prevDayPx) : 0;\n\n // Handle missing current price data\n const hasCurrentPrice = !isNaN(currentPrice);\n const effectiveCurrentPrice = hasCurrentPrice ? currentPrice : 0;\n\n // For dollar change: show $0.00 when current price is missing\n const change24h = hasCurrentPrice\n ? effectiveCurrentPrice - prevDayPrice\n : 0;\n\n // For percentage: show -100% when current price is missing but previous price exists\n const change24hPercent = calculateChange24hPercent({\n hasCurrentPrice,\n currentPrice: effectiveCurrentPrice,\n prevDayPrice,\n });\n\n // Format volume (dayNtlVlm is daily notional volume)\n // If assetCtx is missing or dayNtlVlm is not available, use NaN to indicate missing data\n const volume = assetCtx?.dayNtlVlm ? parseFloat(assetCtx.dayNtlVlm) : NaN;\n\n // Calculate open interest in USD\n const openInterest = calculateOpenInterestUSD(\n assetCtx?.openInterest,\n currentPrice,\n );\n\n // Get current funding rate from assetCtx - this is the actual current funding rate\n let fundingRate: number | undefined;\n\n if (assetCtx && 'funding' in assetCtx) {\n fundingRate = parseFloat(assetCtx.funding);\n }\n\n // Extract funding timing and predicted rate\n const fundingData = extractFundingData({\n predictedFundings,\n symbol,\n });\n\n // Use current funding rate from assetCtx, not predicted\n // The predicted rate is for the next funding period\n if (!fundingRate && fundingData.predictedFundingRate !== undefined) {\n fundingRate = fundingData.predictedFundingRate;\n }\n\n // Extract DEX and base symbol for display\n // e.g., \"flx:TSLA\" → { dex: \"flx\", symbol: \"TSLA\" }\n const { dex } = parseAssetName(symbol);\n const marketSource = dex ?? undefined;\n\n // HIP-3 markets have a DEX prefix (e.g., xyz:TSLA, flx:GOLD)\n // Crypto markets (HIP-2) don't have a prefix (e.g., BTC, ETH)\n const isHip3 = Boolean(dex);\n\n // Determine market type from explicit mapping only\n // Only explicitly mapped HIP-3 markets get a marketType (e.g., 'xyz:GOLD' → 'commodity')\n // Unmapped HIP-3 markets (e.g., 'hyna:BTC') have no marketType - they go to \"New\" tab\n // Main DEX crypto also has no marketType\n const explicitMarketType = assetMarketTypes?.[symbol];\n const marketType: MarketType | undefined = explicitMarketType;\n\n // Mark as \"new\" if it's a HIP-3 market but not explicitly categorized\n // New markets are always HIP-3 (non-crypto) that haven't been assigned a category yet\n const isNewMarket = isHip3 && !explicitMarketType;\n\n return {\n symbol,\n name: symbol,\n maxLeverage: `${asset.maxLeverage}x`,\n price: isNaN(currentPrice)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatPerpsFiat(currentPrice, {\n ranges: formatters.priceRangesUniversal,\n }),\n change24h: isNaN(change24h)\n ? PERPS_CONSTANTS.ZeroAmountDetailedDisplay\n : formatChange(change24h, formatters),\n change24hPercent: isNaN(change24hPercent)\n ? '0.00%'\n : formatters.formatPercentage(change24hPercent),\n volume: isNaN(volume)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(volume),\n openInterest: isNaN(openInterest)\n ? PERPS_CONSTANTS.FallbackPriceDisplay\n : formatters.formatVolume(openInterest),\n nextFundingTime: fundingData.nextFundingTime,\n fundingIntervalHours: fundingData.fundingIntervalHours,\n fundingRate,\n marketSource,\n marketType,\n isHip3,\n isNewMarket,\n };\n });\n}\n\n/**\n * Format 24h change with sign.\n * Uses more decimal places for smaller amounts to show meaningful precision.\n *\n * @param change - The price change value to format\n * @param formatters - Injectable formatters\n * @returns Formatted change string with sign and dollar symbol\n */\nexport function formatChange(\n change: number,\n formatters: MarketDataFormatters,\n): string {\n if (isNaN(change) || !isFinite(change)) {\n return '$0.00';\n }\n if (change === 0) {\n return '$0.00';\n }\n\n const formatted = formatters.formatPerpsFiat(Math.abs(change), {\n ranges: formatters.priceRangesUniversal,\n });\n\n // Remove $ sign and add it back with proper sign placement\n const valueWithoutDollar = formatted.replace('$', '');\n return change > 0 ? `+$${valueWithoutDollar}` : `-$${valueWithoutDollar}`;\n}\n"]}