@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.
- package/README.md +56 -0
- package/dist/cjs/HyperliquidProvider.js.map +1 -1
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +12 -8
- package/dist/cjs/services/getAccount.js.map +1 -1
- package/dist/cjs/services/getActivity.d.ts.map +1 -1
- package/dist/cjs/services/getActivity.js +71 -45
- package/dist/cjs/services/getActivity.js.map +1 -1
- package/dist/cjs/services/getFills.d.ts.map +1 -1
- package/dist/cjs/services/getFills.js +30 -38
- package/dist/cjs/services/getFills.js.map +1 -1
- package/dist/cjs/services/getMarketSettings.d.ts +2 -2
- package/dist/cjs/services/getMarketSettings.d.ts.map +1 -1
- package/dist/cjs/services/getMarketSettings.js +8 -3
- package/dist/cjs/services/getMarketSettings.js.map +1 -1
- package/dist/cjs/services/historyPagination.d.ts +22 -0
- package/dist/cjs/services/historyPagination.d.ts.map +1 -0
- package/dist/cjs/services/historyPagination.js +125 -0
- package/dist/cjs/services/historyPagination.js.map +1 -0
- package/dist/cjs/types/ledger.d.ts +17 -1
- package/dist/cjs/types/ledger.d.ts.map +1 -1
- package/dist/cjs/types/ledger.js +10 -1
- package/dist/cjs/types/ledger.js.map +1 -1
- package/dist/cjs/utils/mapActivity.d.ts.map +1 -1
- package/dist/cjs/utils/mapActivity.js +41 -0
- package/dist/cjs/utils/mapActivity.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +3 -1
- package/dist/cjs/utils/withdrawableBalances.js.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts +6 -0
- package/dist/cjs/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/cjs/websocket/HyperliquidWsProvider.js +129 -37
- package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/esm/HyperliquidProvider.js.map +1 -1
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +10 -9
- package/dist/esm/services/getAccount.js.map +1 -1
- package/dist/esm/services/getActivity.d.ts +3 -13
- package/dist/esm/services/getActivity.d.ts.map +1 -1
- package/dist/esm/services/getActivity.js +78 -66
- package/dist/esm/services/getActivity.js.map +1 -1
- package/dist/esm/services/getFills.d.ts +2 -14
- package/dist/esm/services/getFills.d.ts.map +1 -1
- package/dist/esm/services/getFills.js +32 -58
- package/dist/esm/services/getFills.js.map +1 -1
- package/dist/esm/services/getMarketSettings.d.ts +5 -3
- package/dist/esm/services/getMarketSettings.d.ts.map +1 -1
- package/dist/esm/services/getMarketSettings.js +13 -7
- package/dist/esm/services/getMarketSettings.js.map +1 -1
- package/dist/esm/services/historyPagination.d.ts +22 -0
- package/dist/esm/services/historyPagination.d.ts.map +1 -0
- package/dist/esm/services/historyPagination.js +121 -0
- package/dist/esm/services/historyPagination.js.map +1 -0
- package/dist/esm/types/ledger.d.ts +42 -1
- package/dist/esm/types/ledger.d.ts.map +1 -1
- package/dist/esm/types/ledger.js +17 -0
- package/dist/esm/types/ledger.js.map +1 -1
- package/dist/esm/utils/mapActivity.d.ts +1 -0
- package/dist/esm/utils/mapActivity.d.ts.map +1 -1
- package/dist/esm/utils/mapActivity.js +49 -1
- package/dist/esm/utils/mapActivity.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts +2 -1
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +5 -2
- package/dist/esm/utils/withdrawableBalances.js.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts +6 -0
- package/dist/esm/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/dist/esm/websocket/HyperliquidWsProvider.js +131 -49
- package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/types/services/getAccount.d.ts.map +1 -1
- package/dist/types/services/getActivity.d.ts +3 -13
- package/dist/types/services/getActivity.d.ts.map +1 -1
- package/dist/types/services/getFills.d.ts +2 -14
- package/dist/types/services/getFills.d.ts.map +1 -1
- package/dist/types/services/getMarketSettings.d.ts +5 -3
- package/dist/types/services/getMarketSettings.d.ts.map +1 -1
- package/dist/types/services/historyPagination.d.ts +22 -0
- package/dist/types/services/historyPagination.d.ts.map +1 -0
- package/dist/types/types/ledger.d.ts +42 -1
- package/dist/types/types/ledger.d.ts.map +1 -1
- package/dist/types/utils/mapActivity.d.ts +1 -0
- package/dist/types/utils/mapActivity.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts +2 -1
- package/dist/types/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/types/websocket/HyperliquidWsProvider.d.ts +6 -0
- package/dist/types/websocket/HyperliquidWsProvider.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/HyperliquidProvider.ts +1 -1
- package/src/services/getAccount.ts +22 -12
- package/src/services/getActivity.ts +138 -105
- package/src/services/getFills.ts +42 -95
- package/src/services/getMarketSettings.ts +20 -8
- package/src/services/historyPagination.ts +169 -0
- package/src/types/ledger.ts +61 -0
- package/src/utils/mapActivity.ts +56 -0
- package/src/utils/withdrawableBalances.ts +8 -3
- 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;
|
|
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.
|
|
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
|
|
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":"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;
|
|
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": "
|
|
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": "^
|
|
52
|
+
"@lifi/perps-types": "^18.0.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@lifi/perps-sdk": "^
|
|
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
|
|
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
|
|
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) =>
|
|
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:
|
|
111
|
-
|
|
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
|
-
/**
|
|
53
|
+
/** Positive safe integer; defaults to 50 and is capped at 200. */
|
|
54
54
|
limit?: number
|
|
55
|
-
/**
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
|
211
|
-
params.
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
}
|