@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,18 +1,14 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.HyperliquidWsProvider = exports.hyperliquidWsProvider = void 0;
7
4
  const perps_sdk_1 = require("@lifi/perps-sdk");
8
5
  const perps_types_1 = require("@lifi/perps-types");
9
- const big_js_1 = __importDefault(require("big.js"));
10
6
  const viem_1 = require("viem");
11
7
  const constants_js_1 = require("../constants.js");
12
8
  const getAccountExists_js_1 = require("../services/getAccountExists.js");
13
9
  const index_js_1 = require("../types/index.js");
14
- const decimal_js_1 = require("../utils/decimal.js");
15
10
  const index_js_2 = require("../utils/index.js");
11
+ const mapOrder_js_1 = require("../utils/mapOrder.js");
16
12
  const HL_L2_BOOK_MAX_LEVELS_PER_SIDE = 20;
17
13
  const normalizeHlAddress = (address) => (0, viem_1.isAddress)(address, { strict: false }) ? address.toLowerCase() : address;
18
14
  const availableAfterMaintenance = (spotState, quoteAssetId) => spotState.tokenToAvailableAfterMaintenance?.find(([token]) => String(token) === quoteAssetId)?.[1];
@@ -333,7 +329,14 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
333
329
  if (priceStep === undefined) {
334
330
  return {};
335
331
  }
336
- return (0, index_js_2.priceStepToAggregation)(priceStep, this.orderbookReferencePrice(marketId));
332
+ const referencePrice = this.orderbookReferencePrice(marketId);
333
+ const referencePriceNumber = referencePrice === undefined
334
+ ? undefined
335
+ : (0, perps_sdk_1.safeDecimalStringToNumber)(referencePrice);
336
+ if (referencePriceNumber === undefined) {
337
+ return {};
338
+ }
339
+ return (0, index_js_2.priceStepToAggregation)(priceStep, referencePriceNumber);
337
340
  }
338
341
  orderbookAggregationKey(marketId, priceStep) {
339
342
  const aggregation = this.orderbookAggregation(marketId, priceStep);
@@ -623,23 +626,22 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
623
626
  }
624
627
  mergedMids() {
625
628
  const map = new Map();
629
+ const setMid = (id, mid) => {
630
+ const decimal = mid == null ? undefined : wsFigureToDecimalString(mid);
631
+ if ((0, perps_sdk_1.isDecimalString)(decimal)) {
632
+ map.set(id, decimal);
633
+ }
634
+ };
626
635
  for (const byMarketId of this.perpCtxBySubDex.values()) {
627
636
  for (const [id, ctx] of Object.entries(byMarketId)) {
628
- const mid = ctx.midPx ?? ctx.markPx;
629
- map.set(id, Number(mid));
637
+ setMid(id, ctx.midPx ?? ctx.markPx);
630
638
  }
631
639
  }
632
640
  for (const [id, ctx] of Object.entries(this.spotCtxByMarketId)) {
633
- const mid = ctx.midPx ?? ctx.markPx;
634
- if (mid != null) {
635
- map.set(id, Number(mid));
636
- }
641
+ setMid(id, ctx.midPx ?? ctx.markPx);
637
642
  }
638
643
  for (const [id, fast] of Object.entries(this.fastCtxByMarketId)) {
639
- const mid = fast.midPx ?? fast.markPx;
640
- if (mid != null) {
641
- map.set(id, Number(mid));
642
- }
644
+ setMid(id, fast.midPx ?? fast.markPx);
643
645
  }
644
646
  return map;
645
647
  }
@@ -651,21 +653,22 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
651
653
  const book = this.latestOrderbookByMarketId.get(marketId);
652
654
  const bid = book?.bids[0]?.price;
653
655
  const ask = book?.asks[0]?.price;
654
- if (bid !== undefined && ask !== undefined) {
655
- return (Number(bid) + Number(ask)) / 2;
656
+ if (bid === undefined || ask === undefined) {
657
+ return undefined;
656
658
  }
657
- return Number.NaN;
659
+ const sum = (0, perps_sdk_1.safeAddDecimalString)(bid, ask);
660
+ return sum === undefined ? undefined : (0, perps_sdk_1.safeDivideDecimalString)(sum, '2');
658
661
  }
