@lifi/perps-sdk-provider-hyperliquid 25.0.0 → 27.0.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 (245) hide show
  1. package/dist/cjs/accountSummary.d.ts.map +1 -1
  2. package/dist/cjs/accountSummary.js +8 -14
  3. package/dist/cjs/accountSummary.js.map +1 -1
  4. package/dist/cjs/services/getAccount.d.ts.map +1 -1
  5. package/dist/cjs/services/getAccount.js +18 -16
  6. package/dist/cjs/services/getAccount.js.map +1 -1
  7. package/dist/cjs/services/getFills.d.ts.map +1 -1
  8. package/dist/cjs/services/getFills.js +2 -1
  9. package/dist/cjs/services/getFills.js.map +1 -1
  10. package/dist/cjs/services/getMarketSettings.d.ts.map +1 -1
  11. package/dist/cjs/services/getMarketSettings.js +1 -1
  12. package/dist/cjs/services/getMarketSettings.js.map +1 -1
  13. package/dist/cjs/services/getOrder.d.ts.map +1 -1
  14. package/dist/cjs/services/getOrder.js +14 -4
  15. package/dist/cjs/services/getOrder.js.map +1 -1
  16. package/dist/cjs/services/getOrders.d.ts.map +1 -1
  17. package/dist/cjs/services/getOrders.js +8 -28
  18. package/dist/cjs/services/getOrders.js.map +1 -1
  19. package/dist/cjs/services/getPortfolioHistory.d.ts.map +1 -1
  20. package/dist/cjs/services/getPortfolioHistory.js +17 -6
  21. package/dist/cjs/services/getPortfolioHistory.js.map +1 -1
  22. package/dist/cjs/services/getPositions.d.ts.map +1 -1
  23. package/dist/cjs/services/getPositions.js +4 -1
  24. package/dist/cjs/services/getPositions.js.map +1 -1
  25. package/dist/cjs/types/ws.d.ts +3 -2
  26. package/dist/cjs/types/ws.d.ts.map +1 -1
  27. package/dist/cjs/utils/index.d.ts +1 -1
  28. package/dist/cjs/utils/index.d.ts.map +1 -1
  29. package/dist/cjs/utils/index.js +3 -1
  30. package/dist/cjs/utils/index.js.map +1 -1
  31. package/dist/cjs/utils/liquidation.d.ts +5 -2
  32. package/dist/cjs/utils/liquidation.d.ts.map +1 -1
  33. package/dist/cjs/utils/liquidation.js +8 -8
  34. package/dist/cjs/utils/liquidation.js.map +1 -1
  35. package/dist/cjs/utils/mapActivity.d.ts.map +1 -1
  36. package/dist/cjs/utils/mapActivity.js +38 -23
  37. package/dist/cjs/utils/mapActivity.js.map +1 -1
  38. package/dist/cjs/utils/mapFill.d.ts +1 -1
  39. package/dist/cjs/utils/mapFill.d.ts.map +1 -1
  40. package/dist/cjs/utils/mapFill.js +17 -6
  41. package/dist/cjs/utils/mapFill.js.map +1 -1
  42. package/dist/cjs/utils/mapMarket.d.ts.map +1 -1
  43. package/dist/cjs/utils/mapMarket.js +9 -13
  44. package/dist/cjs/utils/mapMarket.js.map +1 -1
  45. package/dist/cjs/utils/mapMarketContext.d.ts.map +1 -1
  46. package/dist/cjs/utils/mapMarketContext.js +3 -12
  47. package/dist/cjs/utils/mapMarketContext.js.map +1 -1
  48. package/dist/cjs/utils/mapOrder.d.ts +3 -1
  49. package/dist/cjs/utils/mapOrder.d.ts.map +1 -1
  50. package/dist/cjs/utils/mapOrder.js +73 -19
  51. package/dist/cjs/utils/mapOrder.js.map +1 -1
  52. package/dist/cjs/utils/mapPosition.d.ts +1 -1
  53. package/dist/cjs/utils/mapPosition.d.ts.map +1 -1
  54. package/dist/cjs/utils/mapPosition.js +41 -15
  55. package/dist/cjs/utils/mapPosition.js.map +1 -1
  56. package/dist/cjs/utils/rowTimestamp.d.ts +2 -0
  57. package/dist/cjs/utils/rowTimestamp.d.ts.map +1 -0
  58. package/dist/cjs/utils/rowTimestamp.js +14 -0
  59. package/dist/cjs/utils/rowTimestamp.js.map +1 -0
  60. package/dist/cjs/utils/spotBalance.d.ts +3 -3
  61. package/dist/cjs/utils/spotBalance.d.ts.map +1 -1
  62. package/dist/cjs/utils/spotBalance.js +6 -5
  63. package/dist/cjs/utils/spotBalance.js.map +1 -1
  64. package/dist/cjs/utils/spotCollateral.d.ts.map +1 -1
  65. package/dist/cjs/utils/spotCollateral.js +3 -2
  66. package/dist/cjs/utils/spotCollateral.js.map +1 -1
  67. package/dist/cjs/utils/transferMargin.d.ts.map +1 -1
  68. package/dist/cjs/utils/transferMargin.js +16 -19
  69. package/dist/cjs/utils/transferMargin.js.map +1 -1
  70. package/dist/cjs/utils/venueTotals.d.ts +4 -5
  71. package/dist/cjs/utils/venueTotals.d.ts.map +1 -1
  72. package/dist/cjs/utils/venueTotals.js +18 -10
  73. package/dist/cjs/utils/venueTotals.js.map +1 -1
  74. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  75. package/dist/cjs/utils/withdrawableBalances.js +10 -10
  76. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  77. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +1 -0
  78. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  79. package/dist/cjs/websocket/HyperliquidWsProvider.js +144 -115
  80. package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
  81. package/dist/esm/accountSummary.d.ts +2 -1
  82. package/dist/esm/accountSummary.d.ts.map +1 -1
  83. package/dist/esm/accountSummary.js +11 -13
  84. package/dist/esm/accountSummary.js.map +1 -1
  85. package/dist/esm/services/getAccount.d.ts.map +1 -1
  86. package/dist/esm/services/getAccount.js +23 -21
  87. package/dist/esm/services/getAccount.js.map +1 -1
  88. package/dist/esm/services/getFills.d.ts.map +1 -1
  89. package/dist/esm/services/getFills.js +2 -1
  90. package/dist/esm/services/getFills.js.map +1 -1
  91. package/dist/esm/services/getMarketSettings.d.ts.map +1 -1
  92. package/dist/esm/services/getMarketSettings.js +2 -2
  93. package/dist/esm/services/getMarketSettings.js.map +1 -1
  94. package/dist/esm/services/getOrder.d.ts.map +1 -1
  95. package/dist/esm/services/getOrder.js +14 -4
  96. package/dist/esm/services/getOrder.js.map +1 -1
  97. package/dist/esm/services/getOrders.d.ts.map +1 -1
  98. package/dist/esm/services/getOrders.js +12 -37
  99. package/dist/esm/services/getOrders.js.map +1 -1
  100. package/dist/esm/services/getPortfolioHistory.d.ts.map +1 -1
  101. package/dist/esm/services/getPortfolioHistory.js +19 -7
  102. package/dist/esm/services/getPortfolioHistory.js.map +1 -1
  103. package/dist/esm/services/getPositions.d.ts.map +1 -1
  104. package/dist/esm/services/getPositions.js +4 -1
  105. package/dist/esm/services/getPositions.js.map +1 -1
  106. package/dist/esm/services/getWithdrawableBalances.d.ts +1 -1
  107. package/dist/esm/services/getWithdrawableBalances.js +1 -1
  108. package/dist/esm/types/ws.d.ts +3 -2
  109. package/dist/esm/types/ws.d.ts.map +1 -1
  110. package/dist/esm/utils/index.d.ts +1 -1
  111. package/dist/esm/utils/index.d.ts.map +1 -1
  112. package/dist/esm/utils/index.js +1 -1
  113. package/dist/esm/utils/index.js.map +1 -1
  114. package/dist/esm/utils/liquidation.d.ts +23 -24
  115. package/dist/esm/utils/liquidation.d.ts.map +1 -1
  116. package/dist/esm/utils/liquidation.js +26 -31
  117. package/dist/esm/utils/liquidation.js.map +1 -1
  118. package/dist/esm/utils/mapActivity.d.ts +2 -1
  119. package/dist/esm/utils/mapActivity.d.ts.map +1 -1
  120. package/dist/esm/utils/mapActivity.js +41 -22
  121. package/dist/esm/utils/mapActivity.js.map +1 -1
  122. package/dist/esm/utils/mapFill.d.ts +3 -2
  123. package/dist/esm/utils/mapFill.d.ts.map +1 -1
  124. package/dist/esm/utils/mapFill.js +21 -9
  125. package/dist/esm/utils/mapFill.js.map +1 -1
  126. package/dist/esm/utils/mapMarket.d.ts +2 -2
  127. package/dist/esm/utils/mapMarket.d.ts.map +1 -1
  128. package/dist/esm/utils/mapMarket.js +12 -13
  129. package/dist/esm/utils/mapMarket.js.map +1 -1
  130. package/dist/esm/utils/mapMarketContext.d.ts.map +1 -1
  131. package/dist/esm/utils/mapMarketContext.js +3 -9
  132. package/dist/esm/utils/mapMarketContext.js.map +1 -1
  133. package/dist/esm/utils/mapOrder.d.ts +12 -2
  134. package/dist/esm/utils/mapOrder.d.ts.map +1 -1
  135. package/dist/esm/utils/mapOrder.js +81 -17
  136. package/dist/esm/utils/mapOrder.js.map +1 -1
  137. package/dist/esm/utils/mapPosition.d.ts +4 -2
  138. package/dist/esm/utils/mapPosition.d.ts.map +1 -1
  139. package/dist/esm/utils/mapPosition.js +44 -13
  140. package/dist/esm/utils/mapPosition.js.map +1 -1
  141. package/dist/esm/utils/rowTimestamp.d.ts +6 -0
  142. package/dist/esm/utils/rowTimestamp.d.ts.map +1 -0
  143. package/dist/esm/utils/rowTimestamp.js +14 -0
  144. package/dist/esm/utils/rowTimestamp.js.map +1 -0
  145. package/dist/esm/utils/spotBalance.d.ts +5 -5
  146. package/dist/esm/utils/spotBalance.d.ts.map +1 -1
  147. package/dist/esm/utils/spotBalance.js +9 -8
  148. package/dist/esm/utils/spotBalance.js.map +1 -1
  149. package/dist/esm/utils/spotCollateral.d.ts.map +1 -1
  150. package/dist/esm/utils/spotCollateral.js +3 -2
  151. package/dist/esm/utils/spotCollateral.js.map +1 -1
  152. package/dist/esm/utils/transferMargin.d.ts +2 -1
  153. package/dist/esm/utils/transferMargin.d.ts.map +1 -1
  154. package/dist/esm/utils/transferMargin.js +19 -18
  155. package/dist/esm/utils/transferMargin.js.map +1 -1
  156. package/dist/esm/utils/venueTotals.d.ts +7 -6
  157. package/dist/esm/utils/venueTotals.d.ts.map +1 -1
  158. package/dist/esm/utils/venueTotals.js +21 -8
  159. package/dist/esm/utils/venueTotals.js.map +1 -1
  160. package/dist/esm/utils/withdrawableBalances.d.ts +6 -4
  161. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  162. package/dist/esm/utils/withdrawableBalances.js +17 -15
  163. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  164. package/dist/esm/websocket/HyperliquidWsProvider.d.ts +3 -0
  165. package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  166. package/dist/esm/websocket/HyperliquidWsProvider.js +155 -115
  167. package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
  168. package/dist/types/accountSummary.d.ts +2 -1
  169. package/dist/types/accountSummary.d.ts.map +1 -1
  170. package/dist/types/services/getAccount.d.ts.map +1 -1
  171. package/dist/types/services/getFills.d.ts.map +1 -1
  172. package/dist/types/services/getMarketSettings.d.ts.map +1 -1
  173. package/dist/types/services/getOrder.d.ts.map +1 -1
  174. package/dist/types/services/getOrders.d.ts.map +1 -1
  175. package/dist/types/services/getPortfolioHistory.d.ts.map +1 -1
  176. package/dist/types/services/getPositions.d.ts.map +1 -1
  177. package/dist/types/services/getWithdrawableBalances.d.ts +1 -1
  178. package/dist/types/types/ws.d.ts +3 -2
  179. package/dist/types/types/ws.d.ts.map +1 -1
  180. package/dist/types/utils/index.d.ts +1 -1
  181. package/dist/types/utils/index.d.ts.map +1 -1
  182. package/dist/types/utils/liquidation.d.ts +23 -24
  183. package/dist/types/utils/liquidation.d.ts.map +1 -1
  184. package/dist/types/utils/mapActivity.d.ts +2 -1
  185. package/dist/types/utils/mapActivity.d.ts.map +1 -1
  186. package/dist/types/utils/mapFill.d.ts +3 -2
  187. package/dist/types/utils/mapFill.d.ts.map +1 -1
  188. package/dist/types/utils/mapMarket.d.ts +2 -2
  189. package/dist/types/utils/mapMarket.d.ts.map +1 -1
  190. package/dist/types/utils/mapMarketContext.d.ts.map +1 -1
  191. package/dist/types/utils/mapOrder.d.ts +12 -2
  192. package/dist/types/utils/mapOrder.d.ts.map +1 -1
  193. package/dist/types/utils/mapPosition.d.ts +4 -2
  194. package/dist/types/utils/mapPosition.d.ts.map +1 -1
  195. package/dist/types/utils/rowTimestamp.d.ts +6 -0
  196. package/dist/types/utils/rowTimestamp.d.ts.map +1 -0
  197. package/dist/types/utils/spotBalance.d.ts +5 -5
  198. package/dist/types/utils/spotBalance.d.ts.map +1 -1
  199. package/dist/types/utils/spotCollateral.d.ts.map +1 -1
  200. package/dist/types/utils/transferMargin.d.ts +2 -1
  201. package/dist/types/utils/transferMargin.d.ts.map +1 -1
  202. package/dist/types/utils/venueTotals.d.ts +7 -6
  203. package/dist/types/utils/venueTotals.d.ts.map +1 -1
  204. package/dist/types/utils/withdrawableBalances.d.ts +6 -4
  205. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  206. package/dist/types/websocket/HyperliquidWsProvider.d.ts +3 -0
  207. package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  208. package/package.json +3 -3
  209. package/src/HyperliquidProvider.ts +1 -1
  210. package/src/accountSummary.ts +35 -23
  211. package/src/services/getAccount.ts +50 -33
  212. package/src/services/getFills.ts +2 -1
  213. package/src/services/getMarketSettings.ts +6 -2
  214. package/src/services/getOrder.ts +18 -7
  215. package/src/services/getOrders.ts +14 -46
  216. package/src/services/getPortfolioHistory.ts +34 -7
  217. package/src/services/getPositions.ts +4 -3
  218. package/src/services/getWithdrawableBalances.ts +1 -1
  219. package/src/types/ws.ts +3 -2
  220. package/src/utils/index.ts +2 -0
  221. package/src/utils/liquidation.ts +46 -34
  222. package/src/utils/mapActivity.ts +48 -20
  223. package/src/utils/mapFill.ts +25 -9
  224. package/src/utils/mapMarket.ts +16 -12
  225. package/src/utils/mapMarketContext.ts +6 -8
  226. package/src/utils/mapOrder.ts +107 -20
  227. package/src/utils/mapPosition.ts +72 -14
  228. package/src/utils/rowTimestamp.ts +15 -0
  229. package/src/utils/spotBalance.ts +19 -16
  230. package/src/utils/spotCollateral.ts +15 -2
  231. package/src/utils/transferMargin.ts +40 -18
  232. package/src/utils/venueTotals.ts +51 -17
  233. package/src/utils/withdrawableBalances.ts +33 -15
  234. package/src/websocket/HyperliquidWsProvider.ts +224 -133
  235. package/dist/cjs/utils/decimal.d.ts +0 -3
  236. package/dist/cjs/utils/decimal.d.ts.map +0 -1
  237. package/dist/cjs/utils/decimal.js +0 -19
  238. package/dist/cjs/utils/decimal.js.map +0 -1
  239. package/dist/esm/utils/decimal.d.ts +0 -10
  240. package/dist/esm/utils/decimal.d.ts.map +0 -1
  241. package/dist/esm/utils/decimal.js +0 -19
  242. package/dist/esm/utils/decimal.js.map +0 -1
  243. package/dist/types/utils/decimal.d.ts +0 -10
  244. package/dist/types/utils/decimal.d.ts.map +0 -1
  245. package/src/utils/decimal.ts +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"spotBalance.d.ts","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,SAAS,MAAM,EAAE,EAC1B,iBAAiB,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,KAC3C,GAAG,CAAC,MAAM,EAAE,MAAM,CAapB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,aAAa,KAAG,KAIpD,CAAA;AAEF,qIAAqI;AACrI,eAAO,MAAM,WAAW,GACtB,OAAO,KAAK,EACZ,OAAO,MAAM,EACb,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,KAC7B,OAYF,CAAA"}
