@lifi/perps-sdk-provider-hyperliquid 19.0.0 → 20.1.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 (97) hide show
  1. package/README.md +56 -0
  2. package/dist/cjs/HyperliquidProvider.js.map +1 -1
  3. package/dist/cjs/services/getAccount.d.ts.map +1 -1
  4. package/dist/cjs/services/getAccount.js +12 -8
  5. package/dist/cjs/services/getAccount.js.map +1 -1
  6. package/dist/cjs/services/getActivity.d.ts.map +1 -1
  7. package/dist/cjs/services/getActivity.js +71 -45
  8. package/dist/cjs/services/getActivity.js.map +1 -1
  9. package/dist/cjs/services/getFills.d.ts.map +1 -1
  10. package/dist/cjs/services/getFills.js +30 -38
  11. package/dist/cjs/services/getFills.js.map +1 -1
  12. package/dist/cjs/services/getMarketSettings.d.ts +2 -2
  13. package/dist/cjs/services/getMarketSettings.d.ts.map +1 -1
  14. package/dist/cjs/services/getMarketSettings.js +8 -3
  15. package/dist/cjs/services/getMarketSettings.js.map +1 -1
  16. package/dist/cjs/services/historyPagination.d.ts +22 -0
  17. package/dist/cjs/services/historyPagination.d.ts.map +1 -0
  18. package/dist/cjs/services/historyPagination.js +125 -0
  19. package/dist/cjs/services/historyPagination.js.map +1 -0
  20. package/dist/cjs/types/ledger.d.ts +17 -1
  21. package/dist/cjs/types/ledger.d.ts.map +1 -1
  22. package/dist/cjs/types/ledger.js +10 -1
  23. package/dist/cjs/types/ledger.js.map +1 -1
  24. package/dist/cjs/utils/mapActivity.d.ts.map +1 -1
  25. package/dist/cjs/utils/mapActivity.js +41 -0
  26. package/dist/cjs/utils/mapActivity.js.map +1 -1
  27. package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
  28. package/dist/cjs/utils/withdrawableBalances.js +3 -1
  29. package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
  30. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +6 -0
  31. package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  32. package/dist/cjs/websocket/HyperliquidWsProvider.js +129 -37
  33. package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
  34. package/dist/esm/HyperliquidProvider.js.map +1 -1
  35. package/dist/esm/services/getAccount.d.ts.map +1 -1
  36. package/dist/esm/services/getAccount.js +10 -9
  37. package/dist/esm/services/getAccount.js.map +1 -1
  38. package/dist/esm/services/getActivity.d.ts +3 -13
  39. package/dist/esm/services/getActivity.d.ts.map +1 -1
  40. package/dist/esm/services/getActivity.js +78 -66
  41. package/dist/esm/services/getActivity.js.map +1 -1
  42. package/dist/esm/services/getFills.d.ts +2 -14
  43. package/dist/esm/services/getFills.d.ts.map +1 -1
  44. package/dist/esm/services/getFills.js +32 -58
  45. package/dist/esm/services/getFills.js.map +1 -1
  46. package/dist/esm/services/getMarketSettings.d.ts +5 -3
  47. package/dist/esm/services/getMarketSettings.d.ts.map +1 -1
  48. package/dist/esm/services/getMarketSettings.js +13 -7
  49. package/dist/esm/services/getMarketSettings.js.map +1 -1
  50. package/dist/esm/services/historyPagination.d.ts +22 -0
  51. package/dist/esm/services/historyPagination.d.ts.map +1 -0
  52. package/dist/esm/services/historyPagination.js +121 -0
  53. package/dist/esm/services/historyPagination.js.map +1 -0
  54. package/dist/esm/types/ledger.d.ts +42 -1
  55. package/dist/esm/types/ledger.d.ts.map +1 -1
  56. package/dist/esm/types/ledger.js +17 -0
  57. package/dist/esm/types/ledger.js.map +1 -1
  58. package/dist/esm/utils/mapActivity.d.ts +1 -0
  59. package/dist/esm/utils/mapActivity.d.ts.map +1 -1
  60. package/dist/esm/utils/mapActivity.js +49 -1
  61. package/dist/esm/utils/mapActivity.js.map +1 -1
  62. package/dist/esm/utils/withdrawableBalances.d.ts +2 -1
  63. package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
  64. package/dist/esm/utils/withdrawableBalances.js +5 -2
  65. package/dist/esm/utils/withdrawableBalances.js.map +1 -1
  66. package/dist/esm/websocket/HyperliquidWsProvider.d.ts +6 -0
  67. package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  68. package/dist/esm/websocket/HyperliquidWsProvider.js +131 -49
  69. package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
  70. package/dist/types/services/getAccount.d.ts.map +1 -1
  71. package/dist/types/services/getActivity.d.ts +3 -13
  72. package/dist/types/services/getActivity.d.ts.map +1 -1
  73. package/dist/types/services/getFills.d.ts +2 -14
  74. package/dist/types/services/getFills.d.ts.map +1 -1
  75. package/dist/types/services/getMarketSettings.d.ts +5 -3
  76. package/dist/types/services/getMarketSettings.d.ts.map +1 -1
  77. package/dist/types/services/historyPagination.d.ts +22 -0
  78. package/dist/types/services/historyPagination.d.ts.map +1 -0
  79. package/dist/types/types/ledger.d.ts +42 -1
  80. package/dist/types/types/ledger.d.ts.map +1 -1
  81. package/dist/types/utils/mapActivity.d.ts +1 -0
  82. package/dist/types/utils/mapActivity.d.ts.map +1 -1
  83. package/dist/types/utils/withdrawableBalances.d.ts +2 -1
  84. package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
  85. package/dist/types/websocket/HyperliquidWsProvider.d.ts +6 -0
  86. package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
  87. package/package.json +3 -3
  88. package/src/HyperliquidProvider.ts +1 -1
  89. package/src/services/getAccount.ts +22 -12
  90. package/src/services/getActivity.ts +138 -105
  91. package/src/services/getFills.ts +42 -95
  92. package/src/services/getMarketSettings.ts +20 -8
  93. package/src/services/historyPagination.ts +169 -0
  94. package/src/types/ledger.ts +61 -0
  95. package/src/utils/mapActivity.ts +56 -0
  96. package/src/utils/withdrawableBalances.ts +8 -3
  97. package/src/websocket/HyperliquidWsProvider.ts +141 -63
