@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.
@@ -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) && !('channel' 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((a) => ({ ...a, coin: toDisplaySymbol(a.coin) })),
182
- closedShortAssets: item.closedShortAssets.map((a) => ({ ...a, coin: toDisplaySymbol(a.coin) })),
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((a) => ({ ...a, coin: toDisplaySymbol(a.coin) })),
195
- shortAssets: pos.shortAssets.map((a) => ({ ...a, coin: toDisplaySymbol(a.coin) })),
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) => ({ ...a, asset: toDisplaySymbol(a.asset) })),
205
- shortAssets: order.shortAssets.map((a) => ({ ...a, asset: toDisplaySymbol(a.asset) })),
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((a) => ({ ...a, asset: toDisplaySymbol(a.asset) })),
218
- shortAssets: twap.shortAssets.map((a) => ({ ...a, asset: toDisplaySymbol(a.asset) })),
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) => ({ ...a, asset: toDisplaySymbol(a.asset) })),
232
- shortAssets: g.shortAssets.map((a) => ({ ...a, asset: toDisplaySymbol(a.asset) })),
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
- }, [setTradeHistories, setRawOpenPositions, setOpenOrders, setAccountSummary, setTwapDetails, setNotifications, setMarketData]);
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
- // Helper to find asset metadata from perpMetaAssets
1065
- function findAssetMeta$2(coinName, perpMetaAssets) {
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
- // Try exact match first (for prefixed assets like "xyz:TSLA")
1071
- const exactMatch = perpMetaAssets.find((a) => a.name === coinName);
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: (_a = exactMatch.collateralToken) !== null && _a !== void 0 ? _a : 'USDC',
1075
- marketPrefix: (_b = exactMatch.marketPrefix) !== null && _b !== void 0 ? _b : null,
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
- // Try matching by base symbol (for non-prefixed names in data)
1079
- const baseMatch = perpMetaAssets.find((a) => {
1080
- const baseName = a.name.includes(':') ? a.name.split(':')[1] : a.name;
1081
- return baseName === coinName;
1082
- });
1083
- if (baseMatch) {
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: (_c = baseMatch.collateralToken) !== null && _c !== void 0 ? _c : 'USDC',
1086
- marketPrefix: (_d = baseMatch.marketPrefix) !== null && _d !== void 0 ? _d : null,
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
- const meta = findAssetMeta$2(asset.coin, perpMetaAssets);
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 perpMetaAssets = useHyperliquidData((state) => state.perpMetaAssets);
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, perpMetaAssets);
1125
- }, [tradeHistories, perpMetaAssets]);
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
- // Helper to find asset metadata from perpMetaAssets
6926
- function findAssetMeta$1(coinName, perpMetaAssets) {
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
- // Try exact match first (for prefixed assets like "xyz:TSLA")
6932
- const exactMatch = perpMetaAssets.find((a) => a.name === coinName);
6933
- if (exactMatch) {
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: (_a = exactMatch.collateralToken) !== null && _a !== void 0 ? _a : 'USDC',
6936
- marketPrefix: (_b = exactMatch.marketPrefix) !== null && _b !== void 0 ? _b : null,
7062
+ collateralToken: (_g = regularAsset.collateralToken) !== null && _g !== void 0 ? _g : 'USDC',
7063
+ marketPrefix: null,
6937
7064
  };
6938
7065
  }
6939
- // Try matching by base symbol (for non-prefixed names in data)
6940
- const baseMatch = perpMetaAssets.find((a) => {
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: (_c = baseMatch.collateralToken) !== null && _c !== void 0 ? _c : 'USDC',
6947
- marketPrefix: (_d = baseMatch.marketPrefix) !== null && _d !== void 0 ? _d : null,
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
- const meta = findAssetMeta$1(asset.coin, perpMetaAssets);
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 perpMetaAssets = useHyperliquidData((state) => state.perpMetaAssets);
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
- // Enrich with market prefix and collateral token
7015
- return enrichPositions(positions, perpMetaAssets);
7016
- }, [userOpenPositions, aggregatedClearingHouseState, allMids, perpMetaAssets]);
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
- if (!isTpSl || !pos)
7123
- return ord;
7124
- const mapAssets = (arr) => arr.map((a) => ({ asset: a.coin, weight: a.initialWeight }));
7125
- if (!hasAssets) {
7126
- return {
7127
- ...ord,
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 ord;
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 { adjustOrder: adjustOrder$1, cancelOrder: cancelOrder$1, cancelTwapOrder: cancelTwapOrder$1, openOrders: enrichedOpenOrders, isLoading };
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(() => twapDetails !== null && twapDetails !== void 0 ? twapDetails : [], [twapDetails]);
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 = "https://hl-v2.pearprotocol.io", clientId = "PEARPROTOCOLUI", wsUrl = "wss://hl-v2.pearprotocol.io/ws", }) => {
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
- // Maps for multi-market assets
7798
- const assetToMarkets = new Map(); // TSLA -> ["xyz:TSLA", "flx:TSLA"]
7799
- const marketPrefixes = new Map(); // "xyz:TSLA" -> "xyz"
8114
+ const assetToMarkets = new Map();
8115
+ const marketPrefixes = new Map();
7800
8116
  const cleanedPerpMetas = [];
7801
- // Process each market group (different collateral tokens)
7802
- // Filter out vntl HIP-3 assets from being sent to frontend
7803
- const FILTERED_PREFIXES = ['vntl'];
8117
+ const allPerpMetas = [];
8118
+ const FILTERED_PREFIXES = ['vntl', 'hyna'];
7804
8119
  res.data.forEach((item) => {
7805
- // Convert numeric collateral token to human-readable name
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
- // Track all markets for this asset
7822
- const existingMarkets = (_a = assetToMarkets.get(displayName)) !== null && _a !== void 0 ? _a : [];
7823
- if (!existingMarkets.includes(fullName)) {
7824
- assetToMarkets.set(displayName, [
7825
- ...existingMarkets,
7826
- fullName,
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
- // Add asset with all metadata INCLUDING collateral token for THIS specific market
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, // Use display name for UI
7834
- marketPrefix: prefix, // Which market (xyz, flx, etc)
7835
- collateralToken, // "USDC" or "USDH"
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
- // Regular market without prefix
7840
- cleanedPerpMetas.push({
8150
+ const assetWithMeta = {
7841
8151
  ...asset,
7842
- collateralToken, // "USDC" or "USDH"
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("usePearHyperliquid must be used within a PearHyperliquidProvider");
8210
+ throw new Error('usePearHyperliquid must be used within a PearHyperliquidProvider');
7898
8211
  return ctx;
7899
8212
  }
7900
8213
 
@@ -1,4 +1,4 @@
1
- import React, { ReactNode } from "react";
1
+ import React, { ReactNode } from 'react';
2
2
  export interface PearHyperliquidContextType {
3
3
  clientId: string;
4
4
  apiBaseUrl: string;
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pear-protocol/hyperliquid-sdk",
3
- "version": "0.0.60-beta-usdh-4",
3
+ "version": "0.0.60-beta-usdh-6",
4
4
  "description": "React SDK for Pear Protocol Hyperliquid API integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",