@pear-protocol/hyperliquid-sdk 0.0.66-usdh-2 → 0.0.66-usdh-4

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.
@@ -17,4 +17,4 @@ export * from './useMarketData';
17
17
  export * from './useWatchlist';
18
18
  export * from './usePortfolio';
19
19
  export * from './useAuth';
20
- export * from './useSpotBalances';
20
+ export * from './useAllUserBalances';
@@ -0,0 +1,9 @@
1
+ interface AllUserBalances {
2
+ spotUsdcBalance: number | undefined;
3
+ availableToTradeUsdc: number | undefined;
4
+ spotUsdhBalance: number | undefined;
5
+ availableToTradeUsdh: number | undefined;
6
+ isLoading: boolean;
7
+ }
8
+ export declare const useAllUserBalances: () => AllUserBalances;
9
+ export {};
package/dist/index.d.ts CHANGED
@@ -1252,12 +1252,14 @@ declare function useAuth(): {
1252
1252
  readonly logout: () => Promise<void>;
1253
1253
  };
1254
1254
 
1255
- interface SpotBalances {
1256
- usdhBalance: number | undefined;
1255
+ interface AllUserBalances {
1257
1256
  spotUsdcBalance: number | undefined;
1257
+ availableToTradeUsdc: number | undefined;
1258
+ spotUsdhBalance: number | undefined;
1259
+ availableToTradeUsdh: number | undefined;
1258
1260
  isLoading: boolean;
1259
1261
  }
1260
- declare const useSpotBalances: () => SpotBalances;
1262
+ declare const useAllUserBalances: () => AllUserBalances;
1261
1263
 
1262
1264
  interface UseHyperliquidWebSocketProps {
1263
1265
  wsUrl: string;
@@ -1500,5 +1502,5 @@ declare function isHip3Market(symbol: string): boolean;
1500
1502
 
1501
1503
  declare const useMarketData: any;
1502
1504
 
1503
- export { AccountSummaryCalculator, ConflictDetector, MAX_ASSETS_PER_LEG, MINIMUM_ASSET_USD_VALUE, MaxAssetsPerLegError, MinimumPositionSizeError, PearHyperliquidProvider, TokenMetadataExtractor, adjustAdvancePosition, adjustOrder, adjustPosition, calculateMinimumPositionValue, calculateWeightedRatio, cancelOrder, cancelTwap, cancelTwapOrder, closeAllPositions, closePosition, computeBasketCandles, createCandleLookups, createPosition, executeSpotOrder, getAvailableMarkets, getCompleteTimestamps, getMarketPrefix, getPortfolio, isHip3Market, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toBackendSymbol, toBackendSymbolWithMarket, toDisplaySymbol, toggleWatchlist, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePerpMetaAssets, usePortfolio, usePosition, useSpotBalances, useSpotOrder, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
1505
+ export { AccountSummaryCalculator, ConflictDetector, MAX_ASSETS_PER_LEG, MINIMUM_ASSET_USD_VALUE, MaxAssetsPerLegError, MinimumPositionSizeError, PearHyperliquidProvider, TokenMetadataExtractor, adjustAdvancePosition, adjustOrder, adjustPosition, calculateMinimumPositionValue, calculateWeightedRatio, cancelOrder, cancelTwap, cancelTwapOrder, closeAllPositions, closePosition, computeBasketCandles, createCandleLookups, createPosition, executeSpotOrder, getAvailableMarkets, getCompleteTimestamps, getMarketPrefix, getPortfolio, isHip3Market, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toBackendSymbol, toBackendSymbolWithMarket, toDisplaySymbol, toggleWatchlist, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAllUserBalances, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePerpMetaAssets, usePortfolio, usePosition, useSpotOrder, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
1504
1506
  export type { AccountSummaryResponseDto, ActiveAssetGroupItem, ActiveAssetsResponse, AdjustAdvanceAssetInput, AdjustAdvanceItemInput, AdjustAdvanceResponseDto, AdjustExecutionType, AdjustOrderRequestInput, AdjustOrderResponseDto, AdjustPositionRequestInput, AdjustPositionResponseDto, AgentWalletDto, AgentWalletState, ApiErrorResponse, ApiResponse, AssetCtx, AssetInformationDetail, AssetMarketData, AssetPosition, AutoSyncFillsOptions, AutoSyncFillsState, BalanceSummaryDto, CancelOrderResponseDto, CancelTwapResponseDto, CandleChartData, CandleData, CandleInterval, CandleSnapshotRequest, ClearinghouseState, CloseAllPositionsResponseDto, CloseAllPositionsResultDto, CloseExecutionType, ClosePositionRequestInput, ClosePositionResponseDto, CollateralFilter, CollateralToken, CreatePositionRequestInput, CreatePositionResponseDto, CrossMarginSummaryDto, CumFundingDto, ExecutionType, ExtraAgent, HLWebSocketResponse, HistoricalRange, LadderConfigInput, MarginSummaryDto, MarketDataBySymbol, NotificationCategory, NotificationDto, OpenLimitOrderDto, OpenPositionDto, OrderAssetDto, OrderStatus, PairAssetDto, PairAssetInput, PerformanceOverlay, PlatformAccountSummaryResponseDto, PortfolioBucketDto, PortfolioInterval, PortfolioIntervalsDto, PortfolioOverallDto, PortfolioResponseDto, PositionAdjustmentType, PositionAssetDetailDto, PositionAssetSummaryDto, PositionResponseStatus, RealtimeBar, RealtimeBarsCallback, SpotBalance, SpotOrderFilledStatus, SpotOrderHyperliquidData, SpotOrderHyperliquidResult, SpotOrderRequestInput, SpotOrderResponseDto, SpotState, ToggleWatchlistResponseDto, TokenConflict, TokenHistoricalPriceData, TokenMetadata, TokenSelection, TpSlThresholdInput, TpSlThresholdType, TradeHistoryAssetDataDto, TradeHistoryDataDto, TwapChunkStatusDto, TwapMonitoringDto, TwapSliceFillResponseItem, UniverseAsset, UpdateRiskParametersRequestInput, UpdateRiskParametersResponseDto, UseAuthOptions, UseBasketCandlesReturn, UseHistoricalPriceDataReturn, UseNotificationsResult, UsePerformanceOverlaysReturn, UsePortfolioResult, UseSpotOrderResult, UseTokenSelectionMetadataReturn, UserProfile, UserSelectionState, WatchlistItemDto, WebSocketAckResponse, WebSocketChannel, WebSocketConnectionState, WebSocketDataMessage, WebSocketMessage, WebSocketSubscribeMessage, WsAllMidsData };
package/dist/index.js CHANGED
@@ -422,6 +422,7 @@ const useHyperliquidData = create((set, get) => ({
422
422
  finalAssetContexts: null,
423
423
  finalAtOICaps: null,
424
424
  aggregatedClearingHouseState: null,
425
+ rawClearinghouseStates: null,
425
426
  perpMetaAssets: null,
426
427
  allPerpMetaAssets: null,
427
428
  hip3Assets: new Map(),
@@ -468,6 +469,7 @@ const useHyperliquidData = create((set, get) => ({
468
469
  setFinalAssetContexts: (value) => set({ finalAssetContexts: value }),
469
470
  setFinalAtOICaps: (value) => set({ finalAtOICaps: value }),
470
471
  setAggregatedClearingHouseState: (value) => set({ aggregatedClearingHouseState: value }),
472
+ setRawClearinghouseStates: (value) => set({ rawClearinghouseStates: value }),
471
473
  setPerpMetaAssets: (value) => set({ perpMetaAssets: value }),
472
474
  setAllPerpMetaAssets: (value) => set({ allPerpMetaAssets: value }),
473
475
  setHip3Assets: (value) => set({ hip3Assets: value }),
@@ -734,7 +736,7 @@ const useUserSelection$1 = create((set, get) => ({
734
736
  }));
735
737
 
736
738
  const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
737
- const { setAllMids, setActiveAssetData, upsertActiveAssetData, setCandleData, deleteCandleSymbol, deleteActiveAssetData, addCandleData, setFinalAssetContexts, setFinalAtOICaps, setAggregatedClearingHouseState, } = useHyperliquidData();
739
+ const { setAllMids, setActiveAssetData, upsertActiveAssetData, setCandleData, deleteCandleSymbol, deleteActiveAssetData, addCandleData, setFinalAssetContexts, setFinalAtOICaps, setAggregatedClearingHouseState, setRawClearinghouseStates, } = useHyperliquidData();
738
740
  const { setSpotState } = useUserData();
739
741
  const { candleInterval } = useUserSelection$1();
740
742
  const longTokens = useUserSelection$1((s) => s.longTokens);
@@ -777,8 +779,8 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
777
779
  case 'allDexsAssetCtxs':
778
780
  {
779
781
  const data = response.data;
780
- // Filter out vntl and hyna to match perpMetaAssets filtering
781
- const FILTERED_DEX_PREFIXES = ['vntl', 'hyna'];
782
+ // Filter out hyna to match perpMetaAssets filtering
783
+ const FILTERED_DEX_PREFIXES = ['hyna'];
782
784
  const filtered = (data.ctxs || [])
783
785
  .filter(([prefix]) => !FILTERED_DEX_PREFIXES.includes((prefix || '').toLowerCase()))
784
786
  .sort((a, b) => {
@@ -828,6 +830,7 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
828
830
  withdrawable,
829
831
  };
830
832
  setAggregatedClearingHouseState(aggregatedClearingHouseState);
833
+ setRawClearinghouseStates(data.clearinghouseStates || null);
831
834
  }
832
835
  break;
833
836
  case 'allMids':
@@ -905,6 +908,7 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
905
908
  setFinalAssetContexts,
906
909
  setFinalAtOICaps,
907
910
  setAggregatedClearingHouseState,
911
+ setRawClearinghouseStates,
908
912
  setSpotState,
909
913
  ]);
910
914
  const connect = useCallback(() => {
@@ -1075,6 +1079,7 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
1075
1079
  if (subscribedAddress && subscribedAddress !== userAddress) {
1076
1080
  // clear aggregatedClearingHouseState
1077
1081
  setAggregatedClearingHouseState(null);
1082
+ setRawClearinghouseStates(null);
1078
1083
  // clear spotState
1079
1084
  setSpotState(null);
1080
1085
  }
@@ -1084,6 +1089,7 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
1084
1089
  subscribedAddress,
1085
1090
  sendJsonMessage,
1086
1091
  setAggregatedClearingHouseState,
1092
+ setRawClearinghouseStates,
1087
1093
  setSpotState,
1088
1094
  ]);
1089
1095
  // Handle token subscriptions for activeAssetData
@@ -8139,34 +8145,97 @@ function useAuth() {
8139
8145
  };
8140
8146
  }
8141
8147
 
8142
- const useSpotBalances = () => {
8148
+ const useAllUserBalances = () => {
8143
8149
  const spotState = useUserData((state) => state.spotState);
8150
+ const aggregatedClearingHouseState = useHyperliquidData((state) => state.aggregatedClearingHouseState);
8151
+ const rawClearinghouseStates = useHyperliquidData((state) => state.rawClearinghouseStates);
8152
+ const activeAssetData = useHyperliquidData((state) => state.activeAssetData);
8153
+ const { longTokensMetadata, shortTokensMetadata } = useTokenSelectionMetadata();
8144
8154
  return useMemo(() => {
8145
- if (!spotState) {
8146
- return {
8147
- usdhBalance: undefined,
8148
- spotUsdcBalance: undefined,
8149
- isLoading: true,
8150
- };
8151
- }
8152
- const balances = spotState.balances || [];
8153
- let usdhBal = 0;
8154
- let spotUsdcBal = 0;
8155
- for (const balance of balances) {
8156
- const total = parseFloat(balance.total || '0');
8157
- if (balance.coin === 'USDH') {
8158
- usdhBal = total;
8155
+ const isLoading = !spotState || !aggregatedClearingHouseState;
8156
+ // Helper function to truncate to 2 decimal places without rounding
8157
+ const truncateToTwoDecimals = (value) => {
8158
+ return Math.floor(value * 100) / 100;
8159
+ };
8160
+ // Get spot balances from spotState
8161
+ let spotUsdcBal = undefined;
8162
+ let spotUsdhBal = undefined;
8163
+ if (spotState) {
8164
+ const balances = spotState.balances || [];
8165
+ for (const balance of balances) {
8166
+ const total = parseFloat(balance.total || '0');
8167
+ if (balance.coin === 'USDC') {
8168
+ spotUsdcBal = truncateToTwoDecimals(total);
8169
+ }
8170
+ if (balance.coin === 'USDH') {
8171
+ spotUsdhBal = truncateToTwoDecimals(total);
8172
+ }
8159
8173
  }
8160
- if (balance.coin === 'USDC') {
8161
- spotUsdcBal = total;
8174
+ }
8175
+ let availableToTradeUsdhFromAsset = 0;
8176
+ // This activeAssetData only contains data for SELECTED tokens (user's long and short Tokens)
8177
+ // It does NOT contain data for all tokens, so we cannot reliably use it for available to trade as used on hl trade page
8178
+ // so intead, we rely on rawClearinghouseStates which provides market-specific data
8179
+ // if (activeAssetData) {
8180
+ // Object.values(activeAssetData).forEach((assetData) => {
8181
+ // if (!assetData.availableToTrade) return;
8182
+ // const coinSymbol = assetData.coin;
8183
+ // const availableValue = truncateToTwoDecimals(
8184
+ // parseFloat(assetData.availableToTrade[0] || '0'),
8185
+ // );
8186
+ // // Determine collateral type based on market prefix
8187
+ // // HIP3 markets have prefix: "xyz:SYMBOL", "flx:SYMBOL", "vntl:SYMBOL", etc.
8188
+ // if (coinSymbol.includes(':')) {
8189
+ // const prefix = coinSymbol.split(':')[0];
8190
+ // if (prefix === 'xyz') {
8191
+ // // xyz markets use USDC
8192
+ // availableToTradeUsdcFromAsset = availableValue;
8193
+ // } else {
8194
+ // // flx, vntl, hyna and other markets use USDH
8195
+ // availableToTradeUsdhFromAsset = availableValue;
8196
+ // }
8197
+ // } else {
8198
+ // // Regular markets without prefix are automatically USDC
8199
+ // availableToTradeUsdcFromAsset = availableValue;
8200
+ // }
8201
+ // });
8202
+ // }
8203
+ // Calculate USDC available to trade
8204
+ // Priority 1: Use value from activeAssetData if available (> 0)
8205
+ // Priority 2: Calculate from USDC-specific clearinghouseState (empty prefix)
8206
+ let availableToTradeUsdcValue = undefined;
8207
+ if (rawClearinghouseStates) {
8208
+ // Find USDC market (empty prefix)
8209
+ const usdcMarket = rawClearinghouseStates.find(([prefix]) => prefix === '');
8210
+ const usdcState = usdcMarket === null || usdcMarket === void 0 ? void 0 : usdcMarket[1];
8211
+ if (usdcState === null || usdcState === void 0 ? void 0 : usdcState.marginSummary) {
8212
+ const accountValue = parseFloat(usdcState.marginSummary.accountValue || '0');
8213
+ const totalMarginUsed = parseFloat(usdcState.marginSummary.totalMarginUsed || '0');
8214
+ const calculatedValue = Math.max(0, accountValue - totalMarginUsed);
8215
+ availableToTradeUsdcValue = truncateToTwoDecimals(calculatedValue);
8162
8216
  }
8163
8217
  }
8218
+ // Calculate USDH available to trade
8219
+ // Priority 1: Use value from activeAssetData if available (> 0)
8220
+ // Priority 2: Use spot USDH balance
8221
+ const availableToTradeUsdhValue = availableToTradeUsdhFromAsset > 0
8222
+ ? availableToTradeUsdhFromAsset
8223
+ : spotUsdhBal;
8164
8224
  return {
8165
- usdhBalance: usdhBal,
8166
8225
  spotUsdcBalance: spotUsdcBal,
8167
- isLoading: false,
8226
+ availableToTradeUsdc: availableToTradeUsdcValue,
8227
+ spotUsdhBalance: spotUsdhBal,
8228
+ availableToTradeUsdh: availableToTradeUsdhValue,
8229
+ isLoading,
8168
8230
  };
8169
- }, [spotState]);
8231
+ }, [
8232
+ spotState,
8233
+ aggregatedClearingHouseState,
8234
+ rawClearinghouseStates,
8235
+ activeAssetData,
8236
+ longTokensMetadata,
8237
+ shortTokensMetadata,
8238
+ ]);
8170
8239
  };
8171
8240
 
8172
8241
  const PearHyperliquidContext = createContext(undefined);
@@ -8197,9 +8266,9 @@ const PearHyperliquidProvider = ({ children, apiBaseUrl = 'https://hl-ui.pearpro
8197
8266
  .then((res) => {
8198
8267
  const assetToMarkets = new Map();
8199
8268
  const marketPrefixes = new Map();
8200
- const FILTERED_PREFIXES = ['vntl', 'hyna'];
8269
+ const FILTERED_PREFIXES = ['hyna'];
8201
8270
  // Group assets by market prefix to match WebSocket flattening order
8202
- // WebSocket sends in order: "", "flx", "hyna", "vntl", "xyz"
8271
+ // WebSocket sends in order: "", "flx", "hyna", "vntl", "xyz" (we filter out hyna)
8203
8272
  const assetsByPrefix = new Map();
8204
8273
  const allAssetsByPrefix = new Map();
8205
8274
  res.data.forEach((item) => {
@@ -8424,4 +8493,4 @@ function mapCandleIntervalToTradingViewInterval(interval) {
8424
8493
  }
8425
8494
  }
8426
8495
 
8427
- export { AccountSummaryCalculator, ConflictDetector, MAX_ASSETS_PER_LEG, MINIMUM_ASSET_USD_VALUE, MaxAssetsPerLegError, MinimumPositionSizeError, PearHyperliquidProvider, TokenMetadataExtractor, adjustAdvancePosition, adjustOrder, adjustPosition, calculateMinimumPositionValue, calculateWeightedRatio, cancelOrder, cancelTwap, cancelTwapOrder, closeAllPositions, closePosition, computeBasketCandles, createCandleLookups, createPosition, executeSpotOrder, getAvailableMarkets, getCompleteTimestamps, getMarketPrefix, getPortfolio, isHip3Market, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toBackendSymbol, toBackendSymbolWithMarket, toDisplaySymbol, toggleWatchlist, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePerpMetaAssets, usePortfolio, usePosition, useSpotBalances, useSpotOrder, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
8496
+ export { AccountSummaryCalculator, ConflictDetector, MAX_ASSETS_PER_LEG, MINIMUM_ASSET_USD_VALUE, MaxAssetsPerLegError, MinimumPositionSizeError, PearHyperliquidProvider, TokenMetadataExtractor, adjustAdvancePosition, adjustOrder, adjustPosition, calculateMinimumPositionValue, calculateWeightedRatio, cancelOrder, cancelTwap, cancelTwapOrder, closeAllPositions, closePosition, computeBasketCandles, createCandleLookups, createPosition, executeSpotOrder, getAvailableMarkets, getCompleteTimestamps, getMarketPrefix, getPortfolio, isHip3Market, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toBackendSymbol, toBackendSymbolWithMarket, toDisplaySymbol, toggleWatchlist, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAllUserBalances, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePerpMetaAssets, usePortfolio, usePosition, useSpotOrder, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pear-protocol/hyperliquid-sdk",
3
- "version": "0.0.66-usdh-2",
3
+ "version": "0.0.66-usdh-4",
4
4
  "description": "React SDK for Pear Protocol Hyperliquid API integration",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,7 +0,0 @@
1
- interface SpotBalances {
2
- usdhBalance: number | undefined;
3
- spotUsdcBalance: number | undefined;
4
- isLoading: boolean;
5
- }
6
- export declare const useSpotBalances: () => SpotBalances;
7
- export {};