@lifi/perps-sdk-provider-hyperliquid 20.0.0 → 21.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.
- package/README.md +45 -0
- package/dist/cjs/HyperliquidProvider.d.ts.map +1 -1
- package/dist/cjs/HyperliquidProvider.js +2 -2
- package/dist/cjs/HyperliquidProvider.js.map +1 -1
- package/dist/cjs/services/getAccount.d.ts.map +1 -1
- package/dist/cjs/services/getAccount.js +5 -7
- 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 +68 -44
- 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/getWithdrawableBalances.js +1 -1
- package/dist/cjs/services/getWithdrawableBalances.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/utils/index.d.ts +1 -1
- package/dist/cjs/utils/index.d.ts.map +1 -1
- package/dist/cjs/utils/index.js +3 -3
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/liquidation.js +1 -1
- package/dist/cjs/utils/liquidation.js.map +1 -1
- package/dist/cjs/utils/orderFormatting.d.ts +3 -2
- package/dist/cjs/utils/orderFormatting.d.ts.map +1 -1
- package/dist/cjs/utils/orderFormatting.js +4 -4
- package/dist/cjs/utils/orderFormatting.js.map +1 -1
- package/dist/cjs/utils/spotBalance.d.ts.map +1 -1
- package/dist/cjs/utils/spotBalance.js +2 -2
- package/dist/cjs/utils/spotBalance.js.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts +1 -1
- package/dist/cjs/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/cjs/utils/withdrawableBalances.js +7 -4
- 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 +135 -37
- package/dist/cjs/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/esm/HyperliquidProvider.d.ts.map +1 -1
- package/dist/esm/HyperliquidProvider.js +3 -3
- package/dist/esm/HyperliquidProvider.js.map +1 -1
- package/dist/esm/services/getAccount.d.ts.map +1 -1
- package/dist/esm/services/getAccount.js +6 -5
- 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 +74 -64
- 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/getWithdrawableBalances.js +1 -1
- package/dist/esm/services/getWithdrawableBalances.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/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/liquidation.js +2 -2
- package/dist/esm/utils/liquidation.js.map +1 -1
- package/dist/esm/utils/orderFormatting.d.ts +14 -12
- package/dist/esm/utils/orderFormatting.d.ts.map +1 -1
- package/dist/esm/utils/orderFormatting.js +14 -14
- package/dist/esm/utils/orderFormatting.js.map +1 -1
- package/dist/esm/utils/spotBalance.d.ts.map +1 -1
- package/dist/esm/utils/spotBalance.js +3 -3
- package/dist/esm/utils/spotBalance.js.map +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts +1 -1
- package/dist/esm/utils/withdrawableBalances.d.ts.map +1 -1
- package/dist/esm/utils/withdrawableBalances.js +7 -4
- 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 +138 -50
- package/dist/esm/websocket/HyperliquidWsProvider.js.map +1 -1
- package/dist/types/HyperliquidProvider.d.ts.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/historyPagination.d.ts +22 -0
- package/dist/types/services/historyPagination.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +1 -1
- package/dist/types/utils/index.d.ts.map +1 -1
- package/dist/types/utils/orderFormatting.d.ts +14 -12
- package/dist/types/utils/orderFormatting.d.ts.map +1 -1
- package/dist/types/utils/spotBalance.d.ts.map +1 -1
- package/dist/types/utils/withdrawableBalances.d.ts +1 -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 +6 -5
- package/src/services/getAccount.ts +18 -18
- package/src/services/getActivity.ts +133 -104
- package/src/services/getFills.ts +42 -95
- package/src/services/getWithdrawableBalances.ts +1 -1
- package/src/services/historyPagination.ts +169 -0
- package/src/utils/index.ts +2 -2
- package/src/utils/liquidation.ts +2 -2
- package/src/utils/orderFormatting.ts +20 -16
- package/src/utils/spotBalance.ts +5 -3
- package/src/utils/withdrawableBalances.ts +12 -7
- package/src/websocket/HyperliquidWsProvider.ts +151 -63
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccount.js","sourceRoot":"","sources":["../../../src/services/getAccount.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"getAccount.js","sourceRoot":"","sources":["../../../src/services/getAccount.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,9 +10,9 @@ import type { HyperliquidContext } from '../context.js';
|
|
|
10
10
|
*/
|
|
11
11
|
export interface GetActivityParams {
|
|
12
12
|
address: Address;
|
|
13
|
-
/**
|
|
13
|
+
/** Positive safe integer; defaults to 50 and is capped at 200. */
|
|
14
14
|
limit?: number;
|
|
15
|
-
/**
|
|
15
|
+
/** Opaque cursor returned in the previous page's `pagination.cursor`. */
|
|
16
16
|
cursor?: string;
|
|
17
17
|
/** Inclusive lower bound in milliseconds since epoch. */
|
|
18
18
|
startTime?: number;
|
|
@@ -21,16 +21,6 @@ export interface GetActivityParams {
|
|
|
21
21
|
/** Optional normalized activity-type filter applied after mapping. */
|
|
22
22
|
type?: ActivityType[];
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Fetch a chronological activity feed (deposits, withdrawals, transfers,
|
|
26
|
-
* liquidations, funding) for `address`. Combines results from Hyperliquid's
|
|
27
|
-
* `userNonFundingLedgerUpdates`, `userFunding`, and `userFills` endpoints,
|
|
28
|
-
* sorted newest-first.
|
|
29
|
-
*
|
|
30
|
-
* Cursor-based pagination uses the ms-since-epoch timestamp of the last item
|
|
31
|
-
* on the current page.
|
|
32
|
-
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
33
|
-
* @public
|
|
34
|
-
*/
|
|
24
|
+
/** Fetch retained activity newest-first with opaque cursors across inclusive time ranges. */
|
|
35
25
|
export declare const getActivity: ({ client, apiUrl }: HyperliquidContext, params: GetActivityParams, options?: SDKRequestOptions) => Promise<ActivitiesResponse>;
|
|
36
26
|
//# sourceMappingURL=getActivity.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getActivity.d.ts","sourceRoot":"","sources":["../../../src/services/getActivity.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"getActivity.d.ts","sourceRoot":"","sources":["../../../src/services/getActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EACV,kBAAkB,EAInB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,YAAY,EAAkB,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AA6BvD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,IAAI,CAAC,EAAE,YAAY,EAAE,CAAA;CACtB;AA6KD,6FAA6F;AAC7F,eAAO,MAAM,WAAW,GACtB,oBAAoB,kBAAkB,EACtC,QAAQ,iBAAiB,EACzB,UAAU,iBAAiB,KAC1B,OAAO,CAAC,kBAAkB,CAmD5B,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { getAssetRegistry, getMarketRegistry, } from '@lifi/perps-sdk';
|
|
2
|
-
import { ActivityType } from '@lifi/perps-types';
|
|
3
|
-
import {
|
|
1
|
+
import { getAssetRegistry, getMarketRegistry, PerpsError, } from '@lifi/perps-sdk';
|
|
2
|
+
import { ActivityType, PerpsErrorCode } from '@lifi/perps-types';
|
|
3
|
+
import { PROVIDER_KEY } from '../constants.js';
|
|
4
4
|
import { isBorrowLendDelta, isCollateralTransferDelta, isCStakingTransferDelta, isDepositDelta, isLiquidationDelta, isSendAssetDelta, isSpotTransferDelta, isVaultTransferDelta, isWithdrawDelta, } from '../types/index.js';
|
|
5
5
|
import { mapFundingActivity, mapLedgerEntry, mapLiquidationFills, } from '../utils/index.js';
|
|
6
6
|
import { hlInfoOptions, infoRequest, } from '../utils/infoClient.js';
|
|
7
|
+
import { getHistoryLimit, historyPage } from './historyPagination.js';
|
|
7
8
|
const MARKET_BEARING_TYPES = new Set([
|
|
8
9
|
ActivityType.FUNDING,
|
|
9
10
|
ActivityType.LIQUIDATION,
|
|
@@ -14,25 +15,66 @@ const ASSET_BEARING_TYPES = new Set([
|
|
|
14
15
|
ActivityType.TRANSFER,
|
|
15
16
|
]);
|
|
16
17
|
const needsMarkets = (typeFilter) => !typeFilter || typeFilter.some((t) => MARKET_BEARING_TYPES.has(t));
|
|
17
|
-
const
|
|
18
|
+
const fetchLiquidationHistory = async (apiUrl, user, startTime, endTime, resolveMarket, options) => {
|
|
19
|
+
const retained = new Map();
|
|
20
|
+
while (startTime <= endTime) {
|
|
21
|
+
options?.signal?.throwIfAborted();
|
|
22
|
+
const fills = await infoRequest(apiUrl, { type: 'userFillsByTime', user, startTime, endTime }, options);
|
|
23
|
+
options?.signal?.throwIfAborted();
|
|
24
|
+
let latest = startTime;
|
|
25
|
+
for (const fill of fills) {
|
|
26
|
+
retained.set(fill.tid, fill);
|
|
27
|
+
latest = Math.max(latest, fill.time);
|
|
28
|
+
}
|
|
29
|
+
if (fills.length < 2000 || retained.size >= 10000) {
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
if (latest === startTime) {
|
|
33
|
+
throw new PerpsError(PerpsErrorCode.ThirdPartyError, 'Hyperliquid fills saturate a single millisecond; liquidation history cannot be paginated safely');
|
|
34
|
+
}
|
|
35
|
+
// Inclusive overlap retains all same-time fills at the venue page boundary.
|
|
36
|
+
startTime = latest;
|
|
37
|
+
}
|
|
38
|
+
const queried = user.toLowerCase();
|
|
39
|
+
const fills = [...retained.values()].filter((fill) => fill.liquidation?.liquidatedUser.toLowerCase() === queried);
|
|
40
|
+
if (fills.length === 0) {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
const hashes = new Set();
|
|
44
|
+
let firstTime = Infinity;
|
|
45
|
+
let lastTime = 0;
|
|
46
|
+
for (const fill of fills) {
|
|
47
|
+
if (fill.hash !== undefined) {
|
|
48
|
+
hashes.add(fill.hash);
|
|
49
|
+
}
|
|
50
|
+
firstTime = Math.min(firstTime, fill.time);
|
|
51
|
+
lastTime = Math.max(lastTime, fill.time);
|
|
52
|
+
}
|
|
53
|
+
// Exclusions must cover the entire order, not the current SDK page's ledger window.
|
|
54
|
+
const ledger = await historyPage({ startTime: firstTime, endTime: lastTime }, Number.MAX_SAFE_INTEGER, async (startTime, endTime) => {
|
|
55
|
+
const updates = await infoRequest(apiUrl, { type: 'userNonFundingLedgerUpdates', user, startTime, endTime }, options);
|
|
56
|
+
return {
|
|
57
|
+
items: updates.filter((entry) => isLiquidationDelta(entry.delta) && hashes.has(entry.hash)),
|
|
58
|
+
saturated: updates.length >= 500,
|
|
59
|
+
};
|
|
60
|
+
}, (entry) => ({ time: entry.time, key: entry.hash }), options?.signal);
|
|
61
|
+
return mapLiquidationFills(fills, PROVIDER_KEY, user, resolveMarket, new Set(ledger.items.map((entry) => entry.hash)));
|
|
62
|
+
};
|
|
63
|
+
const fetchActivityData = async (apiUrl, typeFilter, timeParams, assetRegistry, resolveMarket, liquidationHistory, options) => {
|
|
18
64
|
const needLedger = !typeFilter || typeFilter.some((t) => t !== ActivityType.FUNDING);
|
|
19
65
|
const needFunding = !typeFilter || typeFilter.includes(ActivityType.FUNDING);
|
|
20
|
-
|
|
21
|
-
// with a `liquidation` field and never as a ledger `liquidation` delta.
|
|
22
|
-
const needLiquidationFills = !typeFilter || typeFilter.includes(ActivityType.LIQUIDATION);
|
|
23
|
-
const [ledgerUpdates, fundingUpdates, fills] = await Promise.all([
|
|
66
|
+
const [ledgerUpdates, fundingUpdates, liquidations] = await Promise.all([
|
|
24
67
|
needLedger
|
|
25
68
|
? infoRequest(apiUrl, { type: 'userNonFundingLedgerUpdates', ...timeParams }, options)
|
|
26
69
|
: Promise.resolve([]),
|
|
27
70
|
needFunding
|
|
28
71
|
? infoRequest(apiUrl, { type: 'userFunding', ...timeParams }, options)
|
|
29
72
|
: Promise.resolve([]),
|
|
30
|
-
|
|
31
|
-
? infoRequest(apiUrl, timeParams.startTime === undefined
|
|
32
|
-
? { type: 'userFills', user: timeParams.user }
|
|
33
|
-
: { type: 'userFillsByTime', ...timeParams }, options)
|
|
34
|
-
: Promise.resolve([]),
|
|
73
|
+
liquidationHistory,
|
|
35
74
|
]);
|
|
75
|
+
if (ledgerUpdates.length >= 500 || fundingUpdates.length >= 500) {
|
|
76
|
+
return { items: [], saturated: true };
|
|
77
|
+
}
|
|
36
78
|
const ledgerItems = ledgerUpdates.flatMap((entry) => {
|
|
37
79
|
if (typeFilter !== undefined &&
|
|
38
80
|
((isDepositDelta(entry.delta) &&
|
|
@@ -55,29 +97,15 @@ const fetchActivityData = async (apiUrl, typeFilter, timeParams, assetRegistry,
|
|
|
55
97
|
const item = mapFundingActivity(entry, PROVIDER_KEY, resolveMarket);
|
|
56
98
|
return item === null ? [] : [item];
|
|
57
99
|
});
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
.
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (!typeFilter) {
|
|
64
|
-
return merged;
|
|
65
|
-
}
|
|
66
|
-
const typeSet = new Set(typeFilter);
|
|
67
|
-
return merged.filter((item) => typeSet.has(item.type));
|
|
100
|
+
const merged = [...ledgerItems, ...fundingItems, ...(liquidations ?? [])];
|
|
101
|
+
const items = typeFilter
|
|
102
|
+
? merged.filter((item) => typeFilter.includes(item.type))
|
|
103
|
+
: merged;
|
|
104
|
+
return { items, saturated: false };
|
|
68
105
|
};
|
|
69
|
-
/**
|
|
70
|
-
* Fetch a chronological activity feed (deposits, withdrawals, transfers,
|
|
71
|
-
* liquidations, funding) for `address`. Combines results from Hyperliquid's
|
|
72
|
-
* `userNonFundingLedgerUpdates`, `userFunding`, and `userFills` endpoints,
|
|
73
|
-
* sorted newest-first.
|
|
74
|
-
*
|
|
75
|
-
* Cursor-based pagination uses the ms-since-epoch timestamp of the last item
|
|
76
|
-
* on the current page.
|
|
77
|
-
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
78
|
-
* @public
|
|
79
|
-
*/
|
|
106
|
+
/** Fetch retained activity newest-first with opaque cursors across inclusive time ranges. */
|
|
80
107
|
export const getActivity = async ({ client, apiUrl }, params, options) => {
|
|
108
|
+
const limit = getHistoryLimit(params.limit);
|
|
81
109
|
const registry = getMarketRegistry(client, PROVIDER_KEY);
|
|
82
110
|
// Only funding and liquidation rows carry a market, so a Ledger-only
|
|
83
111
|
// request must not pull the market list.
|
|
@@ -90,35 +118,17 @@ export const getActivity = async ({ client, apiUrl }, params, options) => {
|
|
|
90
118
|
await assetRegistry.sync();
|
|
91
119
|
}
|
|
92
120
|
const infoOpts = hlInfoOptions(client, options);
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
// Drop boundary items so the next page does not return the cursor row twice.
|
|
106
|
-
const filtered = params.cursor === undefined
|
|
107
|
-
? merged
|
|
108
|
-
: merged.filter((item) => new Date(item.timestamp).getTime() <
|
|
109
|
-
Number.parseInt(params.cursor, 10));
|
|
110
|
-
const hasMore = filtered.length > limit;
|
|
111
|
-
const items = filtered.slice(0, limit);
|
|
112
|
-
return {
|
|
113
|
-
provider: PROVIDER_KEY,
|
|
114
|
-
items,
|
|
115
|
-
pagination: {
|
|
116
|
-
limit,
|
|
117
|
-
hasMore,
|
|
118
|
-
cursor: items.length > 0
|
|
119
|
-
? String(new Date(items[items.length - 1].timestamp).getTime())
|
|
120
|
-
: undefined,
|
|
121
|
-
},
|
|
122
|
-
};
|
|
121
|
+
const needLiquidationFills = !params.type || params.type.includes(ActivityType.LIQUIDATION);
|
|
122
|
+
let liquidationHistory;
|
|
123
|
+
const page = await historyPage(params, limit, (startTime, endTime, snapshotEnd) => {
|
|
124
|
+
if (needLiquidationFills && liquidationHistory === undefined) {
|
|
125
|
+
liquidationHistory = fetchLiquidationHistory(apiUrl, params.address, params.startTime ?? 0, snapshotEnd, (coin) => registry.get(coin), infoOpts);
|
|
126
|
+
}
|
|
127
|
+
return fetchActivityData(apiUrl, params.type, { user: params.address, startTime, endTime }, assetRegistry, (coin) => registry.get(coin), liquidationHistory, infoOpts);
|
|
128
|
+
}, (item) => ({
|
|
129
|
+
time: new Date(item.timestamp).getTime(),
|
|
130
|
+
key: `${item.type}:${item.id}`,
|
|
131
|
+
}), options?.signal);
|
|
132
|
+
return { provider: PROVIDER_KEY, ...page };
|
|
123
133
|
};
|
|
124
134
|
//# sourceMappingURL=getActivity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getActivity.js","sourceRoot":"","sources":["../../../src/services/getActivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"getActivity.js","sourceRoot":"","sources":["../../../src/services/getActivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ import type { HyperliquidContext } from '../context.js';
|
|
|
9
9
|
*/
|
|
10
10
|
export interface GetFillsParams {
|
|
11
11
|
address: Address;
|
|
12
|
-
/**
|
|
12
|
+
/** Positive safe integer; defaults to 50 and is capped at 200. */
|
|
13
13
|
limit?: number;
|
|
14
14
|
/** Opaque cursor returned in the previous page's `pagination.cursor`. */
|
|
15
15
|
cursor?: string;
|
|
@@ -18,18 +18,6 @@ export interface GetFillsParams {
|
|
|
18
18
|
/** Inclusive upper bound in milliseconds; selects `userFillsByTime`. */
|
|
19
19
|
endTime?: number;
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
22
|
-
* Fetch the user's fills history. When `startTime` or `endTime` is provided,
|
|
23
|
-
* Hyperliquid's `userFillsByTime` endpoint is used; otherwise the unbounded
|
|
24
|
-
* `userFills` endpoint returns the full history. The backend's enriched asset
|
|
25
|
-
* list supplies the display fields; only the fills endpoint is read direct
|
|
26
|
-
* from HL.
|
|
27
|
-
*
|
|
28
|
-
* The response is sorted (time desc, `tid` as tiebreaker) before pagination —
|
|
29
|
-
* see {@link compareFillsDesc}. The cursor encodes the last returned fill's
|
|
30
|
-
* `(time, tid)`; the next page keeps fills that sort strictly after it.
|
|
31
|
-
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
32
|
-
* @public
|
|
33
|
-
*/
|
|
21
|
+
/** Fetch retained fills newest-first, using opaque cursors across inclusive time ranges. */
|
|
34
22
|
export declare const getFills: ({ client, apiUrl }: HyperliquidContext, params: GetFillsParams, options?: SDKRequestOptions) => Promise<FillsResponse>;
|
|
35
23
|
//# sourceMappingURL=getFills.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFills.d.ts","sourceRoot":"","sources":["../../../src/services/getFills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"getFills.d.ts","sourceRoot":"","sources":["../../../src/services/getFills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AAC3E,OAAO,KAAK,EAAQ,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAEnC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAMvD;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,yEAAyE;IACzE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,4FAA4F;AAC5F,eAAO,MAAM,QAAQ,GACnB,oBAAoB,kBAAkB,EACtC,QAAQ,cAAc,EACtB,UAAU,iBAAiB,KAC1B,OAAO,CAAC,aAAa,CA8CvB,CAAA"}
|
|
@@ -1,68 +1,42 @@
|
|
|
1
1
|
import { getMarketRegistry } from '@lifi/perps-sdk';
|
|
2
|
-
import {
|
|
2
|
+
import { PROVIDER_KEY } from '../constants.js';
|
|
3
3
|
import { assetIsOutcome, mapFill } from '../utils/index.js';
|
|
4
4
|
import { hlInfoOptions, infoRequest } from '../utils/infoClient.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// it must impose its own (time desc, tid desc as tiebreaker for same-time fills).
|
|
8
|
-
const compareFillsDesc = (a, b) => b.time - a.time || b.tid - a.tid;
|
|
9
|
-
const encodeCursor = (fill) => `${fill.time}:${fill.tid}`;
|
|
10
|
-
const decodeCursor = (cursor) => {
|
|
11
|
-
const [time, tid] = cursor.split(':').map(Number);
|
|
12
|
-
return { time, tid };
|
|
13
|
-
};
|
|
14
|
-
/**
|
|
15
|
-
* Fetch the user's fills history. When `startTime` or `endTime` is provided,
|
|
16
|
-
* Hyperliquid's `userFillsByTime` endpoint is used; otherwise the unbounded
|
|
17
|
-
* `userFills` endpoint returns the full history. The backend's enriched asset
|
|
18
|
-
* list supplies the display fields; only the fills endpoint is read direct
|
|
19
|
-
* from HL.
|
|
20
|
-
*
|
|
21
|
-
* The response is sorted (time desc, `tid` as tiebreaker) before pagination —
|
|
22
|
-
* see {@link compareFillsDesc}. The cursor encodes the last returned fill's
|
|
23
|
-
* `(time, tid)`; the next page keeps fills that sort strictly after it.
|
|
24
|
-
* @throws {PerpsError} On Hyperliquid REST error, network, or parsing failures.
|
|
25
|
-
* @public
|
|
26
|
-
*/
|
|
5
|
+
import { getHistoryLimit, historyPage } from './historyPagination.js';
|
|
6
|
+
/** Fetch retained fills newest-first, using opaque cursors across inclusive time ranges. */
|
|
27
7
|
export const getFills = async ({ client, apiUrl }, params, options) => {
|
|
8
|
+
const limit = getHistoryLimit(params.limit);
|
|
28
9
|
const registry = getMarketRegistry(client, PROVIDER_KEY);
|
|
29
10
|
await registry.sync();
|
|
30
11
|
const infoOpts = hlInfoOptions(client, options);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
user: params.address
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const page = filtered.slice(0, limit);
|
|
47
|
-
// `get`, not `require`: a coin the backend market list does not hold drops
|
|
48
|
-
// only its own row instead of rejecting the whole page. The registry warns
|
|
49
|
-
// once per unresolved id. A delisted market still resolves, so its rows stay.
|
|
50
|
-
const items = page.flatMap((f) => {
|
|
51
|
-
if (assetIsOutcome(f.coin)) {
|
|
52
|
-
return [];
|
|
12
|
+
let useRecent = params.cursor === undefined &&
|
|
13
|
+
params.startTime === undefined &&
|
|
14
|
+
params.endTime === undefined;
|
|
15
|
+
const page = await historyPage(params, limit, async (startTime, endTime) => {
|
|
16
|
+
const fills = await infoRequest(apiUrl, useRecent
|
|
17
|
+
? { type: 'userFills', user: params.address }
|
|
18
|
+
: {
|
|
19
|
+
type: 'userFillsByTime',
|
|
20
|
+
user: params.address,
|
|
21
|
+
startTime,
|
|
22
|
+
endTime,
|
|
23
|
+
}, infoOpts);
|
|
24
|
+
useRecent = false;
|
|
25
|
+
if (fills.length >= 2000) {
|
|
26
|
+
return { items: [], saturated: true };
|
|
53
27
|
}
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
};
|
|
28
|
+
const items = fills.flatMap((fill) => {
|
|
29
|
+
if (assetIsOutcome(fill.coin)) {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const market = registry.get(fill.coin);
|
|
33
|
+
return market === undefined ? [] : [mapFill(fill, market)];
|
|
34
|
+
});
|
|
35
|
+
return { items, saturated: false };
|
|
36
|
+
}, (fill) => ({
|
|
37
|
+
time: new Date(fill.createdAt).getTime(),
|
|
38
|
+
key: Number(fill.id),
|
|
39
|
+
}), options?.signal);
|
|
40
|
+
return { provider: PROVIDER_KEY, ...page };
|
|
67
41
|
};
|
|
68
42
|
//# sourceMappingURL=getFills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFills.js","sourceRoot":"","sources":["../../../src/services/getFills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0B,MAAM,iBAAiB,CAAA;AAG3E,OAAO,
|
|
1
|
+
{"version":3,"file":"getFills.js","sourceRoot":"","sources":["../../../src/services/getFills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA0B,MAAM,iBAAiB,CAAA;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAG9C,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAmBrE,4FAA4F;AAC5F,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,EAAE,MAAM,EAAE,MAAM,EAAsB,EACtC,MAAsB,EACtB,OAA2B,EACH,EAAE;IAC1B,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxD,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IACrB,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/C,IAAI,SAAS,GACX,MAAM,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,CAAC,SAAS,KAAK,SAAS;QAC9B,MAAM,CAAC,OAAO,KAAK,SAAS,CAAA;IAC9B,MAAM,IAAI,GAAG,MAAM,WAAW,CAC5B,MAAM,EACN,KAAK,EACL,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,WAAW,CAC7B,MAAM,EACN,SAAS;YACP,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;YAC7C,CAAC,CAAC;gBACE,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,MAAM,CAAC,OAAO;gBACpB,SAAS;gBACT,OAAO;aACR,EACL,QAAQ,CACT,CAAA;QACD,SAAS,GAAG,KAAK,CAAA;QACjB,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;QACvC,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAU,EAAE;YAC3C,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,OAAO,EAAE,CAAA;YACX,CAAC;YACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACtC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QACF,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IACpC,CAAC,EACD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACT,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;QACxC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;KACrB,CAAC,EACF,OAAO,EAAE,MAAM,CAChB,CAAA;IACD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,CAAA;AAC5C,CAAC,CAAA"}
|
|
@@ -34,6 +34,6 @@ export const getWithdrawableBalances = async ({ client, apiUrl }, params, option
|
|
|
34
34
|
throw error;
|
|
35
35
|
}
|
|
36
36
|
const feeUsd = providers.find((provider) => provider.key === PROVIDER_KEY)?.withdrawalFeeUsd;
|
|
37
|
-
return hyperliquidWithdrawableBalances(abstraction, state, spotState, quoteAsset.id, feeUsd
|
|
37
|
+
return hyperliquidWithdrawableBalances(abstraction, state, spotState, quoteAsset.id, feeUsd);
|
|
38
38
|
};
|
|
39
39
|
//# sourceMappingURL=getWithdrawableBalances.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getWithdrawableBalances.js","sourceRoot":"","sources":["../../../src/services/getWithdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,UAAU,GAIX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAO9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAA;AAUlF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC1C,EAAE,MAAM,EAAE,MAAM,EAAsB,EACtC,MAAqC,EACrC,OAA2B,EACa,EAAE;IAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/C,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,GAC3D,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE;QACf,WAAW,CACT,MAAM,EACN,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EACjD,QAAQ,CACT;QACD,WAAW,CACT,MAAM,EACN,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EACpD,QAAQ,CACT;QACD,WAAW,CACT,MAAM,EACN,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EACxD,QAAQ,CACT;KACF,CAAC,CAAA;IAEJ,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,cAAc,CACjD,EAAE,UAAU,CAAA;IACb,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,CAC1B,cAAc,CAAC,QAAQ,EACvB,2CAA2C,cAAc,6CAA6C,CACvG,CAAA;QACD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAA;QACzB,MAAM,KAAK,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAC3B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,YAAY,CAC5C,EAAE,gBAAgB,CAAA;IAEnB,OAAO,+BAA+B,CACpC,WAAW,EACX,KAAK,EACL,SAAS,EACT,UAAU,CAAC,EAAE,EACb,MAAM,
|
|
1
|
+
{"version":3,"file":"getWithdrawableBalances.js","sourceRoot":"","sources":["../../../src/services/getWithdrawableBalances.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,UAAU,GAIX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAO9D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACnE,OAAO,EAAE,+BAA+B,EAAE,MAAM,kCAAkC,CAAA;AAUlF;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,EAC1C,EAAE,MAAM,EAAE,MAAM,EAAsB,EACtC,MAAqC,EACrC,OAA2B,EACa,EAAE;IAC1C,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;IACxD,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAE/C,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,CAAC,GAC3D,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;QAC7B,QAAQ,CAAC,IAAI,EAAE;QACf,WAAW,CACT,MAAM,EACN,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EACjD,QAAQ,CACT;QACD,WAAW,CACT,MAAM,EACN,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EACpD,QAAQ,CACT;QACD,WAAW,CACT,MAAM,EACN,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,EACxD,QAAQ,CACT;KACF,CAAC,CAAA;IAEJ,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAC7B,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,cAAc,CACjD,EAAE,UAAU,CAAA;IACb,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,UAAU,CAC1B,cAAc,CAAC,QAAQ,EACvB,2CAA2C,cAAc,6CAA6C,CACvG,CAAA;QACD,KAAK,CAAC,IAAI,GAAG,YAAY,CAAA;QACzB,MAAM,KAAK,CAAA;IACb,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAC3B,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,YAAY,CAC5C,EAAE,gBAAgB,CAAA;IAEnB,OAAO,+BAA+B,CACpC,WAAW,EACX,KAAK,EACL,SAAS,EACT,UAAU,CAAC,EAAE,EACb,MAAM,CACP,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { PerpsError } from '@lifi/perps-sdk';
|
|
2
|
+
import { PerpsErrorCode } from '@lifi/perps-types';
|
|
3
|
+
import { DEFAULT_HISTORY_LIMIT, MAX_HISTORY_LIMIT } from '../constants.js';
|
|
4
|
+
const compareKeys = (a, b) => typeof a === 'number' && typeof b === 'number'
|
|
5
|
+
? b - a
|
|
6
|
+
: a < b
|
|
7
|
+
? 1
|
|
8
|
+
: a > b
|
|
9
|
+
? -1
|
|
10
|
+
: 0;
|
|
11
|
+
export const getHistoryLimit = (limit = DEFAULT_HISTORY_LIMIT) => {
|
|
12
|
+
if (!Number.isSafeInteger(limit) || limit < 1) {
|
|
13
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, 'Hyperliquid history limit must be a positive safe integer');
|
|
14
|
+
}
|
|
15
|
+
return Math.min(limit, MAX_HISTORY_LIMIT);
|
|
16
|
+
};
|
|
17
|
+
const decodeCursor = (cursor) => {
|
|
18
|
+
let value;
|
|
19
|
+
try {
|
|
20
|
+
value = JSON.parse(cursor);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Hyperliquid history cursor');
|
|
24
|
+
}
|
|
25
|
+
if (!Array.isArray(value) ||
|
|
26
|
+
value.length !== 4 ||
|
|
27
|
+
!Number.isSafeInteger(value[0]) ||
|
|
28
|
+
(typeof value[1] !== 'string' && typeof value[1] !== 'number') ||
|
|
29
|
+
!Number.isSafeInteger(value[2]) ||
|
|
30
|
+
value[2] > value[0] ||
|
|
31
|
+
!Number.isSafeInteger(value[3]) ||
|
|
32
|
+
value[3] < value[0]) {
|
|
33
|
+
throw new PerpsError(PerpsErrorCode.ValidationError, 'Invalid Hyperliquid history cursor');
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
time: value[0],
|
|
37
|
+
key: value[1],
|
|
38
|
+
startTime: value[2],
|
|
39
|
+
endTime: value[3],
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
export async function historyPage(params, limit, fetchWindow, identify, signal) {
|
|
43
|
+
const boundary = params.cursor === undefined ? undefined : decodeCursor(params.cursor);
|
|
44
|
+
const lower = params.startTime ?? 0;
|
|
45
|
+
const snapshotEnd = boundary?.endTime ?? params.endTime ?? Date.now();
|
|
46
|
+
const upper = Math.min(snapshotEnd, boundary?.time ?? Infinity);
|
|
47
|
+
const windows = [];
|
|
48
|
+
if (boundary && boundary.startTime > lower) {
|
|
49
|
+
windows.push({ startTime: lower, endTime: boundary.startTime - 1 });
|
|
50
|
+
}
|
|
51
|
+
windows.push({
|
|
52
|
+
startTime: Math.max(lower, boundary?.startTime ?? lower),
|
|
53
|
+
endTime: upper,
|
|
54
|
+
});
|
|
55
|
+
const items = [];
|
|
56
|
+
let last;
|
|
57
|
+
while (windows.length > 0) {
|
|
58
|
+
signal?.throwIfAborted();
|
|
59
|
+
const window = windows.pop();
|
|
60
|
+
if (window.startTime > window.endTime) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const result = await fetchWindow(window.startTime, window.endTime, snapshotEnd);
|
|
64
|
+
signal?.throwIfAborted();
|
|
65
|
+
if (result.saturated) {
|
|
66
|
+
if (window.startTime === window.endTime) {
|
|
67
|
+
throw new PerpsError(PerpsErrorCode.ThirdPartyError, 'Hyperliquid history saturates a single millisecond; its time-only API cannot paginate this timestamp safely');
|
|
68
|
+
}
|
|
69
|
+
// Time APIs truncate from the start, so a capped response cannot supply a newest page.
|
|
70
|
+
const midpoint = window.startTime + Math.floor((window.endTime - window.startTime) / 2);
|
|
71
|
+
windows.push({ startTime: window.startTime, endTime: midpoint });
|
|
72
|
+
windows.push({ startTime: midpoint + 1, endTime: window.endTime });
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const sorted = result.items.sort((a, b) => {
|
|
76
|
+
const left = identify(a);
|
|
77
|
+
const right = identify(b);
|
|
78
|
+
return right.time - left.time || compareKeys(left.key, right.key);
|
|
79
|
+
});
|
|
80
|
+
for (const item of sorted) {
|
|
81
|
+
const identity = identify(item);
|
|
82
|
+
if (identity.time < window.startTime || identity.time > window.endTime) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (boundary &&
|
|
86
|
+
(identity.time > boundary.time ||
|
|
87
|
+
(identity.time === boundary.time &&
|
|
88
|
+
compareKeys(identity.key, boundary.key) <= 0))) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (items.length === limit) {
|
|
92
|
+
return {
|
|
93
|
+
items,
|
|
94
|
+
pagination: {
|
|
95
|
+
limit,
|
|
96
|
+
hasMore: true,
|
|
97
|
+
cursor: last &&
|
|
98
|
+
JSON.stringify([
|
|
99
|
+
last.time,
|
|
100
|
+
last.key,
|
|
101
|
+
last.startTime,
|
|
102
|
+
last.endTime,
|
|
103
|
+
]),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
items.push(item);
|
|
108
|
+
last = { ...identity, startTime: window.startTime, endTime: snapshotEnd };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
items,
|
|
113
|
+
pagination: {
|
|
114
|
+
limit,
|
|
115
|
+
hasMore: false,
|
|
116
|
+
cursor: last &&
|
|
117
|
+
JSON.stringify([last.time, last.key, last.startTime, last.endTime]),
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=historyPagination.js.map
|