@pear-protocol/hyperliquid-sdk 0.0.60-beta-usdh-4 → 0.0.60-beta-usdh-6
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/dist/hooks/useTrading.d.ts +0 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +436 -123
- package/dist/provider.d.ts +1 -1
- package/dist/types.d.ts +4 -0
- package/package.json +1 -1
|
@@ -4,9 +4,6 @@ export declare const useTradeHistories: () => {
|
|
|
4
4
|
data: TradeHistoryDataDto[] | null;
|
|
5
5
|
isLoading: boolean;
|
|
6
6
|
};
|
|
7
|
-
/**
|
|
8
|
-
* Hook to access open orders with loading state
|
|
9
|
-
*/
|
|
10
7
|
export declare const useOpenOrders: () => {
|
|
11
8
|
data: OpenLimitOrderDto[] | null;
|
|
12
9
|
isLoading: boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -263,6 +263,8 @@ interface OpenPositionDto {
|
|
|
263
263
|
interface OrderAssetDto {
|
|
264
264
|
asset: string;
|
|
265
265
|
weight: number;
|
|
266
|
+
marketPrefix?: string | null;
|
|
267
|
+
collateralToken?: CollateralToken;
|
|
266
268
|
}
|
|
267
269
|
/**
|
|
268
270
|
* Order status
|
|
@@ -567,6 +569,8 @@ interface RawAssetDto {
|
|
|
567
569
|
size: number;
|
|
568
570
|
side: string;
|
|
569
571
|
fundingPaid?: number;
|
|
572
|
+
marketPrefix?: string | null;
|
|
573
|
+
collateralToken?: CollateralToken;
|
|
570
574
|
}
|
|
571
575
|
/**
|
|
572
576
|
* Raw position data from open-positions channel
|
|
@@ -745,9 +749,6 @@ declare const useTradeHistories: () => {
|
|
|
745
749
|
data: TradeHistoryDataDto[] | null;
|
|
746
750
|
isLoading: boolean;
|
|
747
751
|
};
|
|
748
|
-
/**
|
|
749
|
-
* Hook to access open orders with loading state
|
|
750
|
-
*/
|
|
751
752
|
declare const useOpenOrders: () => {
|
|
752
753
|
data: OpenLimitOrderDto[] | null;
|
|
753
754
|
isLoading: boolean;
|
package/dist/index.js
CHANGED
|
@@ -155,7 +155,8 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
155
155
|
try {
|
|
156
156
|
const message = JSON.parse(event.data);
|
|
157
157
|
// Handle subscription responses (only if they don't have channel data)
|
|
158
|
-
if (('success' in message || 'error' in message) &&
|
|
158
|
+
if (('success' in message || 'error' in message) &&
|
|
159
|
+
!('channel' in message)) {
|
|
159
160
|
if (message.error) {
|
|
160
161
|
setLastError(message.error);
|
|
161
162
|
}
|
|
@@ -174,12 +175,21 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
174
175
|
switch (dataMessage.channel) {
|
|
175
176
|
case 'trade-histories':
|
|
176
177
|
{
|
|
178
|
+
const mapAsset = (a) => {
|
|
179
|
+
var _a, _b;
|
|
180
|
+
const extractedPrefix = getMarketPrefix(a.coin);
|
|
181
|
+
return {
|
|
182
|
+
...a,
|
|
183
|
+
coin: toDisplaySymbol(a.coin),
|
|
184
|
+
marketPrefix: (_b = (_a = a.marketPrefix) !== null && _a !== void 0 ? _a : extractedPrefix) !== null && _b !== void 0 ? _b : null,
|
|
185
|
+
};
|
|
186
|
+
};
|
|
177
187
|
const list = dataMessage.data.map((item) => {
|
|
178
188
|
var _a, _b;
|
|
179
189
|
return ({
|
|
180
190
|
...item,
|
|
181
|
-
closedLongAssets: item.closedLongAssets.map(
|
|
182
|
-
closedShortAssets: item.closedShortAssets.map(
|
|
191
|
+
closedLongAssets: item.closedLongAssets.map(mapAsset),
|
|
192
|
+
closedShortAssets: item.closedShortAssets.map(mapAsset),
|
|
183
193
|
positionLongAssets: (_a = item.positionLongAssets) === null || _a === void 0 ? void 0 : _a.map((a) => toDisplaySymbol(a)),
|
|
184
194
|
positionShortAssets: (_b = item.positionShortAssets) === null || _b === void 0 ? void 0 : _b.map((a) => toDisplaySymbol(a)),
|
|
185
195
|
});
|
|
@@ -189,10 +199,19 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
189
199
|
break;
|
|
190
200
|
case 'open-positions':
|
|
191
201
|
{
|
|
202
|
+
const enrichAsset = (a) => {
|
|
203
|
+
var _a, _b;
|
|
204
|
+
const extractedPrefix = getMarketPrefix(a.coin);
|
|
205
|
+
return {
|
|
206
|
+
...a,
|
|
207
|
+
coin: toDisplaySymbol(a.coin),
|
|
208
|
+
marketPrefix: (_b = (_a = a.marketPrefix) !== null && _a !== void 0 ? _a : extractedPrefix) !== null && _b !== void 0 ? _b : null,
|
|
209
|
+
};
|
|
210
|
+
};
|
|
192
211
|
const list = dataMessage.data.map((pos) => ({
|
|
193
212
|
...pos,
|
|
194
|
-
longAssets: pos.longAssets.map(
|
|
195
|
-
shortAssets: pos.shortAssets.map(
|
|
213
|
+
longAssets: pos.longAssets.map(enrichAsset),
|
|
214
|
+
shortAssets: pos.shortAssets.map(enrichAsset),
|
|
196
215
|
}));
|
|
197
216
|
setRawOpenPositions(list);
|
|
198
217
|
}
|
|
@@ -201,8 +220,14 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
201
220
|
{
|
|
202
221
|
const list = dataMessage.data.map((order) => ({
|
|
203
222
|
...order,
|
|
204
|
-
longAssets: order.longAssets.map((a) => ({
|
|
205
|
-
|
|
223
|
+
longAssets: order.longAssets.map((a) => ({
|
|
224
|
+
...a,
|
|
225
|
+
asset: toDisplaySymbol(a.asset),
|
|
226
|
+
})),
|
|
227
|
+
shortAssets: order.shortAssets.map((a) => ({
|
|
228
|
+
...a,
|
|
229
|
+
asset: toDisplaySymbol(a.asset),
|
|
230
|
+
})),
|
|
206
231
|
}));
|
|
207
232
|
setOpenOrders(list);
|
|
208
233
|
}
|
|
@@ -212,10 +237,20 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
212
237
|
break;
|
|
213
238
|
case 'twap-details':
|
|
214
239
|
{
|
|
240
|
+
const mapTwapAsset = (a) => {
|
|
241
|
+
var _a, _b, _c;
|
|
242
|
+
const extractedPrefix = getMarketPrefix(a.asset);
|
|
243
|
+
return {
|
|
244
|
+
...a,
|
|
245
|
+
asset: toDisplaySymbol(a.asset),
|
|
246
|
+
marketPrefix: (_b = (_a = a.marketPrefix) !== null && _a !== void 0 ? _a : extractedPrefix) !== null && _b !== void 0 ? _b : null,
|
|
247
|
+
collateralToken: (_c = a.collateralToken) !== null && _c !== void 0 ? _c : undefined,
|
|
248
|
+
};
|
|
249
|
+
};
|
|
215
250
|
const list = dataMessage.data.map((twap) => ({
|
|
216
251
|
...twap,
|
|
217
|
-
longAssets: twap.longAssets.map(
|
|
218
|
-
shortAssets: twap.shortAssets.map(
|
|
252
|
+
longAssets: twap.longAssets.map(mapTwapAsset),
|
|
253
|
+
shortAssets: twap.shortAssets.map(mapTwapAsset),
|
|
219
254
|
}));
|
|
220
255
|
setTwapDetails(list);
|
|
221
256
|
}
|
|
@@ -228,8 +263,14 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
228
263
|
const md = dataMessage.data;
|
|
229
264
|
const mapGroup = (g) => ({
|
|
230
265
|
...g,
|
|
231
|
-
longAssets: g.longAssets.map((a) => ({
|
|
232
|
-
|
|
266
|
+
longAssets: g.longAssets.map((a) => ({
|
|
267
|
+
...a,
|
|
268
|
+
asset: toDisplaySymbol(a.asset),
|
|
269
|
+
})),
|
|
270
|
+
shortAssets: g.shortAssets.map((a) => ({
|
|
271
|
+
...a,
|
|
272
|
+
asset: toDisplaySymbol(a.asset),
|
|
273
|
+
})),
|
|
233
274
|
});
|
|
234
275
|
const mapped = {
|
|
235
276
|
active: md.active.map(mapGroup),
|
|
@@ -247,7 +288,15 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
247
288
|
catch (error) {
|
|
248
289
|
setLastError(`Failed to parse message: ${error instanceof Error ? error.message : String(error)}`);
|
|
249
290
|
}
|
|
250
|
-
}, [
|
|
291
|
+
}, [
|
|
292
|
+
setTradeHistories,
|
|
293
|
+
setRawOpenPositions,
|
|
294
|
+
setOpenOrders,
|
|
295
|
+
setAccountSummary,
|
|
296
|
+
setTwapDetails,
|
|
297
|
+
setNotifications,
|
|
298
|
+
setMarketData,
|
|
299
|
+
]);
|
|
251
300
|
const connect = useCallback(() => {
|
|
252
301
|
if (!enabled || !wsUrl)
|
|
253
302
|
return;
|
|
@@ -316,7 +365,7 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
316
365
|
'open-orders',
|
|
317
366
|
'twap-details',
|
|
318
367
|
'fills-checkpoint',
|
|
319
|
-
'notifications'
|
|
368
|
+
'notifications',
|
|
320
369
|
];
|
|
321
370
|
const globalChannels = ['market-data'];
|
|
322
371
|
if (address && address !== lastSubscribedAddress) {
|
|
@@ -325,14 +374,14 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
325
374
|
sendMessage(JSON.stringify({
|
|
326
375
|
action: 'unsubscribe',
|
|
327
376
|
address: lastSubscribedAddress,
|
|
328
|
-
channels: addressSpecificChannels
|
|
377
|
+
channels: addressSpecificChannels,
|
|
329
378
|
}));
|
|
330
379
|
}
|
|
331
380
|
// Subscribe to all channels (global + address-specific)
|
|
332
381
|
sendMessage(JSON.stringify({
|
|
333
382
|
action: 'subscribe',
|
|
334
383
|
address: address,
|
|
335
|
-
channels: [...globalChannels, ...addressSpecificChannels]
|
|
384
|
+
channels: [...globalChannels, ...addressSpecificChannels],
|
|
336
385
|
}));
|
|
337
386
|
setLastSubscribedAddress(address);
|
|
338
387
|
setLastError(null);
|
|
@@ -342,7 +391,7 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
342
391
|
sendMessage(JSON.stringify({
|
|
343
392
|
action: 'unsubscribe',
|
|
344
393
|
address: lastSubscribedAddress,
|
|
345
|
-
channels: addressSpecificChannels
|
|
394
|
+
channels: addressSpecificChannels,
|
|
346
395
|
}));
|
|
347
396
|
setLastSubscribedAddress(null);
|
|
348
397
|
}
|
|
@@ -350,7 +399,7 @@ const useHyperliquidWebSocket = ({ wsUrl, address, enabled = true, }) => {
|
|
|
350
399
|
// If no address but connected, subscribe to global channels only
|
|
351
400
|
sendMessage(JSON.stringify({
|
|
352
401
|
action: 'subscribe',
|
|
353
|
-
channels: globalChannels
|
|
402
|
+
channels: globalChannels,
|
|
354
403
|
}));
|
|
355
404
|
}
|
|
356
405
|
}, [isConnected, address, lastSubscribedAddress, sendMessage]);
|
|
@@ -374,6 +423,7 @@ const useHyperliquidData = create((set, get) => ({
|
|
|
374
423
|
finalAtOICaps: null,
|
|
375
424
|
aggregatedClearingHouseState: null,
|
|
376
425
|
perpMetaAssets: null,
|
|
426
|
+
allPerpMetaAssets: null,
|
|
377
427
|
hip3Assets: new Map(),
|
|
378
428
|
hip3MarketPrefixes: new Map(),
|
|
379
429
|
setAllMids: (value) => set({ allMids: value }),
|
|
@@ -419,6 +469,7 @@ const useHyperliquidData = create((set, get) => ({
|
|
|
419
469
|
setFinalAtOICaps: (value) => set({ finalAtOICaps: value }),
|
|
420
470
|
setAggregatedClearingHouseState: (value) => set({ aggregatedClearingHouseState: value }),
|
|
421
471
|
setPerpMetaAssets: (value) => set({ perpMetaAssets: value }),
|
|
472
|
+
setAllPerpMetaAssets: (value) => set({ allPerpMetaAssets: value }),
|
|
422
473
|
setHip3Assets: (value) => set({ hip3Assets: value }),
|
|
423
474
|
setHip3MarketPrefixes: (value) => set({ hip3MarketPrefixes: value }),
|
|
424
475
|
}));
|
|
@@ -1061,45 +1112,88 @@ const useAccountSummary = () => {
|
|
|
1061
1112
|
return { data: calculated, isLoading };
|
|
1062
1113
|
};
|
|
1063
1114
|
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
var _a, _b, _c, _d;
|
|
1115
|
+
function findAssetMeta$4(coinName, perpMetaAssets, knownPrefix, desiredCollateral) {
|
|
1116
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
|
|
1067
1117
|
if (!perpMetaAssets) {
|
|
1068
1118
|
return { collateralToken: 'USDC', marketPrefix: null };
|
|
1069
1119
|
}
|
|
1070
|
-
|
|
1071
|
-
|
|
1120
|
+
if (desiredCollateral) {
|
|
1121
|
+
const collateralMatch = perpMetaAssets.find((a) => a.name === coinName && a.collateralToken === desiredCollateral);
|
|
1122
|
+
if (collateralMatch) {
|
|
1123
|
+
return {
|
|
1124
|
+
collateralToken: (_a = collateralMatch.collateralToken) !== null && _a !== void 0 ? _a : 'USDC',
|
|
1125
|
+
marketPrefix: (_b = collateralMatch.marketPrefix) !== null && _b !== void 0 ? _b : null,
|
|
1126
|
+
};
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
1129
|
+
if (coinName.includes(':')) {
|
|
1130
|
+
const [prefix, symbol] = coinName.split(':');
|
|
1131
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
1132
|
+
var _a;
|
|
1133
|
+
return a.name === symbol &&
|
|
1134
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === prefix.toLowerCase();
|
|
1135
|
+
});
|
|
1136
|
+
if (exactMatch) {
|
|
1137
|
+
return {
|
|
1138
|
+
collateralToken: (_c = exactMatch.collateralToken) !== null && _c !== void 0 ? _c : 'USDC',
|
|
1139
|
+
marketPrefix: (_d = exactMatch.marketPrefix) !== null && _d !== void 0 ? _d : null,
|
|
1140
|
+
};
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
if (knownPrefix) {
|
|
1144
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
1145
|
+
var _a;
|
|
1146
|
+
return a.name === coinName &&
|
|
1147
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === knownPrefix.toLowerCase();
|
|
1148
|
+
});
|
|
1149
|
+
if (exactMatch) {
|
|
1150
|
+
return {
|
|
1151
|
+
collateralToken: (_e = exactMatch.collateralToken) !== null && _e !== void 0 ? _e : 'USDC',
|
|
1152
|
+
marketPrefix: (_f = exactMatch.marketPrefix) !== null && _f !== void 0 ? _f : null,
|
|
1153
|
+
};
|
|
1154
|
+
}
|
|
1155
|
+
}
|
|
1156
|
+
const exactMatch = perpMetaAssets.find((a) => a.name === coinName && !a.marketPrefix);
|
|
1072
1157
|
if (exactMatch) {
|
|
1073
1158
|
return {
|
|
1074
|
-
collateralToken: (
|
|
1075
|
-
marketPrefix: (
|
|
1159
|
+
collateralToken: (_g = exactMatch.collateralToken) !== null && _g !== void 0 ? _g : 'USDC',
|
|
1160
|
+
marketPrefix: (_h = exactMatch.marketPrefix) !== null && _h !== void 0 ? _h : null,
|
|
1076
1161
|
};
|
|
1077
1162
|
}
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1163
|
+
const hip3Matches = perpMetaAssets.filter((a) => a.name === coinName && a.marketPrefix);
|
|
1164
|
+
if (hip3Matches.length > 0) {
|
|
1165
|
+
if (desiredCollateral) {
|
|
1166
|
+
const collateralMatch = hip3Matches.find((a) => a.collateralToken === desiredCollateral);
|
|
1167
|
+
if (collateralMatch) {
|
|
1168
|
+
return {
|
|
1169
|
+
collateralToken: (_j = collateralMatch.collateralToken) !== null && _j !== void 0 ? _j : 'USDC',
|
|
1170
|
+
marketPrefix: (_k = collateralMatch.marketPrefix) !== null && _k !== void 0 ? _k : null,
|
|
1171
|
+
};
|
|
1172
|
+
}
|
|
1173
|
+
}
|
|
1174
|
+
const usdHMatch = hip3Matches.find((a) => a.collateralToken === 'USDH');
|
|
1175
|
+
const chosen = usdHMatch !== null && usdHMatch !== void 0 ? usdHMatch : hip3Matches[0];
|
|
1084
1176
|
return {
|
|
1085
|
-
collateralToken: (
|
|
1086
|
-
marketPrefix: (
|
|
1177
|
+
collateralToken: (_l = chosen.collateralToken) !== null && _l !== void 0 ? _l : 'USDC',
|
|
1178
|
+
marketPrefix: (_m = chosen.marketPrefix) !== null && _m !== void 0 ? _m : null,
|
|
1087
1179
|
};
|
|
1088
1180
|
}
|
|
1089
1181
|
return { collateralToken: 'USDC', marketPrefix: null };
|
|
1090
1182
|
}
|
|
1091
|
-
// Enrich trade history assets with market prefix and collateral token
|
|
1092
1183
|
function enrichTradeHistoryAssets(assets, perpMetaAssets) {
|
|
1093
1184
|
return assets.map((asset) => {
|
|
1094
|
-
|
|
1185
|
+
var _a;
|
|
1186
|
+
if (asset.marketPrefix && asset.collateralToken) {
|
|
1187
|
+
return asset;
|
|
1188
|
+
}
|
|
1189
|
+
const meta = findAssetMeta$4(asset.coin, perpMetaAssets, asset.marketPrefix, asset.collateralToken);
|
|
1095
1190
|
return {
|
|
1096
1191
|
...asset,
|
|
1097
|
-
marketPrefix: meta.marketPrefix,
|
|
1098
|
-
collateralToken: meta.collateralToken,
|
|
1192
|
+
marketPrefix: asset.marketPrefix || meta.marketPrefix,
|
|
1193
|
+
collateralToken: (_a = asset.collateralToken) !== null && _a !== void 0 ? _a : meta.collateralToken,
|
|
1099
1194
|
};
|
|
1100
1195
|
});
|
|
1101
1196
|
}
|
|
1102
|
-
// Enrich all trade histories with market metadata
|
|
1103
1197
|
function enrichTradeHistories(histories, perpMetaAssets) {
|
|
1104
1198
|
return histories.map((history) => ({
|
|
1105
1199
|
...history,
|
|
@@ -1113,21 +1207,17 @@ const useTradeHistories = () => {
|
|
|
1113
1207
|
throw new Error('useTradeHistories must be used within a PearHyperliquidProvider');
|
|
1114
1208
|
}
|
|
1115
1209
|
const tradeHistories = useUserData((state) => state.tradeHistories);
|
|
1116
|
-
const
|
|
1210
|
+
const allPerpMetaAssets = useHyperliquidData((state) => state.allPerpMetaAssets);
|
|
1117
1211
|
const isLoading = useMemo(() => {
|
|
1118
1212
|
return tradeHistories === null && context.isConnected;
|
|
1119
1213
|
}, [tradeHistories, context.isConnected]);
|
|
1120
|
-
// Enrich trade histories with market prefix and collateral token
|
|
1121
1214
|
const enrichedTradeHistories = useMemo(() => {
|
|
1122
1215
|
if (!tradeHistories)
|
|
1123
1216
|
return null;
|
|
1124
|
-
return enrichTradeHistories(tradeHistories,
|
|
1125
|
-
}, [tradeHistories,
|
|
1217
|
+
return enrichTradeHistories(tradeHistories, allPerpMetaAssets);
|
|
1218
|
+
}, [tradeHistories, allPerpMetaAssets]);
|
|
1126
1219
|
return { data: enrichedTradeHistories, isLoading };
|
|
1127
1220
|
};
|
|
1128
|
-
/**
|
|
1129
|
-
* Hook to access open orders with loading state
|
|
1130
|
-
*/
|
|
1131
1221
|
const useOpenOrders = () => {
|
|
1132
1222
|
const context = useContext(PearHyperliquidContext);
|
|
1133
1223
|
if (!context) {
|
|
@@ -6860,6 +6950,9 @@ const calculatePositionAsset = (asset, currentPrice, totalInitialPositionSize, l
|
|
|
6860
6950
|
entryPositionValue: entryNotional,
|
|
6861
6951
|
initialWeight: totalInitialPositionSize > 0 ? entryNotional / totalInitialPositionSize : 0,
|
|
6862
6952
|
fundingPaid: (_a = asset.fundingPaid) !== null && _a !== void 0 ? _a : 0,
|
|
6953
|
+
// Preserve market metadata from raw asset (if provided by backend)
|
|
6954
|
+
marketPrefix: asset.marketPrefix,
|
|
6955
|
+
collateralToken: asset.collateralToken,
|
|
6863
6956
|
};
|
|
6864
6957
|
};
|
|
6865
6958
|
const buildPositionValue = (rawPositions, clearinghouseState, allMids) => {
|
|
@@ -6922,45 +7015,77 @@ const buildPositionValue = (rawPositions, clearinghouseState, allMids) => {
|
|
|
6922
7015
|
});
|
|
6923
7016
|
};
|
|
6924
7017
|
|
|
6925
|
-
|
|
6926
|
-
|
|
6927
|
-
var _a, _b, _c, _d;
|
|
7018
|
+
function findAssetMeta$3(coinName, perpMetaAssets, knownPrefix, desiredCollateral) {
|
|
7019
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
6928
7020
|
if (!perpMetaAssets) {
|
|
6929
7021
|
return { collateralToken: 'USDC', marketPrefix: null };
|
|
6930
7022
|
}
|
|
6931
|
-
|
|
6932
|
-
|
|
6933
|
-
|
|
7023
|
+
if (desiredCollateral) {
|
|
7024
|
+
const collateralMatch = perpMetaAssets.find((a) => a.name === coinName && a.collateralToken === desiredCollateral);
|
|
7025
|
+
if (collateralMatch) {
|
|
7026
|
+
return {
|
|
7027
|
+
collateralToken: (_a = collateralMatch.collateralToken) !== null && _a !== void 0 ? _a : 'USDC',
|
|
7028
|
+
marketPrefix: (_b = collateralMatch.marketPrefix) !== null && _b !== void 0 ? _b : null,
|
|
7029
|
+
};
|
|
7030
|
+
}
|
|
7031
|
+
}
|
|
7032
|
+
if (coinName.includes(':')) {
|
|
7033
|
+
const [prefix, symbol] = coinName.split(':');
|
|
7034
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
7035
|
+
var _a;
|
|
7036
|
+
return a.name === symbol &&
|
|
7037
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === prefix.toLowerCase();
|
|
7038
|
+
});
|
|
7039
|
+
if (exactMatch) {
|
|
7040
|
+
return {
|
|
7041
|
+
collateralToken: (_c = exactMatch.collateralToken) !== null && _c !== void 0 ? _c : 'USDC',
|
|
7042
|
+
marketPrefix: (_d = exactMatch.marketPrefix) !== null && _d !== void 0 ? _d : null,
|
|
7043
|
+
};
|
|
7044
|
+
}
|
|
7045
|
+
}
|
|
7046
|
+
if (knownPrefix) {
|
|
7047
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
7048
|
+
var _a;
|
|
7049
|
+
return a.name === coinName &&
|
|
7050
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === knownPrefix.toLowerCase();
|
|
7051
|
+
});
|
|
7052
|
+
if (exactMatch) {
|
|
7053
|
+
return {
|
|
7054
|
+
collateralToken: (_e = exactMatch.collateralToken) !== null && _e !== void 0 ? _e : 'USDC',
|
|
7055
|
+
marketPrefix: (_f = exactMatch.marketPrefix) !== null && _f !== void 0 ? _f : null,
|
|
7056
|
+
};
|
|
7057
|
+
}
|
|
7058
|
+
}
|
|
7059
|
+
const regularAsset = perpMetaAssets.find((a) => a.name === coinName && !a.marketPrefix);
|
|
7060
|
+
if (regularAsset) {
|
|
6934
7061
|
return {
|
|
6935
|
-
collateralToken: (
|
|
6936
|
-
marketPrefix:
|
|
7062
|
+
collateralToken: (_g = regularAsset.collateralToken) !== null && _g !== void 0 ? _g : 'USDC',
|
|
7063
|
+
marketPrefix: null,
|
|
6937
7064
|
};
|
|
6938
7065
|
}
|
|
6939
|
-
|
|
6940
|
-
|
|
6941
|
-
const baseName = a.name.includes(':') ? a.name.split(':')[1] : a.name;
|
|
6942
|
-
return baseName === coinName;
|
|
6943
|
-
});
|
|
6944
|
-
if (baseMatch) {
|
|
7066
|
+
const hip3Asset = perpMetaAssets.find((a) => a.name === coinName && a.marketPrefix);
|
|
7067
|
+
if (hip3Asset) {
|
|
6945
7068
|
return {
|
|
6946
|
-
collateralToken: (
|
|
6947
|
-
marketPrefix: (
|
|
7069
|
+
collateralToken: (_h = hip3Asset.collateralToken) !== null && _h !== void 0 ? _h : 'USDC',
|
|
7070
|
+
marketPrefix: (_j = hip3Asset.marketPrefix) !== null && _j !== void 0 ? _j : null,
|
|
6948
7071
|
};
|
|
6949
7072
|
}
|
|
6950
7073
|
return { collateralToken: 'USDC', marketPrefix: null };
|
|
6951
7074
|
}
|
|
6952
|
-
// Enrich position assets with market prefix and collateral token
|
|
6953
7075
|
function enrichPositionAssets(assets, perpMetaAssets) {
|
|
6954
7076
|
return assets.map((asset) => {
|
|
6955
|
-
|
|
7077
|
+
var _a;
|
|
7078
|
+
if (asset.marketPrefix && asset.collateralToken) {
|
|
7079
|
+
return asset;
|
|
7080
|
+
}
|
|
7081
|
+
const meta = findAssetMeta$3(asset.coin, perpMetaAssets, asset.marketPrefix, asset.collateralToken);
|
|
6956
7082
|
return {
|
|
6957
7083
|
...asset,
|
|
6958
|
-
marketPrefix: meta.marketPrefix,
|
|
6959
|
-
collateralToken: meta.collateralToken,
|
|
7084
|
+
marketPrefix: asset.marketPrefix || meta.marketPrefix,
|
|
7085
|
+
collateralToken: (_a = asset.collateralToken) !== null && _a !== void 0 ? _a : meta.collateralToken,
|
|
6960
7086
|
};
|
|
6961
7087
|
});
|
|
6962
7088
|
}
|
|
6963
|
-
// Enrich all positions with market metadata
|
|
6964
7089
|
function enrichPositions(positions, perpMetaAssets) {
|
|
6965
7090
|
return positions.map((position) => ({
|
|
6966
7091
|
...position,
|
|
@@ -6975,35 +7100,28 @@ function usePosition() {
|
|
|
6975
7100
|
}
|
|
6976
7101
|
const { apiBaseUrl, isConnected } = context;
|
|
6977
7102
|
const hip3Assets = useHyperliquidData((s) => s.hip3Assets);
|
|
6978
|
-
// Create position API action
|
|
6979
7103
|
const createPosition$1 = async (payload) => {
|
|
6980
7104
|
return createPosition(apiBaseUrl, payload, hip3Assets);
|
|
6981
7105
|
};
|
|
6982
|
-
// Update TP/SL risk parameters for a position
|
|
6983
7106
|
const updateRiskParameters$1 = async (positionId, payload) => {
|
|
6984
7107
|
return updateRiskParameters(apiBaseUrl, positionId, payload);
|
|
6985
7108
|
};
|
|
6986
|
-
// Close a position (MARKET or TWAP)
|
|
6987
7109
|
const closePosition$1 = async (positionId, payload) => {
|
|
6988
7110
|
return closePosition(apiBaseUrl, positionId, payload);
|
|
6989
7111
|
};
|
|
6990
|
-
// Close all positions (MARKET or TWAP)
|
|
6991
7112
|
const closeAllPositions$1 = async (payload) => {
|
|
6992
7113
|
return closeAllPositions(apiBaseUrl, payload);
|
|
6993
7114
|
};
|
|
6994
|
-
// Adjust a position (REDUCE/INCREASE by %; MARKET or LIMIT)
|
|
6995
7115
|
const adjustPosition$1 = async (positionId, payload) => {
|
|
6996
7116
|
return adjustPosition(apiBaseUrl, positionId, payload);
|
|
6997
7117
|
};
|
|
6998
|
-
// Adjust to absolute target sizes per asset, optionally adding new assets
|
|
6999
7118
|
const adjustAdvancePosition$1 = async (positionId, payload) => {
|
|
7000
7119
|
return adjustAdvancePosition(apiBaseUrl, positionId, payload, hip3Assets);
|
|
7001
7120
|
};
|
|
7002
|
-
// Open positions using WS data, with derived values
|
|
7003
7121
|
const userOpenPositions = useUserData((state) => state.rawOpenPositions);
|
|
7004
7122
|
const aggregatedClearingHouseState = useHyperliquidData((state) => state.aggregatedClearingHouseState);
|
|
7005
7123
|
const allMids = useHyperliquidData((state) => state.allMids);
|
|
7006
|
-
const
|
|
7124
|
+
const allPerpMetaAssets = useHyperliquidData((state) => state.allPerpMetaAssets);
|
|
7007
7125
|
const isLoading = useMemo(() => {
|
|
7008
7126
|
return userOpenPositions === null && isConnected;
|
|
7009
7127
|
}, [userOpenPositions, isConnected]);
|
|
@@ -7011,9 +7129,13 @@ function usePosition() {
|
|
|
7011
7129
|
if (!userOpenPositions || !aggregatedClearingHouseState || !allMids)
|
|
7012
7130
|
return null;
|
|
7013
7131
|
const positions = buildPositionValue(userOpenPositions, aggregatedClearingHouseState, allMids);
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7132
|
+
return enrichPositions(positions, allPerpMetaAssets);
|
|
7133
|
+
}, [
|
|
7134
|
+
userOpenPositions,
|
|
7135
|
+
aggregatedClearingHouseState,
|
|
7136
|
+
allMids,
|
|
7137
|
+
allPerpMetaAssets,
|
|
7138
|
+
]);
|
|
7017
7139
|
return {
|
|
7018
7140
|
createPosition: createPosition$1,
|
|
7019
7141
|
updateRiskParameters: updateRiskParameters$1,
|
|
@@ -7095,12 +7217,97 @@ async function executeSpotOrder(baseUrl, payload) {
|
|
|
7095
7217
|
}
|
|
7096
7218
|
}
|
|
7097
7219
|
|
|
7220
|
+
function findAssetMeta$2(assetName, perpMetaAssets, knownPrefix, desiredCollateral) {
|
|
7221
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
7222
|
+
if (!perpMetaAssets) {
|
|
7223
|
+
return { collateralToken: 'USDC', marketPrefix: null };
|
|
7224
|
+
}
|
|
7225
|
+
if (desiredCollateral) {
|
|
7226
|
+
const collateralMatch = perpMetaAssets.find((a) => a.name === assetName && a.collateralToken === desiredCollateral);
|
|
7227
|
+
if (collateralMatch) {
|
|
7228
|
+
return {
|
|
7229
|
+
collateralToken: (_a = collateralMatch.collateralToken) !== null && _a !== void 0 ? _a : 'USDC',
|
|
7230
|
+
marketPrefix: (_b = collateralMatch.marketPrefix) !== null && _b !== void 0 ? _b : null,
|
|
7231
|
+
};
|
|
7232
|
+
}
|
|
7233
|
+
}
|
|
7234
|
+
if (assetName.includes(':')) {
|
|
7235
|
+
const [prefix, symbol] = assetName.split(':');
|
|
7236
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
7237
|
+
var _a;
|
|
7238
|
+
return a.name === symbol &&
|
|
7239
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === prefix.toLowerCase();
|
|
7240
|
+
});
|
|
7241
|
+
if (exactMatch) {
|
|
7242
|
+
return {
|
|
7243
|
+
collateralToken: (_c = exactMatch.collateralToken) !== null && _c !== void 0 ? _c : 'USDC',
|
|
7244
|
+
marketPrefix: (_d = exactMatch.marketPrefix) !== null && _d !== void 0 ? _d : null,
|
|
7245
|
+
};
|
|
7246
|
+
}
|
|
7247
|
+
}
|
|
7248
|
+
if (knownPrefix) {
|
|
7249
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
7250
|
+
var _a;
|
|
7251
|
+
return a.name === assetName &&
|
|
7252
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === knownPrefix.toLowerCase();
|
|
7253
|
+
});
|
|
7254
|
+
if (exactMatch) {
|
|
7255
|
+
return {
|
|
7256
|
+
collateralToken: (_e = exactMatch.collateralToken) !== null && _e !== void 0 ? _e : 'USDC',
|
|
7257
|
+
marketPrefix: (_f = exactMatch.marketPrefix) !== null && _f !== void 0 ? _f : null,
|
|
7258
|
+
};
|
|
7259
|
+
}
|
|
7260
|
+
}
|
|
7261
|
+
const regularAsset = perpMetaAssets.find((a) => a.name === assetName && !a.marketPrefix);
|
|
7262
|
+
if (regularAsset) {
|
|
7263
|
+
return {
|
|
7264
|
+
collateralToken: (_g = regularAsset.collateralToken) !== null && _g !== void 0 ? _g : 'USDC',
|
|
7265
|
+
marketPrefix: null,
|
|
7266
|
+
};
|
|
7267
|
+
}
|
|
7268
|
+
const hip3Assets = perpMetaAssets.filter((a) => a.name === assetName && a.marketPrefix);
|
|
7269
|
+
if (hip3Assets.length > 0) {
|
|
7270
|
+
if (desiredCollateral) {
|
|
7271
|
+
const collateralMatch = hip3Assets.find((a) => a.collateralToken === desiredCollateral);
|
|
7272
|
+
if (collateralMatch) {
|
|
7273
|
+
return {
|
|
7274
|
+
collateralToken: (_h = collateralMatch.collateralToken) !== null && _h !== void 0 ? _h : 'USDC',
|
|
7275
|
+
marketPrefix: (_j = collateralMatch.marketPrefix) !== null && _j !== void 0 ? _j : null,
|
|
7276
|
+
};
|
|
7277
|
+
}
|
|
7278
|
+
}
|
|
7279
|
+
const usdHMatch = hip3Assets.find((a) => a.collateralToken === 'USDH');
|
|
7280
|
+
const chosen = usdHMatch !== null && usdHMatch !== void 0 ? usdHMatch : hip3Assets[0];
|
|
7281
|
+
return {
|
|
7282
|
+
collateralToken: (_k = chosen.collateralToken) !== null && _k !== void 0 ? _k : 'USDC',
|
|
7283
|
+
marketPrefix: (_l = chosen.marketPrefix) !== null && _l !== void 0 ? _l : null,
|
|
7284
|
+
};
|
|
7285
|
+
}
|
|
7286
|
+
return { collateralToken: 'USDC', marketPrefix: null };
|
|
7287
|
+
}
|
|
7288
|
+
function enrichOrderAssets$1(assets, perpMetaAssets) {
|
|
7289
|
+
if (!assets)
|
|
7290
|
+
return [];
|
|
7291
|
+
return assets.map((asset) => {
|
|
7292
|
+
var _a;
|
|
7293
|
+
if (asset.marketPrefix && asset.collateralToken) {
|
|
7294
|
+
return asset;
|
|
7295
|
+
}
|
|
7296
|
+
const meta = findAssetMeta$2(asset.asset, perpMetaAssets, asset.marketPrefix, asset.collateralToken);
|
|
7297
|
+
return {
|
|
7298
|
+
...asset,
|
|
7299
|
+
marketPrefix: asset.marketPrefix || meta.marketPrefix,
|
|
7300
|
+
collateralToken: (_a = asset.collateralToken) !== null && _a !== void 0 ? _a : meta.collateralToken,
|
|
7301
|
+
};
|
|
7302
|
+
});
|
|
7303
|
+
}
|
|
7098
7304
|
function useOrders() {
|
|
7099
7305
|
const context = useContext(PearHyperliquidContext);
|
|
7100
7306
|
if (!context)
|
|
7101
7307
|
throw new Error('useOrders must be used within a PearHyperliquidProvider');
|
|
7102
7308
|
const { apiBaseUrl } = context;
|
|
7103
7309
|
const openOrders = useUserData((state) => state.openOrders);
|
|
7310
|
+
const allPerpMetaAssets = useHyperliquidData((state) => state.allPerpMetaAssets);
|
|
7104
7311
|
const isLoading = useMemo(() => openOrders === null && context.isConnected, [openOrders, context.isConnected]);
|
|
7105
7312
|
const { openPositions } = usePosition();
|
|
7106
7313
|
const positionsById = useMemo(() => {
|
|
@@ -7119,19 +7326,27 @@ function useOrders() {
|
|
|
7119
7326
|
const isTpSl = ord.orderType === 'TP' || ord.orderType === 'SL';
|
|
7120
7327
|
const hasAssets = ((_b = (_a = ord.longAssets) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 0 || ((_d = (_c = ord.shortAssets) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) > 0;
|
|
7121
7328
|
const pos = positionsById.get((_e = ord.positionId) !== null && _e !== void 0 ? _e : '');
|
|
7122
|
-
|
|
7123
|
-
|
|
7124
|
-
|
|
7125
|
-
|
|
7126
|
-
|
|
7127
|
-
|
|
7329
|
+
let enrichedOrd = {
|
|
7330
|
+
...ord,
|
|
7331
|
+
longAssets: enrichOrderAssets$1(ord.longAssets, allPerpMetaAssets),
|
|
7332
|
+
shortAssets: enrichOrderAssets$1(ord.shortAssets, allPerpMetaAssets),
|
|
7333
|
+
};
|
|
7334
|
+
if (isTpSl && !hasAssets && pos) {
|
|
7335
|
+
const mapAssets = (arr) => arr.map((a) => ({
|
|
7336
|
+
asset: a.coin,
|
|
7337
|
+
weight: a.initialWeight,
|
|
7338
|
+
marketPrefix: a.marketPrefix,
|
|
7339
|
+
collateralToken: a.collateralToken,
|
|
7340
|
+
}));
|
|
7341
|
+
enrichedOrd = {
|
|
7342
|
+
...enrichedOrd,
|
|
7128
7343
|
longAssets: mapAssets(pos.longAssets),
|
|
7129
7344
|
shortAssets: mapAssets(pos.shortAssets),
|
|
7130
7345
|
};
|
|
7131
7346
|
}
|
|
7132
|
-
return
|
|
7347
|
+
return enrichedOrd;
|
|
7133
7348
|
});
|
|
7134
|
-
}, [openOrders, positionsById]);
|
|
7349
|
+
}, [openOrders, positionsById, allPerpMetaAssets]);
|
|
7135
7350
|
const adjustOrder$1 = async (orderId, payload) => {
|
|
7136
7351
|
return adjustOrder(apiBaseUrl, orderId, payload);
|
|
7137
7352
|
};
|
|
@@ -7141,7 +7356,13 @@ function useOrders() {
|
|
|
7141
7356
|
const cancelTwapOrder$1 = async (orderId) => {
|
|
7142
7357
|
return cancelTwapOrder(apiBaseUrl, orderId);
|
|
7143
7358
|
};
|
|
7144
|
-
return {
|
|
7359
|
+
return {
|
|
7360
|
+
adjustOrder: adjustOrder$1,
|
|
7361
|
+
cancelOrder: cancelOrder$1,
|
|
7362
|
+
cancelTwapOrder: cancelTwapOrder$1,
|
|
7363
|
+
openOrders: enrichedOpenOrders,
|
|
7364
|
+
isLoading,
|
|
7365
|
+
};
|
|
7145
7366
|
}
|
|
7146
7367
|
|
|
7147
7368
|
/**
|
|
@@ -7183,13 +7404,108 @@ function useSpotOrder() {
|
|
|
7183
7404
|
};
|
|
7184
7405
|
}
|
|
7185
7406
|
|
|
7407
|
+
function findAssetMeta$1(assetName, perpMetaAssets, knownPrefix, desiredCollateral) {
|
|
7408
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
7409
|
+
if (!perpMetaAssets) {
|
|
7410
|
+
return { collateralToken: 'USDC', marketPrefix: null };
|
|
7411
|
+
}
|
|
7412
|
+
if (desiredCollateral) {
|
|
7413
|
+
const collateralMatch = perpMetaAssets.find((a) => a.name === assetName && a.collateralToken === desiredCollateral);
|
|
7414
|
+
if (collateralMatch) {
|
|
7415
|
+
return {
|
|
7416
|
+
collateralToken: (_a = collateralMatch.collateralToken) !== null && _a !== void 0 ? _a : 'USDC',
|
|
7417
|
+
marketPrefix: (_b = collateralMatch.marketPrefix) !== null && _b !== void 0 ? _b : null,
|
|
7418
|
+
};
|
|
7419
|
+
}
|
|
7420
|
+
}
|
|
7421
|
+
if (assetName.includes(':')) {
|
|
7422
|
+
const [prefix, symbol] = assetName.split(':');
|
|
7423
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
7424
|
+
var _a;
|
|
7425
|
+
return a.name === symbol &&
|
|
7426
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === prefix.toLowerCase();
|
|
7427
|
+
});
|
|
7428
|
+
if (exactMatch) {
|
|
7429
|
+
return {
|
|
7430
|
+
collateralToken: (_c = exactMatch.collateralToken) !== null && _c !== void 0 ? _c : 'USDC',
|
|
7431
|
+
marketPrefix: (_d = exactMatch.marketPrefix) !== null && _d !== void 0 ? _d : null,
|
|
7432
|
+
};
|
|
7433
|
+
}
|
|
7434
|
+
}
|
|
7435
|
+
if (knownPrefix) {
|
|
7436
|
+
const exactMatch = perpMetaAssets.find((a) => {
|
|
7437
|
+
var _a;
|
|
7438
|
+
return a.name === assetName &&
|
|
7439
|
+
((_a = a.marketPrefix) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === knownPrefix.toLowerCase();
|
|
7440
|
+
});
|
|
7441
|
+
if (exactMatch) {
|
|
7442
|
+
return {
|
|
7443
|
+
collateralToken: (_e = exactMatch.collateralToken) !== null && _e !== void 0 ? _e : 'USDC',
|
|
7444
|
+
marketPrefix: (_f = exactMatch.marketPrefix) !== null && _f !== void 0 ? _f : null,
|
|
7445
|
+
};
|
|
7446
|
+
}
|
|
7447
|
+
}
|
|
7448
|
+
const regularAsset = perpMetaAssets.find((a) => a.name === assetName && !a.marketPrefix);
|
|
7449
|
+
if (regularAsset) {
|
|
7450
|
+
return {
|
|
7451
|
+
collateralToken: (_g = regularAsset.collateralToken) !== null && _g !== void 0 ? _g : 'USDC',
|
|
7452
|
+
marketPrefix: null,
|
|
7453
|
+
};
|
|
7454
|
+
}
|
|
7455
|
+
const hip3Assets = perpMetaAssets.filter((a) => a.name === assetName && a.marketPrefix);
|
|
7456
|
+
if (hip3Assets.length > 0) {
|
|
7457
|
+
if (desiredCollateral) {
|
|
7458
|
+
const collateralMatch = hip3Assets.find((a) => a.collateralToken === desiredCollateral);
|
|
7459
|
+
if (collateralMatch) {
|
|
7460
|
+
return {
|
|
7461
|
+
collateralToken: (_h = collateralMatch.collateralToken) !== null && _h !== void 0 ? _h : 'USDC',
|
|
7462
|
+
marketPrefix: (_j = collateralMatch.marketPrefix) !== null && _j !== void 0 ? _j : null,
|
|
7463
|
+
};
|
|
7464
|
+
}
|
|
7465
|
+
}
|
|
7466
|
+
const usdHMatch = hip3Assets.find((a) => a.collateralToken === 'USDH');
|
|
7467
|
+
const chosen = usdHMatch !== null && usdHMatch !== void 0 ? usdHMatch : hip3Assets[0];
|
|
7468
|
+
return {
|
|
7469
|
+
collateralToken: (_k = chosen.collateralToken) !== null && _k !== void 0 ? _k : 'USDC',
|
|
7470
|
+
marketPrefix: (_l = chosen.marketPrefix) !== null && _l !== void 0 ? _l : null,
|
|
7471
|
+
};
|
|
7472
|
+
}
|
|
7473
|
+
return { collateralToken: 'USDC', marketPrefix: null };
|
|
7474
|
+
}
|
|
7475
|
+
function enrichOrderAssets(assets, perpMetaAssets) {
|
|
7476
|
+
if (!assets)
|
|
7477
|
+
return [];
|
|
7478
|
+
return assets.map((asset) => {
|
|
7479
|
+
var _a;
|
|
7480
|
+
if (asset.marketPrefix && asset.collateralToken) {
|
|
7481
|
+
return asset;
|
|
7482
|
+
}
|
|
7483
|
+
const meta = findAssetMeta$1(asset.asset, perpMetaAssets, asset.marketPrefix, asset.collateralToken);
|
|
7484
|
+
return {
|
|
7485
|
+
...asset,
|
|
7486
|
+
marketPrefix: asset.marketPrefix || meta.marketPrefix,
|
|
7487
|
+
collateralToken: (_a = asset.collateralToken) !== null && _a !== void 0 ? _a : meta.collateralToken,
|
|
7488
|
+
};
|
|
7489
|
+
});
|
|
7490
|
+
}
|
|
7491
|
+
function enrichTwapOrders(orders, perpMetaAssets) {
|
|
7492
|
+
return orders.map((order) => ({
|
|
7493
|
+
...order,
|
|
7494
|
+
longAssets: enrichOrderAssets(order.longAssets, perpMetaAssets),
|
|
7495
|
+
shortAssets: enrichOrderAssets(order.shortAssets, perpMetaAssets),
|
|
7496
|
+
}));
|
|
7497
|
+
}
|
|
7186
7498
|
function useTwap() {
|
|
7187
|
-
const twapDetails = useUserData(state => state.twapDetails);
|
|
7499
|
+
const twapDetails = useUserData((state) => state.twapDetails);
|
|
7500
|
+
const allPerpMetaAssets = useHyperliquidData((state) => state.allPerpMetaAssets);
|
|
7188
7501
|
const context = useContext(PearHyperliquidContext);
|
|
7189
7502
|
if (!context)
|
|
7190
7503
|
throw new Error('useTwap must be used within a PearHyperliquidProvider');
|
|
7191
7504
|
const { apiBaseUrl } = context;
|
|
7192
|
-
const orders = useMemo(() =>
|
|
7505
|
+
const orders = useMemo(() => {
|
|
7506
|
+
const rawOrders = twapDetails !== null && twapDetails !== void 0 ? twapDetails : [];
|
|
7507
|
+
return enrichTwapOrders(rawOrders, allPerpMetaAssets);
|
|
7508
|
+
}, [twapDetails, allPerpMetaAssets]);
|
|
7193
7509
|
const cancelTwap$1 = async (orderId) => {
|
|
7194
7510
|
return cancelTwap(apiBaseUrl, orderId);
|
|
7195
7511
|
};
|
|
@@ -7773,11 +8089,12 @@ const PearHyperliquidContext = createContext(undefined);
|
|
|
7773
8089
|
/**
|
|
7774
8090
|
* React Provider for PearHyperliquidClient
|
|
7775
8091
|
*/
|
|
7776
|
-
const PearHyperliquidProvider = ({ children, apiBaseUrl =
|
|
8092
|
+
const PearHyperliquidProvider = ({ children, apiBaseUrl = 'https://hl-v2.pearprotocol.io', clientId = 'PEARPROTOCOLUI', wsUrl = 'wss://hl-v2.pearprotocol.io/ws', }) => {
|
|
7777
8093
|
const address = useUserData((s) => s.address);
|
|
7778
8094
|
const setAddress = useUserData((s) => s.setAddress);
|
|
7779
8095
|
const perpsMetaAssets = useHyperliquidData((state) => state.perpMetaAssets);
|
|
7780
8096
|
const setPerpMetaAssets = useHyperliquidData((state) => state.setPerpMetaAssets);
|
|
8097
|
+
const setAllPerpMetaAssets = useHyperliquidData((state) => state.setAllPerpMetaAssets);
|
|
7781
8098
|
const setHip3Assets = useHyperliquidData((state) => state.setHip3Assets);
|
|
7782
8099
|
const setHip3MarketPrefixes = useHyperliquidData((state) => state.setHip3MarketPrefixes);
|
|
7783
8100
|
const websocketsEnabled = useMemo(() => Array.isArray(perpsMetaAssets) && perpsMetaAssets.length > 0, [perpsMetaAssets]);
|
|
@@ -7794,69 +8111,65 @@ const PearHyperliquidProvider = ({ children, apiBaseUrl = "https://hl-v2.pearpro
|
|
|
7794
8111
|
if (perpsMetaAssets === null) {
|
|
7795
8112
|
fetchAllPerpMetas()
|
|
7796
8113
|
.then((res) => {
|
|
7797
|
-
|
|
7798
|
-
const
|
|
7799
|
-
const marketPrefixes = new Map(); // "xyz:TSLA" -> "xyz"
|
|
8114
|
+
const assetToMarkets = new Map();
|
|
8115
|
+
const marketPrefixes = new Map();
|
|
7800
8116
|
const cleanedPerpMetas = [];
|
|
7801
|
-
|
|
7802
|
-
|
|
7803
|
-
const FILTERED_PREFIXES = ['vntl'];
|
|
8117
|
+
const allPerpMetas = [];
|
|
8118
|
+
const FILTERED_PREFIXES = ['vntl', 'hyna'];
|
|
7804
8119
|
res.data.forEach((item) => {
|
|
7805
|
-
|
|
7806
|
-
const collateralToken = item.collateralToken === 360 ? "USDH" : "USDC";
|
|
8120
|
+
const collateralToken = item.collateralToken === 360 ? 'USDH' : 'USDC';
|
|
7807
8121
|
item.universe.forEach((asset) => {
|
|
7808
8122
|
var _a;
|
|
7809
|
-
const [maybePrefix, maybeMarket] = asset.name.split(
|
|
8123
|
+
const [maybePrefix, maybeMarket] = asset.name.split(':');
|
|
7810
8124
|
if (maybeMarket) {
|
|
7811
|
-
// HIP-3 market with prefix (e.g., "xyz:TSLA")
|
|
7812
8125
|
const prefix = maybePrefix.toLowerCase();
|
|
7813
|
-
// Skip filtered prefixes (e.g., vntl)
|
|
7814
|
-
if (FILTERED_PREFIXES.includes(prefix)) {
|
|
7815
|
-
return;
|
|
7816
|
-
}
|
|
7817
8126
|
const displayName = maybeMarket;
|
|
7818
8127
|
const fullName = `${prefix}:${displayName}`;
|
|
7819
|
-
// Store full market name with prefix
|
|
7820
8128
|
marketPrefixes.set(fullName, prefix);
|
|
7821
|
-
|
|
7822
|
-
|
|
7823
|
-
|
|
7824
|
-
|
|
7825
|
-
|
|
7826
|
-
|
|
7827
|
-
|
|
8129
|
+
if (!FILTERED_PREFIXES.includes(prefix)) {
|
|
8130
|
+
const existingMarkets = (_a = assetToMarkets.get(displayName)) !== null && _a !== void 0 ? _a : [];
|
|
8131
|
+
if (!existingMarkets.includes(fullName)) {
|
|
8132
|
+
assetToMarkets.set(displayName, [
|
|
8133
|
+
...existingMarkets,
|
|
8134
|
+
fullName,
|
|
8135
|
+
]);
|
|
8136
|
+
}
|
|
7828
8137
|
}
|
|
7829
|
-
|
|
7830
|
-
// Important: We keep ALL variants so each market+collateral combo is tracked
|
|
7831
|
-
cleanedPerpMetas.push({
|
|
8138
|
+
const assetWithMeta = {
|
|
7832
8139
|
...asset,
|
|
7833
|
-
name: displayName,
|
|
7834
|
-
marketPrefix: prefix,
|
|
7835
|
-
collateralToken,
|
|
7836
|
-
}
|
|
8140
|
+
name: displayName,
|
|
8141
|
+
marketPrefix: prefix,
|
|
8142
|
+
collateralToken,
|
|
8143
|
+
};
|
|
8144
|
+
allPerpMetas.push(assetWithMeta);
|
|
8145
|
+
if (!FILTERED_PREFIXES.includes(prefix)) {
|
|
8146
|
+
cleanedPerpMetas.push(assetWithMeta);
|
|
8147
|
+
}
|
|
7837
8148
|
}
|
|
7838
8149
|
else {
|
|
7839
|
-
|
|
7840
|
-
cleanedPerpMetas.push({
|
|
8150
|
+
const assetWithMeta = {
|
|
7841
8151
|
...asset,
|
|
7842
|
-
collateralToken,
|
|
7843
|
-
}
|
|
8152
|
+
collateralToken,
|
|
8153
|
+
};
|
|
8154
|
+
cleanedPerpMetas.push(assetWithMeta);
|
|
8155
|
+
allPerpMetas.push(assetWithMeta);
|
|
7844
8156
|
}
|
|
7845
8157
|
});
|
|
7846
8158
|
});
|
|
7847
8159
|
setHip3Assets(assetToMarkets);
|
|
7848
8160
|
setHip3MarketPrefixes(marketPrefixes);
|
|
7849
8161
|
setPerpMetaAssets(cleanedPerpMetas);
|
|
8162
|
+
setAllPerpMetaAssets(allPerpMetas);
|
|
7850
8163
|
})
|
|
7851
8164
|
.catch(() => { });
|
|
7852
8165
|
}
|
|
7853
8166
|
}, [
|
|
7854
8167
|
perpsMetaAssets,
|
|
7855
8168
|
setPerpMetaAssets,
|
|
8169
|
+
setAllPerpMetaAssets,
|
|
7856
8170
|
setHip3Assets,
|
|
7857
8171
|
setHip3MarketPrefixes,
|
|
7858
8172
|
]);
|
|
7859
|
-
// Auth methods now sourced from useAuth hook
|
|
7860
8173
|
useAutoSyncFills({
|
|
7861
8174
|
baseUrl: apiBaseUrl,
|
|
7862
8175
|
address,
|
|
@@ -7894,7 +8207,7 @@ const PearHyperliquidProvider = ({ children, apiBaseUrl = "https://hl-v2.pearpro
|
|
|
7894
8207
|
function usePearHyperliquid() {
|
|
7895
8208
|
const ctx = useContext(PearHyperliquidContext);
|
|
7896
8209
|
if (!ctx)
|
|
7897
|
-
throw new Error(
|
|
8210
|
+
throw new Error('usePearHyperliquid must be used within a PearHyperliquidProvider');
|
|
7898
8211
|
return ctx;
|
|
7899
8212
|
}
|
|
7900
8213
|
|
package/dist/provider.d.ts
CHANGED
package/dist/types.d.ts
CHANGED
|
@@ -247,6 +247,8 @@ export interface OpenPositionDto {
|
|
|
247
247
|
export interface OrderAssetDto {
|
|
248
248
|
asset: string;
|
|
249
249
|
weight: number;
|
|
250
|
+
marketPrefix?: string | null;
|
|
251
|
+
collateralToken?: CollateralToken;
|
|
250
252
|
}
|
|
251
253
|
/**
|
|
252
254
|
* Order status
|
|
@@ -615,6 +617,8 @@ export interface RawAssetDto {
|
|
|
615
617
|
size: number;
|
|
616
618
|
side: string;
|
|
617
619
|
fundingPaid?: number;
|
|
620
|
+
marketPrefix?: string | null;
|
|
621
|
+
collateralToken?: CollateralToken;
|
|
618
622
|
}
|
|
619
623
|
/**
|
|
620
624
|
* Raw position data from open-positions channel
|