@@ -0,0 +1,22 @@
1
+ type HistoryKey = string | number;
2
+ export declare const getHistoryLimit: (limit?: number) => number;
3
+ export declare function historyPage<T>(params: {
4
+ startTime?: number;
5
+ endTime?: number;
6
+ cursor?: string;
7
+ }, limit: number, fetchWindow: (startTime: number, endTime: number, snapshotEnd: number) => Promise<{
8
+ items: T[];
9
+ saturated: boolean;
10
+ }>, identify: (item: T) => {
11
+ time: number;
12
+ key: HistoryKey;
13
+ }, signal?: AbortSignal): Promise<{
14
+ items: T[];
15
+ pagination: {
16
+ limit: number;
17
+ hasMore: boolean;
18
+ cursor?: string;
19
+ };
20
+ }>;
21
+ export {};
22
+ //# sourceMappingURL=historyPagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyPagination.d.ts","sourceRoot":"","sources":["../../../src/services/historyPagination.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,CAAA;AAiBjC,eAAO,MAAM,eAAe,GAAI,cAA6B,KAAG,MAQ/D,CAAA;AAmCD,wBAAsB,WAAW,CAAC,CAAC,EACjC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACjE,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,CACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC;IAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,EAChD,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,UAAU,CAAA;CAAE,EACxD,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC;IACT,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,UAAU,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CACjE,CAAC,CA2FD"}
@@ -113,12 +113,41 @@ export type HlLiquidationDelta = {
113
113
  leverageType: string;
114
114
  liquidatedPositions?: HlLiquidatedPosition[];
115
115
  };
116
+ /**
117
+ * Hyperliquid `cStakingTransfer` ledger delta. Moves `token` between the
118
+ * account's spot balance and its staking balance; `isDeposit` is `true` for a
119
+ * move into staking. `amount` is unsigned. A completed unstake row carries the
120
+ * zero hash.
121
+ * @public
122
+ */
123
+ export type HlCStakingTransferDelta = {
124
+ type: 'cStakingTransfer';
125
+ token: string;
126
+ amount: string;
127
+ isDeposit: boolean;
128
+ };
129
+ /** Borrow-lend market action named by a `borrowLend` ledger delta. @public */
130
+ export type HlBorrowLendOperation = 'supply' | 'withdraw' | 'borrow' | 'repay';
131
+ /**
132
+ * Hyperliquid `borrowLend` ledger delta. Moves `token` between the account's
133
+ * spot balance and the borrow-lend market; `operation` gives the direction and
134
+ * `amount` is unsigned. `interestAmount` is the accrued interest that
135
+ * `amount` includes on a `withdraw` or `repay`, and `"0.0"` otherwise.
136
+ * @public
137
+ */
138
+ export type HlBorrowLendDelta = {
139
+ type: 'borrowLend';
140
+ token: string;
141
+ operation: HlBorrowLendOperation;
142
+ amount: string;
143
+ interestAmount: string;
144
+ };
116
145
  /**
117
146
  * Union of known Hyperliquid non-funding ledger deltas plus an open fallback
118
147
  * for endpoint variants the provider does not map.
119
148
  * @public
120
149
  */
