@lifi/perps-sdk-provider-hyperliquid 0.2.0-alpha.0

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 (434) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +174 -0
  3. package/dist/cjs/HyperliquidProvider.d.ts +15 -0
  4. package/dist/cjs/HyperliquidProvider.d.ts.map +1 -0
  5. package/dist/cjs/HyperliquidProvider.js +135 -0
  6. package/dist/cjs/HyperliquidProvider.js.map +1 -0
  7. package/dist/cjs/accountConfig.d.ts +3 -0
  8. package/dist/cjs/accountConfig.d.ts.map +1 -0
  9. package/dist/cjs/accountConfig.js +45 -0
  10. package/dist/cjs/accountConfig.js.map +1 -0
  11. package/dist/cjs/accountSummary.d.ts +3 -0
  12. package/dist/cjs/accountSummary.d.ts.map +1 -0
  13. package/dist/cjs/accountSummary.js +12 -0
  14. package/dist/cjs/accountSummary.js.map +1 -0
  15. package/dist/cjs/constants.d.ts +11 -0
  16. package/dist/cjs/constants.d.ts.map +1 -0
  17. package/dist/cjs/constants.js +16 -0
  18. package/dist/cjs/constants.js.map +1 -0
  19. package/dist/cjs/context.d.ts +13 -0
  20. package/dist/cjs/context.d.ts.map +1 -0
  21. package/dist/cjs/context.js +24 -0
  22. package/dist/cjs/context.js.map +1 -0
  23. package/dist/cjs/index.d.ts +22 -0
  24. package/dist/cjs/index.d.ts.map +1 -0
  25. package/dist/cjs/index.js +47 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/package.json +1 -0
  28. package/dist/cjs/services/getAccount.d.ts +6 -0
  29. package/dist/cjs/services/getAccount.d.ts.map +1 -0
  30. package/dist/cjs/services/getAccount.js +109 -0
  31. package/dist/cjs/services/getAccount.js.map +1 -0
  32. package/dist/cjs/services/getActivity.d.ts +15 -0
  33. package/dist/cjs/services/getActivity.d.ts.map +1 -0
  34. package/dist/cjs/services/getActivity.js +65 -0
  35. package/dist/cjs/services/getActivity.js.map +1 -0
  36. package/dist/cjs/services/getFills.d.ts +13 -0
  37. package/dist/cjs/services/getFills.d.ts.map +1 -0
  38. package/dist/cjs/services/getFills.js +40 -0
  39. package/dist/cjs/services/getFills.js.map +1 -0
  40. package/dist/cjs/services/getOrder.d.ts +6 -0
  41. package/dist/cjs/services/getOrder.d.ts.map +1 -0
  42. package/dist/cjs/services/getOrder.js +27 -0
  43. package/dist/cjs/services/getOrder.js.map +1 -0
  44. package/dist/cjs/services/getOrders.d.ts +11 -0
  45. package/dist/cjs/services/getOrders.d.ts.map +1 -0
  46. package/dist/cjs/services/getOrders.js +51 -0
  47. package/dist/cjs/services/getOrders.js.map +1 -0
  48. package/dist/cjs/services/getPositions.d.ts +11 -0
  49. package/dist/cjs/services/getPositions.d.ts.map +1 -0
  50. package/dist/cjs/services/getPositions.js +33 -0
  51. package/dist/cjs/services/getPositions.js.map +1 -0
  52. package/dist/cjs/signers/HyperliquidAgentStore.d.ts +19 -0
  53. package/dist/cjs/signers/HyperliquidAgentStore.d.ts.map +1 -0
  54. package/dist/cjs/signers/HyperliquidAgentStore.js +110 -0
  55. package/dist/cjs/signers/HyperliquidAgentStore.js.map +1 -0
  56. package/dist/cjs/signers/index.d.ts +4 -0
  57. package/dist/cjs/signers/index.d.ts.map +1 -0
  58. package/dist/cjs/signers/index.js +8 -0
  59. package/dist/cjs/signers/index.js.map +1 -0
  60. package/dist/cjs/signers/signActions.d.ts +7 -0
  61. package/dist/cjs/signers/signActions.d.ts.map +1 -0
  62. package/dist/cjs/signers/signActions.js +33 -0
  63. package/dist/cjs/signers/signActions.js.map +1 -0
  64. package/dist/cjs/types/account.d.ts +51 -0
  65. package/dist/cjs/types/account.d.ts.map +1 -0
  66. package/dist/cjs/types/account.js +10 -0
  67. package/dist/cjs/types/account.js.map +1 -0
  68. package/dist/cjs/types/action.d.ts +51 -0
  69. package/dist/cjs/types/action.d.ts.map +1 -0
  70. package/dist/cjs/types/action.js +11 -0
  71. package/dist/cjs/types/action.js.map +1 -0
  72. package/dist/cjs/types/asset.d.ts +66 -0
  73. package/dist/cjs/types/asset.d.ts.map +1 -0
  74. package/dist/cjs/types/asset.js +3 -0
  75. package/dist/cjs/types/asset.js.map +1 -0
  76. package/dist/cjs/types/fill.d.ts +18 -0
  77. package/dist/cjs/types/fill.d.ts.map +1 -0
  78. package/dist/cjs/types/fill.js +3 -0
  79. package/dist/cjs/types/fill.js.map +1 -0
  80. package/dist/cjs/types/index.d.ts +8 -0
  81. package/dist/cjs/types/index.d.ts.map +1 -0
  82. package/dist/cjs/types/index.js +24 -0
  83. package/dist/cjs/types/index.js.map +1 -0
  84. package/dist/cjs/types/ledger.d.ts +53 -0
  85. package/dist/cjs/types/ledger.d.ts.map +1 -0
  86. package/dist/cjs/types/ledger.js +8 -0
  87. package/dist/cjs/types/ledger.js.map +1 -0
  88. package/dist/cjs/types/order.d.ts +46 -0
  89. package/dist/cjs/types/order.d.ts.map +1 -0
  90. package/dist/cjs/types/order.js +3 -0
  91. package/dist/cjs/types/order.js.map +1 -0
  92. package/dist/cjs/types/ws.d.ts +36 -0
  93. package/dist/cjs/types/ws.d.ts.map +1 -0
  94. package/dist/cjs/types/ws.js +3 -0
  95. package/dist/cjs/types/ws.js.map +1 -0
  96. package/dist/cjs/utils/assetId.d.ts +4 -0
  97. package/dist/cjs/utils/assetId.d.ts.map +1 -0
  98. package/dist/cjs/utils/assetId.js +21 -0
  99. package/dist/cjs/utils/assetId.js.map +1 -0
  100. package/dist/cjs/utils/index.d.ts +15 -0
  101. package/dist/cjs/utils/index.d.ts.map +1 -0
  102. package/dist/cjs/utils/index.js +49 -0
  103. package/dist/cjs/utils/index.js.map +1 -0
  104. package/dist/cjs/utils/infoClient.d.ts +10 -0
  105. package/dist/cjs/utils/infoClient.d.ts.map +1 -0
  106. package/dist/cjs/utils/infoClient.js +58 -0
  107. package/dist/cjs/utils/infoClient.js.map +1 -0
  108. package/dist/cjs/utils/liquidation.d.ts +3 -0
  109. package/dist/cjs/utils/liquidation.d.ts.map +1 -0
  110. package/dist/cjs/utils/liquidation.js +24 -0
  111. package/dist/cjs/utils/liquidation.js.map +1 -0
  112. package/dist/cjs/utils/mapActivity.d.ts +5 -0
  113. package/dist/cjs/utils/mapActivity.d.ts.map +1 -0
  114. package/dist/cjs/utils/mapActivity.js +133 -0
  115. package/dist/cjs/utils/mapActivity.js.map +1 -0
  116. package/dist/cjs/utils/mapFill.d.ts +6 -0
  117. package/dist/cjs/utils/mapFill.d.ts.map +1 -0
  118. package/dist/cjs/utils/mapFill.js +33 -0
  119. package/dist/cjs/utils/mapFill.js.map +1 -0
  120. package/dist/cjs/utils/mapMarket.d.ts +4 -0
  121. package/dist/cjs/utils/mapMarket.d.ts.map +1 -0
  122. package/dist/cjs/utils/mapMarket.js +22 -0
  123. package/dist/cjs/utils/mapMarket.js.map +1 -0
  124. package/dist/cjs/utils/mapMarketPrice.d.ts +4 -0
  125. package/dist/cjs/utils/mapMarketPrice.d.ts.map +1 -0
  126. package/dist/cjs/utils/mapMarketPrice.js +22 -0
  127. package/dist/cjs/utils/mapMarketPrice.js.map +1 -0
  128. package/dist/cjs/utils/mapOrder.d.ts +12 -0
  129. package/dist/cjs/utils/mapOrder.d.ts.map +1 -0
  130. package/dist/cjs/utils/mapOrder.js +156 -0
  131. package/dist/cjs/utils/mapOrder.js.map +1 -0
  132. package/dist/cjs/utils/mapPosition.d.ts +5 -0
  133. package/dist/cjs/utils/mapPosition.d.ts.map +1 -0
  134. package/dist/cjs/utils/mapPosition.js +28 -0
  135. package/dist/cjs/utils/mapPosition.js.map +1 -0
  136. package/dist/cjs/utils/marketDisplay.d.ts +4 -0
  137. package/dist/cjs/utils/marketDisplay.d.ts.map +1 -0
  138. package/dist/cjs/utils/marketDisplay.js +23 -0
  139. package/dist/cjs/utils/marketDisplay.js.map +1 -0
  140. package/dist/cjs/utils/orderFormatting.d.ts +4 -0
  141. package/dist/cjs/utils/orderFormatting.d.ts.map +1 -0
  142. package/dist/cjs/utils/orderFormatting.js +30 -0
  143. package/dist/cjs/utils/orderFormatting.js.map +1 -0
  144. package/dist/cjs/utils/priceStepToAggregation.d.ts +5 -0
  145. package/dist/cjs/utils/priceStepToAggregation.d.ts.map +1 -0
  146. package/dist/cjs/utils/priceStepToAggregation.js +36 -0
  147. package/dist/cjs/utils/priceStepToAggregation.js.map +1 -0
  148. package/dist/cjs/utils/spotBalance.d.ts +6 -0
  149. package/dist/cjs/utils/spotBalance.d.ts.map +1 -0
  150. package/dist/cjs/utils/spotBalance.js +34 -0
  151. package/dist/cjs/utils/spotBalance.js.map +1 -0
  152. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +29 -0
  153. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -0
  154. package/dist/cjs/websocket/HyperliquidWsProvider.js +359 -0
  155. package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -0
  156. package/dist/cjs/websocket/index.d.ts +2 -0
  157. package/dist/cjs/websocket/index.d.ts.map +1 -0
  158. package/dist/cjs/websocket/index.js +6 -0
  159. package/dist/cjs/websocket/index.js.map +1 -0
  160. package/dist/esm/HyperliquidProvider.d.ts +64 -0
  161. package/dist/esm/HyperliquidProvider.d.ts.map +1 -0
  162. package/dist/esm/HyperliquidProvider.js +162 -0
  163. package/dist/esm/HyperliquidProvider.js.map +1 -0
  164. package/dist/esm/accountConfig.d.ts +10 -0
  165. package/dist/esm/accountConfig.d.ts.map +1 -0
  166. package/dist/esm/accountConfig.js +65 -0
  167. package/dist/esm/accountConfig.js.map +1 -0
  168. package/dist/esm/accountSummary.d.ts +10 -0
  169. package/dist/esm/accountSummary.d.ts.map +1 -0
  170. package/dist/esm/accountSummary.js +22 -0
  171. package/dist/esm/accountSummary.js.map +1 -0
  172. package/dist/esm/constants.d.ts +40 -0
  173. package/dist/esm/constants.d.ts.map +1 -0
  174. package/dist/esm/constants.js +42 -0
  175. package/dist/esm/constants.js.map +1 -0
  176. package/dist/esm/context.d.ts +26 -0
  177. package/dist/esm/context.d.ts.map +1 -0
  178. package/dist/esm/context.js +25 -0
  179. package/dist/esm/context.js.map +1 -0
  180. package/dist/esm/index.d.ts +31 -0
  181. package/dist/esm/index.d.ts.map +1 -0
  182. package/dist/esm/index.js +26 -0
  183. package/dist/esm/index.js.map +1 -0
  184. package/dist/esm/package.json +1 -0
  185. package/dist/esm/services/getAccount.d.ts +28 -0
  186. package/dist/esm/services/getAccount.d.ts.map +1 -0
  187. package/dist/esm/services/getAccount.js +134 -0
  188. package/dist/esm/services/getAccount.js.map +1 -0
  189. package/dist/esm/services/getActivity.d.ts +33 -0
  190. package/dist/esm/services/getActivity.d.ts.map +1 -0
  191. package/dist/esm/services/getActivity.js +75 -0
  192. package/dist/esm/services/getActivity.js.map +1 -0
  193. package/dist/esm/services/getFills.d.ts +34 -0
  194. package/dist/esm/services/getFills.d.ts.map +1 -0
  195. package/dist/esm/services/getFills.js +49 -0
  196. package/dist/esm/services/getFills.js.map +1 -0
  197. package/dist/esm/services/getOrder.d.ts +17 -0
  198. package/dist/esm/services/getOrder.d.ts.map +1 -0
  199. package/dist/esm/services/getOrder.js +29 -0
  200. package/dist/esm/services/getOrder.js.map +1 -0
  201. package/dist/esm/services/getOrders.d.ts +27 -0
  202. package/dist/esm/services/getOrders.d.ts.map +1 -0
  203. package/dist/esm/services/getOrders.js +57 -0
  204. package/dist/esm/services/getOrders.js.map +1 -0
  205. package/dist/esm/services/getPositions.d.ts +26 -0
  206. package/dist/esm/services/getPositions.d.ts.map +1 -0
  207. package/dist/esm/services/getPositions.js +37 -0
  208. package/dist/esm/services/getPositions.js.map +1 -0
  209. package/dist/esm/signers/HyperliquidAgentStore.d.ts +54 -0
  210. package/dist/esm/signers/HyperliquidAgentStore.d.ts.map +1 -0
  211. package/dist/esm/signers/HyperliquidAgentStore.js +134 -0
  212. package/dist/esm/signers/HyperliquidAgentStore.js.map +1 -0
  213. package/dist/esm/signers/index.d.ts +4 -0
  214. package/dist/esm/signers/index.d.ts.map +1 -0
  215. package/dist/esm/signers/index.js +4 -0
  216. package/dist/esm/signers/index.js.map +1 -0
  217. package/dist/esm/signers/signActions.d.ts +15 -0
  218. package/dist/esm/signers/signActions.d.ts.map +1 -0
  219. package/dist/esm/signers/signActions.js +38 -0
  220. package/dist/esm/signers/signActions.js.map +1 -0
  221. package/dist/esm/types/account.d.ts +64 -0
  222. package/dist/esm/types/account.d.ts.map +1 -0
  223. package/dist/esm/types/account.js +13 -0
  224. package/dist/esm/types/account.js.map +1 -0
  225. package/dist/esm/types/action.d.ts +61 -0
  226. package/dist/esm/types/action.d.ts.map +1 -0
  227. package/dist/esm/types/action.js +16 -0
  228. package/dist/esm/types/action.js.map +1 -0
  229. package/dist/esm/types/asset.d.ts +82 -0
  230. package/dist/esm/types/asset.d.ts.map +1 -0
  231. package/dist/esm/types/asset.js +3 -0
  232. package/dist/esm/types/asset.js.map +1 -0
  233. package/dist/esm/types/fill.d.ts +21 -0
  234. package/dist/esm/types/fill.d.ts.map +1 -0
  235. package/dist/esm/types/fill.js +3 -0
  236. package/dist/esm/types/fill.js.map +1 -0
  237. package/dist/esm/types/index.d.ts +8 -0
  238. package/dist/esm/types/index.d.ts.map +1 -0
  239. package/dist/esm/types/index.js +11 -0
  240. package/dist/esm/types/index.js.map +1 -0
  241. package/dist/esm/types/ledger.d.ts +93 -0
  242. package/dist/esm/types/ledger.d.ts.map +1 -0
  243. package/dist/esm/types/ledger.js +16 -0
  244. package/dist/esm/types/ledger.js.map +1 -0
  245. package/dist/esm/types/order.d.ts +51 -0
  246. package/dist/esm/types/order.d.ts.map +1 -0
  247. package/dist/esm/types/order.js +3 -0
  248. package/dist/esm/types/order.js.map +1 -0
  249. package/dist/esm/types/ws.d.ts +43 -0
  250. package/dist/esm/types/ws.d.ts.map +1 -0
  251. package/dist/esm/types/ws.js +3 -0
  252. package/dist/esm/types/ws.js.map +1 -0
  253. package/dist/esm/utils/assetId.d.ts +20 -0
  254. package/dist/esm/utils/assetId.d.ts.map +1 -0
  255. package/dist/esm/utils/assetId.js +31 -0
  256. package/dist/esm/utils/assetId.js.map +1 -0
  257. package/dist/esm/utils/index.d.ts +15 -0
  258. package/dist/esm/utils/index.d.ts.map +1 -0
  259. package/dist/esm/utils/index.js +17 -0
  260. package/dist/esm/utils/index.js.map +1 -0
  261. package/dist/esm/utils/infoClient.d.ts +28 -0
  262. package/dist/esm/utils/infoClient.d.ts.map +1 -0
  263. package/dist/esm/utils/infoClient.js +70 -0
  264. package/dist/esm/utils/infoClient.js.map +1 -0
  265. package/dist/esm/utils/liquidation.d.ts +48 -0
  266. package/dist/esm/utils/liquidation.d.ts.map +1 -0
  267. package/dist/esm/utils/liquidation.js +65 -0
  268. package/dist/esm/utils/liquidation.js.map +1 -0
  269. package/dist/esm/utils/mapActivity.d.ts +15 -0
  270. package/dist/esm/utils/mapActivity.d.ts.map +1 -0
  271. package/dist/esm/utils/mapActivity.js +148 -0
  272. package/dist/esm/utils/mapActivity.js.map +1 -0
  273. package/dist/esm/utils/mapFill.d.ts +11 -0
  274. package/dist/esm/utils/mapFill.d.ts.map +1 -0
  275. package/dist/esm/utils/mapFill.js +34 -0
  276. package/dist/esm/utils/mapFill.js.map +1 -0
  277. package/dist/esm/utils/mapMarket.d.ts +12 -0
  278. package/dist/esm/utils/mapMarket.d.ts.map +1 -0
  279. package/dist/esm/utils/mapMarket.js +27 -0
  280. package/dist/esm/utils/mapMarket.js.map +1 -0
  281. package/dist/esm/utils/mapMarketPrice.d.ts +10 -0
  282. package/dist/esm/utils/mapMarketPrice.d.ts.map +1 -0
  283. package/dist/esm/utils/mapMarketPrice.js +24 -0
  284. package/dist/esm/utils/mapMarketPrice.js.map +1 -0
  285. package/dist/esm/utils/mapOrder.d.ts +49 -0
  286. package/dist/esm/utils/mapOrder.d.ts.map +1 -0
  287. package/dist/esm/utils/mapOrder.js +182 -0
  288. package/dist/esm/utils/mapOrder.js.map +1 -0
  289. package/dist/esm/utils/mapPosition.d.ts +12 -0
  290. package/dist/esm/utils/mapPosition.d.ts.map +1 -0
  291. package/dist/esm/utils/mapPosition.js +30 -0
  292. package/dist/esm/utils/mapPosition.js.map +1 -0
  293. package/dist/esm/utils/marketDisplay.d.ts +17 -0
  294. package/dist/esm/utils/marketDisplay.d.ts.map +1 -0
  295. package/dist/esm/utils/marketDisplay.js +31 -0
  296. package/dist/esm/utils/marketDisplay.js.map +1 -0
  297. package/dist/esm/utils/orderFormatting.d.ts +50 -0
  298. package/dist/esm/utils/orderFormatting.d.ts.map +1 -0
  299. package/dist/esm/utils/orderFormatting.js +78 -0
  300. package/dist/esm/utils/orderFormatting.js.map +1 -0
  301. package/dist/esm/utils/priceStepToAggregation.d.ts +20 -0
  302. package/dist/esm/utils/priceStepToAggregation.d.ts.map +1 -0
  303. package/dist/esm/utils/priceStepToAggregation.js +51 -0
  304. package/dist/esm/utils/priceStepToAggregation.js.map +1 -0
  305. package/dist/esm/utils/spotBalance.d.ts +18 -0
  306. package/dist/esm/utils/spotBalance.d.ts.map +1 -0
  307. package/dist/esm/utils/spotBalance.js +40 -0
  308. package/dist/esm/utils/spotBalance.js.map +1 -0
  309. package/dist/esm/websocket/HyperliquidWsProvider.d.ts +61 -0
  310. package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -0
  311. package/dist/esm/websocket/HyperliquidWsProvider.js +406 -0
  312. package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -0
  313. package/dist/esm/websocket/index.d.ts +2 -0
  314. package/dist/esm/websocket/index.d.ts.map +1 -0
  315. package/dist/esm/websocket/index.js +3 -0
  316. package/dist/esm/websocket/index.js.map +1 -0
  317. package/dist/types/HyperliquidProvider.d.ts +64 -0
  318. package/dist/types/HyperliquidProvider.d.ts.map +1 -0
  319. package/dist/types/accountConfig.d.ts +10 -0
  320. package/dist/types/accountConfig.d.ts.map +1 -0
  321. package/dist/types/accountSummary.d.ts +10 -0
  322. package/dist/types/accountSummary.d.ts.map +1 -0
  323. package/dist/types/constants.d.ts +40 -0
  324. package/dist/types/constants.d.ts.map +1 -0
  325. package/dist/types/context.d.ts +26 -0
  326. package/dist/types/context.d.ts.map +1 -0
  327. package/dist/types/index.d.ts +31 -0
  328. package/dist/types/index.d.ts.map +1 -0
  329. package/dist/types/services/getAccount.d.ts +28 -0
  330. package/dist/types/services/getAccount.d.ts.map +1 -0
  331. package/dist/types/services/getActivity.d.ts +33 -0
  332. package/dist/types/services/getActivity.d.ts.map +1 -0
  333. package/dist/types/services/getFills.d.ts +34 -0
  334. package/dist/types/services/getFills.d.ts.map +1 -0
  335. package/dist/types/services/getOrder.d.ts +17 -0
  336. package/dist/types/services/getOrder.d.ts.map +1 -0
  337. package/dist/types/services/getOrders.d.ts +27 -0
  338. package/dist/types/services/getOrders.d.ts.map +1 -0
  339. package/dist/types/services/getPositions.d.ts +26 -0
  340. package/dist/types/services/getPositions.d.ts.map +1 -0
  341. package/dist/types/signers/HyperliquidAgentStore.d.ts +54 -0
  342. package/dist/types/signers/HyperliquidAgentStore.d.ts.map +1 -0
  343. package/dist/types/signers/index.d.ts +4 -0
  344. package/dist/types/signers/index.d.ts.map +1 -0
  345. package/dist/types/signers/signActions.d.ts +15 -0
  346. package/dist/types/signers/signActions.d.ts.map +1 -0
  347. package/dist/types/types/account.d.ts +64 -0
  348. package/dist/types/types/account.d.ts.map +1 -0
  349. package/dist/types/types/action.d.ts +61 -0
  350. package/dist/types/types/action.d.ts.map +1 -0
  351. package/dist/types/types/asset.d.ts +82 -0
  352. package/dist/types/types/asset.d.ts.map +1 -0
  353. package/dist/types/types/fill.d.ts +21 -0
  354. package/dist/types/types/fill.d.ts.map +1 -0
  355. package/dist/types/types/index.d.ts +8 -0
  356. package/dist/types/types/index.d.ts.map +1 -0
  357. package/dist/types/types/ledger.d.ts +93 -0
  358. package/dist/types/types/ledger.d.ts.map +1 -0
  359. package/dist/types/types/order.d.ts +51 -0
  360. package/dist/types/types/order.d.ts.map +1 -0
  361. package/dist/types/types/ws.d.ts +43 -0
  362. package/dist/types/types/ws.d.ts.map +1 -0
  363. package/dist/types/utils/assetId.d.ts +20 -0
  364. package/dist/types/utils/assetId.d.ts.map +1 -0
  365. package/dist/types/utils/index.d.ts +15 -0
  366. package/dist/types/utils/index.d.ts.map +1 -0
  367. package/dist/types/utils/infoClient.d.ts +28 -0
  368. package/dist/types/utils/infoClient.d.ts.map +1 -0
  369. package/dist/types/utils/liquidation.d.ts +48 -0
  370. package/dist/types/utils/liquidation.d.ts.map +1 -0
  371. package/dist/types/utils/mapActivity.d.ts +15 -0
  372. package/dist/types/utils/mapActivity.d.ts.map +1 -0
  373. package/dist/types/utils/mapFill.d.ts +11 -0
  374. package/dist/types/utils/mapFill.d.ts.map +1 -0
  375. package/dist/types/utils/mapMarket.d.ts +12 -0
  376. package/dist/types/utils/mapMarket.d.ts.map +1 -0
  377. package/dist/types/utils/mapMarketPrice.d.ts +10 -0
  378. package/dist/types/utils/mapMarketPrice.d.ts.map +1 -0
  379. package/dist/types/utils/mapOrder.d.ts +49 -0
  380. package/dist/types/utils/mapOrder.d.ts.map +1 -0
  381. package/dist/types/utils/mapPosition.d.ts +12 -0
  382. package/dist/types/utils/mapPosition.d.ts.map +1 -0
  383. package/dist/types/utils/marketDisplay.d.ts +17 -0
  384. package/dist/types/utils/marketDisplay.d.ts.map +1 -0
  385. package/dist/types/utils/orderFormatting.d.ts +50 -0
  386. package/dist/types/utils/orderFormatting.d.ts.map +1 -0
  387. package/dist/types/utils/priceStepToAggregation.d.ts +20 -0
  388. package/dist/types/utils/priceStepToAggregation.d.ts.map +1 -0
  389. package/dist/types/utils/spotBalance.d.ts +18 -0
  390. package/dist/types/utils/spotBalance.d.ts.map +1 -0
  391. package/dist/types/websocket/HyperliquidWsProvider.d.ts +61 -0
  392. package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -0
  393. package/dist/types/websocket/index.d.ts +2 -0
  394. package/dist/types/websocket/index.d.ts.map +1 -0
  395. package/package.json +73 -0
  396. package/src/HyperliquidProvider.ts +381 -0
  397. package/src/accountConfig.ts +89 -0
  398. package/src/accountSummary.ts +32 -0
  399. package/src/constants.ts +47 -0
  400. package/src/context.ts +41 -0
  401. package/src/index.ts +45 -0
  402. package/src/services/getAccount.ts +263 -0
  403. package/src/services/getActivity.ts +162 -0
  404. package/src/services/getFills.ts +96 -0
  405. package/src/services/getOrder.ts +61 -0
  406. package/src/services/getOrders.ts +101 -0
  407. package/src/services/getPositions.ts +76 -0
  408. package/src/signers/HyperliquidAgentStore.ts +176 -0
  409. package/src/signers/index.ts +5 -0
  410. package/src/signers/signActions.ts +78 -0
  411. package/src/types/account.ts +74 -0
  412. package/src/types/action.ts +66 -0
  413. package/src/types/asset.ts +96 -0
  414. package/src/types/fill.ts +24 -0
  415. package/src/types/index.ts +11 -0
  416. package/src/types/ledger.ts +111 -0
  417. package/src/types/order.ts +56 -0
  418. package/src/types/ws.ts +47 -0
  419. package/src/utils/assetId.ts +38 -0
  420. package/src/utils/index.ts +38 -0
  421. package/src/utils/infoClient.ts +111 -0
  422. package/src/utils/liquidation.ts +74 -0
  423. package/src/utils/mapActivity.ts +182 -0
  424. package/src/utils/mapFill.ts +48 -0
  425. package/src/utils/mapMarket.ts +33 -0
  426. package/src/utils/mapMarketPrice.ts +33 -0
  427. package/src/utils/mapOrder.ts +218 -0
  428. package/src/utils/mapPosition.ts +40 -0
  429. package/src/utils/marketDisplay.ts +38 -0
  430. package/src/utils/orderFormatting.ts +93 -0
  431. package/src/utils/priceStepToAggregation.ts +58 -0
  432. package/src/utils/spotBalance.ts +51 -0
  433. package/src/websocket/HyperliquidWsProvider.ts +533 -0
  434. package/src/websocket/index.ts +3 -0