659
662
  handleL2Book(data) {
660
663
  const book = {
661
664
  provider: this.providerKey,
662
665
  marketId: data.coin,
663
666
  bids: data.levels[0]
664
- .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE)
665
- .map((l) => ({ price: l.px, size: l.sz })),
667
+ .flatMap((l) => toOrderbookLevel(data.coin, l.px, l.sz))
668
+ .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE),
666
669
  asks: data.levels[1]
667
- .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE)
668
- .map((l) => ({ price: l.px, size: l.sz })),
670
+ .flatMap((l) => toOrderbookLevel(data.coin, l.px, l.sz))
671
+ .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE),
669
672
  timestamp: data.time,
670
673
  };
671
674
  this.latestOrderbookByMarketId.set(data.coin, book);
@@ -697,8 +700,8 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
697
700
  const book = {
698
701
  provider: this.providerKey,
699
702
  marketId: delta.c,
700
- bids: applyCompressedL2Side(previous.bids, delta.l[0], delta.r?.[0] ?? [], 'bid'),
701
- asks: applyCompressedL2Side(previous.asks, delta.l[1], delta.r?.[1] ?? [], 'ask'),
703
+ bids: applyCompressedL2Side(delta.c, previous.bids, delta.l[0], delta.r?.[0] ?? [], 'bid'),
704
+ asks: applyCompressedL2Side(delta.c, previous.asks, delta.l[1], delta.r?.[1] ?? [], 'ask'),
702
705
  timestamp: delta.t,
703
706
  };
704
707
  this.latestOrderbookByMarketId.set(delta.c, book);
@@ -761,39 +764,25 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
761
764
  if (epoch !== this.orderUpdatesEpoch || key !== this.orderUpdatesKey) {
762
765
  return;
763
766
  }
767
+ const user = key.slice('orderUpdates:'.length);
764
768
  const mapped = await Promise.all(data.map(async (update) => {
765
769
  const basic = update.order;
766
- if ((0, index_js_2.assetIsOutcome)(basic.coin)) {
770
+ if ((0, index_js_2.assetIsOutcome)(basic.coin) ||
771
+ this.registry?.get(basic.coin) === undefined) {
767
772
  return undefined;
768
773
  }
769
- const market = this.registry?.get(basic.coin);
770
- if (market === undefined) {
771
- return undefined;
774
+ let detail;
775
+ try {
776
+ detail = await this.readOrderDetail(user, client, update);
772
777
  }
773
- const response = await (0, index_js_2.infoRequest)(this.orderApiUrl, {
774
- type: 'orderStatus',
775
- user: key.slice('orderUpdates:'.length),
776
- oid: basic.oid,
777
- }, (0, index_js_2.hlInfoOptions)(client));
778
- if (response.status !== 'order') {
779
- throw new perps_sdk_1.PerpsError(perps_types_1.PerpsErrorCode.OrderNotFound, `Hyperliquid order metadata not found: ${basic.oid}`);
778
+ catch (error) {
779
+ if (!(error instanceof perps_sdk_1.PerpsError)) {
780
+ throw error;
781
+ }
782
+ perps_sdk_1.wsLog.droppedRow(this.providerKey, 'order', `${basic.oid}: ${error.message}`);
783
+ return undefined;
780
784
  }
781
- const detail = {
782
- status: update.status,
783
- statusTimestamp: update.statusTimestamp,
784
- order: {
785
- ...response.order.order,
786
- coin: basic.coin,
787
- side: basic.side,
788
- limitPx: basic.limitPx,
789
- sz: basic.sz,
790
- oid: basic.oid,
791
- timestamp: basic.timestamp,
792
- origSz: basic.origSz,
793
- cloid: basic.cloid ?? response.order.order.cloid,
794
- },
795
- };
796
- return (0, index_js_2.mapOrder)(detail, market);
785
+ return (0, mapOrder_js_1.mapOrderRow)(basic.coin, this.registry, (resolved) => (0, index_js_2.mapOrder)(detail, resolved));
797
786
  }));
798
787
  if (epoch !== this.orderUpdatesEpoch || key !== this.orderUpdatesKey) {
799
788
  return;
@@ -812,6 +801,28 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
812
801
  this.emit(key, { channel: 'orderUpdates', data: { orders, terminated } });
813
802
  });
814
803
  }
804
+ async readOrderDetail(user, client, update) {
805
+ const basic = update.order;
806
+ const response = await (0, index_js_2.infoRequest)(this.orderApiUrl, { type: 'orderStatus', user, oid: basic.oid }, (0, index_js_2.hlInfoOptions)(client));
807
+ if (response.status !== 'order') {
808
+ throw new perps_sdk_1.PerpsError(perps_types_1.PerpsErrorCode.OrderNotFound, `Hyperliquid order metadata not found: ${basic.oid}`);
809
+ }
810
+ return {
811
+ status: update.status,
812
+ statusTimestamp: update.statusTimestamp,
813
+ order: {
814
+ ...response.order.order,
815
+ coin: basic.coin,
816
+ side: basic.side,
817
+ limitPx: basic.limitPx,
818
+ sz: basic.sz,
819
+ oid: basic.oid,
820
+ timestamp: basic.timestamp,
821
+ origSz: basic.origSz,
822
+ cloid: basic.cloid ?? response.order.order.cloid,
823
+ },
824
+ };
825
+ }
815
826
  handleUserFills(data) {
816
827
  const items = data.isSnapshot
817
828
  ? []
@@ -820,7 +831,8 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
820
831
  return [];
821
832
  }
822
833
  const market = this.registry?.get(f.coin);
823
- return market ? [(0, index_js_2.mapFill)(f, market)] : [];
834
+ const mapped = market && (0, index_js_2.mapFill)(f, market);
835
+ return mapped ? [mapped] : [];
824
836
  });
