@lifi/perps-sdk-provider-hyperliquid 20.1.0 → 22.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 (158) hide show
  1. package/README.md +15 -0
  2. package/dist/cjs/HyperliquidProvider.d.ts.map +1 -1
  3. package/dist/cjs/HyperliquidProvider.js +2 -2
  4. package/dist/cjs/HyperliquidProvider.js.map +1 -1
  5. package/dist/cjs/services/getAccount.d.ts.map +1 -1
  6. package/dist/cjs/services/getAccount.js +8 -8
  7. package/dist/cjs/services/getAccount.js.map +1 -1
  8. package/dist/cjs/services/getAccountExists.d.ts +3 -1
  9. package/dist/cjs/services/getAccountExists.d.ts.map +1 -1
  10. package/dist/cjs/services/getAccountExists.js +27 -6
  11. package/dist/cjs/services/getAccountExists.js.map +1 -1
  12. package/dist/cjs/services/getActivity.d.ts.map +1 -1
  13. package/dist/cjs/services/getActivity.js +3 -1
  14. package/dist/cjs/services/getActivity.js.map +1 -1
  15. package/dist/cjs/services/getAvailableToTrade.d.ts.map +1 -1
  16. package/dist/cjs/services/getAvailableToTrade.js +3 -0
  17. package/dist/cjs/services/getAvailableToTrade.js.map +1 -1
  18. package/dist/cjs/services/getFills.d.ts.map +1 -1
  19. package/dist/cjs/services/getFills.js +3 -1
  20. package/dist/cjs/services/getFills.js.map +1 -1
  21. package/dist/cjs/services/getMarketSettings.d.ts.map +1 -1
  22. package/dist/cjs/services/getMarketSettings.js +3 -0
  23. package/dist/cjs/services/getMarketSettings.js.map +1 -1
  24. package/dist/cjs/services/getOrder.d.ts.map +1 -1
  25. package/dist/cjs/services/getOrder.js +2 -0
  26. package/dist/cjs/services/getOrder.js.map +1 -1
  27. package/dist/cjs/services/getOrders.d.ts.map +1 -1
  28. package/dist/cjs/services/getOrders.js +3 -1
  29. package/dist/cjs/services/getOrders.js.map +1 -1
  30. package/dist/cjs/services/getPortfolioHistory.d.ts.map +1 -1
  31. package/dist/cjs/services/getPortfolioHistory.js +2 -0
  32. package/dist/cjs/services/getPortfolioHistory.js.map +1 -1
  33. package/dist/cjs/services/getPositions.d.ts.map +1 -1
  34. package/dist/cjs/services/getPositions.js +3 -1
  35. package/dist/cjs/services/getPositions.js.map +1 -1
  36. package/dist/cjs/services/getWithdrawableBalances.d.ts.map +1 -1
  37. package/dist/cjs/services/getWithdrawableBalances.js +3 -1
  38. package/dist/cjs/services/getWithdrawableBalances.js.map +1 -1
  39. package/dist/cjs/utils/index.d.ts +1 -1
  40. package/dist/cjs/utils/index.d.ts.map +1 -1
  41. package/dist/cjs/utils/index.js +3 -3
  42. package/dist/cjs/utils/index.js.map +1 -1
  43. package/dist/cjs/utils/liquidation.js +1 -1
  44. package/dist/cjs/utils/liquidation.js.map +1 -1
  45. package/dist/cjs/utils/orderFormatting.d.ts +3 -2
  46. package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
  47. package/dist/cjs/utils/orderFormatting.js +4 -4
  48. package/dist/cjs/utils/orderFormatting.js.map +1 -1
  49. package/dist/cjs/utils/spotBalance.d.ts.map +1 -1
  50. package/dist/cjs/utils/spotBalance.js +2 -2
  51. package/dist/cjs/utils/spotBalance.js.map +1 -1
  52. package/dist/cjs/utils/withdrawableBalances.d.ts +1 -1
  53. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  54. package/dist/cjs/utils/withdrawableBalances.js +7 -4
  55. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  56. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +2 -0
  57. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  58. package/dist/cjs/websocket/HyperliquidWsProvider.js +42 -10
  59. package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
  60. package/dist/esm/HyperliquidProvider.d.ts.map +1 -1
  61. package/dist/esm/HyperliquidProvider.js +3 -3
  62. package/dist/esm/HyperliquidProvider.js.map +1 -1
  63. package/dist/esm/services/getAccount.d.ts.map +1 -1
  64. package/dist/esm/services/getAccount.js +9 -6
  65. package/dist/esm/services/getAccount.js.map +1 -1
  66. package/dist/esm/services/getAccountExists.d.ts +3 -1
  67. package/dist/esm/services/getAccountExists.d.ts.map +1 -1
  68. package/dist/esm/services/getAccountExists.js +29 -9
  69. package/dist/esm/services/getAccountExists.js.map +1 -1
  70. package/dist/esm/services/getActivity.d.ts.map +1 -1
  71. package/dist/esm/services/getActivity.js +3 -1
  72. package/dist/esm/services/getActivity.js.map +1 -1
  73. package/dist/esm/services/getAvailableToTrade.d.ts.map +1 -1
  74. package/dist/esm/services/getAvailableToTrade.js +3 -0
  75. package/dist/esm/services/getAvailableToTrade.js.map +1 -1
  76. package/dist/esm/services/getFills.d.ts.map +1 -1
  77. package/dist/esm/services/getFills.js +3 -1
  78. package/dist/esm/services/getFills.js.map +1 -1
  79. package/dist/esm/services/getMarketSettings.d.ts.map +1 -1
  80. package/dist/esm/services/getMarketSettings.js +3 -0
  81. package/dist/esm/services/getMarketSettings.js.map +1 -1
  82. package/dist/esm/services/getOrder.d.ts.map +1 -1
  83. package/dist/esm/services/getOrder.js +2 -0
  84. package/dist/esm/services/getOrder.js.map +1 -1
  85. package/dist/esm/services/getOrders.d.ts.map +1 -1
  86. package/dist/esm/services/getOrders.js +3 -1
  87. package/dist/esm/services/getOrders.js.map +1 -1
  88. package/dist/esm/services/getPortfolioHistory.d.ts.map +1 -1
  89. package/dist/esm/services/getPortfolioHistory.js +2 -0
  90. package/dist/esm/services/getPortfolioHistory.js.map +1 -1
  91. package/dist/esm/services/getPositions.d.ts.map +1 -1
  92. package/dist/esm/services/getPositions.js +3 -1
  93. package/dist/esm/services/getPositions.js.map +1 -1
  94. package/dist/esm/services/getWithdrawableBalances.d.ts.map +1 -1
  95. package/dist/esm/services/getWithdrawableBalances.js +3 -1
  96. package/dist/esm/services/getWithdrawableBalances.js.map +1 -1
  97. package/dist/esm/utils/index.d.ts +1 -1
  98. package/dist/esm/utils/index.d.ts.map +1 -1
  99. package/dist/esm/utils/index.js +1 -1
  100. package/dist/esm/utils/index.js.map +1 -1
  101. package/dist/esm/utils/liquidation.js +2 -2
  102. package/dist/esm/utils/liquidation.js.map +1 -1
  103. package/dist/esm/utils/orderFormatting.d.ts +14 -12
  104. package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
  105. package/dist/esm/utils/orderFormatting.js +14 -14
  106. package/dist/esm/utils/orderFormatting.js.map +1 -1
  107. package/dist/esm/utils/spotBalance.d.ts.map +1 -1
  108. package/dist/esm/utils/spotBalance.js +3 -3
  109. package/dist/esm/utils/spotBalance.js.map +1 -1
  110. package/dist/esm/utils/withdrawableBalances.d.ts +1 -1
  111. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  112. package/dist/esm/utils/withdrawableBalances.js +7 -4
  113. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  114. package/dist/esm/websocket/HyperliquidWsProvider.d.ts +2 -0
  115. package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  116. package/dist/esm/websocket/HyperliquidWsProvider.js +43 -13
  117. package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
  118. package/dist/types/HyperliquidProvider.d.ts.map +1 -1
  119. package/dist/types/services/getAccount.d.ts.map +1 -1
  120. package/dist/types/services/getAccountExists.d.ts +3 -1
  121. package/dist/types/services/getAccountExists.d.ts.map +1 -1
  122. package/dist/types/services/getActivity.d.ts.map +1 -1
  123. package/dist/types/services/getAvailableToTrade.d.ts.map +1 -1
  124. package/dist/types/services/getFills.d.ts.map +1 -1
  125. package/dist/types/services/getMarketSettings.d.ts.map +1 -1
  126. package/dist/types/services/getOrder.d.ts.map +1 -1
  127. package/dist/types/services/getOrders.d.ts.map +1 -1
  128. package/dist/types/services/getPortfolioHistory.d.ts.map +1 -1
  129. package/dist/types/services/getPositions.d.ts.map +1 -1
  130. package/dist/types/services/getWithdrawableBalances.d.ts.map +1 -1
  131. package/dist/types/utils/index.d.ts +1 -1
  132. package/dist/types/utils/index.d.ts.map +1 -1
  133. package/dist/types/utils/orderFormatting.d.ts +14 -12
  134. package/dist/types/utils/orderFormatting.d.ts.map +1 -1
  135. package/dist/types/utils/spotBalance.d.ts.map +1 -1
  136. package/dist/types/utils/withdrawableBalances.d.ts +1 -1
  137. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  138. package/dist/types/websocket/HyperliquidWsProvider.d.ts +2 -0
  139. package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  140. package/package.json +3 -3
  141. package/src/HyperliquidProvider.ts +6 -5
  142. package/src/services/getAccount.ts +21 -19
  143. package/src/services/getAccountExists.ts +55 -14
  144. package/src/services/getActivity.ts +3 -1
  145. package/src/services/getAvailableToTrade.ts +7 -0
  146. package/src/services/getFills.ts +3 -1
  147. package/src/services/getMarketSettings.ts +7 -0
  148. package/src/services/getOrder.ts +2 -0
  149. package/src/services/getOrders.ts +3 -1
  150. package/src/services/getPortfolioHistory.ts +2 -0
  151. package/src/services/getPositions.ts +3 -1
  152. package/src/services/getWithdrawableBalances.ts +3 -1
  153. package/src/utils/index.ts +2 -2
  154. package/src/utils/liquidation.ts +2 -2
  155. package/src/utils/orderFormatting.ts +20 -16
  156. package/src/utils/spotBalance.ts +5 -3
  157. package/src/utils/withdrawableBalances.ts +12 -7
  158. package/src/websocket/HyperliquidWsProvider.ts +55 -15