121
- export type HlLedgerDelta = HlSpotTransferDelta | HlSendAssetDelta | HlCollateralTransferDelta | HlVaultTransferDelta | HlDepositDelta | HlWithdrawDelta | HlLiquidationDelta | {
150
+ export type HlLedgerDelta = HlSpotTransferDelta | HlSendAssetDelta | HlCollateralTransferDelta | HlVaultTransferDelta | HlDepositDelta | HlWithdrawDelta | HlLiquidationDelta | HlCStakingTransferDelta | HlBorrowLendDelta | {
122
151
  type: string;
123
152
  usdc?: string;
124
153
  [key: string]: unknown;
@@ -157,6 +186,18 @@ export declare const isWithdrawDelta: (delta: HlLedgerDelta) => delta is HlWithd
157
186
  * @public
158
187
  */
159
188
  export declare const isLiquidationDelta: (delta: HlLedgerDelta) => delta is HlLiquidationDelta;
189
+ /**
190
+ * Type guard for `HlCStakingTransferDelta`. `isDeposit` is part of the guard:
191
+ * a row without a boolean `isDeposit` names no direction for the movement.
192
+ * @public
193
+ */
194
+ export declare const isCStakingTransferDelta: (delta: HlLedgerDelta) => delta is HlCStakingTransferDelta;
195
+ /**
196
+ * Type guard for `HlBorrowLendDelta`. The operation is part of the guard: an
197
+ * unknown operation names no direction for the movement.
198
+ * @public
199
+ */
200
+ export declare const isBorrowLendDelta: (delta: HlLedgerDelta) => delta is HlBorrowLendDelta;
160
201
  /**
161
202
  * One timestamped non-funding ledger update. `time` is milliseconds since
162
203
  * epoch and `hash` is the upstream transaction identifier.
@@ -1 +1 @@
1
- {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../src/types/ledger.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ledger.d.ts","sourceRoot":"","sources":["../../../src/types/ledger.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { ActivityItem, FundingActivity, LiquidationActivity, MarketDisplay
3
3
  import type { HlFundingUpdate, HlLedgerUpdate, HlUserFill } from '../types/index.js';
4
4
  /**
5
5
  * Map supported ledger entries; exclude same-account moves and unsupported types.
6
+ * Staking and borrow-lend moves map with the queried account as counterparty.
6
7
  * Missing assets throw; unresolved liquidation markets omit only those positions.
7
8
  * @public
8
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mapActivity.d.ts","sourceRoot":"","sources":["../../../src/utils/mapActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACV,YAAY,EAIZ,eAAe,EACf,mBAAmB,EACnB,aAAa,EAGd,MAAM,mBAAmB,CAAA;AAG1B,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACd,UAAU,EACX,MAAM,mBAAmB,CAAA;AA8C1B;;;;GAIG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,EACrB,aAAa,MAAM,EACnB,gBAAgB,MAAM,EACtB,eAAe,aAAa,EAC5B,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,KACzD,YAAY,GAAG,IA+JjB,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,eAAe,EACtB,aAAa,MAAM,EACnB,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,KACzD,eAAe,GAAG,IAgBpB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EAAE,EACnB,aAAa,MAAM,EACnB,gBAAgB,MAAM,EACtB,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,EAC1D,cAAc,WAAW,CAAC,MAAM,CAAC,KAChC,mBAAmB,EA4CrB,CAAA"}
1
+ {"version":3,"file":"mapActivity.d.ts","sourceRoot":"","sources":["../../../src/utils/mapActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAInB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACV,YAAY,EAIZ,eAAe,EACf,mBAAmB,EACnB,aAAa,EAGd,MAAM,mBAAmB,CAAA;AAI1B,OAAO,KAAK,EAEV,eAAe,EACf,cAAc,EACd,UAAU,EACX,MAAM,mBAAmB,CAAA;AA2D1B;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GACzB,OAAO,cAAc,EACrB,aAAa,MAAM,EACnB,gBAAgB,MAAM,EACtB,eAAe,aAAa,EAC5B,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,KACzD,YAAY,GAAG,IAuMjB,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,kBAAkB,GAC7B,OAAO,eAAe,EACtB,aAAa,MAAM,EACnB,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,KACzD,eAAe,GAAG,IAgBpB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,UAAU,EAAE,EACnB,aAAa,MAAM,EACnB,gBAAgB,MAAM,EACtB,eAAe,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,GAAG,SAAS,EAC1D,cAAc,WAAW,CAAC,MAAM,CAAC,KAChC,mBAAmB,EA4CrB,CAAA"}
@@ -9,7 +9,8 @@ import type { HlAbstractionMode, HlClearinghouseState, HlSpotClearinghouseState
9
9
  *
10
10
  * @param quoteAssetId - `Asset.id` the perps-route row is keyed by.
11
11
  * @param withdrawalFee - Flat venue fee in quote-asset units, set on every
12
- * quote-asset row. Absent leaves every row without a fee.
12
+ * quote-asset row. Hyperliquid deducts it from the requested amount. Absent
13
+ * leaves every row without a fee.
13
14
  * @public
14
15
  */
15
16
  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,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAClE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,mBAAmB,CAAA;AAK1B;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,+BAA+B,GAC1C,aAAa,iBAAiB,GAAG,IAAI,EACrC,OAAO,oBAAoB,EAC3B,WAAW,wBAAwB,EACnC,cAAc,MAAM,EACpB,gBAAgB,MAAM,KACrB,2BAA2B,EAwC7B,CAAA"}
1
+ {"version":3,"file":"withdrawableBalances.d.ts","sourceRoot":"","sources":["../../../src/utils/withdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAA;AAClE,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,EA4C7B,CAAA"}
@@ -32,7 +32,12 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
32
32
  private readonly client;
33
33
  private readonly registry;
34
34
  private readonly abstractionByUser;
35
+ private readonly summaryUsers;
36
+ private readonly abstractionReadsByUser;
35
37
  private readonly spotRefs;
38
+ private spotWireEpoch;
39
+ private readonly latestSpotByUser;
40
+ private readonly revalueSpotBalances;
36
41
  private readonly unifiedSummaryByUser;
37
42
  private readonly latestPerpsByUser;
38
43
  private readonly heldSummaryByUser;
@@ -136,6 +141,7 @@ export declare class HyperliquidWsProvider extends WsProviderBase<object> {
136
141
  private fetchAbstractionMode;
137
142
  private handleActiveAssetData;
138
143
  private handleSpotState;
144
+ private emitSpotBalances;
139
145
  /** Read the venue buying power over REST when the spot frame omits it. */
140
146
  private fetchAvailableAfterMaintenance;
141
147
  }
@@ -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":"AAAA,OAAO,EAOL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAGzB,cAAc,EACd,KAAK,iBAAiB,EAEtB,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAOV,YAAY,EACb,MAAM,mBAAmB,CAAA;AAyE1B;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,QAAO,iBAKtC,CAAA;AAEH;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,SAAQ,cAAc,CAAC,MAAM,CAAC;IAC/D,OAAO,CAAC,eAAe,CAAoB;IAC3C,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA4B;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAG/B;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IACjD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA4B;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuC;IACxE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAInC;IAID,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAQlC;IAGH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAG/B;IACH,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAQ/B;IACH,OAAO,CAAC,eAAe,CAAsD;IAC7E,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,wBAAwB,CAAoC;IACpE,OAAO,CAAC,uBAAuB,CAAiC;IAChE,OAAO,CAAC,yBAAyB,CAAuC;IAKxE,OAAO,CAAC,iBAAiB,CAAuC;IAChE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CACW;IAM/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAG/B;IACD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG9B;IACD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAG9B;IACD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAGpC;IACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAGhC;gBAEW,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc;IAYxD,SAAS,CACtB,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,oBAAoB,EAC9B,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,IAAI,CAAC;IAuBhB,cAAc,CAClB,MAAM,EAAE,sBAAsB,EAC9B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,IAAI,CAAC;cAkBN,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IA6InE;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IAoB5B,OAAO,CAAC,iBAAiB;IAmBzB;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAWnC,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,gBAAgB;cAcL,OAAO,IAAI,IAAI;IA0BlC,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAM9C,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;IA8B1C,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,uBAAuB;IAa/B,OAAO,CAAC,WAAW;IAuDnB,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM;IAiFnC,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,SAAS;IAUjB,oFAAoF;IACpF,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,oBAAoB;IAe5B;;;;;;OAMG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,oBAAoB;IAe5B,OAAO,CAAC,wBAAwB;IAchC,sEAAsE;IACtE,OAAO,CAAC,UAAU;IAuBlB,OAAO,CAAC,uBAAuB;IAgB/B,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,QAAQ;IAkBhB,OAAO,CAAC,oBAAoB;IAmC5B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,YAAY;IAsBpB,OAAO,CAAC,kBAAkB;IAyE1B,OAAO,CAAC,eAAe;IAqBvB,OAAO,CAAC,+BAA+B;IA6CvC;0EACsE;IACtE,OAAO,CAAC,MAAM,CAAC,oBAAoB;YAOrB,eAAe;IA8C7B,8EAA8E;IAC9E,OAAO,CAAC,mBAAmB;IA8B3B,OAAO,CAAC,kBAAkB;IA+B1B;2EACuE;IACvE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAEnD;;+BAE2B;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAM;IAEjD,OAAO,CAAC,uBAAuB;IA4C/B,OAAO,CAAC,oBAAoB;IAsD5B,OAAO,CAAC,qBAAqB;IAqB7B,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,gBAAgB;IAuCxB,0EAA0E;IAC1E,OAAO,CAAC,8BAA8B;CAsCvC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lifi/perps-sdk-provider-hyperliquid",
3
- "version": "19.0.0",
3
+ "version": "20.1.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": "^17.0.0"
52
+ "@lifi/perps-types": "^18.0.0"
53
53
  },
54
54
  "peerDependencies": {
55
- "@lifi/perps-sdk": "^19.0.0"
55
+ "@lifi/perps-sdk": "^20.1.0"
56
56
  },
57
57
  "publishConfig": {
58
58
  "access": "public"
@@ -363,7 +363,7 @@ export function hyperliquidProvider(
363
363
  getMarketSettings: (
364
364
  params: ProviderGetMarketSettingsParams,
365
365
  opts?: SDKRequestOptions
366
- ): Promise<MarketSettings | undefined> =>
366
+ ): Promise<MarketSettings> =>
367
367
  getMarketSettings(
368
368
  contextRef.require(),
369
369
  { address: params.address, market: params.market },
@@ -1,6 +1,8 @@
1
1
  import {
2
2
  getMarketRegistry,
3
3
  getMarketsContext,
4
+ maxOf,
5
+ minOf,
4
6
  type ProviderGetAccountParams,
5
7
  type SDKRequestOptions,
6
8
  stringToFloat,
@@ -14,7 +16,7 @@ import type {
14
16
  HyperliquidDexAccountState,
15
17
  Position,
16
18
  } from '@lifi/perps-types'
17
- import type Big from 'big.js'
19
+ import Big from 'big.js'
18
20
  import { PROVIDER_KEY } from '../constants.js'
19
21
  import type { HyperliquidContext } from '../context.js'
20
22
  import type {
@@ -66,13 +68,6 @@ interface BalancePartition {
66
68
  collateralBalances: Balance[]
67
69
  }
68
70
 
69
- const transferableWithin = (venueFigure: Big, units: Big): string => {
70
- if (venueFigure.lt(0)) {
71
- return '0'
72
- }
73
- return (venueFigure.gt(units) ? units : venueFigure).toFixed()
74
- }
75
-
76
71
  const buildBalances = (
77
72
  abstraction: HlAbstractionMode | null,
78
73
  spotState: HlSpotClearinghouseState,
@@ -84,7 +79,19 @@ const buildBalances = (
84
79
  const { balances, collateralBalances } = partitionSpotBalances(
85
80
  spotState.balances
86
81
  .filter((b) => !assetIsOutcome(b.coin))
87
- .map((b) => spotBalance(spotAssetFromToken(b), b.total, priceById)),
82
+ .map((b) => {
83
+ const total = toWireBig(b.total, 'spotClearinghouseState.total')
84
+ return {
85
+ ...spotBalance(spotAssetFromToken(b), b.total, priceById),
86
+ transferable: minOf(
87
+ maxOf(
88
+ total.minus(toWireBig(b.hold, 'spotClearinghouseState.hold')),
89
+ new Big(0)
90
+ ),
91
+ total
92
+ ).toFixed(),
93
+ }
94
+ }),
88
95
  quoteAssetIds
89
96
  )
90
97
 
@@ -107,10 +114,13 @@ const buildBalances = (
107
114
  units: value.toFixed(),
108
115
  valueUsd: value.toFixed(),
109
116
  price: '1',
110
- transferable: transferableWithin(
111
- toWireBig(state.withdrawable, 'clearinghouseState.withdrawable'),
117
+ transferable: minOf(
118
+ maxOf(
119
+ toWireBig(state.withdrawable, 'clearinghouseState.withdrawable'),
120
+ new Big(0)
121
+ ),
112
122
  value
113
- ),
123
+ ).toFixed(),
114
124
  })
115
125
  }
116
126
  }
@@ -2,6 +2,7 @@ import {
2
2
  type AssetRegistry,
3
3
  getAssetRegistry,
4
4
  getMarketRegistry,
5
+ PerpsError,
5
6
  type SDKRequestOptions,
6
7
  } from '@lifi/perps-sdk'
7
8
  import type {
@@ -10,13 +11,9 @@ import type {
10
11
  FundingActivity,
11
12
  MarketDisplay,
12
13
  } from '@lifi/perps-types'
13
- import { ActivityType } from '@lifi/perps-types'
14
+ import { ActivityType, PerpsErrorCode } from '@lifi/perps-types'
14
15
  import type { Address } from 'viem'
15
- import {
16
- DEFAULT_HISTORY_LIMIT,
17
- MAX_HISTORY_LIMIT,
18
- PROVIDER_KEY,
19
- } from '../constants.js'
16
+ import { PROVIDER_KEY } from '../constants.js'
20
17
  import type { HyperliquidContext } from '../context.js'
21
18
  import type {
22
19
  HlUserFills,
@@ -24,7 +21,9 @@ import type {
24
21
  HlUserNonFundingLedgerUpdates,
25
22
  } from '../types/index.js'
26
23
  import {
24
+ isBorrowLendDelta,
27
25
  isCollateralTransferDelta,
26
+ isCStakingTransferDelta,
28
27
  isDepositDelta,
29
28
  isLiquidationDelta,
30
29
  isSendAssetDelta,
@@ -42,6 +41,7 @@ import {
42
41
  type InfoRequestOptions,
43
42
  infoRequest,
44
43
  } from '../utils/infoClient.js'
44
+ import { getHistoryLimit, historyPage } from './historyPagination.js'
45
45
 
46
46
  /**
47
47
  * Parameters for {@link getActivity}.
@@ -50,9 +50,9 @@ import {
50
50
  */
51
51
  export interface GetActivityParams {
52
52
  address: Address
53
- /** Maximum items returned; defaults to 50 and is capped at 200. */
53
+ /** Positive safe integer; defaults to 50 and is capped at 200. */
54
54
  limit?: number
55
- /** Millisecond timestamp cursor; rows strictly older than it are returned. */
55
+ /** Opaque cursor returned in the previous page's `pagination.cursor`. */
56
56
  cursor?: string
57
57
  /** Inclusive lower bound in milliseconds since epoch. */
58
58
  startTime?: number
@@ -76,23 +76,100 @@ const ASSET_BEARING_TYPES: ReadonlySet<ActivityType> = new Set([
76
76
  const needsMarkets = (typeFilter: ActivityType[] | undefined): boolean =>
77
77
  !typeFilter || typeFilter.some((t) => MARKET_BEARING_TYPES.has(t))
78
78
 
79
+ const fetchLiquidationHistory = async (
80
+ apiUrl: string,
81
+ user: Address,
82
+ startTime: number,
83
+ endTime: number,
84
+ resolveMarket: (coin: string) => MarketDisplay | undefined,
85
+ options?: InfoRequestOptions
86
+ ): Promise<ActivityItem[]> => {
87
+ const retained = new Map<number, HlUserFills[number]>()
88
+ while (startTime <= endTime) {
89
+ options?.signal?.throwIfAborted()
90
+ const fills = await infoRequest<HlUserFills>(
91
+ apiUrl,
92
+ { type: 'userFillsByTime', user, startTime, endTime },
93
+ options
94
+ )
95
+ options?.signal?.throwIfAborted()
96
+ let latest = startTime
97
+ for (const fill of fills) {
98
+ retained.set(fill.tid, fill)
99
+ latest = Math.max(latest, fill.time)
100
+ }
101
+ if (fills.length < 2000 || retained.size >= 10000) {
102
+ break
103
+ }
104
+ if (latest === startTime) {
105
+ throw new PerpsError(
106
+ PerpsErrorCode.ThirdPartyError,
107
+ 'Hyperliquid fills saturate a single millisecond; liquidation history cannot be paginated safely'
108
+ )
109
+ }
110
+ // Inclusive overlap retains all same-time fills at the venue page boundary.
111
+ startTime = latest
112
+ }
113
+ const queried = user.toLowerCase()
114
+ const fills = [...retained.values()].filter(
115
+ (fill) => fill.liquidation?.liquidatedUser.toLowerCase() === queried
116
+ )
117
+ if (fills.length === 0) {
118
+ return []
119
+ }
120
+ const hashes = new Set<string>()
121
+ let firstTime = Infinity
122
+ let lastTime = 0
123
+ for (const fill of fills) {
124
+ if (fill.hash !== undefined) {
125
+ hashes.add(fill.hash)
126
+ }
127
+ firstTime = Math.min(firstTime, fill.time)
128
+ lastTime = Math.max(lastTime, fill.time)
129
+ }
130
+ // Exclusions must cover the entire order, not the current SDK page's ledger window.
131
+ const ledger = await historyPage(
132
+ { startTime: firstTime, endTime: lastTime },
133
+ Number.MAX_SAFE_INTEGER,
134
+ async (startTime, endTime) => {
135
+ const updates = await infoRequest<HlUserNonFundingLedgerUpdates>(
136
+ apiUrl,
137
+ { type: 'userNonFundingLedgerUpdates', user, startTime, endTime },
138
+ options
139
+ )
140
+ return {
141
+ items: updates.filter(
142
+ (entry) => isLiquidationDelta(entry.delta) && hashes.has(entry.hash)
143
+ ),
144
+ saturated: updates.length >= 500,
145
+ }
146
+ },
147
+ (entry) => ({ time: entry.time, key: entry.hash }),
148
+ options?.signal
149
+ )
150
+ return mapLiquidationFills(
151
+ fills,
152
+ PROVIDER_KEY,
153
+ user,
154
+ resolveMarket,
155
+ new Set(ledger.items.map((entry) => entry.hash))
156
+ )
157
+ }
158
+
79
159
  const fetchActivityData = async (
80
160
  apiUrl: string,
81
161
  typeFilter: ActivityType[] | undefined,
82
- timeParams: { user: Address; startTime?: number; endTime?: number },
162
+ timeParams: { user: Address; startTime: number; endTime: number },
83
163
  assetRegistry: AssetRegistry,
84
164
  resolveMarket: (coin: string) => MarketDisplay | undefined,
165
+ liquidationHistory: Promise<ActivityItem[]> | undefined,
85
166
  options?: InfoRequestOptions
86
- ): Promise<ActivityItem[]> => {
167
+ ): Promise<{ items: ActivityItem[]; saturated: boolean }> => {
87
168
  const needLedger =
88
169
  !typeFilter || typeFilter.some((t) => t !== ActivityType.FUNDING)
89
170
  const needFunding = !typeFilter || typeFilter.includes(ActivityType.FUNDING)
90
- // A liquidation executed as a market order reaches the account as fills
91
- // with a `liquidation` field and never as a ledger `liquidation` delta.
92
- const needLiquidationFills =
93
- !typeFilter || typeFilter.includes(ActivityType.LIQUIDATION)
94
171
 
95
- const [ledgerUpdates, fundingUpdates, fills] = await Promise.all([
172
+ const [ledgerUpdates, fundingUpdates, liquidations] = await Promise.all([
96
173
  needLedger
97
174
  ? infoRequest<HlUserNonFundingLedgerUpdates>(
98
175
  apiUrl,
@@ -107,16 +184,11 @@ const fetchActivityData = async (
107
184
  options
108
185
  )
109
186
  : Promise.resolve([] as HlUserFunding),
110
- needLiquidationFills
111
- ? infoRequest<HlUserFills>(
112
- apiUrl,
113
- timeParams.startTime === undefined
114
- ? { type: 'userFills', user: timeParams.user }
115
- : { type: 'userFillsByTime', ...timeParams },
116
- options
117
- )
118
- : Promise.resolve([] as HlUserFills),
187
+ liquidationHistory,
119
188
  ])
189
+ if (ledgerUpdates.length >= 500 || fundingUpdates.length >= 500) {
190
+ return { items: [], saturated: true }
191
+ }
120
192
 
121
193
  const ledgerItems: ActivityItem[] = ledgerUpdates.flatMap(
122
194
  (entry): ActivityItem[] => {
@@ -130,7 +202,9 @@ const fetchActivityData = async (
130
202
  (isSpotTransferDelta(entry.delta) ||
131
203
  isSendAssetDelta(entry.delta) ||
132
204
  isCollateralTransferDelta(entry.delta) ||
133
- isVaultTransferDelta(entry.delta))))
205
+ isVaultTransferDelta(entry.delta) ||
206
+ isCStakingTransferDelta(entry.delta) ||
207
+ isBorrowLendDelta(entry.delta))))
134
208
  ) {
135
209
  return []
136
210
  }
@@ -152,46 +226,20 @@ const fetchActivityData = async (
152
226
  }
153
227
  )
154
228
 
155
- const ledgerLiquidationHashes = new Set(
156
- ledgerUpdates
157
- .filter((entry) => isLiquidationDelta(entry.delta))
158
- .map((entry) => entry.hash)
159
- )
160
- const liquidationItems = mapLiquidationFills(
161
- fills,
162
- PROVIDER_KEY,
163
- timeParams.user,
164
- resolveMarket,
165
- ledgerLiquidationHashes
166
- )
167
-
168
- const merged = [...ledgerItems, ...fundingItems, ...liquidationItems].sort(
169
- (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()
170
- )
171
-
172
- if (!typeFilter) {
173
- return merged
174
- }
175
- const typeSet = new Set(typeFilter)
176
- return merged.filter((item) => typeSet.has(item.type))
229
+ const merged = [...ledgerItems, ...fundingItems, ...(liquidations ?? [])]
230
+ const items = typeFilter
231
+ ? merged.filter((item) => typeFilter.includes(item.type))
232
+ : merged
233
+ return { items, saturated: false }
177
234
  }
178
235
 
179
- /**
180
- * Fetch a chronological activity feed (deposits, withdrawals, transfers,
181
- * liquidations, funding) for `address`. Combines results from Hyperliquid's
182
- * `userNonFundingLedgerUpdates`, `userFunding`, and `userFills` endpoints,
183
- * sorted newest-first.
184
- *
185
- * Cursor-based pagination uses the ms-since-epoch timestamp of the last item
186
- * on the current page.
187
- * @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
188
- * @public
189
- */
236
+ /** Fetch retained activity newest-first with opaque cursors across inclusive time ranges. */
190
237
  export const getActivity = async (
191
238
  { client, apiUrl }: HyperliquidContext,
192
239
  params: GetActivityParams,
193
240
  options?: SDKRequestOptions
194
241
  ): Promise<ActivitiesResponse> => {
242
+ const limit = getHistoryLimit(params.limit)
195
243
  const registry = getMarketRegistry(client, PROVIDER_KEY)
196
244
  // Only funding and liquidation rows carry a market, so a Ledger-only
197
245
  // request must not pull the market list.
@@ -207,53 +255,38 @@ export const getActivity = async (
207
255
  }
208
256
  const infoOpts = hlInfoOptions(client, options)
209
257
 
210
- const limit = Math.min(
211
- params.limit ?? DEFAULT_HISTORY_LIMIT,
212
- MAX_HISTORY_LIMIT
213
- )
214
- const timeParams = {
215
- user: params.address,
216
- ...(params.startTime !== undefined || params.endTime !== undefined
217
- ? { startTime: params.startTime ?? 0 }
218
- : {}),
219
- ...(params.endTime === undefined ? {} : { endTime: params.endTime }),
220
- }
221
-
222
- // `get`, not `require`: a coin the backend market list does not hold drops
223
- // only its own row instead of rejecting the whole feed. The registry warns
224
- // once per unresolved id. A delisted market still resolves, so its rows stay.
225
- const merged = await fetchActivityData(
226
- apiUrl,
227
- params.type,
228
- timeParams,
229
- assetRegistry,
230
- (coin) => registry.get(coin),
231
- infoOpts
232
- )
233
-
234
- // Drop boundary items so the next page does not return the cursor row twice.
235
- const filtered =
236
- params.cursor === undefined
237
- ? merged
238
- : merged.filter(
239
- (item) =>
240
- new Date(item.timestamp).getTime() <
241
- Number.parseInt(params.cursor!, 10)
258
+ const needLiquidationFills =
259
+ !params.type || params.type.includes(ActivityType.LIQUIDATION)
260
+ let liquidationHistory: Promise<ActivityItem[]> | undefined
261
+ const page = await historyPage(
262
+ params,
263
+ limit,
264
+ (startTime, endTime, snapshotEnd) => {
265
+ if (needLiquidationFills && liquidationHistory === undefined) {
266
+ liquidationHistory = fetchLiquidationHistory(
267
+ apiUrl,
268
+ params.address,
269
+ params.startTime ?? 0,
270
+ snapshotEnd,
271
+ (coin) => registry.get(coin),
272
+ infoOpts
242
273
  )
243
-
244
- const hasMore = filtered.length > limit
245
- const items = filtered.slice(0, limit)
246
-
247
- return {
248
- provider: PROVIDER_KEY,
249
- items,
250
- pagination: {
251
- limit,
252
- hasMore,
253
- cursor:
254
- items.length > 0
255
- ? String(new Date(items[items.length - 1].timestamp).getTime())
256
- : undefined,
274
+ }
275
+ return fetchActivityData(
276
+ apiUrl,
277
+ params.type,
278
+ { user: params.address, startTime, endTime },
279
+ assetRegistry,
280
+ (coin) => registry.get(coin),
281
+ liquidationHistory,
282
+ infoOpts
283
+ )
257
284
  },
258
- }
285
+ (item) => ({
286
+ time: new Date(item.timestamp).getTime(),
287
+ key: `${item.type}:${item.id}`,
288
+ }),
289
+ options?.signal
290
+ )
291
+ return { provider: PROVIDER_KEY, ...page }
259
292
  }