825
837
  this.emit(`userFills:${data.user.toLowerCase()}`, {
826
838
  channel: 'fills',
@@ -834,9 +846,10 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
834
846
  return [];
835
847
  }
836
848
  const market = this.registry?.get(ap.position.coin);
837
- return market
838
- ? [(0, index_js_2.mapPosition)(ap, (0, perps_sdk_1.toPerpsMarketDisplay)(market))]
839
- : [];
849
+ const position = market === undefined
850
+ ? undefined
851
+ : (0, index_js_2.mapPosition)(ap, (0, perps_sdk_1.toPerpsMarketDisplay)(market));
852
+ return position === undefined ? [] : [position];
840
853
  }));
841
854
  this.emit(`positions:${data.user.toLowerCase()}`, {
842
855
  channel: 'positions',
@@ -844,16 +857,13 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
844
857
  });
845
858
  const { accountValue, marginUsed } = (0, index_js_2.perpsTotals)(data.clearinghouseStates.map(([, state]) => state));
846
859
  const key = data.user.toLowerCase();
847
- this.latestPerpsByUser.set(key, {
848
- positions,
849
- marginUsed: marginUsed.toFixed(),
850
- });
860
+ this.latestPerpsByUser.set(key, { positions, marginUsed });
851
861
  this.emitUnifiedSummary(key);
852
862
  this.emitSummaryIfModeAllows(data.user, {
853
- portfolioValue: accountValue.toFixed(),
854
- availableMargin: accountValue.minus(marginUsed).toFixed(),
855
- marginUsed: marginUsed.toFixed(),
856
- unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(positions).toFixed(),
863
+ portfolioValue: accountValue,
864
+ availableMargin: (0, perps_sdk_1.subtractDecimalString)(accountValue, marginUsed),
865
+ marginUsed,
866
+ unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(positions),
857
867
  });
858
868
  }
