@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
@@ -0,0 +1,11 @@
1
+ // biome-ignore-all lint/performance/noBarrelFile lint/performance/noReExportAll: single re-export entry point
2
+ // for every Hyperliquid wire type. Internal modules import per-file paths
3
+ // (e.g. `../types/account.js`) to avoid pulling unrelated types into bundles.
4
+
5
+ export * from './account.js'
6
+ export * from './action.js'
7
+ export * from './asset.js'
8
+ export * from './fill.js'
9
+ export * from './ledger.js'
10
+ export * from './order.js'
11
+ export * from './ws.js'
@@ -0,0 +1,111 @@
1
+ import type { Address } from 'viem'
2
+
3
+ // `userNonFundingLedgerUpdates` + `userFunding` shapes.
4
+
5
+ /**
6
+ * Hyperliquid `spotTransfer` ledger delta. Emitted for transfers of spot
7
+ * tokens between Hyperliquid accounts. `user` is the sender, `destination`
8
+ * the recipient; direction is derived at the call site from the queried
9
+ * address.
10
+ * @public
11
+ */
12
+ export type HlSpotTransferDelta = {
13
+ type: 'spotTransfer'
14
+ token: string
15
+ amount: string
16
+ usdcValue: string
17
+ user: Address
18
+ destination: Address
19
+ fee?: string
20
+ nativeTokenFee?: string
21
+ nonce?: number
22
+ }
23
+
24
+ /**
25
+ * Hyperliquid ledger delta emitted for the `sendAsset` exchange action. The
26
+ * wire `type` literal is `'send'` (NOT `'sendAsset'`); the TS name retains
27
+ * the `SendAsset` prefix to match `HL_PRIMARY_TYPE_SEND_ASSET`.
28
+ *
29
+ * - `user` is the sender, `destination` the recipient. For same-user dex
30
+ * moves both equal the queried address.
31
+ * - `sourceDex` / `destinationDex` use `""` for the main USDC perp DEX,
32
+ * `"spot"` for spot, or the perp DEX name otherwise.
33
+ * - `token` is a wire token identifier (e.g. `"USDC"` or `"TOKEN:0x..."`).
34
+ * - `nonce` is the wire nonce (ms timestamp); always present on `send`
35
+ * deltas, unlike `spotTransfer` where it may be null.
36
+ * @public
37
+ */
38
+ export type HlSendAssetDelta = {
39
+ type: 'send'
40
+ user: Address
41
+ destination: Address
42
+ sourceDex: string
43
+ destinationDex: string
44
+ token: string
45
+ amount: string
46
+ usdcValue: string
47
+ fee: string
48
+ nativeTokenFee: string
49
+ nonce: number
50
+ feeToken: string
51
+ }
52
+
53
+ /** @public */
54
+ export type HlLedgerDelta =
55
+ | HlSpotTransferDelta
56
+ | HlSendAssetDelta
57
+ | {
58
+ type: string
59
+ usdc?: string
60
+ [key: string]: unknown
61
+ }
62
+
63
+ /**
64
+ * Type guard for `HlSpotTransferDelta` — TypeScript cannot narrow off the
65
+ * `type` discriminant alone because the catch-all arm of `HlLedgerDelta` has
66
+ * `type: string` (a supertype of the literal `'spotTransfer'`). Use this at
67
+ * call sites that need the strongly-typed shape.
68
+ * @public
69
+ */
70
+ export const isSpotTransferDelta = (
71
+ delta: HlLedgerDelta
72
+ ): delta is HlSpotTransferDelta => delta.type === 'spotTransfer'
73
+
74
+ /**
75
+ * Type guard for `HlSendAssetDelta`. The wire `type` literal is `'send'`;
76
+ * see `HlSendAssetDelta` for the naming-vs-wire-format rationale. Same
77
+ * catch-all-arm caveat as `isSpotTransferDelta`.
78
+ * @public
79
+ */
80
+ export const isSendAssetDelta = (
81
+ delta: HlLedgerDelta
82
+ ): delta is HlSendAssetDelta => delta.type === 'send'
83
+
84
+ /** @public */
85
+ export type HlLedgerUpdate = {
86
+ time: number
87
+ hash: string
88
+ delta: HlLedgerDelta
89
+ }
90
+
91
+ /** @public */
92
+ export type HlUserNonFundingLedgerUpdates = HlLedgerUpdate[]
93
+
94
+ /** @public */
95
+ export type HlFundingDelta = {
96
+ type: 'funding'
97
+ coin: string
98
+ usdc: string
99
+ szi: string
100
+ fundingRate: string
101
+ }
102
+
103
+ /** @public */
104
+ export type HlFundingUpdate = {
105
+ time: number
106
+ hash: string
107
+ delta: HlFundingDelta
108
+ }
109
+
110
+ /** @public */
111
+ export type HlUserFunding = HlFundingUpdate[]
@@ -0,0 +1,56 @@
1
+ // Order shapes returned by Hyperliquid `/info`.
2
+
3
+ /** @public */
4
+ export type HlFrontendOpenOrder = {
5
+ oid: number
6
+ coin: string
7
+ side: string
8
+ sz: string
9
+ limitPx: string
10
+ orderType: string
11
+ origSz: string
12
+ reduceOnly: boolean
13
+ timestamp: number
14
+ isTrigger: boolean
15
+ isPositionTpsl: boolean
16
+ triggerCondition: string
17
+ triggerPx: string
18
+ children: HlFrontendOpenOrder[]
19
+ tif: string | null
20
+ cloid: string | null
21
+ }
22
+
23
+ /** @public */
24
+ export type HlFrontendOpenOrders = HlFrontendOpenOrder[]
25
+
26
+ /** @public */
27
+ export type HlOrderDetail = {
28
+ order: {
29
+ oid: number
30
+ coin: string
31
+ side: string
32
+ sz: string
33
+ limitPx: string
34
+ orderType: string
35
+ origSz: string
36
+ reduceOnly: boolean
37
+ timestamp: number
38
+ tif: string | null
39
+ cloid: string | null
40
+ triggerCondition: string
41
+ triggerPx: string | null
42
+ }
43
+ status: string
44
+ statusTimestamp: number
45
+ }
46
+
47
+ /** @public */
48
+ export type HlOrderStatusFound = {
49
+ status: 'order'
50
+ order: HlOrderDetail
51
+ }
52
+
53
+ /** @public */
54
+ export type HlOrderStatusResponse =
55
+ | HlOrderStatusFound
56
+ | { status: 'unknownOid' }
@@ -0,0 +1,47 @@
1
+ // Hyperliquid WebSocket incoming message types.
2
+
3
+ import type { HlClearinghouseState, HlSpotBalance } from './account.js'
4
+ import type { HlAllMids, HlCandle, HlL2Book } from './asset.js'
5
+ import type { HlUserFill } from './fill.js'
6
+
7
+ /** @public */
8
+ export type HlWsMessage = {
9
+ channel: string
10
+ data: unknown
11
+ }
12
+
13
+ /** @public */
14
+ export type HlWsAllMidsData = {
15
+ mids: HlAllMids
16
+ dex?: string
17
+ }
18
+
19
+ /** @public */
20
+ export type HlWsL2BookData = HlL2Book & { coin: string }
21
+
22
+ /** @public */
23
+ export type HlWsCandleData = HlCandle & {
24
+ T: number
25
+ s: string
26
+ i: string
27
+ n: number
28
+ }
29
+
30
+ /** @public */
31
+ export type HlWsUserFillsData = {
32
+ isSnapshot: boolean
33
+ user: string
34
+ fills: HlUserFill[]
35
+ }
36
+
37
+ /** @public */
38
+ export type HlWsAllDexsClearinghouseStateData = {
39
+ user: string
40
+ clearinghouseStates: [string, Pick<HlClearinghouseState, 'assetPositions'>][]
41
+ }
42
+
43
+ /** @public */
44
+ export type HlWsSpotStateData = {
45
+ user: string
46
+ spotState: { balances: HlSpotBalance[] }
47
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Spot asset IDs use the @pairIndex format (e.g. "@230").
3
+ *
4
+ * @public
5
+ */
6
+ export const assetIsSpot = (assetId: string): boolean => assetId.startsWith('@')
7
+
8
+ /**
9
+ * Calculate the asset ID for a given provider index and asset index.
10
+ *
11
+ * Main provider (provider = ''): assetId = indexInProvider
12
+ * HIP-3 providers (provider = 'xyz'): assetId = 100_000 + perpDexIndex * 10_000 + indexInProvider
13
+ * @public
14
+ */
15
+ export const calculateAssetId = (
16
+ providerIndex: number,
17
+ indexInProvider: number
18
+ ): number => {
19
+ if (providerIndex === 0) {
20
+ return indexInProvider
21
+ }
22
+ return 100_000 + providerIndex * 10_000 + indexInProvider
23
+ }
24
+
25
+ /**
26
+ * Get the provider index from the given list of provider names.
27
+ * @public
28
+ */
29
+ export const getProviderIndex = (
30
+ provider: string,
31
+ providerNames: string[]
32
+ ): number => {
33
+ const index = providerNames.indexOf(provider)
34
+ if (index === -1) {
35
+ throw new Error(`Unknown sub-provider: ${provider}`)
36
+ }
37
+ return index
38
+ }
@@ -0,0 +1,38 @@
1
+ // biome-ignore-all lint/performance/noBarrelFile: single re-export entry point
2
+ // for the package's utility surface. Internal modules import per-file paths
3
+ // (e.g. `./assetId.js`, `./mapFill.js`) directly.
4
+
5
+ export { assetIsSpot, calculateAssetId, getProviderIndex } from './assetId.js'
6
+ export type { InfoRequestOptions } from './infoClient.js'
7
+ export { hlInfoOptions, infoRequest } from './infoClient.js'
8
+ export {
9
+ calculateLiquidationPrice,
10
+ calculateMaintenanceMarginRate,
11
+ } from './liquidation.js'
12
+ export { mapFundingActivity, mapLedgerEntry } from './mapActivity.js'
13
+ export { classifyFillFromPosition, mapFill } from './mapFill.js'
14
+ export { mapMarket } from './mapMarket.js'
15
+ export { mapMarketPrice } from './mapMarketPrice.js'
16
+ export {
17
+ isTriggerOrder,
18
+ isTriggerType,
19
+ mapOpenOrder,
20
+ mapOrder,
21
+ mapOrderStatus,
22
+ mapOrderType,
23
+ mapStatusReason,
24
+ mapTriggerOrder,
25
+ } from './mapOrder.js'
26
+ export { isOpenAssetPosition, mapPosition } from './mapPosition.js'
27
+ export { coinAsset, perpsDexNames } from './marketDisplay.js'
28
+ export {
29
+ formatOrderPrice,
30
+ formatOrderSize,
31
+ getMaxPriceDecimals,
32
+ } from './orderFormatting.js'
33
+ export { priceStepToAggregation } from './priceStepToAggregation.js'
34
+ export {
35
+ spotAssetFromToken,
36
+ spotBalance,
37
+ spotPriceById,
38
+ } from './spotBalance.js'
@@ -0,0 +1,111 @@
1
+ import {
2
+ fetchWithRetry,
3
+ PerpsError,
4
+ type PerpsSDKClient,
5
+ type ResolvedRetryPolicy,
6
+ resolveRetryPolicy,
7
+ type SDKRequestOptions,
8
+ } from '@lifi/perps-sdk'
9
+ import { PerpsErrorCode } from '@lifi/perps-types'
10
+ import { PROVIDER_KEY } from '../constants.js'
11
+
12
+ /** @internal */
13
+ export const HYPERLIQUID_RETRY_DEFAULTS: ResolvedRetryPolicy = {
14
+ enabled: true,
15
+ maxAttempts: 3,
16
+ baseDelayMs: 2_000,
17
+ maxDelayMs: 15_000,
18
+ respectRetryAfter: true,
19
+ classify: ({ response }) => {
20
+ if (response.status === 429) {
21
+ return 'retry-rate-limit'
22
+ }
23
+ if (
24
+ response.status === 502 ||
25
+ response.status === 503 ||
26
+ response.status === 504
27
+ ) {
28
+ return 'retry-server'
29
+ }
30
+ return 'fail'
31
+ },
32
+ }
33
+
34
+ /** @public */
35
+ export interface InfoRequestOptions {
36
+ signal?: AbortSignal
37
+ policy?: ResolvedRetryPolicy
38
+ fetchImpl?: typeof fetch
39
+ }
40
+
41
+ /**
42
+ * Resolve the client's retry/fetch config into options for {@link infoRequest}.
43
+ *
44
+ * @public
45
+ */
46
+ export const hlInfoOptions = (
47
+ client: PerpsSDKClient,
48
+ options?: SDKRequestOptions
49
+ ): InfoRequestOptions => ({
50
+ signal: options?.signal,
51
+ policy: resolveRetryPolicy(
52
+ HYPERLIQUID_RETRY_DEFAULTS,
53
+ client.config.retry,
54
+ PROVIDER_KEY
55
+ ),
56
+ fetchImpl: client.config.fetch,
57
+ })
58
+
59
+ /**
60
+ * POST to the Hyperliquid `/info` endpoint and return the parsed JSON body.
61
+ *
62
+ * Direct-to-venue: no proxy, no AJV validation, no cache. The caller's type
63
+ * parameter is trusted; consumers should treat the response shape as
64
+ * upstream-controlled and normalise into `@lifi/perps-types` shapes before
65
+ * surfacing.
66
+ *
67
+ * Non-2xx responses raise a {@link PerpsError} with the Hyperliquid provider key.
68
+ * @public
69
+ */
70
+ export async function infoRequest<T>(
71
+ apiUrl: string,
72
+ body: Record<string, unknown>,
73
+ options?: InfoRequestOptions
74
+ ): Promise<T> {
75
+ const policy = options?.policy ?? HYPERLIQUID_RETRY_DEFAULTS
76
+
77
+ let response: Response
78
+ try {
79
+ response = await fetchWithRetry(
80
+ `${apiUrl}/info`,
81
+ {
82
+ method: 'POST',
83
+ headers: { 'Content-Type': 'application/json' },
84
+ body: JSON.stringify(body),
85
+ },
86
+ {
87
+ policy,
88
+ fetchImpl: options?.fetchImpl,
89
+ signal: options?.signal,
90
+ }
91
+ )
92
+ } catch (error) {
93
+ const err = new PerpsError(
94
+ PerpsErrorCode.ServerError,
95
+ error instanceof Error ? error.message : 'Hyperliquid info request failed'
96
+ )
97
+ err.tool = PROVIDER_KEY
98
+ throw err
99
+ }
100
+
101
+ if (!response.ok) {
102
+ const err = new PerpsError(
103
+ PerpsErrorCode.ThirdPartyError,
104
+ `Hyperliquid info request failed: ${response.status}`
105
+ )
106
+ err.tool = PROVIDER_KEY
107
+ throw err
108
+ }
109
+
110
+ return (await response.json()) as T
111
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Hyperliquid-specific liquidation price calculation.
3
+ *
4
+ * Uses the exact formula from Hyperliquid docs:
5
+ * https://hyperliquid.gitbook.io/hyperliquid-docs/trading/liquidations
6
+ *
7
+ * liq_price = price - side * margin_available / position_size / (1 - l * side)
8
+ *
9
+ * Where:
10
+ * - l = 1 / (2 * maxLeverage) (maintenance margin fraction)
11
+ * - side = 1 (long) or -1 (short)
12
+ * - margin_available = isolated_margin - maintenance_margin_required
13
+ */
14
+
15
+ import { estimateIsolatedLiquidationPrice } from '@lifi/perps-sdk'
16
+
17
+ /**
18
+ * Calculate the maintenance margin fraction for a Hyperliquid asset.
19
+ *
20
+ * Maintenance margin is half of the initial margin at max leverage.
21
+ *
22
+ * @param maxLeverage - Maximum leverage for the asset (e.g., 50 for BTC)
23
+ * @returns Maintenance margin fraction (e.g., 0.01 for 50x max leverage),
24
+ * or undefined if maxLeverage is zero
25
+ * @public
26
+ */
27
+ export function calculateMaintenanceMarginRate(
28
+ maxLeverage: number
29
+ ): number | undefined {
30
+ if (maxLeverage === 0) {
31
+ return undefined
32
+ }
33
+ return 1 / (2 * maxLeverage)
34
+ }
35
+
36
+ /**
37
+ * Calculate liquidation price using the exact Hyperliquid formula.
38
+ *
39
+ * For isolated margin, new position prediction. For existing positions,
40
+ * prefer Position.liquidationPrice from the API.
41
+ *
42
+ * Formula derivation (isolated margin, single position):
43
+ * margin_per_unit = entryPrice / leverage
44
+ * maintenance_per_unit = entryPrice * mmr
45
+ * margin_available = margin_per_unit - maintenance_per_unit
46
+ * liq_price = entryPrice - side * margin_available / (1 - mmr * side)
47
+ *
48
+ * Where mmr = 1 / (2 * maxLeverage).
49
+ *
50
+ * @param entryPrice - Position entry price
51
+ * @param leverage - User-selected leverage (e.g., 10)
52
+ * @param isLong - True if long position, false if short
53
+ * @param maxLeverage - Asset's maximum leverage (e.g., 50 for BTC). Determines
54
+ * the maintenance margin rate: mmr = 1 / (2 * maxLeverage)
55
+ * @returns Estimated liquidation price, or undefined if inputs are invalid
56
+ * @public
57
+ */
58
+ export function calculateLiquidationPrice(
59
+ entryPrice: number,
60
+ leverage: number,
61
+ isLong: boolean,
62
+ maxLeverage: number
63
+ ): number | undefined {
64
+ const mmr = calculateMaintenanceMarginRate(maxLeverage)
65
+ if (mmr === undefined) {
66
+ return undefined
67
+ }
68
+ return estimateIsolatedLiquidationPrice({
69
+ entryPrice,
70
+ leverage,
71
+ isLong,
72
+ maintenanceMarginRate: mmr,
73
+ })
74
+ }
@@ -0,0 +1,182 @@
1
+ import type {
2
+ ActivityItem,
3
+ DepositActivity,
4
+ FundingActivity,
5
+ LiquidationActivity,
6
+ MarketDisplay,
7
+ TransferActivity,
8
+ WithdrawalActivity,
9
+ } from '@lifi/perps-types'
10
+ import { ActivityType } from '@lifi/perps-types'
11
+ import type { HlFundingUpdate, HlLedgerUpdate } from '../types/index.js'
12
+ import { isSendAssetDelta, isSpotTransferDelta } from '../types/index.js'
13
+
14
+ /**
15
+ * Map a Hyperliquid non-funding ledger entry to an ActivityItem.
16
+ *
17
+ * Direction for `spotTransfer` and `sendAsset` is derived from
18
+ * `queriedAddress` matching the delta's `user` (OUT) or `destination` (IN).
19
+ * Returns null for unsupported delta types and for same-user `sendAsset`
20
+ * dex moves (where `user === destination === queriedAddress`).
21
+ * @public
22
+ */
23
+ export const mapLedgerEntry = (
24
+ entry: HlLedgerUpdate,
25
+ providerKey: string,
26
+ queriedAddress: string,
27
+ resolveMarket: (coin: string) => MarketDisplay
28
+ ): ActivityItem | null => {
29
+ const { delta } = entry
30
+ const base = {
31
+ id: entry.hash,
32
+ provider: providerKey,
33
+ timestamp: new Date(entry.time).toISOString(),
34
+ }
35
+
36
+ // Handled before the switch: the catch-all arm of `HlLedgerDelta` is a
37
+ // structural supertype of the concrete delta, so a `switch (delta.type)`
38
+ // cannot narrow off the discriminant. The user-defined type guard does.
39
+ if (isSpotTransferDelta(delta)) {
40
+ const queried = queriedAddress.toLowerCase()
41
+ const sender = delta.user.toLowerCase()
42
+ const recipient = delta.destination.toLowerCase()
43
+ const direction: 'IN' | 'OUT' = queried === sender ? 'OUT' : 'IN'
44
+ const counterpartyAddress = direction === 'OUT' ? recipient : sender
45
+ const meta: Record<string, unknown> = {
46
+ transferType: 'spotTransfer',
47
+ }
48
+ if (delta.usdcValue !== undefined) {
49
+ meta.usdcValue = delta.usdcValue
50
+ }
51
+ if (delta.fee !== undefined) {
52
+ meta.fee = delta.fee
53
+ }
54
+ if (delta.nativeTokenFee !== undefined) {
55
+ meta.nativeTokenFee = delta.nativeTokenFee
56
+ }
57
+ if (delta.nonce !== undefined) {
58
+ meta.nonce = delta.nonce
59
+ }
60
+ return {
61
+ ...base,
62
+ type: ActivityType.TRANSFER,
63
+ direction,
64
+ counterpartyAddress,
65
+ asset: delta.token,
66
+ amount: delta.amount,
67
+ meta,
68
+ explorerLink: entry.hash
69
+ ? `https://app.hyperliquid.xyz/explorer/tx/${entry.hash}`
70
+ : undefined,
71
+ } satisfies TransferActivity
72
+ }
73
+
74
+ // `sendAsset` (wire `type === 'send'`) covers cross-user transfers
75
+ // (modelled as TRANSFER) and same-user dex moves (returned as null —
76
+ // overloading TRANSFER for those would lie about direction). Pre-switch
77
+ // narrowing for the same reason as spotTransfer.
78
+ if (isSendAssetDelta(delta)) {
79
+ const queried = queriedAddress.toLowerCase()
80
+ const sender = delta.user.toLowerCase()
81
+ const recipient = delta.destination.toLowerCase()
82
+
83
+ if (sender === recipient && sender === queried) {
84
+ return null
85
+ }
86
+
87
+ const direction: 'IN' | 'OUT' = queried === sender ? 'OUT' : 'IN'
88
+ const counterpartyAddress = direction === 'OUT' ? recipient : sender
89
+ const meta: Record<string, unknown> = {
90
+ transferType: 'sendAsset',
91
+ sourceDex: delta.sourceDex,
92
+ destinationDex: delta.destinationDex,
93
+ usdcValue: delta.usdcValue,
94
+ fee: delta.fee,
95
+ nativeTokenFee: delta.nativeTokenFee,
96
+ feeToken: delta.feeToken,
97
+ nonce: delta.nonce,
98
+ }
99
+ return {
100
+ ...base,
101
+ type: ActivityType.TRANSFER,
102
+ direction,
103
+ counterpartyAddress,
104
+ asset: delta.token,
105
+ amount: delta.amount,
106
+ meta,
107
+ explorerLink: entry.hash
108
+ ? `https://app.hyperliquid.xyz/explorer/tx/${entry.hash}`
109
+ : undefined,
110
+ } satisfies TransferActivity
111
+ }
112
+
113
+ switch (delta.type) {
114
+ case 'deposit':
115
+ return {
116
+ ...base,
117
+ type: ActivityType.DEPOSIT,
118
+ amount: delta.usdc ?? '0',
119
+ explorerLink: entry.hash
120
+ ? `https://scan.li.fi/tx/${entry.hash}`
121
+ : undefined,
122
+ } satisfies DepositActivity
123
+
124
+ case 'withdraw':
125
+ return {
126
+ ...base,
127
+ type: ActivityType.WITHDRAWAL,
128
+ amount: delta.usdc ?? '0',
129
+ fee: (delta as { fee?: string }).fee ?? '0',
130
+ explorerLink: entry.hash
131
+ ? `https://scan.li.fi/tx/${entry.hash}`
132
+ : undefined,
133
+ } satisfies WithdrawalActivity
134
+
135
+ case 'liquidation': {
136
+ const d = delta as unknown as {
137
+ type: string
138
+ liquidatedNtlPos: string
139
+ accountValue: string
140
+ leverageType: string
141
+ liquidatedPositions?: { coin: string; szi: string }[]
142
+ }
143
+ const liquidatedPositions = (d.liquidatedPositions ?? []).map((p) => ({
144
+ market: resolveMarket(p.coin),
145
+ size: p.szi,
146
+ }))
147
+ // Liquidation rows must point to at least one market. Drop entries with
148
+ // missing/empty positions so downstream consumers can rely on that
149
+ // invariant and avoid rendering a market-less liquidation card.
150
+ if (liquidatedPositions.length === 0) {
151
+ return null
152
+ }
153
+ return {
154
+ ...base,
155
+ type: ActivityType.LIQUIDATION,
156
+ liquidatedNotionalPosition: d.liquidatedNtlPos,
157
+ accountValue: d.accountValue,
158
+ leverageType: d.leverageType,
159
+ liquidatedPositions,
160
+ } satisfies LiquidationActivity
161
+ }
162
+
163
+ default:
164
+ return null
165
+ }
166
+ }
167
+
168
+ /** @public */
169
+ export const mapFundingActivity = (
170
+ entry: HlFundingUpdate,
171
+ providerKey: string,
172
+ resolveMarket: (coin: string) => MarketDisplay
173
+ ): FundingActivity => ({
174
+ id: entry.hash,
175
+ provider: providerKey,
176
+ timestamp: new Date(entry.time).toISOString(),
177
+ type: ActivityType.FUNDING,
178
+ market: resolveMarket(entry.delta.coin),
179
+ amount: entry.delta.usdc,
180
+ positionSize: entry.delta.szi,
181
+ fundingRate: entry.delta.fundingRate,
182
+ })