@lifi/perps-sdk-provider-hyperliquid 0.0.0-preview-c903f1e

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 +29 -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 +68 -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
package/src/context.ts ADDED
@@ -0,0 +1,41 @@
1
+ import { PerpsError, type PerpsSDKClient } from '@lifi/perps-sdk'
2
+ import { PerpsErrorCode } from '@lifi/perps-types'
3
+
4
+ /**
5
+ * Runtime context the Hyperliquid read services resolve their deps from: the
6
+ * bound {@link PerpsSDKClient} (config / fetch / retry / market lookups) and
7
+ * the resolved REST base URL. Captured once in the provider factory's closure
8
+ * via {@link HyperliquidContextRef.bind}; the read methods read it at call
9
+ * time. This is the late-bind the SDK's `bindProvider` sets up — the factory
10
+ * is constructed before the client exists.
11
+ */
12
+ export interface HyperliquidContext {
13
+ client: PerpsSDKClient
14
+ apiUrl: string
15
+ }
16
+
17
+ /**
18
+ * Mutable, single-assignment holder for the {@link HyperliquidContext}. The
19
+ * provider factory creates one per instance and exposes `bind`; the read
20
+ * services call {@link HyperliquidContextRef.require} at call time.
21
+ */
22
+ export class HyperliquidContextRef {
23
+ private context: HyperliquidContext | undefined
24
+
25
+ constructor(private readonly apiUrl: string) {}
26
+
27
+ bind(client: PerpsSDKClient): void {
28
+ this.context = { client, apiUrl: this.apiUrl }
29
+ }
30
+
31
+ require(): HyperliquidContext {
32
+ if (this.context === undefined) {
33
+ throw new PerpsError(
34
+ PerpsErrorCode.SDKError,
35
+ 'hyperliquidProvider used before binding. Register it via ' +
36
+ 'createPerpsClient({ providers: [hyperliquidProvider()] }).'
37
+ )
38
+ }
39
+ return this.context
40
+ }
41
+ }
package/src/index.ts ADDED
@@ -0,0 +1,45 @@
1
+ // biome-ignore-all lint/performance/noBarrelFile: package public entry point.
2
+ // biome-ignore-all lint/performance/noReExportAll: package public entry point.
3
+
4
+ /**
5
+ * Hyperliquid provider plugin for `@lifi/perps-sdk`. Reads account-specific
6
+ * state directly from `${apiUrl}/info`; enriched asset metadata and
7
+ * public/shared data come from the LI.FI backend. Register the
8
+ * `hyperliquidProvider()` factory with `createPerpsClient`.
9
+ *
10
+ * @packageDocumentation
11
+ * @public
12
+ */
13
+
14
+ export { projectHyperliquidConfigSettings } from './accountConfig.js'
15
+ export { getAccountSummary } from './accountSummary.js'
16
+ export {
17
+ DEFAULT_HYPERLIQUID_API_URL,
18
+ HYPERLIQUID_FEE_TIER_FALLBACK,
19
+ PROVIDER_KEY as HYPERLIQUID_PROVIDER_KEY,
20
+ } from './constants.js'
21
+ export {
22
+ type HyperliquidPerpsProvider,
23
+ type HyperliquidProviderOptions,
24
+ hyperliquidProvider,
25
+ } from './HyperliquidProvider.js'
26
+ export type { GetAccountParams } from './services/getAccount.js'
27
+ export { getAccount } from './services/getAccount.js'
28
+ export type { GetActivityParams } from './services/getActivity.js'
29
+ export { getActivity } from './services/getActivity.js'
30
+ export type { GetFillsParams } from './services/getFills.js'
31
+ export { getFills } from './services/getFills.js'
32
+ export type { GetOrderParams } from './services/getOrder.js'
33
+ export { getOrder } from './services/getOrder.js'
34
+ export type { GetOrdersParams } from './services/getOrders.js'
35
+ export { getOrders } from './services/getOrders.js'
36
+ export type { GetPositionsParams } from './services/getPositions.js'
37
+ export { getPositions } from './services/getPositions.js'
38
+ export type { HyperliquidAgent } from './signers/HyperliquidAgentStore.js'
39
+ export { HyperliquidAgentStore } from './signers/HyperliquidAgentStore.js'
40
+ export * from './types/index.js'
41
+ export * from './utils/index.js'
42
+ export {
43
+ HyperliquidWsProvider,
44
+ hyperliquidWsProvider,
45
+ } from './websocket/HyperliquidWsProvider.js'
@@ -0,0 +1,263 @@
1
+ import {
2
+ getMarketRegistry,
3
+ getPrices,
4
+ type ProviderGetAccountParams,
5
+ type SDKRequestOptions,
6
+ stringToFloat,
7
+ } from '@lifi/perps-sdk'
8
+ import type {
9
+ AccountResponse,
10
+ Asset,
11
+ Balance,
12
+ HyperliquidAccountConfig,
13
+ Position,
14
+ } from '@lifi/perps-types'
15
+ import { PROVIDER_KEY } from '../constants.js'
16
+ import type { HyperliquidContext } from '../context.js'
17
+ import {
18
+ HlAbstractionMode,
19
+ type HlClearinghouseState,
20
+ type HlExtraAgents,
21
+ type HlSpotClearinghouseState,
22
+ type HlUserFees,
23
+ } from '../types/index.js'
24
+ import {
25
+ perpsDexNames,
26
+ spotAssetFromToken,
27
+ spotBalance,
28
+ spotPriceById,
29
+ } from '../utils/index.js'
30
+ import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
31
+ import { mapPosition } from '../utils/mapPosition.js'
32
+
33
+ /**
34
+ * Parameters for {@link getAccount}.
35
+ *
36
+ * @public
37
+ */
38
+ export type GetAccountParams = ProviderGetAccountParams
39
+
40
+ const getAccountValue = (state: HlClearinghouseState): number =>
41
+ Number.parseFloat(
42
+ state.crossMarginSummary.accountValue || state.marginSummary.accountValue
43
+ )
44
+
45
+ const getTotalMarginUsed = (state: HlClearinghouseState): number =>
46
+ Number.parseFloat(
47
+ state.crossMarginSummary.totalMarginUsed ||
48
+ state.marginSummary.totalMarginUsed
49
+ )
50
+
51
+ const getMarginUsed = (
52
+ abstraction: HlAbstractionMode | null,
53
+ positions: Position[],
54
+ stateByDex: Map<string, HlClearinghouseState>
55
+ ): string => {
56
+ if (
57
+ abstraction === HlAbstractionMode.UNIFIED_ACCOUNT ||
58
+ abstraction === HlAbstractionMode.PORTFOLIO_MARGIN
59
+ ) {
60
+ // Per HL docs, individual per-dex states are not meaningful for these
61
+ // modes; derive total margin from the already-mapped positions.
62
+ const total = positions.reduce(
63
+ (sum, p) => sum + Number.parseFloat(p.marginUsed),
64
+ 0
65
+ )
66
+ return total.toString()
67
+ }
68
+
69
+ if (abstraction === HlAbstractionMode.DEX_ABSTRACTION) {
70
+ let total = 0
71
+ for (const [, state] of stateByDex) {
72
+ total += getTotalMarginUsed(state)
73
+ }
74
+ return total.toString()
75
+ }
76
+
77
+ const mainState = stateByDex.get('')
78
+ if (!mainState) {
79
+ return '0'
80
+ }
81
+ return getTotalMarginUsed(mainState).toString()
82
+ }
83
+
84
+ const isUnifiedMode = (abstraction: HlAbstractionMode | null): boolean =>
85
+ abstraction === HlAbstractionMode.UNIFIED_ACCOUNT ||
86
+ abstraction === HlAbstractionMode.PORTFOLIO_MARGIN
87
+
88
+ interface BalancePartition {
89
+ balances: Balance[]
90
+ collateralBalances: Balance[]
91
+ }
92
+
93
+ const buildBalances = (
94
+ abstraction: HlAbstractionMode | null,
95
+ spotState: HlSpotClearinghouseState,
96
+ stateByDex: Map<string, HlClearinghouseState>,
97
+ quoteAssetIds: ReadonlySet<string>,
98
+ priceById: Map<string, number>,
99
+ quoteAssetByCategory: Map<string, Asset>
100
+ ): BalancePartition => {
101
+ const balances: Balance[] = []
102
+ const collateralBalances: Balance[] = []
103
+
104
+ // Spot balances: collateral iff the token is a category quote asset.
105
+ for (const b of spotState.balances) {
106
+ const balance = spotBalance(spotAssetFromToken(b), b.total, priceById)
107
+ if (quoteAssetIds.has(balance.asset.id)) {
108
+ collateralBalances.push(balance)
109
+ } else {
110
+ balances.push(balance)
111
+ }
112
+ }
113
+
114
+ // Unified/portfolio modes hold everything in spot — per-dex equity would
115
+ // double-count. Only disabled/dexAbstraction carry separate venue collateral.
116
+ // `accountValue` is reported net of locked margin, i.e. the free collateral;
117
+ // the locked portion is carried by the positions' `marginUsed`.
118
+ if (!isUnifiedMode(abstraction)) {
119
+ for (const [dex, state] of stateByDex) {
120
+ const categoryId = dex || PROVIDER_KEY
121
+ const value = getAccountValue(state)
122
+ collateralBalances.push({
123
+ categoryId,
124
+ // Always present: every dex in `stateByDex` derives from `markets`,
125
+ // which is what populates `quoteAssetByCategory`.
126
+ asset: quoteAssetByCategory.get(categoryId)!,
127
+ units: value.toString(),
128
+ valueUsd: value.toString(),
129
+ })
130
+ }
131
+ }
132
+
133
+ return { balances, collateralBalances }
134
+ }
135
+
136
+ /**
137
+ * Fetch the Hyperliquid account snapshot for `address`: balances per
138
+ * sub-dex (and spot), aggregate margin used, unrealised PnL, fee tier, and
139
+ * the typed `HyperliquidAccountConfig`.
140
+ *
141
+ * Issues `userFees`, `userAbstraction`, `extraAgents`,
142
+ * `spotClearinghouseState` and one `clearinghouseState` per supported perps
143
+ * sub-dex, all concurrently.
144
+ *
145
+ * `config.builderFeeApproval` is intentionally omitted — that field
146
+ * compares the venue's `maxBuilderFee` against the integrator-specific
147
+ * builder address LI.FI publishes, which is not data the venue itself
148
+ * owns. Surfacing it belongs at a higher layer (the LI.FI backend or a
149
+ * thin client-side helper that has the integrator's builder config).
150
+ * @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
151
+ * @public
152
+ */
153
+ export const getAccount = async (
154
+ { client, apiUrl }: HyperliquidContext,
155
+ params: GetAccountParams,
156
+ options?: SDKRequestOptions
157
+ ): Promise<AccountResponse> => {
158
+ const registry = getMarketRegistry(client, PROVIDER_KEY)
159
+ const markets = await registry.sync()
160
+ const dexNames = perpsDexNames(markets)
161
+ const quoteAssetIds = new Set(markets.map((m) => m.quoteAsset.id))
162
+ const quoteAssetByCategory = new Map(
163
+ markets.map((m) => [m.categoryId, m.quoteAsset])
164
+ )
165
+ const infoOpts = hlInfoOptions(client, options)
166
+
167
+ const [
168
+ feesResult,
169
+ abstractionResult,
170
+ agentsResult,
171
+ spotState,
172
+ stateResults,
173
+ { prices },
174
+ ] = await Promise.all([
175
+ infoRequest<HlUserFees>(
176
+ apiUrl,
177
+ { type: 'userFees', user: params.address },
178
+ infoOpts
179
+ ),
180
+ // "Never set abstraction" is a successful 200 `null` body, not an error —
181
+ // so a fetch failure must propagate, never be coerced to `null` (which
182
+ // would silently route margin/balance down the wrong, non-unified branch).
183
+ infoRequest<HlAbstractionMode | null>(
184
+ apiUrl,
185
+ { type: 'userAbstraction', user: params.address },
186
+ infoOpts
187
+ ),
188
+ infoRequest<HlExtraAgents>(
189
+ apiUrl,
190
+ { type: 'extraAgents', user: params.address },
191
+ infoOpts
192
+ ),
193
+ infoRequest<HlSpotClearinghouseState>(
194
+ apiUrl,
195
+ { type: 'spotClearinghouseState', user: params.address },
196
+ infoOpts
197
+ ),
198
+ Promise.all(
199
+ dexNames.map((name) =>
200
+ infoRequest<HlClearinghouseState>(
201
+ apiUrl,
202
+ {
203
+ type: 'clearinghouseState',
204
+ user: params.address,
205
+ ...(name ? { dex: name } : {}),
206
+ },
207
+ infoOpts
208
+ )
209
+ )
210
+ ),
211
+ getPrices(client, { provider: PROVIDER_KEY }, options),
212
+ ])
213
+
214
+ const priceById = spotPriceById(
215
+ markets,
216
+ new Map(prices.map((p) => [p.marketId, stringToFloat(p.markPrice)]))
217
+ )
218
+
219
+ const positions: Position[] = stateResults.flatMap((state) =>
220
+ state.assetPositions
221
+ .filter((ap) => Number.parseFloat(ap.position.szi) !== 0)
222
+ .map((ap) => mapPosition(ap, registry.require(ap.position.coin)))
223
+ )
224
+
225
+ const stateByDex = new Map<string, HlClearinghouseState>()
226
+ stateResults.forEach((state, i) => {
227
+ stateByDex.set(dexNames[i], state)
228
+ })
229
+
230
+ const totalUnrealizedPnl = positions.reduce(
231
+ (sum, p) => sum + Number.parseFloat(p.unrealizedPnl),
232
+ 0
233
+ )
234
+
235
+ const config: HyperliquidAccountConfig = {
236
+ provider: PROVIDER_KEY,
237
+ abstractionMode: abstractionResult,
238
+ agents: agentsResult,
239
+ }
240
+
241
+ const { balances, collateralBalances } = buildBalances(
242
+ abstractionResult,
243
+ spotState,
244
+ stateByDex,
245
+ quoteAssetIds,
246
+ priceById,
247
+ quoteAssetByCategory
248
+ )
249
+
250
+ return {
251
+ provider: PROVIDER_KEY,
252
+ address: params.address,
253
+ balances,
254
+ collateralBalances,
255
+ marginUsed: getMarginUsed(abstractionResult, positions, stateByDex),
256
+ unrealizedPnl: totalUnrealizedPnl.toString(),
257
+ feeTier: {
258
+ maker: feesResult.userAddRate ?? '0',
259
+ taker: feesResult.userCrossRate ?? '0',
260
+ },
261
+ config,
262
+ }
263
+ }
@@ -0,0 +1,162 @@
1
+ import { getMarketRegistry, type SDKRequestOptions } from '@lifi/perps-sdk'
2
+ import type {
3
+ ActivitiesResponse,
4
+ ActivityItem,
5
+ MarketDisplay,
6
+ } from '@lifi/perps-types'
7
+ import { ActivityType } from '@lifi/perps-types'
8
+ import type { Address } from 'viem'
9
+ import {
10
+ DEFAULT_HISTORY_LIMIT,
11
+ MAX_HISTORY_LIMIT,
12
+ NINETY_DAYS_MS,
13
+ PROVIDER_KEY,
14
+ } from '../constants.js'
15
+ import type { HyperliquidContext } from '../context.js'
16
+ import type {
17
+ HlUserFunding,
18
+ HlUserNonFundingLedgerUpdates,
19
+ } from '../types/index.js'
20
+ import { mapFundingActivity, mapLedgerEntry } from '../utils/index.js'
21
+ import {
22
+ hlInfoOptions,
23
+ type InfoRequestOptions,
24
+ infoRequest,
25
+ } from '../utils/infoClient.js'
26
+
27
+ /**
28
+ * Parameters for {@link getActivity}.
29
+ *
30
+ * @public
31
+ */
32
+ export interface GetActivityParams {
33
+ address: Address
34
+ limit?: number
35
+ /** `cursor` is a ms-since-epoch upper bound — items with `timestamp < cursor` are returned. */
36
+ cursor?: string
37
+ startTime?: number
38
+ endTime?: number
39
+ type?: ActivityType[]
40
+ }
41
+
42
+ const fetchActivityData = async (
43
+ apiUrl: string,
44
+ typeFilter: ActivityType[] | undefined,
45
+ timeParams: { user: Address; startTime: number; endTime?: number },
46
+ resolveMarket: (coin: string) => MarketDisplay,
47
+ options?: InfoRequestOptions
48
+ ): Promise<ActivityItem[]> => {
49
+ const needLedger =
50
+ !typeFilter || typeFilter.some((t) => t !== ActivityType.FUNDING)
51
+ const needFunding = !typeFilter || typeFilter.includes(ActivityType.FUNDING)
52
+
53
+ const [ledgerUpdates, fundingUpdates] = await Promise.all([
54
+ needLedger
55
+ ? infoRequest<HlUserNonFundingLedgerUpdates>(
56
+ apiUrl,
57
+ { type: 'userNonFundingLedgerUpdates', ...timeParams },
58
+ options
59
+ )
60
+ : Promise.resolve([] as HlUserNonFundingLedgerUpdates),
61
+ needFunding
62
+ ? infoRequest<HlUserFunding>(
63
+ apiUrl,
64
+ { type: 'userFunding', ...timeParams },
65
+ options
66
+ )
67
+ : Promise.resolve([] as HlUserFunding),
68
+ ])
69
+
70
+ const ledgerItems: ActivityItem[] = ledgerUpdates
71
+ .map((entry) =>
72
+ mapLedgerEntry(entry, PROVIDER_KEY, timeParams.user, resolveMarket)
73
+ )
74
+ .filter((item): item is ActivityItem => item !== null)
75
+
76
+ const fundingItems: ActivityItem[] = fundingUpdates.map((entry) =>
77
+ mapFundingActivity(entry, PROVIDER_KEY, resolveMarket)
78
+ )
79
+
80
+ const merged = [...ledgerItems, ...fundingItems].sort(
81
+ (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
82
+ )
83
+
84
+ if (!typeFilter) {
85
+ return merged
86
+ }
87
+ const typeSet = new Set(typeFilter)
88
+ return merged.filter((item) => typeSet.has(item.type))
89
+ }
90
+
91
+ /**
92
+ * Fetch a chronological activity feed (deposits, withdrawals, transfers,
93
+ * liquidations, funding) for `address`. Combines results from Hyperliquid's
94
+ * `userNonFundingLedgerUpdates` and `userFunding` endpoints, sorted
95
+ * newest-first.
96
+ *
97
+ * Cursor-based pagination uses the ms-since-epoch timestamp of the last
98
+ * item on the current page. `startTime` defaults to 90 days ago to keep
99
+ * unbounded queries cheap.
100
+ * @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
101
+ * @public
102
+ */
103
+ export const getActivity = async (
104
+ { client, apiUrl }: HyperliquidContext,
105
+ params: GetActivityParams,
106
+ options?: SDKRequestOptions
107
+ ): Promise<ActivitiesResponse> => {
108
+ const registry = getMarketRegistry(client, PROVIDER_KEY)
109
+ await registry.sync()
110
+ const infoOpts = hlInfoOptions(client, options)
111
+
112
+ const limit = Math.min(
113
+ params.limit ?? DEFAULT_HISTORY_LIMIT,
114
+ MAX_HISTORY_LIMIT
115
+ )
116
+ const startTime = params.startTime ?? Date.now() - NINETY_DAYS_MS
117
+ const endTime =
118
+ params.cursor === undefined
119
+ ? params.endTime
120
+ : Number.parseInt(params.cursor, 10)
121
+
122
+ const timeParams = {
123
+ user: params.address,
124
+ startTime,
125
+ ...(endTime === undefined ? {} : { endTime }),
126
+ }
127
+
128
+ const merged = await fetchActivityData(
129
+ apiUrl,
130
+ params.type,
131
+ timeParams,
132
+ (coin) => registry.require(coin),
133
+ infoOpts
134
+ )
135
+
136
+ // Hyperliquid's endTime is inclusive — drop boundary items so we don't
137
+ // return the cursor row twice on the next page.
138
+ const filtered =
139
+ params.cursor === undefined
140
+ ? merged
141
+ : merged.filter(
142
+ (item) =>
143
+ new Date(item.timestamp).getTime() <
144
+ Number.parseInt(params.cursor!, 10)
145
+ )
146
+
147
+ const hasMore = filtered.length > limit
148
+ const items = filtered.slice(0, limit)
149
+
150
+ return {
151
+ provider: PROVIDER_KEY,
152
+ items,
153
+ pagination: {
154
+ limit,
155
+ hasMore,
156
+ cursor:
157
+ items.length > 0
158
+ ? String(new Date(items[items.length - 1].timestamp).getTime())
159
+ : undefined,
160
+ },
161
+ }
162
+ }
@@ -0,0 +1,96 @@
1
+ import { getMarketRegistry, type SDKRequestOptions } from '@lifi/perps-sdk'
2
+ import type { FillsResponse } from '@lifi/perps-types'
3
+ import type { Address } from 'viem'
4
+ import {
5
+ DEFAULT_HISTORY_LIMIT,
6
+ MAX_HISTORY_LIMIT,
7
+ PROVIDER_KEY,
8
+ } from '../constants.js'
9
+ import type { HyperliquidContext } from '../context.js'
10
+ import type { HlUserFills, HlUserFillsByTime } from '../types/index.js'
11
+ import { mapFill } from '../utils/index.js'
12
+ import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
13
+
14
+ /**
15
+ * Parameters for {@link getFills}.
16
+ *
17
+ * @public
18
+ */
19
+ export interface GetFillsParams {
20
+ address: Address
21
+ limit?: number
22
+ /** `tid` of the oldest fill to return (returned items have `tid < cursor`). */
23
+ cursor?: string
24
+ /** Inclusive lower bound in ms-since-epoch — switches to the `userFillsByTime` endpoint. */
25
+ startTime?: number
26
+ /** Inclusive upper bound in ms-since-epoch — switches to the `userFillsByTime` endpoint. */
27
+ endTime?: number
28
+ }
29
+
30
+ /**
31
+ * Fetch the user's fills history. When `startTime` or `endTime` is provided,
32
+ * Hyperliquid's `userFillsByTime` endpoint is used; otherwise the unbounded
33
+ * `userFills` endpoint returns the full history. The backend's enriched asset
34
+ * list supplies the display fields; only the fills endpoint is read direct
35
+ * from HL.
36
+ *
37
+ * Pagination is cursor-based on the fill's `tid`: results with
38
+ * `tid < cursor` are kept and the last-page's tail `id` is returned as the
39
+ * next cursor.
40
+ * @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
41
+ * @public
42
+ */
43
+ export const getFills = async (
44
+ { client, apiUrl }: HyperliquidContext,
45
+ params: GetFillsParams,
46
+ options?: SDKRequestOptions
47
+ ): Promise<FillsResponse> => {
48
+ const registry = getMarketRegistry(client, PROVIDER_KEY)
49
+ await registry.sync()
50
+ const infoOpts = hlInfoOptions(client, options)
51
+
52
+ const limit = Math.min(
53
+ params.limit ?? DEFAULT_HISTORY_LIMIT,
54
+ MAX_HISTORY_LIMIT
55
+ )
56
+
57
+ const useByTime =
58
+ params.startTime !== undefined || params.endTime !== undefined
59
+
60
+ const allFills = useByTime
61
+ ? await infoRequest<HlUserFillsByTime>(
62
+ apiUrl,
63
+ {
64
+ type: 'userFillsByTime',
65
+ user: params.address,
66
+ startTime: params.startTime ?? 0,
67
+ ...(params.endTime !== undefined ? { endTime: params.endTime } : {}),
68
+ },
69
+ infoOpts
70
+ )
71
+ : await infoRequest<HlUserFills>(
72
+ apiUrl,
73
+ { type: 'userFills', user: params.address },
74
+ infoOpts
75
+ )
76
+
77
+ const filtered =
78
+ params.cursor === undefined
79
+ ? allFills
80
+ : allFills.filter((f) => f.tid < Number.parseInt(params.cursor!, 10))
81
+
82
+ const hasMore = filtered.length > limit
83
+ const items = filtered
84
+ .slice(0, limit)
85
+ .map((f) => mapFill(f, registry.require(f.coin)))
86
+
87
+ return {
88
+ provider: PROVIDER_KEY,
89
+ items,
90
+ pagination: {
91
+ limit,
92
+ hasMore,
93
+ cursor: items.length > 0 ? items[items.length - 1].id : undefined,
94
+ },
95
+ }
96
+ }
@@ -0,0 +1,61 @@
1
+ import {
2
+ getMarketRegistry,
3
+ PerpsError,
4
+ type ProviderGetOrderParams,
5
+ type SDKRequestOptions,
6
+ } from '@lifi/perps-sdk'
7
+ import type { Order } from '@lifi/perps-types'
8
+ import { PerpsErrorCode } from '@lifi/perps-types'
9
+ import { PROVIDER_KEY } from '../constants.js'
10
+ import type { HyperliquidContext } from '../context.js'
11
+ import type { HlOrderStatusResponse } from '../types/index.js'
12
+ import { mapOrder } from '../utils/index.js'
13
+ import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
14
+
15
+ /**
16
+ * Parameters for {@link getOrder}.
17
+ *
18
+ * @public
19
+ */
20
+ export type GetOrderParams = ProviderGetOrderParams
21
+
22
+ /**
23
+ * Read getOrder direct from the Hyperliquid REST API.
24
+ *
25
+ * @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
26
+ * @public
27
+ */
28
+ export const getOrder = async (
29
+ { client, apiUrl }: HyperliquidContext,
30
+ params: GetOrderParams,
31
+ options?: SDKRequestOptions
32
+ ): Promise<Order> => {
33
+ const oid = Number.parseInt(params.id, 10)
34
+ if (Number.isNaN(oid)) {
35
+ const err = new PerpsError(
36
+ PerpsErrorCode.ValidationError,
37
+ `Invalid order ID: ${params.id}. Must be a numeric oid.`
38
+ )
39
+ err.tool = PROVIDER_KEY
40
+ throw err
41
+ }
42
+
43
+ const status = await infoRequest<HlOrderStatusResponse>(
44
+ apiUrl,
45
+ { type: 'orderStatus', user: params.address, oid },
46
+ hlInfoOptions(client, options)
47
+ )
48
+
49
+ if (status.status !== 'order') {
50
+ const err = new PerpsError(
51
+ PerpsErrorCode.OrderNotFound,
52
+ `Order not found: ${params.id}`
53
+ )
54
+ err.tool = PROVIDER_KEY
55
+ throw err
56
+ }
57
+
58
+ const registry = getMarketRegistry(client, PROVIDER_KEY)
59
+ await registry.sync()
60
+ return mapOrder(status.order, registry.require(status.order.order.coin))
61
+ }