859
869
  static summaryComputableFor(mode) {
@@ -937,14 +947,14 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
937
947
  const portfolioValue = [
938
948
  ...pipeline.spot.collateralBalances,
939
949
  ...pipeline.spot.balances,
940
- ].reduce((sum, balance) => sum.plus((0, decimal_js_1.toWireBig)(balance.valueUsd, 'spotBalance.valueUsd')), new big_js_1.default(0));
950
+ ].reduce((sum, balance) => (0, perps_sdk_1.addDecimalString)(sum, (0, perps_sdk_1.unknownToDecimalString)(balance.valueUsd, 'spotBalance.valueUsd', this.providerKey)), '0');
941
951
  this.emit(`accountSummary:${key}`, {
942
952
  channel: 'accountSummary',
943
953
  data: {
944
- portfolioValue: portfolioValue.toFixed(),
954
+ portfolioValue,
945
955
  availableMargin: pipeline.availableMargin,
946
956
  marginUsed: perps.marginUsed,
947
- unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(perps.positions).toFixed(),
957
+ unrealizedPnl: (0, index_js_2.sumUnrealizedPnl)(perps.positions),
948
958
  },
949
959
  });
950
960
  }
@@ -1056,23 +1066,26 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
1056
1066
  }
1057
1067
  const markets = this.registry?.activeMarkets ?? [];
1058
1068
  const priceById = (0, index_js_2.spotPriceById)(markets, this.mergedMids());
1059
- const balances = data.spotState.balances.filter((balance) => !(0, index_js_2.assetIsOutcome)(balance.coin) &&
1060
- (0, decimal_js_1.toWireBig)(balance.total, 'spotState.balances.total').gt(0));
1069
+ const balances = data.spotState.balances
1070
+ .filter((balance) => !(0, index_js_2.assetIsOutcome)(balance.coin))
1071
+ .filter((balance) => (0, perps_sdk_1.safeIsDecimalStringGreaterThan)(balance.total, '0') === true)
1072
+ .map((balance) => ({ balance, total: balance.total }));
1061
1073
  const pipeline = this.unifiedSummaryByUser.get(user);