@@ -1,4 +1,5 @@
1
1
  import {
2
+ calculateTransferable,
2
3
  DecodeChain,
3
4
  getMarketRegistry,
4
5
  isActiveMarket,
@@ -30,12 +31,13 @@ import type {
30
31
  } from '@lifi/perps-types'
31
32
  import { PerpsErrorCode } from '@lifi/perps-types'
32
33
  import Big from 'big.js'
33
- import { isAddress } from 'viem'
34
+ import { type Address, isAddress } from 'viem'
34
35
  import {
35
36
  DEFAULT_HYPERLIQUID_API_URL,
36
37
  HYPERLIQUID_FEE_TIER_FALLBACK,
37
38
  SPOT_MARKET_ID,
38
39
  } from '../constants.js'
40
+ import { requireAccountExists } from '../services/getAccountExists.js'
39
41
  import type {
40
42
  HlActiveAssetData,
41
43
  HlAssetPosition,
@@ -137,6 +139,7 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
137
139
  private readonly clearinghouseRefs = new Map<string, number>()
138
140
  private readonly client: PerpsSDKClient | undefined
139
141
  private readonly registry: MarketRegistry | undefined
142
+ private readonly accountChecksByUser = new Map<string, Promise<void>>()
140
143
  // Spot-funded modes need both spot valuation and clearinghouse margin state.
141
144
  private readonly abstractionByUser = new Map<
142
145
  string,
@@ -229,6 +232,26 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
229
232
  this.orderApiUrl = orderApiUrl.origin
230
233
  }
231
234
 
235
+ private ensureAccountExists(address: Address): Promise<void> {
236
+ const user = normalizeHlAddress(address)
237
+ const existing = this.accountChecksByUser.get(user)
238
+ if (existing !== undefined) {
239
+ return existing
240
+ }
241
+ const check = requireAccountExists(
242
+ this.orderApiUrl,
243
+ address,
244
+ this.client === undefined ? undefined : hlInfoOptions(this.client)
245
+ )
246
+ this.accountChecksByUser.set(user, check)
247
+ void check.catch(() => {
248
+ if (this.accountChecksByUser.get(user) === check) {
249
+ this.accountChecksByUser.delete(user)
250
+ }
251
+ })
252
+ return check
253
+ }
254
+
232
255
  override async subscribe(
233
256
  sub: Subscription,
234
257
  listener: SubscriptionListener,
@@ -278,23 +301,19 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
278
301
  }
279
302
 
280
303
  protected async openChannel(sub: Subscription): Promise<() => void> {
281
- // Must run synchronously, before any await, so two concurrent opens
282
- // cannot both pass the exclusivity check.
283
- if (sub.channel === 'orderUpdates') {
284
- this.claimOrderUpdatesKey(this.toKey(sub))
285
- }
286
-
287
- await this.registry?.sync()
288
-
304
+ const registry = this.registry
305
+ let marketValidated = false
289
306
  if (
290
- this.registry !== undefined &&
307
+ registry !== undefined &&
291
308
  (sub.channel === 'marketContext' ||
292
309
  sub.channel === 'orderbook' ||
293
310
  sub.channel === 'candle' ||
294
311
  sub.channel === 'trades' ||
295
312
  sub.channel === 'availableToTrade')
296
313
  ) {
297
- const market = this.registry.requireActive(sub.marketId)
314
+ await registry.sync()
315
+ marketValidated = true
316
+ const market = registry.requireActive(sub.marketId)
298
317
  if (
299
318
  sub.channel === 'availableToTrade' &&
300
319
  market.categoryId === SPOT_MARKET_ID
@@ -308,6 +327,18 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
308
327
  }
309
328
  }
310
329
 
330
+ if ('address' in sub) {
331
+ await this.ensureAccountExists(sub.address)
332
+ }
333
+
334
+ if (sub.channel === 'orderUpdates') {
335
+ this.claimOrderUpdatesKey(this.toKey(sub))
336
+ }
337
+
338
+ if (registry !== undefined && !marketValidated) {
339
+ await registry.sync()
340
+ }
341
+
311
342
  // Markets context aggregates slower asset-context feeds with fast mid/mark
312
343
  // ticks from `fastAssetCtxs`.
313
344
  if (sub.channel === 'marketsContext') {
@@ -1507,10 +1538,19 @@ export class HyperliquidWsProvider extends WsProviderBase<object> {
1507
1538
  }
1508
1539
  return
1509
1540
  }
1510
- const rows = balances.map((balance) => ({
1511
- ...spotBalance(spotAssetFromToken(balance), balance.total, priceById),
1512
- locked: balance.hold,
1513
- }))
1541
+ const rows = balances.map((balance) => {
1542
+ const total = toWireBig(balance.total, 'spotState.balances.total')
1543
+ return {
1544
+ ...spotBalance(spotAssetFromToken(balance), balance.total, priceById),
1545
+ locked: balance.hold,
1546
+ transferable: calculateTransferable(
1547
+ total
1548
+ .minus(toWireBig(balance.hold, 'spotState.balances.hold'))
1549
+ .toFixed(),
1550
+ total.toFixed()
1551
+ ),
1552
+ }
1553
+ })
1514
1554
  this.emit(`spotState:${user}`, {
1515
1555
  channel: 'spotBalances',
1516
1556
  data: rows,