@pear-protocol/hyperliquid-sdk 0.0.68 → 0.0.70-beta
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/clients/positions.d.ts +7 -0
- package/dist/hooks/usePosition.d.ts +2 -1
- package/dist/index.d.ts +10 -2
- package/dist/index.js +119 -66
- package/package.json +1 -1
|
@@ -126,3 +126,10 @@ export interface AdjustAdvanceResponseDto {
|
|
|
126
126
|
}
|
|
127
127
|
export declare function adjustAdvancePosition(baseUrl: string, positionId: string, payload: AdjustAdvanceItemInput[], displayToFull: Map<string, string>): Promise<ApiResponse<AdjustAdvanceResponseDto>>;
|
|
128
128
|
export declare function cancelTwap(baseUrl: string, orderId: string): Promise<ApiResponse<CancelTwapResponseDto>>;
|
|
129
|
+
export interface UpdateLeverageRequestInput {
|
|
130
|
+
leverage: number;
|
|
131
|
+
}
|
|
132
|
+
export interface UpdateLeverageResponseDto {
|
|
133
|
+
message?: string;
|
|
134
|
+
}
|
|
135
|
+
export declare function updateLeverage(baseUrl: string, positionId: string, payload: UpdateLeverageRequestInput): Promise<ApiResponse<UpdateLeverageResponseDto | null>>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CreatePositionRequestInput, type CreatePositionResponseDto, type UpdateRiskParametersRequestInput, type UpdateRiskParametersResponseDto, type ClosePositionRequestInput, type ClosePositionResponseDto, type CloseAllPositionsResponseDto, type AdjustPositionRequestInput, type AdjustPositionResponseDto, type AdjustAdvanceItemInput, type AdjustAdvanceResponseDto } from '../clients/positions';
|
|
1
|
+
import { type CreatePositionRequestInput, type CreatePositionResponseDto, type UpdateRiskParametersRequestInput, type UpdateRiskParametersResponseDto, type ClosePositionRequestInput, type ClosePositionResponseDto, type CloseAllPositionsResponseDto, type AdjustPositionRequestInput, type AdjustPositionResponseDto, type AdjustAdvanceItemInput, type AdjustAdvanceResponseDto, type UpdateLeverageResponseDto } from '../clients/positions';
|
|
2
2
|
import type { ApiResponse, OpenPositionDto } from '../types';
|
|
3
3
|
export declare function usePosition(): {
|
|
4
4
|
readonly createPosition: (payload: CreatePositionRequestInput) => Promise<ApiResponse<CreatePositionResponseDto>>;
|
|
@@ -7,6 +7,7 @@ export declare function usePosition(): {
|
|
|
7
7
|
readonly closeAllPositions: (payload: ClosePositionRequestInput) => Promise<ApiResponse<CloseAllPositionsResponseDto>>;
|
|
8
8
|
readonly adjustPosition: (positionId: string, payload: AdjustPositionRequestInput) => Promise<ApiResponse<AdjustPositionResponseDto>>;
|
|
9
9
|
readonly adjustAdvancePosition: (positionId: string, payload: AdjustAdvanceItemInput[]) => Promise<ApiResponse<AdjustAdvanceResponseDto>>;
|
|
10
|
+
readonly updateLeverage: (positionId: string, leverage: number) => Promise<ApiResponse<UpdateLeverageResponseDto | null>>;
|
|
10
11
|
readonly openPositions: OpenPositionDto[] | null;
|
|
11
12
|
readonly isLoading: boolean;
|
|
12
13
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -1008,6 +1008,13 @@ interface AdjustAdvanceResponseDto {
|
|
|
1008
1008
|
}
|
|
1009
1009
|
declare function adjustAdvancePosition(baseUrl: string, positionId: string, payload: AdjustAdvanceItemInput[], displayToFull: Map<string, string>): Promise<ApiResponse<AdjustAdvanceResponseDto>>;
|
|
1010
1010
|
declare function cancelTwap(baseUrl: string, orderId: string): Promise<ApiResponse<CancelTwapResponseDto>>;
|
|
1011
|
+
interface UpdateLeverageRequestInput {
|
|
1012
|
+
leverage: number;
|
|
1013
|
+
}
|
|
1014
|
+
interface UpdateLeverageResponseDto {
|
|
1015
|
+
message?: string;
|
|
1016
|
+
}
|
|
1017
|
+
declare function updateLeverage(baseUrl: string, positionId: string, payload: UpdateLeverageRequestInput): Promise<ApiResponse<UpdateLeverageResponseDto | null>>;
|
|
1011
1018
|
|
|
1012
1019
|
declare function usePosition(): {
|
|
1013
1020
|
readonly createPosition: (payload: CreatePositionRequestInput) => Promise<ApiResponse<CreatePositionResponseDto>>;
|
|
@@ -1016,6 +1023,7 @@ declare function usePosition(): {
|
|
|
1016
1023
|
readonly closeAllPositions: (payload: ClosePositionRequestInput) => Promise<ApiResponse<CloseAllPositionsResponseDto>>;
|
|
1017
1024
|
readonly adjustPosition: (positionId: string, payload: AdjustPositionRequestInput) => Promise<ApiResponse<AdjustPositionResponseDto>>;
|
|
1018
1025
|
readonly adjustAdvancePosition: (positionId: string, payload: AdjustAdvanceItemInput[]) => Promise<ApiResponse<AdjustAdvanceResponseDto>>;
|
|
1026
|
+
readonly updateLeverage: (positionId: string, leverage: number) => Promise<ApiResponse<UpdateLeverageResponseDto | null>>;
|
|
1019
1027
|
readonly openPositions: OpenPositionDto[] | null;
|
|
1020
1028
|
readonly isLoading: boolean;
|
|
1021
1029
|
};
|
|
@@ -1325,5 +1333,5 @@ declare function validatePositionSize(usdValue: number, longAssets?: PairAssetIn
|
|
|
1325
1333
|
|
|
1326
1334
|
declare const useMarketData: any;
|
|
1327
1335
|
|
|
1328
|
-
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, getCompleteTimestamps, getPortfolio, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toggleWatchlist, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePortfolio, usePosition, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
|
|
1329
|
-
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, CreatePositionRequestInput, CreatePositionResponseDto, CrossMarginSummaryDto, CumFundingDto, ExecutionType, ExtraAgent, HLWebSocketResponse, HistoricalRange, LadderConfigInput, MarginSummaryDto, NotificationCategory, NotificationDto, OpenLimitOrderDto, OpenPositionDto, OrderAssetDto, OrderStatus, PairAssetDto, PairAssetInput, PerformanceOverlay, PlatformAccountSummaryResponseDto, PortfolioBucketDto, PortfolioInterval, PortfolioIntervalsDto, PortfolioOverallDto, PortfolioResponseDto, PositionAdjustmentType, PositionAssetDetailDto, PositionAssetSummaryDto, PositionResponseStatus, RealtimeBar, RealtimeBarsCallback, ToggleWatchlistResponseDto, TokenConflict, TokenHistoricalPriceData, TokenMetadata, TokenSelection, TpSlThresholdInput, TpSlThresholdType, TradeHistoryAssetDataDto, TradeHistoryDataDto, TwapChunkStatusDto, TwapMonitoringDto, TwapSliceFillResponseItem, UniverseAsset, UpdateRiskParametersRequestInput, UpdateRiskParametersResponseDto, UseAuthOptions, UseBasketCandlesReturn, UseHistoricalPriceDataReturn, UseNotificationsResult, UsePerformanceOverlaysReturn, UsePortfolioResult, UseTokenSelectionMetadataReturn, UserProfile, UserSelectionState, WatchlistItemDto, WebSocketAckResponse, WebSocketChannel, WebSocketConnectionState, WebSocketDataMessage, WebSocketMessage, WebSocketSubscribeMessage, WsAllMidsData };
|
|
1336
|
+
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, getCompleteTimestamps, getPortfolio, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toggleWatchlist, updateLeverage, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePortfolio, usePosition, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
|
|
1337
|
+
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, CreatePositionRequestInput, CreatePositionResponseDto, CrossMarginSummaryDto, CumFundingDto, ExecutionType, ExtraAgent, HLWebSocketResponse, HistoricalRange, LadderConfigInput, MarginSummaryDto, NotificationCategory, NotificationDto, OpenLimitOrderDto, OpenPositionDto, OrderAssetDto, OrderStatus, PairAssetDto, PairAssetInput, PerformanceOverlay, PlatformAccountSummaryResponseDto, PortfolioBucketDto, PortfolioInterval, PortfolioIntervalsDto, PortfolioOverallDto, PortfolioResponseDto, PositionAdjustmentType, PositionAssetDetailDto, PositionAssetSummaryDto, PositionResponseStatus, RealtimeBar, RealtimeBarsCallback, ToggleWatchlistResponseDto, TokenConflict, TokenHistoricalPriceData, TokenMetadata, TokenSelection, TpSlThresholdInput, TpSlThresholdType, TradeHistoryAssetDataDto, TradeHistoryDataDto, TwapChunkStatusDto, TwapMonitoringDto, TwapSliceFillResponseItem, UniverseAsset, UpdateLeverageRequestInput, UpdateLeverageResponseDto, UpdateRiskParametersRequestInput, UpdateRiskParametersResponseDto, UseAuthOptions, UseBasketCandlesReturn, UseHistoricalPriceDataReturn, UseNotificationsResult, UsePerformanceOverlaysReturn, UsePortfolioResult, UseTokenSelectionMetadataReturn, UserProfile, UserSelectionState, WatchlistItemDto, WebSocketAckResponse, WebSocketChannel, WebSocketConnectionState, WebSocketDataMessage, WebSocketMessage, WebSocketSubscribeMessage, WsAllMidsData };
|
package/dist/index.js
CHANGED
|
@@ -625,11 +625,11 @@ const useUserSelection$1 = create((set, get) => ({
|
|
|
625
625
|
}));
|
|
626
626
|
|
|
627
627
|
const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
628
|
-
const { setAllMids, setActiveAssetData, upsertActiveAssetData, setCandleData, deleteCandleSymbol, deleteActiveAssetData, addCandleData, setFinalAssetContexts, setFinalAtOICaps, setAggregatedClearingHouseState } = useHyperliquidData();
|
|
628
|
+
const { setAllMids, setActiveAssetData, upsertActiveAssetData, setCandleData, deleteCandleSymbol, deleteActiveAssetData, addCandleData, setFinalAssetContexts, setFinalAtOICaps, setAggregatedClearingHouseState, } = useHyperliquidData();
|
|
629
629
|
const { candleInterval } = useUserSelection$1();
|
|
630
630
|
const longTokens = useUserSelection$1((s) => s.longTokens);
|
|
631
631
|
const shortTokens = useUserSelection$1((s) => s.shortTokens);
|
|
632
|
-
const selectedTokenSymbols = useMemo(() =>
|
|
632
|
+
const selectedTokenSymbols = useMemo(() => [...longTokens, ...shortTokens].map((t) => t.symbol), [longTokens, shortTokens]);
|
|
633
633
|
const [lastError, setLastError] = useState(null);
|
|
634
634
|
const [subscribedAddress, setSubscribedAddress] = useState(null);
|
|
635
635
|
const [subscribedTokens, setSubscribedTokens] = useState([]);
|
|
@@ -644,9 +644,9 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
644
644
|
try {
|
|
645
645
|
const message = JSON.parse(event.data);
|
|
646
646
|
// Handle subscription responses
|
|
647
|
-
if (
|
|
647
|
+
if ("success" in message || "error" in message) {
|
|
648
648
|
if (message.error) {
|
|
649
|
-
console.error(
|
|
649
|
+
console.error("[HyperLiquid WS] Subscription error:", message.error);
|
|
650
650
|
setLastError(message.error);
|
|
651
651
|
}
|
|
652
652
|
else {
|
|
@@ -655,36 +655,30 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
655
655
|
return;
|
|
656
656
|
}
|
|
657
657
|
// Handle channel data messages
|
|
658
|
-
if (
|
|
658
|
+
if ("channel" in message && "data" in message) {
|
|
659
659
|
const response = message;
|
|
660
660
|
switch (response.channel) {
|
|
661
|
-
case
|
|
661
|
+
case "webData3":
|
|
662
662
|
const webData3 = response.data;
|
|
663
663
|
// finalAssetContexts now sourced from allDexsAssetCtxs channel
|
|
664
664
|
const finalAtOICaps = webData3.perpDexStates.flatMap((dex) => dex.perpsAtOpenInterestCap);
|
|
665
665
|
setFinalAtOICaps(finalAtOICaps);
|
|
666
666
|
break;
|
|
667
|
-
case
|
|
667
|
+
case "allDexsAssetCtxs":
|
|
668
668
|
{
|
|
669
669
|
const data = response.data;
|
|
670
670
|
const finalAssetContexts = (data.ctxs || []).flatMap(([, ctxs]) => ctxs || []);
|
|
671
671
|
setFinalAssetContexts(finalAssetContexts);
|
|
672
672
|
}
|
|
673
673
|
break;
|
|
674
|
-
case
|
|
674
|
+
case "allDexsClearinghouseState":
|
|
675
675
|
{
|
|
676
|
-
// If the user is not authenticated, ignore clearinghouse state to avoid
|
|
677
|
-
// populating summaries with the default zero address data.
|
|
678
|
-
if (!address) {
|
|
679
|
-
setAggregatedClearingHouseState(null);
|
|
680
|
-
break;
|
|
681
|
-
}
|
|
682
676
|
const data = response.data;
|
|
683
677
|
const states = (data.clearinghouseStates || [])
|
|
684
678
|
.map(([, s]) => s)
|
|
685
679
|
.filter(Boolean);
|
|
686
|
-
const sum = (values) => values.reduce((acc, v) => acc + (parseFloat(v ||
|
|
687
|
-
const toStr = (n) =>
|
|
680
|
+
const sum = (values) => values.reduce((acc, v) => acc + (parseFloat(v || "0") || 0), 0);
|
|
681
|
+
const toStr = (n) => Number.isFinite(n) ? n.toString() : "0";
|
|
688
682
|
const assetPositions = states.flatMap((s) => s.assetPositions || []);
|
|
689
683
|
const crossMaintenanceMarginUsed = toStr(sum(states.map((s) => s.crossMaintenanceMarginUsed)));
|
|
690
684
|
const crossMarginSummary = {
|
|
@@ -712,29 +706,34 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
712
706
|
setAggregatedClearingHouseState(aggregatedClearingHouseState);
|
|
713
707
|
}
|
|
714
708
|
break;
|
|
715
|
-
case
|
|
709
|
+
case "allMids":
|
|
716
710
|
{
|
|
717
711
|
const data = response.data;
|
|
718
712
|
const remapped = {
|
|
719
713
|
mids: Object.fromEntries(
|
|
720
714
|
// only support non hip-3 and xyz market
|
|
721
|
-
Object.entries(data.mids || {})
|
|
715
|
+
Object.entries(data.mids || {})
|
|
716
|
+
.filter(([k, v]) => !k.includes(":") || k.includes("xyz:"))
|
|
717
|
+
.map(([k, v]) => [toDisplaySymbol(k), v])),
|
|
722
718
|
};
|
|
723
719
|
setAllMids(remapped);
|
|
724
720
|
}
|
|
725
721
|
break;
|
|
726
|
-
case
|
|
722
|
+
case "activeAssetData":
|
|
727
723
|
{
|
|
728
724
|
const assetData = response.data;
|
|
729
725
|
const symbol = toDisplaySymbol(assetData.coin);
|
|
730
|
-
const normalized = {
|
|
726
|
+
const normalized = {
|
|
727
|
+
...assetData,
|
|
728
|
+
coin: symbol,
|
|
729
|
+
};
|
|
731
730
|
upsertActiveAssetData(symbol, normalized);
|
|
732
731
|
}
|
|
733
732
|
break;
|
|
734
|
-
case
|
|
733
|
+
case "candle":
|
|
735
734
|
{
|
|
736
735
|
const candleDataItem = response.data;
|
|
737
|
-
const symbol = toDisplaySymbol(candleDataItem.s ||
|
|
736
|
+
const symbol = toDisplaySymbol(candleDataItem.s || "");
|
|
738
737
|
const normalized = { ...candleDataItem, s: symbol };
|
|
739
738
|
addCandleData(symbol, normalized);
|
|
740
739
|
}
|
|
@@ -746,10 +745,17 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
746
745
|
}
|
|
747
746
|
catch (error) {
|
|
748
747
|
const errorMessage = `Failed to parse message: ${error instanceof Error ? error.message : String(error)}`;
|
|
749
|
-
console.error(
|
|
748
|
+
console.error("[HyperLiquid WS] Parse error:", errorMessage, "Raw message:", event.data);
|
|
750
749
|
setLastError(errorMessage);
|
|
751
750
|
}
|
|
752
|
-
}, [
|
|
751
|
+
}, [
|
|
752
|
+
setAllMids,
|
|
753
|
+
upsertActiveAssetData,
|
|
754
|
+
addCandleData,
|
|
755
|
+
setFinalAssetContexts,
|
|
756
|
+
setFinalAtOICaps,
|
|
757
|
+
setAggregatedClearingHouseState,
|
|
758
|
+
]);
|
|
753
759
|
const connect = useCallback(() => {
|
|
754
760
|
if (!enabled)
|
|
755
761
|
return;
|
|
@@ -762,7 +768,7 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
762
768
|
}
|
|
763
769
|
manualCloseRef.current = false;
|
|
764
770
|
setReadyState(ReadyState.CONNECTING);
|
|
765
|
-
const ws = new WebSocket(
|
|
771
|
+
const ws = new WebSocket("wss://api.hyperliquid.xyz/ws");
|
|
766
772
|
wsRef.current = ws;
|
|
767
773
|
ws.onopen = () => {
|
|
768
774
|
reconnectAttemptsRef.current = 0;
|
|
@@ -771,15 +777,15 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
771
777
|
};
|
|
772
778
|
ws.onmessage = handleMessage;
|
|
773
779
|
ws.onerror = (event) => {
|
|
774
|
-
console.error(
|
|
775
|
-
setLastError(
|
|
780
|
+
console.error("[HyperLiquid WS] Connection error:", event);
|
|
781
|
+
setLastError("WebSocket error");
|
|
776
782
|
};
|
|
777
783
|
ws.onclose = () => {
|
|
778
784
|
setReadyState(ReadyState.CLOSED);
|
|
779
785
|
if (!manualCloseRef.current && reconnectAttemptsRef.current < 5) {
|
|
780
786
|
reconnectAttemptsRef.current += 1;
|
|
781
787
|
if (reconnectAttemptsRef.current === 5) {
|
|
782
|
-
console.error(
|
|
788
|
+
console.error("[HyperLiquid WS] Reconnection stopped after 5 attempts");
|
|
783
789
|
}
|
|
784
790
|
setTimeout(() => connect(), 3000);
|
|
785
791
|
}
|
|
@@ -813,7 +819,7 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
813
819
|
if (isConnected) {
|
|
814
820
|
// Send ping every 30 seconds
|
|
815
821
|
pingIntervalRef.current = setInterval(() => {
|
|
816
|
-
sendJsonMessage({ method:
|
|
822
|
+
sendJsonMessage({ method: "ping" });
|
|
817
823
|
}, 30000);
|
|
818
824
|
}
|
|
819
825
|
else {
|
|
@@ -833,57 +839,57 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
833
839
|
useEffect(() => {
|
|
834
840
|
if (!isConnected)
|
|
835
841
|
return;
|
|
836
|
-
const DEFAULT_ADDRESS =
|
|
842
|
+
const DEFAULT_ADDRESS = "0x0000000000000000000000000000000000000000";
|
|
837
843
|
const userAddress = address || DEFAULT_ADDRESS;
|
|
838
844
|
if (subscribedAddress === userAddress)
|
|
839
845
|
return;
|
|
840
846
|
// Unsubscribe from previous address if exists
|
|
841
847
|
if (subscribedAddress) {
|
|
842
848
|
const unsubscribeMessage = {
|
|
843
|
-
method:
|
|
849
|
+
method: "unsubscribe",
|
|
844
850
|
subscription: {
|
|
845
|
-
type:
|
|
851
|
+
type: "webData3",
|
|
846
852
|
user: subscribedAddress,
|
|
847
853
|
},
|
|
848
854
|
};
|
|
849
855
|
sendJsonMessage(unsubscribeMessage);
|
|
850
856
|
const unsubscribeAllDexsClearinghouseState = {
|
|
851
|
-
method:
|
|
857
|
+
method: "unsubscribe",
|
|
852
858
|
subscription: {
|
|
853
|
-
type:
|
|
859
|
+
type: "allDexsClearinghouseState",
|
|
854
860
|
user: subscribedAddress,
|
|
855
861
|
},
|
|
856
862
|
};
|
|
857
863
|
sendJsonMessage(unsubscribeAllDexsClearinghouseState);
|
|
858
864
|
}
|
|
859
865
|
const subscribeWebData3 = {
|
|
860
|
-
method:
|
|
866
|
+
method: "subscribe",
|
|
861
867
|
subscription: {
|
|
862
|
-
type:
|
|
868
|
+
type: "webData3",
|
|
863
869
|
user: userAddress,
|
|
864
870
|
},
|
|
865
871
|
};
|
|
866
872
|
// Subscribe to allDexsClearinghouseState with the same payload as webData3
|
|
867
873
|
const subscribeAllDexsClearinghouseState = {
|
|
868
|
-
method:
|
|
874
|
+
method: "subscribe",
|
|
869
875
|
subscription: {
|
|
870
|
-
type:
|
|
876
|
+
type: "allDexsClearinghouseState",
|
|
871
877
|
user: userAddress,
|
|
872
878
|
},
|
|
873
879
|
};
|
|
874
880
|
// Subscribe to allMids
|
|
875
881
|
const subscribeAllMids = {
|
|
876
|
-
method:
|
|
882
|
+
method: "subscribe",
|
|
877
883
|
subscription: {
|
|
878
|
-
type:
|
|
879
|
-
dex:
|
|
884
|
+
type: "allMids",
|
|
885
|
+
dex: "ALL_DEXS",
|
|
880
886
|
},
|
|
881
887
|
};
|
|
882
888
|
// Subscribe to allDexsAssetCtxs (no payload params, global feed)
|
|
883
889
|
const subscribeAllDexsAssetCtxs = {
|
|
884
|
-
method:
|
|
890
|
+
method: "subscribe",
|
|
885
891
|
subscription: {
|
|
886
|
-
type:
|
|
892
|
+
type: "allDexsAssetCtxs",
|
|
887
893
|
},
|
|
888
894
|
};
|
|
889
895
|
sendJsonMessage(subscribeWebData3);
|
|
@@ -896,7 +902,13 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
896
902
|
// clear aggregatedClearingHouseState
|
|
897
903
|
setAggregatedClearingHouseState(null);
|
|
898
904
|
}
|
|
899
|
-
}, [
|
|
905
|
+
}, [
|
|
906
|
+
isConnected,
|
|
907
|
+
address,
|
|
908
|
+
subscribedAddress,
|
|
909
|
+
sendJsonMessage,
|
|
910
|
+
setAggregatedClearingHouseState,
|
|
911
|
+
]);
|
|
900
912
|
// Handle token subscriptions for activeAssetData
|
|
901
913
|
useEffect(() => {
|
|
902
914
|
if (!isConnected || !address)
|
|
@@ -905,11 +917,11 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
905
917
|
const tokensToSubscribe = effectiveTokens.filter((token) => token && !subscribedTokens.includes(token));
|
|
906
918
|
const tokensToUnsubscribe = subscribedTokens.filter((token) => !effectiveTokens.includes(token));
|
|
907
919
|
// Unsubscribe from tokens no longer in the list
|
|
908
|
-
tokensToUnsubscribe.forEach(token => {
|
|
920
|
+
tokensToUnsubscribe.forEach((token) => {
|
|
909
921
|
const unsubscribeMessage = {
|
|
910
|
-
method:
|
|
922
|
+
method: "unsubscribe",
|
|
911
923
|
subscription: {
|
|
912
|
-
type:
|
|
924
|
+
type: "activeAssetData",
|
|
913
925
|
user: address,
|
|
914
926
|
coin: token,
|
|
915
927
|
},
|
|
@@ -917,11 +929,11 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
917
929
|
sendJsonMessage(unsubscribeMessage);
|
|
918
930
|
});
|
|
919
931
|
// Subscribe to new tokens
|
|
920
|
-
tokensToSubscribe.forEach(token => {
|
|
932
|
+
tokensToSubscribe.forEach((token) => {
|
|
921
933
|
const subscribeMessage = {
|
|
922
|
-
method:
|
|
934
|
+
method: "subscribe",
|
|
923
935
|
subscription: {
|
|
924
|
-
type:
|
|
936
|
+
type: "activeAssetData",
|
|
925
937
|
user: address,
|
|
926
938
|
coin: token,
|
|
927
939
|
},
|
|
@@ -932,7 +944,14 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
932
944
|
setSubscribedTokens(effectiveTokens.filter((token) => token));
|
|
933
945
|
tokensToSubscribe.forEach((token) => deleteActiveAssetData(token));
|
|
934
946
|
}
|
|
935
|
-
}, [
|
|
947
|
+
}, [
|
|
948
|
+
isConnected,
|
|
949
|
+
address,
|
|
950
|
+
selectedTokenSymbols,
|
|
951
|
+
subscribedTokens,
|
|
952
|
+
sendJsonMessage,
|
|
953
|
+
setActiveAssetData,
|
|
954
|
+
]);
|
|
936
955
|
// Handle candle subscriptions for tokens and interval changes
|
|
937
956
|
useEffect(() => {
|
|
938
957
|
if (!isConnected)
|
|
@@ -941,11 +960,11 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
941
960
|
// Unsubscribe from previous candle subscriptions if interval changed
|
|
942
961
|
const prevInterval = prevCandleIntervalRef.current;
|
|
943
962
|
if (prevInterval && prevInterval !== candleInterval) {
|
|
944
|
-
subscribedCandleTokens.forEach(token => {
|
|
963
|
+
subscribedCandleTokens.forEach((token) => {
|
|
945
964
|
const unsubscribeMessage = {
|
|
946
|
-
method:
|
|
965
|
+
method: "unsubscribe",
|
|
947
966
|
subscription: {
|
|
948
|
-
type:
|
|
967
|
+
type: "candle",
|
|
949
968
|
coin: token,
|
|
950
969
|
interval: prevInterval,
|
|
951
970
|
},
|
|
@@ -960,9 +979,9 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
960
979
|
// Unsubscribe from tokens no longer in the list
|
|
961
980
|
tokensToUnsubscribe.forEach((token) => {
|
|
962
981
|
const unsubscribeMessage = {
|
|
963
|
-
method:
|
|
982
|
+
method: "unsubscribe",
|
|
964
983
|
subscription: {
|
|
965
|
-
type:
|
|
984
|
+
type: "candle",
|
|
966
985
|
coin: token,
|
|
967
986
|
interval: candleInterval,
|
|
968
987
|
},
|
|
@@ -972,9 +991,9 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
972
991
|
// Subscribe to new tokens
|
|
973
992
|
tokensToSubscribe.forEach((token) => {
|
|
974
993
|
const subscribeMessage = {
|
|
975
|
-
method:
|
|
994
|
+
method: "subscribe",
|
|
976
995
|
subscription: {
|
|
977
|
-
type:
|
|
996
|
+
type: "candle",
|
|
978
997
|
coin: token,
|
|
979
998
|
interval: candleInterval,
|
|
980
999
|
},
|
|
@@ -982,12 +1001,21 @@ const useHyperliquidNativeWebSocket = ({ address, enabled = true, }) => {
|
|
|
982
1001
|
sendJsonMessage(subscribeMessage);
|
|
983
1002
|
});
|
|
984
1003
|
// Update subscribed state
|
|
985
|
-
if (tokensToSubscribe.length > 0 ||
|
|
1004
|
+
if (tokensToSubscribe.length > 0 ||
|
|
1005
|
+
tokensToUnsubscribe.length > 0 ||
|
|
1006
|
+
prevInterval !== candleInterval) {
|
|
986
1007
|
setSubscribedCandleTokens(effectiveTokens.filter((token) => token));
|
|
987
1008
|
prevCandleIntervalRef.current = candleInterval;
|
|
988
1009
|
tokensToUnsubscribe.forEach((token) => deleteCandleSymbol(token));
|
|
989
1010
|
}
|
|
990
|
-
}, [
|
|
1011
|
+
}, [
|
|
1012
|
+
isConnected,
|
|
1013
|
+
selectedTokenSymbols,
|
|
1014
|
+
candleInterval,
|
|
1015
|
+
subscribedCandleTokens,
|
|
1016
|
+
sendJsonMessage,
|
|
1017
|
+
setCandleData,
|
|
1018
|
+
]);
|
|
991
1019
|
return {
|
|
992
1020
|
isConnected,
|
|
993
1021
|
lastError,
|
|
@@ -1361,20 +1389,20 @@ const useTokenSelectionMetadataStore = create((set) => ({
|
|
|
1361
1389
|
});
|
|
1362
1390
|
return totalFunding;
|
|
1363
1391
|
})();
|
|
1364
|
-
// Max leverage (
|
|
1392
|
+
// Max leverage (maximum across all tokens)
|
|
1365
1393
|
const maxLeverage = (() => {
|
|
1366
1394
|
if (!perpMetaAssets)
|
|
1367
1395
|
return 0;
|
|
1368
1396
|
const allTokenSymbols = [...longTokens, ...shortTokens].map((t) => t.symbol);
|
|
1369
1397
|
if (allTokenSymbols.length === 0)
|
|
1370
1398
|
return 0;
|
|
1371
|
-
let
|
|
1399
|
+
let maxLev = 0;
|
|
1372
1400
|
allTokenSymbols.forEach((symbol) => {
|
|
1373
1401
|
const tokenUniverse = perpMetaAssets.find((u) => u.name === symbol);
|
|
1374
1402
|
if (tokenUniverse === null || tokenUniverse === void 0 ? void 0 : tokenUniverse.maxLeverage)
|
|
1375
|
-
|
|
1403
|
+
maxLev = Math.max(maxLev, tokenUniverse.maxLeverage);
|
|
1376
1404
|
});
|
|
1377
|
-
return
|
|
1405
|
+
return maxLev;
|
|
1378
1406
|
})();
|
|
1379
1407
|
// Min margin (10 * total number of tokens)
|
|
1380
1408
|
const minMargin = (() => {
|
|
@@ -6572,6 +6600,28 @@ async function cancelTwap(baseUrl, orderId) {
|
|
|
6572
6600
|
throw toApiError(error);
|
|
6573
6601
|
}
|
|
6574
6602
|
}
|
|
6603
|
+
async function updateLeverage(baseUrl, positionId, payload) {
|
|
6604
|
+
var _a;
|
|
6605
|
+
const url = joinUrl(baseUrl, `/positions/${positionId}/adjust-leverage`);
|
|
6606
|
+
try {
|
|
6607
|
+
const resp = await apiClient.post(url, payload, {
|
|
6608
|
+
headers: {
|
|
6609
|
+
"Content-Type": "application/json",
|
|
6610
|
+
},
|
|
6611
|
+
timeout: 60000,
|
|
6612
|
+
});
|
|
6613
|
+
// If backend returns 204, resp.data may be empty; normalize to null for callers
|
|
6614
|
+
const normalizedData = ((_a = resp.data) !== null && _a !== void 0 ? _a : null);
|
|
6615
|
+
return {
|
|
6616
|
+
data: normalizedData,
|
|
6617
|
+
status: resp.status,
|
|
6618
|
+
headers: resp.headers,
|
|
6619
|
+
};
|
|
6620
|
+
}
|
|
6621
|
+
catch (error) {
|
|
6622
|
+
throw toApiError(error);
|
|
6623
|
+
}
|
|
6624
|
+
}
|
|
6575
6625
|
|
|
6576
6626
|
const calculatePositionAsset = (asset, currentPrice, totalInitialPositionSize, leverage, isLong = true) => {
|
|
6577
6627
|
var _a;
|
|
@@ -6685,6 +6735,9 @@ function usePosition() {
|
|
|
6685
6735
|
const adjustAdvancePosition$1 = async (positionId, payload) => {
|
|
6686
6736
|
return adjustAdvancePosition(apiBaseUrl, positionId, payload, displayToFull);
|
|
6687
6737
|
};
|
|
6738
|
+
const updateLeverage$1 = async (positionId, leverage) => {
|
|
6739
|
+
return updateLeverage(apiBaseUrl, positionId, { leverage });
|
|
6740
|
+
};
|
|
6688
6741
|
// Open positions using WS data, with derived values
|
|
6689
6742
|
const userOpenPositions = useUserData((state) => state.rawOpenPositions);
|
|
6690
6743
|
const aggregatedClearingHouseState = useHyperliquidData((state) => state.aggregatedClearingHouseState);
|
|
@@ -6697,7 +6750,7 @@ function usePosition() {
|
|
|
6697
6750
|
return null;
|
|
6698
6751
|
return buildPositionValue(userOpenPositions, aggregatedClearingHouseState, allMids);
|
|
6699
6752
|
}, [userOpenPositions, aggregatedClearingHouseState, allMids]);
|
|
6700
|
-
return { createPosition: createPosition$1, updateRiskParameters: updateRiskParameters$1, closePosition: closePosition$1, closeAllPositions: closeAllPositions$1, adjustPosition: adjustPosition$1, adjustAdvancePosition: adjustAdvancePosition$1, openPositions, isLoading };
|
|
6753
|
+
return { createPosition: createPosition$1, updateRiskParameters: updateRiskParameters$1, closePosition: closePosition$1, closeAllPositions: closeAllPositions$1, adjustPosition: adjustPosition$1, adjustAdvancePosition: adjustAdvancePosition$1, updateLeverage: updateLeverage$1, openPositions, isLoading };
|
|
6701
6754
|
}
|
|
6702
6755
|
|
|
6703
6756
|
async function adjustOrder(baseUrl, orderId, payload) {
|
|
@@ -7393,4 +7446,4 @@ function mapCandleIntervalToTradingViewInterval(interval) {
|
|
|
7393
7446
|
}
|
|
7394
7447
|
}
|
|
7395
7448
|
|
|
7396
|
-
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, getCompleteTimestamps, getPortfolio, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toggleWatchlist, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePortfolio, usePosition, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
|
|
7449
|
+
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, getCompleteTimestamps, getPortfolio, mapCandleIntervalToTradingViewInterval, mapTradingViewIntervalToCandleInterval, markNotificationReadById, markNotificationsRead, toggleWatchlist, updateLeverage, updateRiskParameters, useAccountSummary, useActiveBaskets, useAgentWallet, useAllBaskets, useAuth, useAutoSyncFills, useBasketCandles, useFindBasket, useHighlightedBaskets, useHistoricalPriceData, useHistoricalPriceDataStore, useHyperliquidNativeWebSocket, useHyperliquidWebSocket, useMarketData, useMarketDataAllPayload, useMarketDataPayload, useNotifications, useOpenOrders, useOrders, usePearHyperliquid, usePerformanceOverlays, usePortfolio, usePosition, useTokenSelectionMetadata, useTopGainers, useTopLosers, useTradeHistories, useTwap, useUserSelection, useWatchlist, useWatchlistBaskets, useWebData, validateMaxAssetsPerLeg, validateMinimumAssetSize, validatePositionSize };
|