1062
- if (balances.some((balance) => priceById.get(String(balance.token)) === 0)) {
1074
+ if (balances.some(({ balance }) => {
1075
+ const price = priceById.get(String(balance.token));
1076
+ return price !== undefined && (0, perps_sdk_1.isDecimalStringZero)(price);
1077
+ })) {
1063
1078
  if (pipeline !== undefined) {
1064
1079
  pipeline.spot = undefined;
1065
1080
  }
1066
1081
  return;
1067
1082
  }
1068
- const rows = balances.map((balance) => {
1069
- const total = (0, decimal_js_1.toWireBig)(balance.total, 'spotState.balances.total');
1083
+ const rows = balances.map(({ balance, total }) => {
1084
+ const free = (0, perps_sdk_1.safeSubtractDecimalString)(total, balance.hold);
1070
1085
  return {
1071
- ...(0, index_js_2.spotBalance)((0, index_js_2.spotAssetFromToken)(balance), balance.total, priceById),
1086
+ ...(0, index_js_2.spotBalance)((0, index_js_2.spotAssetFromToken)(balance), total, priceById),
1072
1087
  locked: balance.hold,
1073
- transferable: (0, perps_sdk_1.calculateTransferable)(total
1074
- .minus((0, decimal_js_1.toWireBig)(balance.hold, 'spotState.balances.hold'))
1075
- .toFixed(), total.toFixed()),
1088
+ transferable: free === undefined ? '0' : (0, perps_sdk_1.calculateTransferable)(free, total),
1076
1089
  };
1077
1090
  });
1078
1091
  this.emit(`spotState:${user}`, {
@@ -1112,29 +1125,20 @@ class HyperliquidWsProvider extends perps_sdk_1.WsProviderBase {
1112
1125
  }
1113
1126
  exports.HyperliquidWsProvider = HyperliquidWsProvider;
1114
1127
  const isObject = (v) => typeof v === 'object' && v !== null;
1115
- const toMarketContextString = (value) => {
1116
- if (typeof value === 'number') {
1117
- return (0, perps_sdk_1.numberToDecimalString)(value);
1118
- }
1119
- return typeof value === 'string' ? value : undefined;
1120
- };
1128
+ function wsFigureToDecimalString(value) {
1129
+ return typeof value === 'number' ? (0, perps_sdk_1.safeNumberToDecimalString)(value) : value;
1130
+ }
1131
+ function optionalWsFigureToDecimalString(value) {
1132
+ return value == null ? undefined : wsFigureToDecimalString(value);
1133
+ }
1121
1134
  const toMarketCapString = (price, circulatingSupply) => {
1122
- const priceString = toMarketContextString(price);
1123
- const supplyString = toMarketContextString(circulatingSupply);
1124
- if (priceString === undefined || supplyString === undefined) {
1125
- return undefined;
1126
- }
1127
- try {
1128
- const parsedPrice = new big_js_1.default(priceString);
1129
- const parsedSupply = new big_js_1.default(supplyString);
1130
- if (parsedPrice.lte(0) || parsedSupply.lte(0)) {
1131
- return undefined;
1132
- }
1133
- return parsedPrice.times(parsedSupply).toFixed();
1134
- }
1135
- catch {
1135
+ const supply = optionalWsFigureToDecimalString(circulatingSupply);
1136
+ if (supply === undefined ||
1137
+ (0, perps_sdk_1.safeIsDecimalStringGreaterThan)(price, '0') !== true ||
1138
+ (0, perps_sdk_1.safeIsDecimalStringGreaterThan)(supply, '0') !== true) {
1136
1139
  return undefined;
1137
1140
  }
1141
+ return (0, perps_sdk_1.safeMultiplyDecimalString)(price, supply);
1138
1142
  };
1139
1143
  function mergePerpAssetCtx(previous, marketId, update) {
1140
1144
  const funding = update.funding ?? previous?.funding;
@@ -1168,15 +1172,13 @@ function allDexsAssetCtxEntries(data) {
1168
1172
  return data.assetCtxs ?? data.ctxs ?? [];
1169
1173
  }
1170
1174
  function activePerpAssetCtx(marketId, ctx) {
1171
- const funding = toMarketContextString(ctx.funding);
1172
- const openInterest = toMarketContextString(ctx.openInterest);
1173
- const dayNtlVlm = toMarketContextString(ctx.dayNtlVlm);
1174
- const prevDayPx = toMarketContextString(ctx.prevDayPx);
1175
- const markPx = toMarketContextString(ctx.markPx);
1176
- const midPx = ctx.midPx === undefined || ctx.midPx === null
1177
- ? null
1178
- : (toMarketContextString(ctx.midPx) ?? null);
1179
- const oraclePx = toMarketContextString(ctx.oraclePx);
1175
+ const funding = optionalWsFigureToDecimalString(ctx.funding);
1176
+ const openInterest = optionalWsFigureToDecimalString(ctx.openInterest);
1177
+ const dayNtlVlm = optionalWsFigureToDecimalString(ctx.dayNtlVlm);
1178
+ const prevDayPx = optionalWsFigureToDecimalString(ctx.prevDayPx);
1179
+ const markPx = optionalWsFigureToDecimalString(ctx.markPx);
1180
+ const midPx = optionalWsFigureToDecimalString(ctx.midPx) ?? null;
1181
+ const oraclePx = optionalWsFigureToDecimalString(ctx.oraclePx);
1180
1182
  if (funding === undefined ||
1181
1183
  openInterest === undefined ||
1182
1184
  dayNtlVlm === undefined ||
@@ -1197,8 +1199,8 @@ function activePerpAssetCtx(marketId, ctx) {
1197
1199
  };
1198
1200
  }
1199
1201
  function mapSpotMarketContext(marketId, ctx, fast) {
1200
- const midPrice = toMarketContextString(ctx.midPx ?? ctx.markPx);
1201
- const markPrice = toMarketContextString(ctx.markPx);
1202
+ const midPrice = optionalWsFigureToDecimalString(ctx.midPx ?? ctx.markPx);
1203
+ const markPrice = optionalWsFigureToDecimalString(ctx.markPx);
1202
1204
  if (midPrice === undefined || markPrice === undefined) {
1203
1205
  return undefined;
1204
1206
  }
@@ -1207,18 +1209,40 @@ function mapSpotMarketContext(marketId, ctx, fast) {
1207
1209
  marketId,
1208
1210
  midPrice: fast?.midPx != null ? fast.midPx : midPrice,
1209
1211
  markPrice: emittedMarkPrice,
1210
- prevDayPrice: toMarketContextString(ctx.prevDayPx),
1211
- volume24h: toMarketContextString(ctx.dayNtlVlm),
1212
+ prevDayPrice: optionalWsFigureToDecimalString(ctx.prevDayPx),
1213
+ volume24h: optionalWsFigureToDecimalString(ctx.dayNtlVlm),
1212
1214
  marketCap: toMarketCapString(emittedMarkPrice, ctx.circulatingSupply),
1213
1215
  };
1214
1216
  }
1217
+ const BOOK_LEVEL_ROW = 'order book level';
1218
+ function bookLevelPrice(marketId, price) {
1219
+ if (!(0, perps_sdk_1.isDecimalString)(price)) {
1220
+ perps_sdk_1.wsLog.skippedRow(constants_js_1.PROVIDER_KEY, BOOK_LEVEL_ROW, 'price', price, marketId);
1221
+ return undefined;
1222
+ }
1223
+ return price;
1224
+ }
1225
+ function bookLevelSize(marketId, size) {
1226
+ if (!(0, perps_sdk_1.isDecimalString)(size)) {
1227
+ perps_sdk_1.wsLog.skippedRow(constants_js_1.PROVIDER_KEY, BOOK_LEVEL_ROW, 'size', size, marketId);
1228
+ return undefined;
1229
+ }
1230
+ return size;
1231
+ }
1232
+ function toOrderbookLevel(marketId, price, size) {
1233
+ const levelPrice = bookLevelPrice(marketId, price);
1234
+ const levelSize = levelPrice === undefined ? undefined : bookLevelSize(marketId, size);
1235
+ return levelPrice === undefined || levelSize === undefined
1236
+ ? []
1237
+ : [{ price: levelPrice, size: levelSize }];
1238
+ }
1215
1239
  function compactRemovalPrice(levels, value) {
1216
1240
  if (typeof value === 'number') {
1217
1241
  return levels[value]?.price;
1218
1242
  }
1219
1243
  return typeof value === 'string' ? value : value.p;
1220
1244
  }
1221
- function applyCompressedL2Side(previous, updates, removals, side) {
1245
+ function applyCompressedL2Side(marketId, previous, updates, removals, side) {
1222
1246
  const byPrice = new Map(previous.map((level) => [level.price, level.size]));
1223
1247
  for (const removal of removals) {
1224
1248
  const price = compactRemovalPrice(previous, removal);
@@ -1227,18 +1251,23 @@ function applyCompressedL2Side(previous, updates, removals, side) {
1227
1251
  }
1228
1252
  }
1229
1253
  for (const update of updates) {
1230
- if (Number(update.s) === 0) {
1231
- byPrice.delete(update.p);
1254
+ const price = bookLevelPrice(marketId, update.p);
1255
+ if (price === undefined) {
1256
+ continue;
1257
+ }
1258
+ const size = bookLevelSize(marketId, update.s);
1259
+ if (size === undefined || (0, perps_sdk_1.safeIsDecimalStringZero)(size) !== false) {
1260
+ byPrice.delete(price);
1232
1261
  }
1233
1262
  else {
1234
- byPrice.set(update.p, update.s);
1263
+ byPrice.set(price, size);
1235
1264
  }
1236
1265
  }
1237
1266
  return [...byPrice.entries()]
1238
1267
  .map(([price, size]) => ({ price, size }))
1239
1268
  .sort((a, b) => side === 'bid'
1240
- ? Number(b.price) - Number(a.price)
1241
- : Number(a.price) - Number(b.price))
1269
+ ? (0, perps_sdk_1.compareDecimalStrings)(b.price, a.price)
1270
+ : (0, perps_sdk_1.compareDecimalStrings)(a.price, b.price))
1242
1271
  .slice(0, HL_L2_BOOK_MAX_LEVELS_PER_SIDE);
1243
1272
  }
1244
1273
  function isValidHlFrame(channel, data) {