@@ -0,0 +1,533 @@
1
+ import {
2
+ getMarketRegistry,
3
+ isActiveOrderStatus,
4
+ type MarketRegistry,
5
+ type PerpsSDKClient,
6
+ type ProviderGetQuoteParams,
7
+ type QuoteListener,
8
+ ReconnectingWebSocket,
9
+ resolveSubscribeQuote,
10
+ WsProviderBase,
11
+ type WsProviderFactory,
12
+ wsLog,
13
+ } from '@lifi/perps-sdk'
14
+ import {
15
+ type OpenOrder,
16
+ OrderSide,
17
+ OrderType,
18
+ type Subscription,
19
+ type TriggerOrder,
20
+ } from '@lifi/perps-types'
21
+ import { HYPERLIQUID_FEE_TIER_FALLBACK } from '../constants.js'
22
+ import type {
23
+ HlAssetPosition,
24
+ HlOrderDetail,
25
+ HlUserFill,
26
+ HlWsAllDexsClearinghouseStateData,
27
+ HlWsAllMidsData,
28
+ HlWsCandleData,
29
+ HlWsL2BookData,
30
+ HlWsMessage,
31
+ HlWsSpotStateData,
32
+ HlWsUserFillsData,
33
+ } from '../types/index.js'
34
+ import {
35
+ isOpenAssetPosition,
36
+ isTriggerOrder,
37
+ mapFill,
38
+ mapOrderStatus,
39
+ mapOrderType,
40
+ mapPosition,
41
+ priceStepToAggregation,
42
+ spotAssetFromToken,
43
+ spotBalance,
44
+ spotPriceById,
45
+ } from '../utils/index.js'
46
+
47
+ /** HL's `l2Book` returns at most this many levels per side (slow/default mode). */
48
+ const HL_L2_BOOK_MAX_LEVELS_PER_SIDE = 20
49
+
50
+ /**
51
+ * `WsProviderFactory` constructor for Hyperliquid — pass to
52
+ * `new PerpsWsClient(client, { wsProviders: { hyperliquid: hyperliquidWsProvider() } })`.
53
+ *
54
+ * Derives the active sub-DEX set from the `markets` list `PerpsWsClient`
55
+ * passes in (the provider's own key and `'spot'` are excluded — they
56
+ * aren't sub-DEX subscriptions on the HL wire). Higher-order shape mirrors
57
+ * `lighterWsProvider(options)` so the two factories register identically.
58
+ *
59
+ * @public
60
+ */
61
+ export const hyperliquidWsProvider =
62
+ (): WsProviderFactory =>
63
+ ({ provider, wsUrl, markets, client }) => {
64
+ const subDexes = markets.filter((m) => m !== provider && m !== 'spot')
65
+ return new HyperliquidWsProvider(wsUrl, provider, subDexes, client)
66
+ }
67
+
68
+ /**
69
+ * Hyperliquid realtime {@link WsProvider}: multiplexes prices, positions,
70
+ * orders, fills and spot balances over a single {@link ReconnectingWebSocket}.
71
+ * Construct via {@link hyperliquidWsProvider}.
72
+ *
73
+ * `orderUpdates` supports a single address per provider instance: HL delivers
74
+ * those frames without a user field, so frames from two concurrent address
75
+ * subscriptions on one socket cannot be attributed. Subscribing a second
76
+ * address rejects while the first still has listeners; once the first is
77
+ * released, an address switch reclaims the channel immediately.
78
+ *
79
+ * @public
80
+ */
81
+ export class HyperliquidWsProvider extends WsProviderBase<object> {
82
+ private orderUpdatesKey: string | undefined
83
+ private readonly subDexes: string[]
84
+ private readonly client: PerpsSDKClient | undefined
85
+ private readonly registry: MarketRegistry | undefined
86
+ private midsBySubDex = new Map<string, Record<string, string>>()
87
+
88
+ constructor(
89
+ wsUrl: string,
90
+ providerKey: string,
91
+ subDexes: string[],
92
+ client?: PerpsSDKClient
93
+ ) {
94
+ super(
95
+ new ReconnectingWebSocket(wsUrl, { pingPayload: '{"method":"ping"}' }),
96
+ providerKey
97
+ )
98
+ this.subDexes = subDexes
99
+ this.client = client
100
+ this.registry = client && getMarketRegistry(client, providerKey)
101
+ }
102
+
103
+ async subscribeQuote(
104
+ params: ProviderGetQuoteParams,
105
+ onQuote: QuoteListener
106
+ ): Promise<() => void> {
107
+ const client = this.client
108
+ if (client === undefined) {
109
+ throw new Error(
110
+ 'HyperliquidWsProvider: PerpsSDKClient not provided; cannot stream quotes. ' +
111
+ 'Construct via `hyperliquidWsProvider()` and register with PerpsWsClient.'
112
+ )
113
+ }
114
+ return resolveSubscribeQuote(
115
+ client,
116
+ this.providerKey,
117
+ this,
118
+ params,
119
+ HYPERLIQUID_FEE_TIER_FALLBACK,
120
+ onQuote
121
+ )
122
+ }
123
+
124
+ protected async openChannel(sub: Subscription): Promise<() => void> {
125
+ // Must run synchronously, before any await, so two concurrent opens
126
+ // cannot both pass the exclusivity check.
127
+ if (sub.channel === 'orderUpdates') {
128
+ this.claimOrderUpdatesKey(this.toKey(sub))
129
+ }
130
+
131
+ await this.registry?.sync()
132
+
133
+ // Prices require multi-sub-dex allMids subscriptions under one logical key.
134
+ if (sub.channel === 'prices') {
135
+ const entries = this.getPriceSubEntries()
136
+
137
+ for (const { subKey, payload } of entries) {
138
+ await this.registerSub(subKey, payload)
139
+ }
140
+
141
+ await this.rws.ready()
142
+
143
+ return () => {
144
+ for (const { subKey, payload } of entries) {
145
+ this.unregisterSub(subKey)
146
+ this.rws.send(
147
+ JSON.stringify({ method: 'unsubscribe', subscription: payload })
148
+ )
149
+ }
150
+ this.midsBySubDex.clear()
151
+ }
152
+ }
153
+
154
+ // All other channels: single WS subscription per key
155
+ const key = this.toKey(sub)
156
+ const payload = this.toHlPayload(sub)
157
+ await this.registerSub(key, payload)
158
+
159
+ await this.rws.ready()
160
+
161
+ return () => {
162
+ this.unregisterSub(key)
163
+ if (this.orderUpdatesKey === key) {
164
+ this.orderUpdatesKey = undefined
165
+ }
166
+ this.rws.send(
167
+ JSON.stringify({ method: 'unsubscribe', subscription: payload })
168
+ )
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Enforce the single-address `orderUpdates` invariant (HL frames carry no
174
+ * user field, so concurrent address subscriptions are unattributable). A
175
+ * listener-free lingering channel for another address is torn down eagerly
176
+ * so a wallet switch needn't wait out the teardown linger; a live one throws.
177
+ */
178
+ private claimOrderUpdatesKey(key: string): void {
179
+ const active = this.orderUpdatesKey
180
+ if (
181
+ active !== undefined &&
182
+ active !== key &&
183
+ !this.closeChannelIfIdle(active)
184
+ ) {
185
+ throw new Error(
186
+ `Hyperliquid supports one orderUpdates address per provider instance ` +
187
+ `(frames carry no user field). Unsubscribe ` +
188
+ `${active.slice('orderUpdates:'.length)} before subscribing ` +
189
+ `${key.slice('orderUpdates:'.length)}.`
190
+ )
191
+ }
192
+ this.orderUpdatesKey = key
193
+ }
194
+
195
+ /** Build sub-key + payload pairs for each sub-dex allMids subscription. */
196
+ private getPriceSubEntries(): Array<{ subKey: string; payload: object }> {
197
+ return [
198
+ {
199
+ subKey: 'allMids:default',
200
+ payload: { type: 'allMids' },
201
+ },
202
+ ...this.subDexes.map((dex) => ({
203
+ subKey: `allMids:${dex}`,
204
+ payload: { type: 'allMids', dex },
205
+ })),
206
+ ]
207
+ }
208
+
209
+ protected override onClose(): void {
210
+ this.midsBySubDex.clear()
211
+ this.orderUpdatesKey = undefined
212
+ }
213
+
214
+ protected sendSubscribe(payload: object): void {
215
+ this.rws.send(
216
+ JSON.stringify({ method: 'subscribe', subscription: payload })
217
+ )
218
+ }
219
+
220
+ protected toKey(sub: Subscription): string {
221
+ switch (sub.channel) {
222
+ case 'prices':
223
+ return 'allMids'
224
+ case 'orderbook':
225
+ return `l2Book:${sub.marketId}`
226
+ case 'candle':
227
+ return `candle:${sub.marketId}:${sub.interval}`
228
+ case 'orderUpdates':
229
+ return `orderUpdates:${sub.address.toLowerCase()}`
230
+ case 'fills':
231
+ return `userFills:${sub.address.toLowerCase()}`
232
+ case 'positions':
233
+ return `positions:${sub.address.toLowerCase()}`
234
+ case 'spotBalances':
235
+ return `spotState:${sub.address.toLowerCase()}`
236
+ }
237
+ }
238
+
239
+ private toHlPayload(sub: Subscription): object {
240
+ switch (sub.channel) {
241
+ case 'prices':
242
+ // Prices are handled via getPriceSubEntries in subscribe()
243
+ // and never reach toHlPayload, but TS requires exhaustive cases.
244
+ return { type: 'allMids' }
245
+ case 'orderbook':
246
+ return {
247
+ type: 'l2Book',
248
+ coin: sub.marketId,
249
+ // HL's l2Book ignores any level-count field; it returns up to 20
250
+ // levels/side and controls granularity via nSigFigs (+ mantissa,
251
+ // valid only when nSigFigs === 5).
252
+ ...(sub.priceStep !== undefined
253
+ ? priceStepToAggregation(
254
+ sub.priceStep,
255
+ this.mergedMids().get(sub.marketId) ?? Number.NaN
256
+ )
257
+ : {}),
258
+ }
259
+ case 'candle':
260
+ return {
261
+ type: 'candle',
262
+ coin: sub.marketId,
263
+ interval: sub.interval,
264
+ }
265
+ case 'orderUpdates':
266
+ return { type: 'orderUpdates', user: sub.address }
267
+ case 'fills':
268
+ return { type: 'userFills', user: sub.address }
269
+ case 'positions':
270
+ return { type: 'allDexsClearinghouseState', user: sub.address }
271
+ case 'spotBalances':
272
+ return { type: 'spotState', user: sub.address }
273
+ }
274
+ }
275
+
276
+ protected handleMessage(raw: string) {
277
+ let msg: HlWsMessage
278
+ try {
279
+ msg = JSON.parse(raw)
280
+ } catch {
281
+ wsLog.parseFailure(this.providerKey, raw)
282
+ return
283
+ }
284
+ if (
285
+ !msg.channel ||
286
+ msg.channel === 'pong' ||
287
+ msg.channel === 'subscriptionResponse'
288
+ ) {
289
+ return
290
+ }
291
+
292
+ if (msg.channel === 'error') {
293
+ wsLog.serverError(this.providerKey, String(msg.data))
294
+ return
295
+ }
296
+
297
+ if (!isValidHlFrame(msg.channel, msg.data)) {
298
+ wsLog.parseFailure(this.providerKey, raw)
299
+ return
300
+ }
301
+
302
+ try {
303
+ switch (msg.channel) {
304
+ case 'allMids':
305
+ this.handleAllMids(msg.data as HlWsAllMidsData)
306
+ break
307
+ case 'l2Book':
308
+ this.handleL2Book(msg.data as HlWsL2BookData)
309
+ break
310
+ case 'candle':
311
+ this.handleCandle(msg.data as HlWsCandleData)
312
+ break
313
+ case 'orderUpdates':
314
+ this.handleOrderUpdates(msg.data as HlOrderDetail[])
315
+ break
316
+ case 'userFills':
317
+ this.handleUserFills(msg.data as HlWsUserFillsData)
318
+ break
319
+ case 'allDexsClearinghouseState':
320
+ this.handleAllDexsClearinghouseState(
321
+ msg.data as HlWsAllDexsClearinghouseStateData
322
+ )
323
+ break
324
+ case 'spotState':
325
+ this.handleSpotState(msg.data as HlWsSpotStateData)
326
+ break
327
+ }
328
+ } catch (error) {
329
+ wsLog.handlerFailure(this.providerKey, error)
330
+ }
331
+ }
332
+
333
+ private handleAllMids(data: HlWsAllMidsData) {
334
+ const subDexKey = data.dex || 'default'
335
+ this.midsBySubDex.set(subDexKey, data.mids)
336
+
337
+ const merged: Record<string, string> = {}
338
+ for (const mids of this.midsBySubDex.values()) {
339
+ Object.assign(merged, mids)
340
+ }
341
+
342
+ this.emit('allMids', { channel: 'prices', data: merged })
343
+ }
344
+
345
+ /** Latest mid per `Market.id`, merged across sub-dex allMids frames. */
346
+ private mergedMids(): Map<string, number> {
347
+ const map = new Map<string, number>()
348
+ for (const mids of this.midsBySubDex.values()) {
349
+ for (const [id, mid] of Object.entries(mids)) {
350
+ map.set(id, Number(mid))
351
+ }
352
+ }
353
+ return map
354
+ }
355
+
356
+ private handleL2Book(data: HlWsL2BookData) {
357
+ this.emit(`l2Book:${data.coin}`, {
358
+ channel: 'orderbook',
359
+ data: {
360
+ provider: this.providerKey,
361
+ marketId: data.coin,
362
+ bids: data.levels[0]
363
+ .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE)
364
+ .map((l) => ({ price: l.px, size: l.sz })),
365
+ asks: data.levels[1]
366
+ .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE)
367
+ .map((l) => ({ price: l.px, size: l.sz })),
368
+ timestamp: data.time,
369
+ },
370
+ })
371
+ }
372
+
373
+ private handleCandle(data: HlWsCandleData) {
374
+ this.emit(`candle:${data.s}:${data.i}`, {
375
+ channel: 'candle',
376
+ data: {
377
+ t: data.t,
378
+ o: data.o,
379
+ h: data.h,
380
+ l: data.l,
381
+ c: data.c,
382
+ v: data.v,
383
+ },
384
+ })
385
+ }
386
+
387
+ private handleOrderUpdates(data: HlOrderDetail[]) {
388
+ // Untagged frame: attributable only via the single-address invariant.
389
+ const key = this.orderUpdatesKey
390
+ if (key === undefined) {
391
+ return
392
+ }
393
+ const openOrders: OpenOrder[] = []
394
+ const triggerOrders: TriggerOrder[] = []
395
+ const terminated: string[] = []
396
+ for (const detail of data) {
397
+ const o = detail.order
398
+ const orderId = String(o.oid)
399
+ if (!isActiveOrderStatus(mapOrderStatus(detail.status))) {
400
+ terminated.push(orderId)
401
+ continue
402
+ }
403
+ const type = mapOrderType(o.orderType)
404
+ // A miss warns once and schedules a cooldown-gated registry refetch
405
+ // (the id may have listed after the snapshot); skip just this item.
406
+ const market = this.registry?.get(o.coin)
407
+ if (!market) {
408
+ continue
409
+ }
410
+ const createdAt = new Date(o.timestamp).toISOString()
411
+ if (isTriggerOrder(o)) {
412
+ const isLimit =
413
+ type === OrderType.TAKE_PROFIT_LIMIT || type === OrderType.STOP_LIMIT
414
+ triggerOrders.push({
415
+ orderId,
416
+ market,
417
+ type,
418
+ size: o.sz,
419
+ triggerPrice: o.triggerPx ?? '0',
420
+ ...(isLimit ? { limitPrice: o.limitPx } : {}),
421
+ label: o.triggerCondition,
422
+ createdAt,
423
+ })
424
+ } else {
425
+ const filled = parseFloat(o.origSz) - parseFloat(o.sz)
426
+ openOrders.push({
427
+ orderId,
428
+ market,
429
+ side: o.side === 'B' ? OrderSide.BUY : OrderSide.SELL,
430
+ type,
431
+ size: o.sz,
432
+ price: o.limitPx,
433
+ filledSize: filled.toString(),
434
+ reduceOnly: o.reduceOnly ?? false,
435
+ createdAt,
436
+ })
437
+ }
438
+ }
439
+ this.emit(key, {
440
+ channel: 'orderUpdates',
441
+ data: { openOrders, triggerOrders, terminated },
442
+ })
443
+ }
444
+
445
+ private handleUserFills(data: HlWsUserFillsData) {
446
+ const items = data.fills.flatMap((f) => {
447
+ const market = this.registry?.get(f.coin)
448
+ return market ? [mapFill(f as HlUserFill, market)] : []
449
+ })
450
+ this.emit(`userFills:${data.user.toLowerCase()}`, {
451
+ channel: 'fills',
452
+ data: items,
453
+ })
454
+ }
455
+
456
+ private handleAllDexsClearinghouseState(
457
+ data: HlWsAllDexsClearinghouseStateData
458
+ ) {
459
+ const positions = data.clearinghouseStates.flatMap(([, state]) =>
460
+ state.assetPositions.flatMap((ap) => {
461
+ if (!isOpenAssetPosition(ap as HlAssetPosition)) {
462
+ return []
463
+ }
464
+ const market = this.registry?.get(ap.position.coin)
465
+ return market ? [mapPosition(ap as HlAssetPosition, market)] : []
466
+ })
467
+ )
468
+ this.emit(`positions:${data.user.toLowerCase()}`, {
469
+ channel: 'positions',
470
+ data: positions,
471
+ })
472
+ }
473
+
474
+ private handleSpotState(data: HlWsSpotStateData) {
475
+ const priceById = spotPriceById(
476
+ this.registry?.markets ?? [],
477
+ this.mergedMids()
478
+ )
479
+ this.emit(`spotState:${data.user.toLowerCase()}`, {
480
+ channel: 'spotBalances',
481
+ data: data.spotState.balances.map((b) => ({
482
+ ...spotBalance(spotAssetFromToken(b), b.total, priceById),
483
+ locked: b.hold,
484
+ })),
485
+ })
486
+ }
487
+ }
488
+
489
+ const isObject = (v: unknown): v is Record<string, unknown> =>
490
+ typeof v === 'object' && v !== null
491
+
492
+ /**
493
+ * Minimal presence/type check of the channel-discriminating and required
494
+ * fields the matching handler dereferences without its own guard. A frame
495
+ * that parses but fails this is a bad frame (log + skip), distinct from a
496
+ * handler that throws on otherwise-shaped data. Unknown channels pass through
497
+ * to the dispatch switch, which silently ignores them.
498
+ */
499
+ function isValidHlFrame(channel: string, data: unknown): boolean {
500
+ if (!isObject(data)) {
501
+ return false
502
+ }
503
+ switch (channel) {
504
+ case 'allMids':
505
+ return isObject(data.mids)
506
+ case 'l2Book':
507
+ return (
508
+ typeof data.coin === 'string' &&
509
+ Array.isArray(data.levels) &&
510
+ Array.isArray(data.levels[0]) &&
511
+ Array.isArray(data.levels[1]) &&
512
+ typeof data.time === 'number'
513
+ )
514
+ case 'candle':
515
+ return typeof data.s === 'string' && typeof data.i === 'string'
516
+ case 'orderUpdates':
517
+ return Array.isArray(data)
518
+ case 'userFills':
519
+ return typeof data.user === 'string' && Array.isArray(data.fills)
520
+ case 'allDexsClearinghouseState':
521
+ return (
522
+ typeof data.user === 'string' && Array.isArray(data.clearinghouseStates)
523
+ )
524
+ case 'spotState':
525
+ return (
526
+ typeof data.user === 'string' &&
527
+ isObject(data.spotState) &&
528
+ Array.isArray(data.spotState.balances)
529
+ )
530
+ default:
531
+ return true
532
+ }
533
+ }
@@ -0,0 +1,3 @@
1
+ // biome-ignore-all lint/performance/noBarrelFile: package-internal barrel.
2
+
3
+ export { HyperliquidWsProvider } from './HyperliquidWsProvider.js'