1
+ {"version":3,"file":"spotBalance.d.ts","sourceRoot":"","sources":["../../../src/utils/spotBalance.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,SAAS,SAAS,MAAM,EAAE,EAC1B,iBAAiB,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,KAClD,GAAG,CAAC,MAAM,EAAE,aAAa,CAc3B,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAAI,GAAG,aAAa,KAAG,KAIpD,CAAA;AAEF,qIAAqI;AACrI,eAAO,MAAM,WAAW,GACtB,OAAO,KAAK,EACZ,OAAO,aAAa,EACpB,WAAW,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,KAC5C,OAUF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"spotCollateral.d.ts","sourceRoot":"","sources":["../../../src/utils/spotCollateral.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGhD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,OAAO,EAAE,CAAA;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,cAAc,SAAS,OAAO,EAAE,EAChC,eAAe,WAAW,CAAC,MAAM,CAAC,KACjC,aAcF,CAAA"}
1
+ {"version":3,"file":"spotCollateral.d.ts","sourceRoot":"","sources":["../../../src/utils/spotCollateral.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAGhD;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,kBAAkB,EAAE,OAAO,EAAE,CAAA;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAA;CACpB;AAED;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,GAChC,cAAc,SAAS,OAAO,EAAE,EAChC,eAAe,WAAW,CAAC,MAAM,CAAC,KACjC,aAuBF,CAAA"}
@@ -10,7 +10,8 @@ import { type DecimalString, type Position } from '@lifi/perps-types';
10
10
  * margin adjustment; `'0'` for add-only strict-isolated markets and when
11
11
  * nothing is removable.
12
12
  * @throws {PerpsError} `ValidationError` when a required `Position` decimal
13
- * is malformed, or when a size, price or requirement is not positive.
13
+ * is absent or malformed, or when a size, price or requirement is not
14
+ * positive.
14
15
  * @see https://hyperliquid.gitbook.io/hyperliquid-docs/trading/margining
15
16
  * @public
16
17
  */
@@ -1 +1 @@
1
- {"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AAqB1B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CAwB3B"}
1
+ {"version":3,"file":"transferMargin.d.ts","sourceRoot":"","sources":["../../../src/utils/transferMargin.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,QAAQ,EACd,MAAM,mBAAmB,CAAA;AAkC1B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CA4B3B"}
@@ -1,5 +1,4 @@
1
- import type { HyperliquidMarginSummary, Position } from '@lifi/perps-types';
2
- import Big from 'big.js';
1
+ import type { DecimalString, HyperliquidMarginSummary, Position } from '@lifi/perps-types';
3
2
  /**
4
3
  * One perps sub-dex entry {@link perpsTotals} reads. The REST response always
5
4
  * carries `marginSummary`; a WebSocket frame may omit it.
@@ -12,15 +11,17 @@ export interface DexMarginSummary {
12
11
  * Sum the venue `marginSummary` totals over every perps sub-dex of an
13
12
  * account. `accountValue` is total equity, so it already carries locked
14
13
  * margin and unrealized PnL. An entry without a `marginSummary` adds nothing.
14
+ * @throws {PerpsError} `SDKError` when a venue figure is not a decimal.
15
15
  * @public
16
16
  */
17
17
  export declare const perpsTotals: (dexStates: readonly DexMarginSummary[]) => {
18
- accountValue: Big;
19
- marginUsed: Big;
18
+ accountValue: DecimalString;
19
+ marginUsed: DecimalString;
20
20
  };
21
21
  /**
22
- * Sum the unrealized PnL of every position, in quote-asset units.
22
+ * Sum the unrealized PnL of every position, in quote-asset units. A term that
23
+ * does not match the decimal pattern adds nothing and warns once.
23
24
  * @public
24
25
  */
25
- export declare const sumUnrealizedPnl: (positions: readonly Position[]) => Big;
26
+ export declare const sumUnrealizedPnl: (positions: readonly Position[]) => DecimalString;
26
27
  //# sourceMappingURL=venueTotals.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"venueTotals.d.ts","sourceRoot":"","sources":["../../../src/utils/venueTotals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC3E,OAAO,GAAG,MAAM,QAAQ,CAAA;AAGxB;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,wBAAwB,CAAA;CACzC;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,SAAS,gBAAgB,EAAE,KACrC;IAAE,YAAY,EAAE,GAAG,CAAC;IAAC,UAAU,EAAE,GAAG,CAAA;CAetC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,SAAS,QAAQ,EAAE,KAAG,GAK/D,CAAA"}
1
+ {"version":3,"file":"venueTotals.d.ts","sourceRoot":"","sources":["../../../src/utils/venueTotals.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,aAAa,EACb,wBAAwB,EACxB,QAAQ,EACT,MAAM,mBAAmB,CAAA;AAG1B;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,CAAC,EAAE,wBAAwB,CAAA;CACzC;AAED;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,WAAW,SAAS,gBAAgB,EAAE,KACrC;IAAE,YAAY,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAyB1D,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,WAAW,SAAS,QAAQ,EAAE,KAC7B,aAaF,CAAA"}
@@ -1,16 +1,18 @@
1
1
  import { type ProviderWithdrawableBalance } from '@lifi/perps-sdk';
2
2
  import type { HlAbstractionMode, HlClearinghouseState, HlSpotClearinghouseState } from '../types/index.js';
3
3
  /**
4
- * Split a Hyperliquid account's venue figures into the routes a withdrawal
5
- * draws on. A unified or portfolio-margin account holds its collateral in spot,
4
+ * Split a Hyperliquid account's venue figures into the categories a
5
+ * withdrawal draws on. A unified or portfolio-margin account holds its collateral in spot,
6
6
  * so each spot token adds the part of `total` that no order or margin holds. A
7
- * route with nothing left to draw carries no row, and the caller applies the
7
+ * category with nothing left to draw carries no row, and the caller applies the
8
8
  * per-asset venue minimum.
9
9
  *
10
- * @param quoteAssetId - `Asset.id` the perps-route row is keyed by.
10
+ * @param quoteAssetId - `Asset.id` the perps-category row is keyed by.
11
11
  * @param withdrawalFee - Flat venue fee in quote-asset units, set on every
12
12
  * quote-asset row. Hyperliquid deducts it from the requested amount. Absent
13
13
  * leaves every row without a fee.
14
+ * @throws {PerpsError} `SDKError` when the fee or a venue figure does not match the
15
+ * decimal pattern.
14
16
  * @public
15
17
  */
16
18
  export declare const hyperliquidWithdrawableBalances: (abstraction: HlAbstractionMode | null, state: HlClearinghouseState, spotState: HlSpotClearinghouseState, quoteAssetId: string, withdrawalFee?: string) => ProviderWithdrawableBalance[];
@@ -1 +1 @@
1
- {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAK1B;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,+BAA+B,GAC1C,aAAa,iBAAiB,GAAG,IAAI,EACrC,OAAO,oBAAoB,EAC3B,WAAW,wBAAwB,EACnC,cAAc,MAAM,EACpB,gBAAgB,MAAM,KACrB,2BAA2B,EA8C7B,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,2BAA2B,EAGjC,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAI1B;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,+BAA+B,GAC1C,aAAa,iBAAiB,GAAG,IAAI,EACrC,OAAO,oBAAoB,EAC3B,WAAW,wBAAwB,EACnC,cAAc,MAAM,EACpB,gBAAgB,MAAM,KACrB,2BAA2B,EA2D7B,CAAA"}
@@ -114,6 +114,8 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
114
114
  private handleActiveAssetCtx;
115
115
  private handleActiveSpotAssetCtx;
116
116
  /** Latest mid per `Market.id` across asset-context and fast feeds. */
117
+ /** Latest mid per `Market.id` across asset-context and fast feeds; a mid
118
+ * that does not match the decimal pattern is left out. */
117
119
  private mergedMids;
118
120
  private orderbookReferencePrice;
119
121
  private handleL2Book;
@@ -123,6 +125,7 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
123
125
  private handleCandle;
124
126
  private handleTrades;
125
127
  private handleOrderUpdates;
128
+ private readOrderDetail;
126
129
  private handleUserFills;
127
130
  private handleAllDexsClearinghouseState;
128
131
  /** Whether the mode's collateral lives per-dex, making the perps-only
@@ -1 +1 @@
1
- {"version":3,"file":"HyperliquidWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/HyperliquidWsProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HyperliquidWsProvider.d.ts","sourceRoot":"","sources":["../../../src/websocket/HyperliquidWsProvider.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/perps-sdk-provider-hyperliquid",
3
- "version": "25.0.0",
3
+ "version": "27.0.0",
4
4
  "description": "Hyperliquid provider plugin for @lifi/perps-sdk",
5
5
  "homepage": "https://github.com/lifinance/perps-sdk",
6
6
  "bugs": {
@@ -49,10 +49,10 @@
49
49
  "dependencies": {
50
50
  "big.js": "^7.0.1",
51
51
  "viem": "^2.55.18",
52
- "@lifi/perps-types": "^20.2.0"
52
+ "@lifi/perps-types": "^22.0.0"
53
53
  },
54
54
  "peerDependencies": {
55
- "@lifi/perps-sdk": "^23.1.0"
55
+ "@lifi/perps-sdk": "^25.0.0"
56
56
  },
57
57
  "publishConfig": {
58
58
  "access": "public"
@@ -479,7 +479,7 @@ export function hyperliquidProvider(
479
479
  estimateLiquidationPrice: (
480
480
  market: PerpsMarket,
481
481
  params: LiquidationEstimateParams
482
- ): number | undefined =>
482
+ ): string | undefined =>
483
483
  calculateLiquidationPrice(
484
484
  params.entryPrice,
485
485
  params.leverage,
@@ -1,21 +1,34 @@
1
- import { PerpsError } from '@lifi/perps-sdk'
1
+ import {
2
+ addDecimalString,
3
+ PerpsError,
4
+ subtractDecimalString,
5
+ unknownToDecimalString,
6
+ } from '@lifi/perps-sdk'
2
7
  import type {
3
8
  AccountResponse,
4
9
  AccountSummary,
5
10
  Balance,
11
+ DecimalString,
6
12
  HyperliquidAccountConfig,
7
13
  Position,
8
14
  } from '@lifi/perps-types'
9
15
  import { PerpsErrorCode } from '@lifi/perps-types'
10
- import Big from 'big.js'
16
+ import { PROVIDER_KEY } from './constants.js'
11
17
  import { isUnifiedAbstraction } from './utils/abstractionMode.js'
12
- import { toWireBig } from './utils/decimal.js'
13
18
  import { perpsTotals, sumUnrealizedPnl } from './utils/venueTotals.js'
14
19
 
15
- const sumValueUsd = (balances: readonly Balance[]): Big =>
20
+ const sumValueUsd = (balances: readonly Balance[]): DecimalString =>
16
21
  balances.reduce(
17
- (sum, balance) => sum.plus(toWireBig(balance.valueUsd, 'balance.valueUsd')),
18
- new Big(0)
22
+ (sum, balance) =>
23
+ addDecimalString(
24
+ sum,
25
+ unknownToDecimalString(
26
+ balance.valueUsd,
27
+ 'balance.valueUsd',
28
+ PROVIDER_KEY
29
+ )
30
+ ),
31
+ '0'
19
32
  )
20
33
 
21
34
  const hyperliquidConfig = (
@@ -32,11 +45,11 @@ const hyperliquidConfig = (
32
45
 
33
46
  const getAvailableMargin = (
34
47
  config: HyperliquidAccountConfig,
35
- accountValue: Big,
36
- marginUsed: Big
37
- ): Big => {
48
+ accountValue: DecimalString,
49
+ marginUsed: DecimalString
50
+ ): DecimalString => {
38
51
  if (!isUnifiedAbstraction(config.abstractionMode)) {
39
- return accountValue.minus(marginUsed)
52
+ return subtractDecimalString(accountValue, marginUsed)
40
53
  }
41
54
  if (config.availableAfterMaintenance === undefined) {
42
55
  throw new PerpsError(
@@ -44,9 +57,10 @@ const getAvailableMargin = (
44
57
  `Hyperliquid '${config.abstractionMode}' account carries no quote-asset entry in \`tokenToAvailableAfterMaintenance\``
45
58
  )
46
59
  }
47
- return toWireBig(
60
+ return unknownToDecimalString(
48
61
  config.availableAfterMaintenance,
49
- 'tokenToAvailableAfterMaintenance'
62
+ 'tokenToAvailableAfterMaintenance',
63
+ PROVIDER_KEY
50
64
  )
51
65
  }
52
66
 
@@ -55,7 +69,8 @@ const getAvailableMargin = (
55
69
  * {@link AccountSummary}, from the venue figures the response carries.
56
70
  *
57
71
  * @throws {PerpsError} `SDKError` when the account is not a Hyperliquid one,
58
- * or when a unified/portfolio-margin account carries no venue buying power.
72
+ * when a unified/portfolio-margin account carries no venue buying power, or
73
+ * when a summed venue figure is not a decimal.
59
74
  * @public
60
75
  */
61
76
  export function getAccountSummary(
@@ -66,15 +81,12 @@ export function getAccountSummary(
66
81
  const { accountValue, marginUsed } = perpsTotals(config.dexStates)
67
82
 
68
83
  return {
69
- portfolioValue: sumValueUsd(account.collateralBalances)
70
- .plus(sumValueUsd(account.balances))
71
- .toFixed(),
72
- availableMargin: getAvailableMargin(
73
- config,
74
- accountValue,
75
- marginUsed
76
- ).toFixed(),
77
- marginUsed: marginUsed.toFixed(),
78
- unrealizedPnl: sumUnrealizedPnl(positions).toFixed(),
84
+ portfolioValue: addDecimalString(
85
+ sumValueUsd(account.collateralBalances),
86
+ sumValueUsd(account.balances)
87
+ ),
88
+ availableMargin: getAvailableMargin(config, accountValue, marginUsed),
89
+ marginUsed,
90
+ unrealizedPnl: sumUnrealizedPnl(positions),
79
91
  }
80
92
  }
@@ -2,20 +2,23 @@ import {
2
2
  calculateTransferable,
3
3
  getMarketRegistry,
4
4
  getMarketsContext,
5
+ isDecimalStringGreaterThan,
5
6
  type ProviderGetAccountParams,
6
- parseDecimal,
7
7
  type SDKRequestOptions,
8
+ safeAddDecimalStrings,
9
+ subtractDecimalString,
8
10
  toPerpsMarketDisplay,
11
+ unknownToDecimalString,
9
12
  } from '@lifi/perps-sdk'
10
13
  import type {
11
14
  AccountResponse,
12
15
  Asset,
13
16
  Balance,
17
+ DecimalString,
14
18
  HyperliquidAccountConfig,
15
19
  HyperliquidDexAccountState,
16
20
  Position,
17
21
  } from '@lifi/perps-types'
18
- import type Big from 'big.js'
19
22
  import { PROVIDER_KEY } from '../constants.js'
20
23
  import type { HyperliquidContext } from '../context.js'
21
24
  import type {
@@ -26,16 +29,13 @@ import type {
26
29
  HlUserFees,
27
30
  } from '../types/index.js'
28
31
  import { isUnifiedAbstraction } from '../utils/abstractionMode.js'
29
- import { toWireBig } from '../utils/decimal.js'
30
32
  import {
31
33
  assetIsOutcome,
32
34
  partitionSpotBalances,
33
35
  perpsDexNames,
34
- perpsTotals,
35
36
  spotAssetFromToken,
36
37
  spotBalance,
37
38
  spotPriceById,
38
- sumUnrealizedPnl,
39
39
  } from '../utils/index.js'
40
40
  import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
41
41
  import { isOpenAssetPosition, mapPosition } from '../utils/mapPosition.js'
@@ -48,12 +48,6 @@ import { requireAccountExists } from './getAccountExists.js'
48
48
  */
49
49
  export type GetAccountParams = ProviderGetAccountParams
50
50
 
51
- // `marginSummary` covers the whole account (cross AND isolated positions);
52
- // `crossMarginSummary` is the cross-only subset and would drop isolated
53
- // equity/margin.
54
- const getAccountValue = (state: HlClearinghouseState): Big =>
55
- toWireBig(state.marginSummary.accountValue, 'marginSummary.accountValue')
56
-
57
51
  /** Venue buying power for the quote asset the perps dex settles in. */
58
52
  const getAvailableAfterMaintenance = (
59
53
  spotState: HlSpotClearinghouseState,
@@ -73,21 +67,28 @@ const buildBalances = (
73
67
  spotState: HlSpotClearinghouseState,
74
68
  stateByDex: Map<string, HlClearinghouseState>,
75
69
  quoteAssetIds: ReadonlySet<string>,
76
- priceById: Map<string, number>,
70
+ priceById: ReadonlyMap<string, DecimalString>,
77
71
  quoteAssetByCategory: Map<string, Asset>
78
72
  ): BalancePartition => {
79
73
  const { balances, collateralBalances } = partitionSpotBalances(
80
74
  spotState.balances
81
75
  .filter((b) => !assetIsOutcome(b.coin))
82
76
  .map((b) => {
83
- const total = toWireBig(b.total, 'spotClearinghouseState.total')
77
+ const total = unknownToDecimalString(
78
+ b.total,
79
+ 'spotClearinghouseState.total',
80
+ PROVIDER_KEY
81
+ )
82
+ const hold = unknownToDecimalString(
83
+ b.hold,
84
+ 'spotClearinghouseState.hold',
85
+ PROVIDER_KEY
86
+ )
84
87
  return {
85
- ...spotBalance(spotAssetFromToken(b), b.total, priceById),
88
+ ...spotBalance(spotAssetFromToken(b), total, priceById),
86
89
  transferable: calculateTransferable(
90
+ subtractDecimalString(total, hold),
87
91
  total
88
- .minus(toWireBig(b.hold, 'spotClearinghouseState.hold'))
89
- .toFixed(),
90
- total.toFixed()
91
92
  ),
92
93
  }
93
94
  }),
@@ -101,8 +102,15 @@ const buildBalances = (
101
102
  if (!isUnifiedAbstraction(abstraction)) {
102
103
  for (const [dex, state] of stateByDex) {
103
104
  const categoryId = dex || PROVIDER_KEY
104
- const value = getAccountValue(state)
105
- if (!value.gt(0)) {
105
+ // `marginSummary` covers the whole account (cross AND isolated positions);
106
+ // `crossMarginSummary` is the cross-only subset and would drop isolated
107
+ // equity/margin.
108
+ const value = unknownToDecimalString(
109
+ state.marginSummary.accountValue,
110
+ 'marginSummary.accountValue',
111
+ PROVIDER_KEY
112
+ )
113
+ if (!isDecimalStringGreaterThan(value, '0')) {
106
114
  continue
107
115
  }
108
116
  collateralBalances.push({
@@ -110,15 +118,16 @@ const buildBalances = (
110
118
  // Always present: every dex in `stateByDex` derives from `markets`,
111
119
  // which is what populates `quoteAssetByCategory`.
112
120
  asset: quoteAssetByCategory.get(categoryId)!,
113
- units: value.toFixed(),
114
- valueUsd: value.toFixed(),
121
+ units: value,
122
+ valueUsd: value,
115
123
  price: '1',
116
124
  transferable: calculateTransferable(
117
- toWireBig(
125
+ unknownToDecimalString(
118
126
  state.withdrawable,
119
- 'clearinghouseState.withdrawable'
120
- ).toFixed(),
121
- value.toFixed()
127
+ 'clearinghouseState.withdrawable',
128
+ PROVIDER_KEY
129
+ ),
130
+ value
122
131
  ),
123
132
  })
124
133
  }
@@ -209,9 +218,7 @@ export const getAccount = async (
209
218
 
210
219
  const priceById = spotPriceById(
211
220
  markets,
212
- new Map(
213
- prices.map((p) => [p.marketId, parseDecimal(p.markPrice) ?? Number.NaN])
214
- )
221
+ new Map(prices.map((p) => [p.marketId, p.markPrice]))
215
222
  )
216
223
 
217
224
  const positions: Position[] = stateResults.flatMap((state) =>
@@ -219,12 +226,13 @@ export const getAccount = async (
219
226
  .filter(
220
227
  (ap) => !assetIsOutcome(ap.position.coin) && isOpenAssetPosition(ap)
221
228
  )
222
- .map((ap) =>
223
- mapPosition(
229
+ .flatMap((ap) => {
230
+ const position = mapPosition(
224
231
  ap,
225
232
  toPerpsMarketDisplay(registry.require(ap.position.coin))
226
233
  )
227
- )
234
+ return position === undefined ? [] : [position]
235
+ })
228
236
  )
229
237
 
230
238
  const stateByDex = new Map<string, HlClearinghouseState>()
@@ -266,14 +274,23 @@ export const getAccount = async (
266
274
  quoteAssetByCategory
267
275
  )
268
276
 
277
+ const marginUsed = safeAddDecimalStrings(
278
+ dexStates.flatMap(({ marginSummary }) =>
279
+ marginSummary === undefined ? [] : [marginSummary.totalMarginUsed]
280
+ )
281
+ )
282
+ const unrealizedPnl = safeAddDecimalStrings(
283
+ positions.map((position) => position.unrealizedPnl)
284
+ )
285
+
269
286
  return {
270
287
  provider: PROVIDER_KEY,
271
288
  address: params.address,
272
289
  balances,
273
290
  collateralBalances,
274
291
  positions,
275
- marginUsed: perpsTotals(dexStates).marginUsed.toFixed(),
276
- unrealizedPnl: sumUnrealizedPnl(positions).toFixed(),
292
+ ...(marginUsed === undefined ? {} : { marginUsed }),
293
+ ...(unrealizedPnl === undefined ? {} : { unrealizedPnl }),
277
294
  feeTier: {
278
295
  maker: feesResult.userAddRate ?? '0',
279
296
  taker: feesResult.userCrossRate ?? '0',
@@ -67,7 +67,8 @@ export const getFills = async (
67
67
  return []
68
68
  }
69
69
  const market = registry.get(fill.coin)
70
- return market === undefined ? [] : [mapFill(fill, market)]
70
+ const mapped = market && mapFill(fill, market)
71
+ return mapped ? [mapped] : []
71
72
  })
72
73
  return { items, saturated: false }
73
74
  },
@@ -1,4 +1,8 @@
1
- import { PerpsError, type SDKRequestOptions } from '@lifi/perps-sdk'
1
+ import {
2
+ numberToDecimalString,
3
+ PerpsError,
4
+ type SDKRequestOptions,
5
+ } from '@lifi/perps-sdk'
2
6
  import {
3
7
  MarginMode,
4
8
  type MarketRef,
@@ -66,6 +70,6 @@ export const getMarketSettings = async (
66
70
  return {
67
71
  marginMode:
68
72
  leverage.type === 'isolated' ? MarginMode.ISOLATED : MarginMode.CROSS,
69
- leverage: leverage.value,
73
+ leverage: numberToDecimalString(leverage.value),
70
74
  }
71
75
  }
@@ -24,6 +24,15 @@ import { requireAccountExists } from './getAccountExists.js'
24
24
  */
25
25
  export type GetOrderParams = ProviderGetOrderParams
26
26
 
27
+ const orderNotFound = (id: string): PerpsError => {
28
+ const err = new PerpsError(
29
+ PerpsErrorCode.OrderNotFound,
30
+ `Order not found: ${id}`
31
+ )
32
+ err.tool = PROVIDER_KEY
33
+ return err
34
+ }
35
+
27
36
  /**
28
37
  * Read getOrder direct from the Hyperliquid REST API.
29
38
  *
@@ -70,17 +79,16 @@ export const getOrder = async (
70
79
  if (twap !== undefined) {
71
80
  const registry = getMarketRegistry(client, PROVIDER_KEY)
72
81
  await registry.sync()
73
- return mapOrder(twap, registry.require(twap.state.coin))
82
+ const order = mapOrder(twap, registry.require(twap.state.coin))
83
+ if (order === undefined) {
84
+ throw orderNotFound(params.id)
85
+ }
86
+ return order
74
87
  }
75
88
  }
76
89
 
77
90
  if (status.status !== 'order' || assetIsOutcome(status.order.order.coin)) {
78
- const err = new PerpsError(
79
- PerpsErrorCode.OrderNotFound,
80
- `Order not found: ${params.id}`
81
- )
82
- err.tool = PROVIDER_KEY
83
- throw err
91
+ throw orderNotFound(params.id)
84
92
  }
85
93
 
86
94
  const registry = getMarketRegistry(client, PROVIDER_KEY)
@@ -89,6 +97,9 @@ export const getOrder = async (
89
97
  status.order,
90
98
  registry.require(status.order.order.coin)
91
99
  )
100
+ if (order === undefined) {
101
+ throw orderNotFound(params.id)
102
+ }
92
103
  const [linked] = await withExplorerLinks([order], params.address, infoOpts)
93
104
  return linked
94
105
  }
@@ -1,14 +1,11 @@
1
1
  import {
2
2
  ACTIVE_ORDER_STATUSES,
3
- createWarnOnce,
4
3
  getMarketRegistry,
5
4
  isActiveOrderStatus,
6
- type MarketRegistry,
7
- PerpsError,
8
5
  type ProviderGetOrdersParams,
9
6
  type SDKRequestOptions,
10
7
  } from '@lifi/perps-sdk'
11
- import type { MarketDisplay, Order, OrdersResponse } from '@lifi/perps-types'
8
+ import type { Order, OrdersResponse } from '@lifi/perps-types'
12
9
  import { PROVIDER_KEY } from '../constants.js'
13
10
  import type { HyperliquidContext } from '../context.js'
14
11
  import type {
@@ -17,48 +14,14 @@ import type {
17
14
  HlTwapHistoryEntry,
18
15
  } from '../types/index.js'
19
16
  import { withExplorerLinks } from '../utils/explorer.js'
20
- import { assetIsOutcome, mapOrder, perpsDexNames } from '../utils/index.js'
17
+ import { mapOrder, perpsDexNames } from '../utils/index.js'
21
18
  import { hlInfoOptions, infoRequest } from '../utils/infoClient.js'
19
+ import { mapOrderRow } from '../utils/mapOrder.js'
22
20
  import { requireAccountExists } from './getAccountExists.js'
23
21
 
24
22
  /** Parameters for a lifecycle-filtered Hyperliquid order read. */
25
23
  export type GetOrdersParams = ProviderGetOrdersParams
26
24
 
27
- const warn = createWarnOnce()
28
-
29
- const warnOnce = (key: string): void => {
30
- warn(key, `[${PROVIDER_KEY}] ${key}`)
31
- }
32
-
33
- /**
34
- * Map one venue row, or drop it. An outcome market identity, a coin the backend
35
- * market list does not hold, and a row the mapper rejects each drop only their
36
- * own row instead of rejecting the whole page; each distinct mapper message
37
- * warns once.
38
- */
39
- const mapRow = (
40
- coin: string,
41
- registry: MarketRegistry,
42
- map: (market: MarketDisplay) => Order
43
- ): Order | undefined => {
44
- if (assetIsOutcome(coin)) {
45
- return undefined
46
- }
47
- const market = registry.get(coin)
48
- if (market === undefined) {
49
- return undefined
50
- }
51
- try {
52
- return map(market)
53
- } catch (error) {
54
- if (!(error instanceof PerpsError)) {
55
- throw error
56
- }
57
- warnOnce(`dropped order row: ${error.message}`)
58
- return undefined
59
- }
60
- }
61
-
62
25
  /** Read regular, trigger, and TWAP orders from the requested lifecycle feeds. */
63
26
  export const getOrders = async (
64
27
  { client, apiUrl }: HyperliquidContext,
@@ -114,17 +77,22 @@ export const getOrders = async (
114
77
  rows.set(key, order)
115
78
  }
116
79
  }
80
+ const seenHistorical = new Set<string>()
117
81
  for (const detail of historical) {
118
82
  const key = String(detail.order.oid)
119
83
  // The feed carries one row per lifecycle transition, newest first, and a
120
84
  // terminal row shares its timestamp with the `open` row beneath it, so
121
- // only the first row of an id states that order's current status.
122
- if (rows.has(key)) {
85
+ // only the first row of an id states that order's current status, even
86
+ // when the mapper skips that row.
87
+ if (seenHistorical.has(key)) {
123
88
  continue
124
89
  }
90
+ seenHistorical.add(key)
125
91
  keep(
126
92
  key,
127
- mapRow(detail.order.coin, registry, (market) => mapOrder(detail, market))
93
+ mapOrderRow(detail.order.coin, registry, (market) =>
94
+ mapOrder(detail, market)
95
+ )
128
96
  )
129
97
  }
130
98
  const raw = open.flat()
@@ -135,13 +103,13 @@ export const getOrders = async (
135
103
  if (!childIds.has(order.oid)) {
136
104
  keep(
137
105
  String(order.oid),
138
- mapRow(order.coin, registry, (market) => mapOrder(order, market))
106
+ mapOrderRow(order.coin, registry, (market) => mapOrder(order, market))
139
107
  )
140
108
  }
141
109
  for (const child of order.children ?? []) {
142
110
  keep(
143
111
  String(child.oid),
144
- mapRow(child.coin, registry, (market) =>
112
+ mapOrderRow(child.coin, registry, (market) =>
145
113
  mapOrder(child, market, String(order.oid))
146
114
  )
147
115
  )
@@ -151,7 +119,7 @@ export const getOrders = async (
151
119
  for (const twap of twaps) {
152
120
  keep(
153
121
  `twap:${twap.twapId}`,
154
- mapRow(twap.state.coin, registry, (market) => mapOrder(twap, market))
122
+ mapOrderRow(twap.state.coin, registry, (market) => mapOrder(twap, market))
155
123
  )
156
124
  }
157
125
  const matching = [...rows.values()].filter(