@liberfi.io/ui-perpetuals 0.1.76 → 0.1.78
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/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/version.ts","../src/client/hyperliquid/WebSocketManager.ts","../src/client/hyperliquid/HyperliquidPerpetualsClient.ts","../src/context/PerpetualsContext.ts","../src/providers/PerpetualsProvider.tsx","../src/hooks/usePerpetualsClient.ts","../src/hooks/useCoinsQuery.ts","../src/hooks/useMarketQuery.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useKlinesQuery.ts","../src/hooks/useOrderBookQuery.ts","../src/hooks/useRecentTradesQuery.ts","../src/hooks/usePositionsQuery.ts","../src/hooks/useOrdersQuery.ts","../src/hooks/useTradesQuery.ts","../src/hooks/useCreateOrderMutation.ts","../src/hooks/useCancelOrderMutation.ts","../src/hooks/useMarketDataSubscription.ts","../src/hooks/useCandlesSubscription.ts","../src/hooks/useUserDataSubscription.ts","../src/components/coin-info/coin-info-notfound.ui.tsx","../src/components/coin-info/coin-info-skeletons.ui.tsx","../src/components/coin-info/coin-info.script.tsx","../src/components/coin-info/coin-info.ui.tsx","../src/components/coin-info/coin-info.widget.tsx","../src/components/search-coins/search-coins.script.tsx","../src/components/search-coins/search-coins.ui.tsx","../src/components/search-coins/search-coins.widget.tsx","../src/components/orderbook/orderbook.script.tsx","../src/components/orderbook/orderbook.ui.tsx","../src/components/orderbook/orderbook.widget.tsx","../src/components/trades/trades.script.tsx","../src/components/trades/trades.ui.tsx","../src/components/trades/trades.widget.tsx","../src/components/place-order/place-order-form.script.tsx","../src/components/place-order/place-order-form.ui.tsx","../src/components/place-order/place-order-form.widget.tsx","../src/components/positions/positions.script.tsx","../src/components/positions/positions.ui.tsx","../src/components/positions/positions.widget.tsx","../src/components/open-orders/open-orders.script.tsx","../src/components/open-orders/open-orders.ui.tsx","../src/components/open-orders/open-orders.widget.tsx","../src/components/trade-history/trade-history.script.tsx","../src/components/trade-history/trade-history.ui.tsx","../src/components/trade-history/trade-history.widget.tsx"],"names":["version_default","WebSocketManager","wsEndpoint","resolve","reject","event","error","delay","message","subscription","data","channel","subscriptionId","transformedData","type","_param","param","mids","coin","price","symbol","trade","bids","asks","level","fill","interval","unsubscription","callback","HYPERLIQUID_ENDPOINTS","HyperliquidPerpetualsClient","config","endpoint","body","url","controller","timeoutId","response","HyperliquidApiError","meta","asset","markets","symbols","assetCtxs","allMarkets","index","ctx","currentPrice","prevPrice","change24h","symbolSet","m","limit","intervalMs","endTime","startTime","candle","maxLevel","_params","params","positions","assetPos","pos","quantity","entryPrice","unrealizedPnl","positionValue","filteredPositions","p","sum","orders","order","origSz","remainingSz","filledSz","filteredOrders","o","trades","isLong","t","userAddress","subscriptionType","statusCode","responseBody","PerpetualsContext","createContext","PerpetualsProvider","client","children","jsx","usePerpetualsClient","context","useContext","coinsQueryKey","fetchCoins","useCoinsQuery","options","useQuery","marketQueryKey","fetchMarket","useMarketQuery","marketsQueryKey","fetchMarkets","useMarketsQuery","klinesQueryKey","fetchKlines","useKlinesQuery","orderBookQueryKey","fetchOrderBook","useOrderBookQuery","recentTradesQueryKey","fetchRecentTrades","useRecentTradesQuery","positionsQueryKey","fetchPositions","usePositionsQuery","enabled","queryParams","ordersQueryKey","fetchOrders","useOrdersQuery","tradesQueryKey","fetchTrades","useTradesQuery","createOrder","useCreateOrderMutation","useMutation","cancelOrder","useCancelOrderMutation","useMarketDataSubscription","setData","useState","isConnected","setIsConnected","setError","handleData","useCallback","newData","useEffect","isSubscribed","err","useCandlesSubscription","useUserDataSubscription","CoinInfoNotFoundUI","CoinInfoSkeletonsUI","jsxs","Skeleton","useCoinInfo","marketData","setMarketData","fundingCountdown","setFundingCountdown","initialData","isPending","realtimeData","normalized","normalizeRealtimeTickerPayload","previous","buildMarketData","calculateCountdown","now","eightHours","remainder","timeUntilNext","payload","matched","item","toNumberOr","value","fallback","base","patch","formatCountdown","seconds","hours","minutes","secs","formatNumber","num","decimals","formatPrice","CoinInfoUI","indexPrice","volume24h","openInterest","fundingRate","safeChange24h","safeFundingRate","isPositiveChange","changePercent","cn","CoinInfoWidget","isLoading","useSearchCoinsScript","onSelectCoin","searchQuery","setSearchQuery","coins","setCoins","coinSymbols","isLoadingSymbols","marketsData","isLoadingMarkets","filteredCoins","useMemo","query","SearchCoinsUI","onSearchChange","Input","e","SearchIcon","StyledTable","TableHeader","TableColumn","TableBody","fundingPercent","isPositiveFunding","TableRow","TableCell","SearchCoinsWidget","className","handleSelectCoin","aggregateByPrecision","levels","precision","aggregated","roundedPrice","existing","calculateTotalsAndPercentages","total","withTotals","maxTotal","useOrderBookScript","initialPrecision","orderBook","setOrderBook","setPrecision","aggregatedBids","aggregatedAsks","sortedBids","a","b","sortedAsks","bestBid","spread","spreadPercentage","formatQuantity","qty","OrderBookUI","onPriceClick","reversedAsks","ask","bid","OrderBookSkeleton","_","i","OrderBookEmpty","OrderBookWidget","useTradesScript","setTrades","realtimeTrade","isValidTrade","prevTrades","normalizedTrades","normalizeRealtimeTrades","deduped","nextTrade","formatTime","timestamp","date","TradesUI","onTradeClick","isBuy","TradesSkeleton","TradesEmpty","TradesWidget","usePlaceOrderFormScript","onSuccess","onError","side","setSide","orderType","setOrderType","form","useForm","isSubmitting","watchedValues","amount","leverage","estimatedFee","estimatedTotal","liquidationPrice","maintenanceMarginRate","availableMargin","accountValue","currentPosition","handleSubmit","finalPrice","takeProfitPrice","stopLossPrice","tpPercent","slPercent","FormNumberInput","name","placeholder","endContent","RHNumberInput","PlaceOrderFormUI","methods","onSideChange","onOrderTypeChange","onSubmit","tpSlOptions","Button","RHForm","Slider","option","PlaceOrderFormWidget","usePositionsScript","onCloseSuccess","onCloseError","setPositions","positionsData","realtimePosition","isClosing","prevPositions","existingIndex","newPositions","handleClosePosition","position","closeSide","formatPnl","pnl","formatPnlPercent","percent","PositionsUI","onClosePosition","pnlColor","PositionsSkeleton","PositionsEmpty","PositionsWidget","useOpenOrdersScript","onCancelSuccess","onCancelError","setOrders","ordersData","realtimeOrder","isCanceling","prevOrders","newOrders","handleCancelOrder","OpenOrdersUI","onCancelOrder","OpenOrdersSkeleton","OpenOrdersEmpty","OpenOrdersWidget","getTimeRangeInMs","range","today","useTradeHistoryScript","initialTimeRange","pageSize","timeRange","setTimeRange","currentPage","setCurrentPage","allTrades","setAllTrades","tradesData","totalPages","startIndex","endIndex","page","formatDateTime","month","day","TIME_RANGE_OPTIONS","TradeHistoryUI","onTimeRangeChange","onNextPage","onPreviousPage","onGoToPage","Fragment","pageNum","TradeHistorySkeleton","TradeHistoryEmpty","TradeHistoryWidget","goToNextPage","goToPreviousPage","goToPage"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-perpetuals\"] = \"0.1.76\";\n}\n\nexport default \"0.1.76\";\n","import type { Kline } from \"../../types\";\n\n/**\n * WebSocket subscription callback function type\n */\ntype SubscriptionCallback = (data: any) => void;\n\n/**\n * WebSocket subscription metadata\n */\ninterface Subscription {\n type: string;\n param: string;\n callback: SubscriptionCallback;\n}\n\n/**\n * WebSocket Manager for Hyperliquid\n *\n * Handles WebSocket connection lifecycle, including:\n * - Connection management (connect/disconnect)\n * - Automatic reconnection with exponential backoff\n * - Heartbeat to keep connection alive\n * - Subscription management (subscribe/unsubscribe)\n * - Message queue for offline messages\n */\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private wsEndpoint: string;\n private subscriptions: Map<string, Subscription> = new Map();\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = 10;\n private reconnectDelay: number = 1000; // Initial reconnect delay: 1 second\n private heartbeatInterval: number | null = null;\n private messageQueue: any[] = []; // Message queue before connection established\n private isConnected: boolean = false;\n private pingInterval: number = 30000; // 30 second heartbeat\n private reconnectTimeout: number | null = null;\n private isReconnecting: boolean = false;\n\n /**\n * Create a new WebSocketManager\n * @param wsEndpoint WebSocket endpoint URL\n */\n constructor(wsEndpoint: string) {\n this.wsEndpoint = wsEndpoint;\n }\n\n /**\n * Connect to WebSocket server\n * @returns Promise that resolves when connection is established\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n // Close existing connection if any\n if (this.ws) {\n this.ws.close();\n }\n\n this.ws = new WebSocket(this.wsEndpoint);\n\n this.ws.onopen = () => {\n console.log(\"[WebSocket] Connected to Hyperliquid\");\n this.isConnected = true;\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.startHeartbeat();\n this.flushMessageQueue();\n resolve();\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (error: Event) => {\n console.error(\"[WebSocket] Error:\", error);\n this.isConnected = false;\n if (!this.isReconnecting) {\n reject(new Error(\"WebSocket connection failed\"));\n }\n };\n\n this.ws.onclose = (event: CloseEvent) => {\n console.log(\n `[WebSocket] Closed: ${event.code} - ${event.reason || \"No reason provided\"}`,\n );\n this.isConnected = false;\n this.stopHeartbeat();\n\n // Only attempt reconnect if not manually disconnected (code 1000 = normal closure)\n if (event.code !== 1000) {\n this.attemptReconnect();\n }\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n disconnect(): void {\n this.stopHeartbeat();\n this.subscriptions.clear();\n\n // Clear reconnect timeout\n if (this.reconnectTimeout !== null) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close(1000, \"Normal closure\");\n this.ws = null;\n }\n\n this.isConnected = false;\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect(): void {\n if (this.isReconnecting) {\n return; // Already attempting to reconnect\n }\n\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(\"[WebSocket] Max reconnection attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: min(1000 * 2^attempts, 30000)\n const delay = Math.min(\n this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000, // Max 30 seconds\n );\n\n console.log(\n `[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`,\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n this.connect()\n .then(() => {\n // Resubscribe to all previous subscriptions\n this.resubscribeAll();\n })\n .catch((error) => {\n console.error(\"[WebSocket] Reconnection failed:\", error);\n this.isReconnecting = false;\n // attemptReconnect will be called again by onclose event\n });\n }, delay);\n }\n\n /**\n * Start heartbeat interval to keep connection alive\n */\n private startHeartbeat(): void {\n this.heartbeatInterval = window.setInterval(() => {\n if (\n this.isConnected &&\n this.ws &&\n this.ws.readyState === WebSocket.OPEN\n ) {\n // Send a ping message to keep connection alive\n // Hyperliquid WebSocket accepts JSON messages\n this.send({ method: \"ping\" });\n }\n }, this.pingInterval);\n }\n\n /**\n * Stop heartbeat interval\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval !== null) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Send message to WebSocket server\n * @param message Message object to send\n */\n private send(message: any): void {\n if (this.isConnected && this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n } else {\n // Connection not established, add to queue\n this.messageQueue.push(message);\n }\n }\n\n /**\n * Flush message queue after connection established\n */\n private flushMessageQueue(): void {\n while (this.messageQueue.length > 0) {\n const message = this.messageQueue.shift();\n if (message) {\n this.send(message);\n }\n }\n }\n\n /**\n * Resubscribe to all subscriptions after reconnection\n */\n private resubscribeAll(): void {\n this.subscriptions.forEach((subscription) => {\n this.sendSubscription(subscription.type, subscription.param);\n });\n }\n\n /**\n * Handle incoming WebSocket message\n * @param data Raw message data\n */\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data);\n\n // Handle different message types\n if (message.channel) {\n this.handleChannelMessage(message);\n } else if (message.method === \"pong\") {\n // Heartbeat response\n // No action needed\n }\n } catch (error) {\n console.error(\"[WebSocket] Failed to parse message:\", error, data);\n }\n }\n\n /**\n * Handle channel-specific messages\n * @param message Parsed message object\n */\n private handleChannelMessage(message: any): void {\n const channel = message.channel;\n\n // Find matching subscriptions and trigger callbacks\n this.subscriptions.forEach((subscription, subscriptionId) => {\n if (this.isChannelMatch(channel, subscription.type, subscription.param)) {\n try {\n const transformedData = this.transformData(\n subscription.type,\n message.data,\n subscription.param,\n );\n subscription.callback(transformedData);\n } catch (error) {\n console.error(\n `[WebSocket] Error in subscription callback (${subscriptionId}):`,\n error,\n );\n }\n }\n });\n }\n\n /**\n * Check if channel matches subscription\n * @param channel Channel name from message\n * @param type Subscription type\n * @param _param Subscription parameter (reserved for future use)\n * @returns True if channel matches subscription\n */\n private isChannelMatch(\n channel: string,\n type: string,\n _param: string,\n ): boolean {\n // Match channel to subscription type\n if (type === \"ticker\") {\n return channel === \"allMids\";\n } else if (type === \"trades\") {\n return channel === \"trades\";\n } else if (type === \"orderBook\") {\n return channel === \"l2Book\";\n } else if (type === \"candle\") {\n return channel === \"candle\";\n } else if (type === \"userFills\") {\n return channel === \"userFills\";\n } else if (type === \"userEvents\") {\n return channel === \"userEvents\";\n }\n\n return false;\n }\n\n /**\n * Transform raw data to standard format\n * @param type Subscription type\n * @param data Raw data from WebSocket\n * @param param Subscription parameter (e.g., symbol, interval)\n * @returns Transformed data\n */\n private transformData(type: string, data: any, param: string): any {\n if (type === \"ticker\") {\n return this.transformTickerData(data);\n } else if (type === \"trades\") {\n return this.transformTradesData(data, param);\n } else if (type === \"orderBook\") {\n return this.transformOrderBookData(data, param);\n } else if (type === \"candle\") {\n return this.transformCandleData(data, param);\n } else if (type === \"userFills\") {\n return this.transformUserFillsData(data);\n } else if (type === \"userEvents\") {\n return this.transformUserEventsData(data);\n }\n\n return data;\n }\n\n /**\n * Transform ticker data (allMids)\n */\n private transformTickerData(data: any): any {\n const mids = data.mids || {};\n return Object.entries(mids).map(([coin, price]) => ({\n symbol: `${coin}-USDC`,\n price: parseFloat(price as string),\n timestamp: Date.now(),\n }));\n }\n\n /**\n * Transform trades data\n */\n private transformTradesData(data: any, symbol: string): any {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.map((trade: any) => ({\n symbol,\n side: trade.side === \"B\" ? \"buy\" : \"sell\",\n price: parseFloat(trade.px),\n quantity: parseFloat(trade.sz),\n timestamp: trade.time,\n tradeId: trade.tid,\n }));\n }\n\n /**\n * Transform order book data\n */\n private transformOrderBookData(data: any, symbol: string): any {\n const [bids, asks] = data.levels || [[], []];\n\n return {\n symbol,\n bids: bids.map((level: any) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n asks: asks.map((level: any) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n timestamp: data.time || Date.now(),\n };\n }\n\n /**\n * Transform candle data\n */\n private transformCandleData(data: any, param: string): Kline {\n const [symbol] = param.split(\":\");\n\n return {\n symbol,\n open: parseFloat(data.o),\n high: parseFloat(data.h),\n low: parseFloat(data.l),\n close: parseFloat(data.c),\n volume: parseFloat(data.v),\n timestamp: data.t,\n closeTimestamp: data.T,\n };\n }\n\n /**\n * Transform user fills data\n */\n private transformUserFillsData(data: any): any {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.map((fill: any) => ({\n tradeId: fill.tid?.toString(),\n orderId: fill.oid?.toString(),\n symbol: `${fill.coin}-USDC`,\n side: fill.dir?.includes(\"Long\") ? \"long\" : \"short\",\n price: parseFloat(fill.px),\n quantity: parseFloat(fill.sz),\n fee: parseFloat(fill.fee || \"0\"),\n feeCurrency: fill.feeToken || \"USDC\",\n isMaker: fill.side === \"M\",\n timestamp: fill.time,\n }));\n }\n\n /**\n * Transform user events data (orders and positions)\n */\n private transformUserEventsData(data: any): any {\n // User events can contain both order updates and position updates\n // Return the data as-is for now, let the callback handle it\n return data;\n }\n\n /**\n * Send subscription message to Hyperliquid WebSocket\n * @param type Subscription type\n * @param param Subscription parameter\n */\n private sendSubscription(type: string, param: string): void {\n let subscription: any;\n\n if (type === \"ticker\") {\n // Subscribe to all mids (ticker data)\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"allMids\",\n },\n };\n } else if (type === \"trades\") {\n // Subscribe to trades for specific coin\n const coin = param.split(\"-\")[0]; // \"BTC-USDC\" -> \"BTC\"\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"trades\",\n coin,\n },\n };\n } else if (type === \"orderBook\") {\n // Subscribe to order book for specific coin\n const coin = param.split(\"-\")[0];\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"l2Book\",\n coin,\n },\n };\n } else if (type === \"candle\") {\n // Subscribe to candles\n const [symbol, interval] = param.split(\":\");\n const coin = symbol.split(\"-\")[0];\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"candle\",\n coin,\n interval,\n },\n };\n } else if (type === \"userFills\") {\n // Subscribe to user fills\n const userAddress = param;\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"userFills\",\n user: userAddress,\n },\n };\n } else if (type === \"userEvents\") {\n // Subscribe to user events (orders + positions)\n const userAddress = param;\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"userEvents\",\n user: userAddress,\n },\n };\n }\n\n if (subscription) {\n this.send(subscription);\n }\n }\n\n /**\n * Send unsubscription message to Hyperliquid WebSocket\n * @param type Subscription type\n * @param param Subscription parameter\n */\n private sendUnsubscription(type: string, param: string): void {\n let unsubscription: any;\n\n if (type === \"ticker\") {\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"allMids\",\n },\n };\n } else if (type === \"trades\") {\n const coin = param.split(\"-\")[0];\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"trades\",\n coin,\n },\n };\n } else if (type === \"orderBook\") {\n const coin = param.split(\"-\")[0];\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"l2Book\",\n coin,\n },\n };\n } else if (type === \"candle\") {\n const [symbol, interval] = param.split(\":\");\n const coin = symbol.split(\"-\")[0];\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"candle\",\n coin,\n interval,\n },\n };\n } else if (type === \"userFills\") {\n const userAddress = param;\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"userFills\",\n user: userAddress,\n },\n };\n } else if (type === \"userEvents\") {\n const userAddress = param;\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"userEvents\",\n user: userAddress,\n },\n };\n }\n\n if (unsubscription) {\n this.send(unsubscription);\n }\n }\n\n /**\n * Subscribe to a data stream\n * @param type Subscription type\n * @param param Subscription parameter (symbol, user address, etc.)\n * @param callback Callback function to receive data\n * @returns Subscription ID (for unsubscribing)\n */\n subscribe(\n type: string,\n param: string,\n callback: SubscriptionCallback,\n ): string {\n const subscriptionId = `${type}:${param}`;\n\n // Store subscription\n this.subscriptions.set(subscriptionId, { type, param, callback });\n\n // Send subscription message\n this.sendSubscription(type, param);\n\n return subscriptionId;\n }\n\n /**\n * Unsubscribe from a data stream\n * @param subscriptionId Subscription ID returned from subscribe()\n */\n unsubscribe(subscriptionId: string): void {\n const subscription = this.subscriptions.get(subscriptionId);\n\n if (subscription) {\n // Send unsubscription message\n this.sendUnsubscription(subscription.type, subscription.param);\n\n // Remove subscription\n this.subscriptions.delete(subscriptionId);\n }\n }\n\n /**\n * Check if WebSocket is connected\n * @returns True if connected\n */\n isConnectedNow(): boolean {\n return this.isConnected;\n }\n}\n","import type {\n IPerpetualsClient,\n MarketData,\n Kline,\n KlineInterval,\n OrderBook,\n Trade,\n PlaceOrderParams,\n PlaceOrderResult,\n CancelOrderParams,\n CancelOrderResult,\n GetPositionsParams,\n GetPositionsResult,\n GetOpenOrdersParams,\n GetOpenOrdersResult,\n GetTradesParams,\n GetTradesResult,\n} from \"../../types\";\nimport { WebSocketManager } from \"./WebSocketManager\";\n\n/**\n * Hyperliquid 环境类型\n */\nexport type HyperliquidEnvironment = \"testnet\" | \"mainnet\";\n\n/**\n * Hyperliquid 客户端配置\n */\nexport interface HyperliquidClientConfig {\n /**\n * 环境配置\n * @default \"testnet\"\n */\n environment?: HyperliquidEnvironment;\n\n /**\n * 自定义 API 端点(可选)\n * 如果不提供,将根据 environment 自动选择\n */\n apiEndpoint?: string;\n\n /**\n * 自定义 WebSocket 端点(可选)\n * 如果不提供,将根据 environment 自动选择\n */\n wsEndpoint?: string;\n\n /**\n * 请求超时时间(毫秒)\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Hyperliquid API 端点配置\n */\nconst HYPERLIQUID_ENDPOINTS = {\n testnet: {\n api: \"https://api.hyperliquid-testnet.xyz\",\n ws: \"wss://api.hyperliquid-testnet.xyz/ws\",\n },\n mainnet: {\n api: \"https://api.hyperliquid.xyz\",\n ws: \"wss://api.hyperliquid.xyz/ws\",\n },\n} as const;\n\n/**\n * HyperliquidPerpetualsClient 类\n *\n * 实现 IPerpetualsClient 接口,提供 Hyperliquid 永续合约交易功能\n */\nexport class HyperliquidPerpetualsClient implements IPerpetualsClient {\n private readonly apiEndpoint: string;\n private readonly _wsEndpoint: string;\n private readonly timeout: number;\n private readonly environment: HyperliquidEnvironment;\n private wsManager: WebSocketManager | null = null;\n\n /**\n * 构造 Hyperliquid 客户端\n *\n * @param config 客户端配置,不传则使用默认配置(testnet)\n */\n constructor(config: HyperliquidClientConfig = {}) {\n // 1. 确定环境\n this.environment = config.environment || \"testnet\";\n\n // 2. 确定 API 端点\n this.apiEndpoint =\n config.apiEndpoint || HYPERLIQUID_ENDPOINTS[this.environment].api;\n\n // 3. 确定 WebSocket 端点\n this._wsEndpoint =\n config.wsEndpoint || HYPERLIQUID_ENDPOINTS[this.environment].ws;\n\n // 4. 设置超时时间\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * 内部 HTTP 请求方法\n *\n * @param endpoint API 端点路径\n * @param body 请求体\n * @returns 响应数据\n * @throws {HyperliquidApiError} API 请求失败\n */\n private async request<T = any>(endpoint: string, body: any): Promise<T> {\n const url = `${this.apiEndpoint}${endpoint}`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HyperliquidApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n await response.text(),\n );\n }\n\n const data = await response.json();\n return data;\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n throw new HyperliquidApiError(\n `Request timeout after ${this.timeout}ms`,\n 408,\n \"\",\n );\n }\n\n if (error instanceof HyperliquidApiError) {\n throw error;\n }\n\n throw new HyperliquidApiError(`Network error: ${error.message}`, 0, \"\");\n }\n }\n\n /**\n * 辅助方法:将符号格式转换为 Hyperliquid 币种名称\n * @param symbol 统一格式符号(例如 \"BTC-USDC\")\n * @returns Hyperliquid 币种名称(例如 \"BTC\")\n */\n private symbolToCoin(symbol: string): string {\n return symbol.split(\"-\")[0];\n }\n\n /**\n * 辅助方法:将 KlineInterval 转换为毫秒数\n * @param interval K线时间间隔\n * @returns 毫秒数\n */\n private parseInterval(interval: KlineInterval): number {\n const intervalMap: Record<KlineInterval, number> = {\n \"1m\": 60 * 1000,\n \"5m\": 5 * 60 * 1000,\n \"15m\": 15 * 60 * 1000,\n \"30m\": 30 * 60 * 1000,\n \"1h\": 60 * 60 * 1000,\n \"4h\": 4 * 60 * 60 * 1000,\n \"1d\": 24 * 60 * 60 * 1000,\n \"1w\": 7 * 24 * 60 * 60 * 1000,\n };\n return intervalMap[interval];\n }\n\n // ===================================\n // 市场数据查询接口(6个方法)\n // ===================================\n\n /**\n * 获取所有支持的币种列表\n * @returns 币种符号数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getSupportedCoins(): Promise<string[]> {\n const [meta] = await this.request<[{ universe: Array<{ name: string }> }]>(\n \"/info\",\n { type: \"metaAndAssetCtxs\" },\n );\n\n // 转换:coin.name -> \"BTC-USDC\"\n return meta.universe.map((asset) => `${asset.name}-USDC`);\n }\n\n /**\n * 获取指定币种的市场数据\n * @param symbol 币种符号\n * @returns 市场数据,币种不存在时返回 null\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getMarket(symbol: string): Promise<MarketData | null> {\n const markets = await this.getMarkets([symbol]);\n return markets.length > 0 ? markets[0] : null;\n }\n\n /**\n * 获取多个或所有币种的市场数据\n * @param symbols 币种符号数组(可选)\n * @returns 市场数据数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getMarkets(symbols?: string[]): Promise<MarketData[]> {\n const [meta, assetCtxs] = await this.request<\n [\n { universe: Array<{ name: string }> },\n Array<{\n funding?: string;\n openInterest?: string;\n prevDayPx?: string;\n dayNtlVlm?: string;\n oraclePx?: string;\n markPx?: string;\n midPx?: string;\n }>,\n ]\n >(\"/info\", { type: \"metaAndAssetCtxs\" });\n\n // 合并 meta 和 assetCtxs 数据\n const allMarkets = meta.universe.map((asset, index) => {\n const ctx = assetCtxs[index];\n const symbol = `${asset.name}-USDC`;\n\n // 使用 midPx 作为当前价格,fallback 到 markPx\n const currentPrice = parseFloat(ctx.midPx || ctx.markPx || \"0\");\n const prevPrice = ctx.prevDayPx\n ? parseFloat(ctx.prevDayPx)\n : currentPrice;\n const change24h =\n prevPrice > 0 ? ((currentPrice - prevPrice) / prevPrice) * 100 : 0;\n\n return {\n symbol,\n price: currentPrice,\n change24h,\n volume24h: parseFloat(ctx.dayNtlVlm || \"0\"),\n fundingRate: parseFloat(ctx.funding || \"0\"),\n openInterest: parseFloat(ctx.openInterest || \"0\"),\n markPrice: parseFloat(ctx.markPx || \"0\"),\n indexPrice: parseFloat(ctx.oraclePx || ctx.midPx || \"0\"),\n } as MarketData;\n });\n\n // 如果指定了 symbols,进行过滤\n if (symbols && symbols.length > 0) {\n const symbolSet = new Set(symbols);\n return allMarkets.filter((m) => symbolSet.has(m.symbol));\n }\n\n return allMarkets;\n }\n\n /**\n * 获取K线数据\n * @param symbol 交易对符号\n * @param interval 时间间隔\n * @param limit 返回K线数量\n * @returns K线数据数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getKlines(\n symbol: string,\n interval: KlineInterval,\n limit: number = 100,\n ): Promise<Kline[]> {\n const coin = this.symbolToCoin(symbol);\n\n // 计算时间范围\n const intervalMs = this.parseInterval(interval);\n const endTime = Date.now();\n const startTime = endTime - intervalMs * limit;\n\n const data = await this.request<\n Array<{\n t: number;\n T: number;\n s: string;\n i: string;\n o: string;\n c: string;\n h: string;\n l: string;\n v: string;\n n: number;\n }>\n >(\"/info\", {\n type: \"candleSnapshot\",\n req: { coin, interval, startTime, endTime },\n });\n\n // 转换为统一格式\n return data.map((candle) => ({\n symbol,\n open: parseFloat(candle.o),\n high: parseFloat(candle.h),\n low: parseFloat(candle.l),\n close: parseFloat(candle.c),\n volume: parseFloat(candle.v),\n timestamp: candle.t,\n closeTimestamp: candle.T,\n }));\n }\n\n /**\n * 获取订单簿\n * @param symbol 交易对符号\n * @param maxLevel 最大深度档位\n * @returns 订单簿数据\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getOrderBook(\n symbol: string,\n maxLevel: number = 10,\n ): Promise<OrderBook> {\n const coin = this.symbolToCoin(symbol);\n\n const data = await this.request<{\n coin: string;\n time: number;\n levels: [\n Array<{ px: string; sz: string; n: number }>,\n Array<{ px: string; sz: string; n: number }>,\n ];\n }>(\"/info\", { type: \"l2Book\", coin });\n\n const [bids, asks] = data.levels;\n\n return {\n symbol,\n bids: bids.slice(0, maxLevel).map((level) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n asks: asks.slice(0, maxLevel).map((level) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n timestamp: data.time,\n };\n }\n\n /**\n * 获取最近成交记录\n * @param symbol 交易对符号\n * @param limit 最大成交记录数\n * @returns 成交记录数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getRecentTrades(symbol: string, limit: number = 50): Promise<Trade[]> {\n const coin = this.symbolToCoin(symbol);\n\n const data = await this.request<\n Array<{\n coin: string;\n side: string;\n px: string;\n sz: string;\n time: number;\n tid: number;\n }>\n >(\"/info\", { type: \"recentTrades\", coin });\n\n return data.slice(0, limit).map((trade) => ({\n symbol,\n side: trade.side === \"B\" ? \"buy\" : \"sell\",\n price: parseFloat(trade.px),\n quantity: parseFloat(trade.sz),\n timestamp: trade.time,\n tradeId: trade.tid,\n }));\n }\n\n // ===================================\n // 交易操作接口(2个方法)\n // ===================================\n\n /**\n * 下单(买入或卖出合约)\n *\n * ⚠️ 注意:此方法需要配置钱包私钥进行 EIP-712 签名认证\n *\n * @param params 下单参数\n * @returns 下单结果\n * @throws {HyperliquidApiError} API 请求失败、余额不足、参数错误等\n * @throws {Error} 未配置认证信息\n *\n * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n */\n async placeOrder(_params: PlaceOrderParams): Promise<PlaceOrderResult> {\n throw new Error(\n \"placeOrder() requires wallet private key configuration for EIP-712 signature. \" +\n \"Please configure authentication before calling this method. \" +\n \"See: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\",\n );\n }\n\n /**\n * 取消订单\n *\n * ⚠️ 注意:此方法需要配置钱包私钥进行 EIP-712 签名认证\n *\n * @param params 取消订单参数\n * @returns 取消订单结果\n * @throws {HyperliquidApiError} API 请求失败、订单不存在等\n * @throws {Error} 未配置认证信息\n *\n * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n */\n async cancelOrder(_params: CancelOrderParams): Promise<CancelOrderResult> {\n throw new Error(\n \"cancelOrder() requires wallet private key configuration for EIP-712 signature. \" +\n \"Please configure authentication before calling this method. \" +\n \"See: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\",\n );\n }\n\n // ===================================\n // 账户查询接口(3个方法)\n // ===================================\n\n /**\n * 获取用户持仓信息\n *\n * ⚠️ Hyperliquid 要求:必须提供 userAddress 参数\n *\n * @param params 查询参数\n * @returns 持仓结果\n * @throws {HyperliquidApiError} API 请求失败\n * @throws {Error} 缺少必需参数\n */\n async getPositions(\n params: GetPositionsParams = {},\n ): Promise<GetPositionsResult> {\n if (!params.userAddress) {\n throw new Error(\n \"Hyperliquid requires userAddress parameter. \" +\n \"Example: { userAddress: '0x...' }\",\n );\n }\n\n const data = await this.request<{\n assetPositions: Array<{\n position: {\n coin: string;\n szi: string;\n leverage: { type: string; value: number };\n entryPx: string;\n positionValue: string;\n unrealizedPnl: string;\n returnOnEquity: string;\n liquidationPx: string | null;\n marginUsed: string;\n };\n }>;\n marginSummary: {\n accountValue: string;\n totalMarginUsed: string;\n totalNtlPos: string;\n totalRawUsd: string;\n };\n crossMarginSummary: {\n accountValue: string;\n totalMarginUsed: string;\n totalNtlPos: string;\n totalRawUsd: string;\n };\n }>(\"/info\", { type: \"clearinghouseState\", user: params.userAddress });\n\n // 转换持仓数据\n const positions = data.assetPositions\n .map((assetPos) => {\n const pos = assetPos.position;\n const symbol = `${pos.coin}-USDC`;\n const quantity = parseFloat(pos.szi);\n\n // 数量为 0 表示没有持仓\n if (quantity === 0) {\n return null;\n }\n\n const entryPrice = parseFloat(pos.entryPx);\n const unrealizedPnl = parseFloat(pos.unrealizedPnl);\n const positionValue = parseFloat(pos.positionValue);\n\n return {\n symbol,\n side: quantity > 0 ? (\"long\" as const) : (\"short\" as const),\n quantity: Math.abs(quantity),\n entryPrice,\n markPrice: entryPrice, // Hyperliquid 不直接提供,可从 assetCtxs 获取\n unrealizedPnl,\n unrealizedPnlPercent: parseFloat(pos.returnOnEquity) * 100,\n leverage: pos.leverage.value,\n liquidationPrice: pos.liquidationPx\n ? parseFloat(pos.liquidationPx)\n : undefined,\n margin: parseFloat(pos.marginUsed),\n notionalValue: Math.abs(positionValue),\n };\n })\n .filter(Boolean) as any[];\n\n // 过滤指定币种\n const filteredPositions = params.symbol\n ? positions.filter((p) => p.symbol === params.symbol)\n : positions;\n\n return {\n positions: filteredPositions,\n totalEquity: parseFloat(data.marginSummary.accountValue),\n availableBalance:\n parseFloat(data.marginSummary.accountValue) -\n parseFloat(data.marginSummary.totalMarginUsed),\n totalUnrealizedPnl: filteredPositions.reduce(\n (sum, p) => sum + p.unrealizedPnl,\n 0,\n ),\n raw: data,\n };\n }\n\n /**\n * 获取用户挂单信息\n *\n * ⚠️ Hyperliquid 要求:必须提供 userAddress 参数\n *\n * @param params 查询参数\n * @returns 挂单结果\n * @throws {HyperliquidApiError} API 请求失败\n * @throws {Error} 缺少必需参数\n */\n async getOpenOrders(\n params: GetOpenOrdersParams = {},\n ): Promise<GetOpenOrdersResult> {\n if (!params.userAddress) {\n throw new Error(\n \"Hyperliquid requires userAddress parameter. \" +\n \"Example: { userAddress: '0x...' }\",\n );\n }\n\n const data = await this.request<\n Array<{\n coin: string;\n side: boolean;\n limitPx: string;\n sz: string;\n origSz: string;\n oid: number;\n cloid?: string;\n timestamp: number;\n orderType: any;\n }>\n >(\"/info\", { type: \"openOrders\", user: params.userAddress });\n\n // 转换订单数据\n const orders = data.map((order) => {\n const symbol = `${order.coin}-USDC`;\n const origSz = parseFloat(order.origSz);\n const remainingSz = parseFloat(order.sz);\n const filledSz = origSz - remainingSz;\n\n return {\n orderId: order.oid.toString(),\n clientOrderId: order.cloid,\n symbol,\n side: order.side ? (\"long\" as const) : (\"short\" as const),\n orderType: \"limit\" as const,\n price: parseFloat(order.limitPx),\n quantity: origSz,\n filledQuantity: filledSz,\n remainingQuantity: remainingSz,\n status: (filledSz > 0 && remainingSz > 0\n ? \"partially_filled\"\n : \"pending\") as any,\n timestamp: order.timestamp,\n updateTimestamp: order.timestamp,\n };\n });\n\n // 过滤指定币种\n const filteredOrders = params.symbol\n ? orders.filter((o) => o.symbol === params.symbol)\n : orders;\n\n return {\n orders: filteredOrders,\n totalCount: filteredOrders.length,\n raw: data,\n };\n }\n\n /**\n * 获取用户交易历史\n *\n * ⚠️ Hyperliquid 要求:必须提供 userAddress 参数\n *\n * @param params 查询参数\n * @returns 交易历史结果\n * @throws {HyperliquidApiError} API 请求失败\n * @throws {Error} 缺少必需参数\n */\n async getTrades(params: GetTradesParams = {}): Promise<GetTradesResult> {\n if (!params.userAddress) {\n throw new Error(\n \"Hyperliquid requires userAddress parameter. \" +\n \"Example: { userAddress: '0x...' }\",\n );\n }\n\n const data = await this.request<\n Array<{\n coin: string;\n side: string;\n px: string;\n sz: string;\n time: number;\n dir: string;\n oid: number;\n tid: number;\n fee?: string;\n feeToken?: string;\n }>\n >(\"/info\", { type: \"userFills\", user: params.userAddress });\n\n // 转换交易数据\n let trades = data.map((fill) => {\n const symbol = `${fill.coin}-USDC`;\n const isLong = fill.dir.includes(\"Long\");\n\n return {\n tradeId: fill.tid.toString(),\n orderId: fill.oid.toString(),\n symbol,\n side: isLong ? (\"long\" as const) : (\"short\" as const),\n price: parseFloat(fill.px),\n quantity: parseFloat(fill.sz),\n fee: parseFloat(fill.fee || \"0\"),\n feeCurrency: fill.feeToken || \"USDC\",\n isMaker: fill.side === \"M\", // \"M\" = Maker, \"T\" = Taker\n timestamp: fill.time,\n };\n });\n\n // 过滤指定币种\n if (params.symbol) {\n trades = trades.filter((t) => t.symbol === params.symbol);\n }\n\n // 过滤时间范围\n if (params.startTime) {\n trades = trades.filter((t) => t.timestamp >= params.startTime!);\n }\n if (params.endTime) {\n trades = trades.filter((t) => t.timestamp <= params.endTime!);\n }\n\n // 限制返回数量\n if (params.limit) {\n trades = trades.slice(0, params.limit);\n }\n\n return {\n trades,\n totalCount: trades.length,\n raw: data,\n };\n }\n\n // ===================================\n // WebSocket 连接管理(2个方法)\n // ===================================\n\n /**\n * Connect to WebSocket server\n *\n * Establishes WebSocket connection for real-time data streaming.\n * Connection will auto-reconnect on disconnect.\n *\n * @throws {Error} Connection failed\n */\n async connectWebSocket(): Promise<void> {\n if (!this.wsManager) {\n this.wsManager = new WebSocketManager(this._wsEndpoint);\n }\n\n if (this.wsManager.isConnectedNow()) {\n console.log(\"[WebSocket] Already connected\");\n return;\n }\n\n await this.wsManager.connect();\n }\n\n /**\n * Disconnect from WebSocket server\n *\n * Closes WebSocket connection and cleans up all subscriptions.\n */\n disconnectWebSocket(): void {\n if (this.wsManager) {\n this.wsManager.disconnect();\n this.wsManager = null;\n }\n }\n\n // ===================================\n // WebSocket 订阅(4个方法)\n // ===================================\n\n /**\n * Subscribe to market data (price, trades, order book)\n *\n * @param type Subscription type: 'ticker' | 'trades' | 'orderBook'\n * @param symbol Trading pair symbol (e.g., \"BTC-USDC\")\n * @param callback Data callback function\n * @returns Subscription ID (for unsubscribing)\n */\n subscribeMarketData(\n type: \"ticker\" | \"trades\" | \"orderBook\",\n symbol: string,\n callback: (data: any) => void,\n ): string {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n\n return this.wsManager.subscribe(type, symbol, callback);\n }\n\n /**\n * Subscribe to kline (candlestick) data\n *\n * @param symbol Trading pair symbol (e.g., \"BTC-USDC\")\n * @param interval Time interval (e.g., \"1m\", \"1h\", \"1d\")\n * @param callback Data callback function\n * @returns Subscription ID (for unsubscribing)\n */\n subscribeCandles(\n symbol: string,\n interval: KlineInterval,\n callback: (candle: Kline) => void,\n ): string {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n\n // Combine symbol and interval as parameter\n const param = `${symbol}:${interval}`;\n return this.wsManager.subscribe(\"candle\", param, callback);\n }\n\n /**\n * Subscribe to user data (orders, positions, fills)\n *\n * @param type Subscription type: 'orders' | 'positions' | 'fills'\n * @param userAddress User wallet address\n * @param callback Data callback function\n * @returns Subscription ID (for unsubscribing)\n */\n subscribeUserData(\n type: \"orders\" | \"positions\" | \"fills\",\n userAddress: string,\n callback: (data: any) => void,\n ): string {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n\n // Use userEvents for orders and positions, userFills for fills\n const subscriptionType = type === \"fills\" ? \"userFills\" : \"userEvents\";\n\n return this.wsManager.subscribe(subscriptionType, userAddress, callback);\n }\n\n /**\n * Unsubscribe from a data stream\n *\n * @param subscriptionId Subscription ID returned from subscribe methods\n */\n unsubscribe(subscriptionId: string): void {\n if (this.wsManager) {\n this.wsManager.unsubscribe(subscriptionId);\n }\n }\n}\n\n/**\n * Hyperliquid API 错误类\n */\nexport class HyperliquidApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly responseBody: string,\n ) {\n super(message);\n this.name = \"HyperliquidApiError\";\n }\n}\n","import { createContext } from \"react\";\nimport type { IPerpetualsClient } from \"../types\";\n\n/**\n * Perpetuals context value type\n *\n * Provides access to the perpetuals trading client instance\n */\nexport interface PerpetualsContextValue {\n /**\n * Perpetuals client instance for trading operations\n */\n client: IPerpetualsClient;\n}\n\n/**\n * Perpetuals Context\n *\n * React context for accessing perpetuals trading functionality throughout the app\n */\nexport const PerpetualsContext = createContext<PerpetualsContextValue>(\n {} as PerpetualsContextValue,\n);\n","import { PropsWithChildren } from \"react\";\nimport {\n PerpetualsContext,\n PerpetualsContextValue,\n} from \"../context/PerpetualsContext\";\n\n/**\n * Perpetuals provider props type\n */\nexport type PerpetualsProviderProps = PropsWithChildren<PerpetualsContextValue>;\n\n/**\n * Perpetuals Provider Component\n *\n * Provides perpetuals trading client to all child components via React Context\n *\n * @param props Provider props containing client and children\n * @returns Provider component wrapping children\n */\nexport function PerpetualsProvider({\n client,\n children,\n}: PerpetualsProviderProps) {\n return (\n <PerpetualsContext.Provider value={{ client }}>\n {children}\n </PerpetualsContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport {\n PerpetualsContext,\n PerpetualsContextValue,\n} from \"../context/PerpetualsContext\";\n\n/**\n * Hook to access perpetuals client from context\n *\n * Must be used within a PerpetualsProvider component\n *\n * @returns Perpetuals context value containing the client instance\n * @throws Error if used outside of PerpetualsProvider\n */\nexport function usePerpetualsClient(): PerpetualsContextValue {\n const context = useContext(PerpetualsContext);\n\n if (!context || !context.client) {\n throw new Error(\n \"usePerpetualsClient must be used within a PerpetualsProvider\",\n );\n }\n\n return context;\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport function coinsQueryKey(): string[] {\n return [\"perps\", \"coins\"];\n}\n\nexport async function fetchCoins(client: IPerpetualsClient): Promise<string[]> {\n return await client.getSupportedCoins();\n}\n\nexport function useCoinsQuery(\n options: Omit<\n UseQueryOptions<string[], Error, string[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: coinsQueryKey(),\n queryFn: async () => fetchCoins(client),\n staleTime: 5 * 60 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, MarketData } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseMarketQueryParams {\n symbol: string;\n}\n\nexport function marketQueryKey(params: UseMarketQueryParams): string[] {\n return [\"perps\", \"market\", params.symbol];\n}\n\nexport async function fetchMarket(\n client: IPerpetualsClient,\n { symbol }: UseMarketQueryParams,\n): Promise<MarketData | null> {\n return await client.getMarket(symbol);\n}\n\nexport function useMarketQuery(\n params: UseMarketQueryParams,\n options: Omit<\n UseQueryOptions<MarketData | null, Error, MarketData | null, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: marketQueryKey(params),\n queryFn: async () => fetchMarket(client, params),\n staleTime: 10 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, MarketData } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseMarketsQueryParams {\n symbols?: string[];\n}\n\nexport function marketsQueryKey(params: UseMarketsQueryParams = {}): string[] {\n return [\"perps\", \"markets\", JSON.stringify((params.symbols ?? []).sort())];\n}\n\nexport async function fetchMarkets(\n client: IPerpetualsClient,\n { symbols }: UseMarketsQueryParams = {},\n): Promise<MarketData[]> {\n return await client.getMarkets(symbols);\n}\n\nexport function useMarketsQuery(\n params: UseMarketsQueryParams = {},\n options: Omit<\n UseQueryOptions<MarketData[], Error, MarketData[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: marketsQueryKey(params),\n queryFn: async () => fetchMarkets(client, params),\n staleTime: 10 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, Kline, KlineInterval } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseKlinesQueryParams {\n symbol: string;\n interval: KlineInterval;\n limit?: number;\n}\n\nexport function klinesQueryKey(params: UseKlinesQueryParams): string[] {\n return [\n \"perps\",\n \"klines\",\n params.symbol,\n params.interval,\n String(params.limit ?? 100),\n ];\n}\n\nexport async function fetchKlines(\n client: IPerpetualsClient,\n { symbol, interval, limit }: UseKlinesQueryParams,\n): Promise<Kline[]> {\n return await client.getKlines(symbol, interval, limit);\n}\n\nexport function useKlinesQuery(\n params: UseKlinesQueryParams,\n options: Omit<\n UseQueryOptions<Kline[], Error, Kline[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: klinesQueryKey(params),\n queryFn: async () => fetchKlines(client, params),\n staleTime: 30 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, OrderBook } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseOrderBookQueryParams {\n symbol: string;\n maxLevel?: number;\n}\n\nexport function orderBookQueryKey(params: UseOrderBookQueryParams): string[] {\n return [\"perps\", \"orderBook\", params.symbol, String(params.maxLevel ?? 20)];\n}\n\nexport async function fetchOrderBook(\n client: IPerpetualsClient,\n { symbol, maxLevel }: UseOrderBookQueryParams,\n): Promise<OrderBook> {\n return await client.getOrderBook(symbol, maxLevel);\n}\n\nexport function useOrderBookQuery(\n params: UseOrderBookQueryParams,\n options: Omit<\n UseQueryOptions<OrderBook, Error, OrderBook, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: orderBookQueryKey(params),\n queryFn: async () => fetchOrderBook(client, params),\n staleTime: 5 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, Trade } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseRecentTradesQueryParams {\n symbol: string;\n limit?: number;\n}\n\nexport function recentTradesQueryKey(\n params: UseRecentTradesQueryParams,\n): string[] {\n return [\"perps\", \"recentTrades\", params.symbol, String(params.limit ?? 50)];\n}\n\nexport async function fetchRecentTrades(\n client: IPerpetualsClient,\n { symbol, limit }: UseRecentTradesQueryParams,\n): Promise<Trade[]> {\n return await client.getRecentTrades(symbol, limit);\n}\n\nexport function useRecentTradesQuery(\n params: UseRecentTradesQueryParams,\n options: Omit<\n UseQueryOptions<Trade[], Error, Trade[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: recentTradesQueryKey(params),\n queryFn: async () => fetchRecentTrades(client, params),\n staleTime: 5 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n GetPositionsResult,\n GetPositionsParams,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UsePositionsQueryParams extends GetPositionsParams {\n enabled?: boolean;\n}\n\nexport function positionsQueryKey(\n params: Omit<UsePositionsQueryParams, \"enabled\">,\n): string[] {\n return [\"perps\", \"positions\", params.userAddress ?? \"\", params.symbol ?? \"\"];\n}\n\nexport async function fetchPositions(\n client: IPerpetualsClient,\n params: GetPositionsParams,\n): Promise<GetPositionsResult> {\n return await client.getPositions(params);\n}\n\nexport function usePositionsQuery(\n params: UsePositionsQueryParams,\n options: Omit<\n UseQueryOptions<GetPositionsResult, Error, GetPositionsResult, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n const { enabled = true, ...queryParams } = params;\n\n return useQuery({\n queryKey: positionsQueryKey(queryParams),\n queryFn: async () => fetchPositions(client, queryParams),\n enabled: enabled && !!queryParams.userAddress,\n staleTime: 10 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n GetOpenOrdersResult,\n GetOpenOrdersParams,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseOrdersQueryParams extends GetOpenOrdersParams {\n enabled?: boolean;\n}\n\nexport function ordersQueryKey(\n params: Omit<UseOrdersQueryParams, \"enabled\">,\n): string[] {\n return [\"perps\", \"orders\", params.userAddress ?? \"\", params.symbol ?? \"\"];\n}\n\nexport async function fetchOrders(\n client: IPerpetualsClient,\n params: GetOpenOrdersParams,\n): Promise<GetOpenOrdersResult> {\n return await client.getOpenOrders(params);\n}\n\nexport function useOrdersQuery(\n params: UseOrdersQueryParams,\n options: Omit<\n UseQueryOptions<GetOpenOrdersResult, Error, GetOpenOrdersResult, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n const { enabled = true, ...queryParams } = params;\n\n return useQuery({\n queryKey: ordersQueryKey(queryParams),\n queryFn: async () => fetchOrders(client, queryParams),\n enabled: enabled && !!queryParams.userAddress,\n staleTime: 5 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n GetTradesResult,\n GetTradesParams,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseTradesQueryParams extends GetTradesParams {\n enabled?: boolean;\n}\n\nexport function tradesQueryKey(\n params: Omit<UseTradesQueryParams, \"enabled\">,\n): string[] {\n return [\n \"perps\",\n \"trades\",\n params.userAddress ?? \"\",\n params.symbol ?? \"\",\n String(params.limit ?? 50),\n String(params.startTime ?? \"\"),\n String(params.endTime ?? \"\"),\n ];\n}\n\nexport async function fetchTrades(\n client: IPerpetualsClient,\n params: GetTradesParams,\n): Promise<GetTradesResult> {\n return await client.getTrades(params);\n}\n\nexport function useTradesQuery(\n params: UseTradesQueryParams,\n options: Omit<\n UseQueryOptions<GetTradesResult, Error, GetTradesResult, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n const { enabled = true, ...queryParams } = params;\n\n return useQuery({\n queryKey: tradesQueryKey(queryParams),\n queryFn: async () => fetchTrades(client, queryParams),\n enabled: enabled && !!queryParams.userAddress,\n staleTime: 30 * 1000,\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n PlaceOrderParams,\n PlaceOrderResult,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type UseCreateOrderMutationParams = PlaceOrderParams;\n\nexport async function createOrder(\n client: IPerpetualsClient,\n params: UseCreateOrderMutationParams,\n): Promise<PlaceOrderResult> {\n return await client.placeOrder(params);\n}\n\nexport function useCreateOrderMutation(\n options: Omit<\n UseMutationOptions<PlaceOrderResult, Error, UseCreateOrderMutationParams>,\n \"mutationFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useMutation({\n mutationFn: async (params: UseCreateOrderMutationParams) =>\n createOrder(client, params),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n CancelOrderParams,\n CancelOrderResult,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type UseCancelOrderMutationParams = CancelOrderParams;\n\nexport async function cancelOrder(\n client: IPerpetualsClient,\n params: UseCancelOrderMutationParams,\n): Promise<CancelOrderResult> {\n return await client.cancelOrder(params);\n}\n\nexport function useCancelOrderMutation(\n options: Omit<\n UseMutationOptions<CancelOrderResult, Error, UseCancelOrderMutationParams>,\n \"mutationFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useMutation({\n mutationFn: async (params: UseCancelOrderMutationParams) =>\n cancelOrder(client, params),\n ...options,\n });\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { MarketData, Trade, OrderBook } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type MarketDataType = \"ticker\" | \"trades\" | \"orderBook\";\n\nexport interface UseMarketDataSubscriptionParams {\n type: MarketDataType;\n symbol: string;\n enabled?: boolean;\n}\n\nexport interface UseMarketDataSubscriptionResult<T> {\n data: T | null;\n isConnected: boolean;\n error: Error | null;\n}\n\nexport function useMarketDataSubscription<\n T = MarketDataType extends \"ticker\"\n ? MarketData\n : MarketDataType extends \"trades\"\n ? Trade\n : OrderBook,\n>(params: UseMarketDataSubscriptionParams): UseMarketDataSubscriptionResult<T> {\n const { type, symbol, enabled = true } = params;\n const { client } = usePerpetualsClient();\n const [data, setData] = useState<T | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const handleData = useCallback((newData: T) => {\n setData(newData);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n let subscriptionId: string | null = null;\n let isSubscribed = true;\n\n const connect = async () => {\n try {\n await client.connectWebSocket();\n\n if (!isSubscribed) return;\n\n setIsConnected(true);\n setError(null);\n\n subscriptionId = client.subscribeMarketData(type, symbol, handleData);\n } catch (err) {\n if (isSubscribed) {\n setError(err instanceof Error ? err : new Error(\"Connection failed\"));\n setIsConnected(false);\n }\n }\n };\n\n connect();\n\n return () => {\n isSubscribed = false;\n if (subscriptionId) {\n try {\n client.unsubscribe(subscriptionId);\n } catch (err) {\n console.error(\"Failed to unsubscribe:\", err);\n }\n }\n client.disconnectWebSocket();\n setIsConnected(false);\n setData(null);\n };\n }, [client, type, symbol, enabled, handleData]);\n\n return { data, isConnected, error };\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { Kline, KlineInterval } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseCandlesSubscriptionParams {\n symbol: string;\n interval: KlineInterval;\n enabled?: boolean;\n}\n\nexport interface UseCandlesSubscriptionResult {\n data: Kline | null;\n isConnected: boolean;\n error: Error | null;\n}\n\nexport function useCandlesSubscription(\n params: UseCandlesSubscriptionParams,\n): UseCandlesSubscriptionResult {\n const { symbol, interval, enabled = true } = params;\n const { client } = usePerpetualsClient();\n const [data, setData] = useState<Kline | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const handleData = useCallback((newData: Kline) => {\n setData(newData);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n let subscriptionId: string | null = null;\n let isSubscribed = true;\n\n const connect = async () => {\n try {\n await client.connectWebSocket();\n\n if (!isSubscribed) return;\n\n setIsConnected(true);\n setError(null);\n\n subscriptionId = client.subscribeCandles(symbol, interval, handleData);\n } catch (err) {\n if (isSubscribed) {\n setError(err instanceof Error ? err : new Error(\"Connection failed\"));\n setIsConnected(false);\n }\n }\n };\n\n connect();\n\n return () => {\n isSubscribed = false;\n if (subscriptionId) {\n try {\n client.unsubscribe(subscriptionId);\n } catch (err) {\n console.error(\"Failed to unsubscribe:\", err);\n }\n }\n client.disconnectWebSocket();\n setIsConnected(false);\n setData(null);\n };\n }, [client, symbol, interval, enabled, handleData]);\n\n return { data, isConnected, error };\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { Order, Position, TradeHistory } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type UserDataType = \"orders\" | \"positions\" | \"fills\";\n\nexport interface UseUserDataSubscriptionParams {\n type: UserDataType;\n userAddress: string;\n enabled?: boolean;\n}\n\nexport interface UseUserDataSubscriptionResult<T> {\n data: T | null;\n isConnected: boolean;\n error: Error | null;\n}\n\nexport function useUserDataSubscription<\n T = UserDataType extends \"orders\"\n ? Order\n : UserDataType extends \"positions\"\n ? Position\n : TradeHistory,\n>(params: UseUserDataSubscriptionParams): UseUserDataSubscriptionResult<T> {\n const { type, userAddress, enabled = true } = params;\n const { client } = usePerpetualsClient();\n const [data, setData] = useState<T | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const handleData = useCallback((newData: T) => {\n setData(newData);\n }, []);\n\n useEffect(() => {\n if (!enabled || !userAddress) {\n return;\n }\n\n let subscriptionId: string | null = null;\n let isSubscribed = true;\n\n const connect = async () => {\n try {\n await client.connectWebSocket();\n\n if (!isSubscribed) return;\n\n setIsConnected(true);\n setError(null);\n\n subscriptionId = client.subscribeUserData(\n type,\n userAddress,\n handleData,\n );\n } catch (err) {\n if (isSubscribed) {\n setError(err instanceof Error ? err : new Error(\"Connection failed\"));\n setIsConnected(false);\n }\n }\n };\n\n connect();\n\n return () => {\n isSubscribed = false;\n if (subscriptionId) {\n try {\n client.unsubscribe(subscriptionId);\n } catch (err) {\n console.error(\"Failed to unsubscribe:\", err);\n }\n }\n client.disconnectWebSocket();\n setIsConnected(false);\n setData(null);\n };\n }, [client, type, userAddress, enabled, handleData]);\n\n return { data, isConnected, error };\n}\n","export function CoinInfoNotFoundUI() {\n return (\n <div className=\"flex items-center justify-center px-4 py-3 bg-neutral-900 border-b border-neutral-800\">\n <span className=\"text-neutral-400 text-sm\">\n Market data not available\n </span>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport function CoinInfoSkeletonsUI() {\n return (\n <div className=\"flex items-center gap-6 px-4 py-3 bg-neutral-900 border-b border-neutral-800\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-6 w-20 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-28 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n </div>\n\n <div className=\"h-8 w-px bg-neutral-800\" />\n\n <div className=\"flex items-center gap-6 text-sm\">\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-20 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-20 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-24 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-32 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-20 rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMarketDataSubscription } from \"../../hooks/useMarketDataSubscription\";\nimport { useMarketQuery } from \"../../hooks/useMarketQuery\";\nimport type { MarketData } from \"../../types\";\n\nexport type UseCoinInfoReturnType = {\n marketData?: MarketData;\n isLoading: boolean;\n fundingCountdown: number;\n};\n\nexport function useCoinInfo(symbol: string): UseCoinInfoReturnType {\n const [marketData, setMarketData] = useState<MarketData | undefined>();\n const [fundingCountdown, setFundingCountdown] = useState<number>(0);\n\n const { data: initialData, isPending } = useMarketQuery({ symbol });\n\n const { data: realtimeData, isConnected } =\n useMarketDataSubscription<MarketData>({\n type: \"ticker\",\n symbol,\n enabled: !!initialData,\n });\n\n useEffect(() => {\n if (!initialData) return;\n setMarketData(initialData);\n }, [initialData]);\n\n useEffect(() => {\n if (!realtimeData) return;\n\n const normalized = normalizeRealtimeTickerPayload(realtimeData, symbol);\n if (!normalized) return;\n\n setMarketData((previous) =>\n buildMarketData(previous ?? initialData ?? undefined, normalized, symbol),\n );\n }, [realtimeData, initialData, symbol]);\n\n useEffect(() => {\n const calculateCountdown = () => {\n const now = Date.now();\n const eightHours = 8 * 60 * 60 * 1000;\n const remainder = now % eightHours;\n const timeUntilNext = eightHours - remainder;\n return Math.floor(timeUntilNext / 1000);\n };\n\n setFundingCountdown(calculateCountdown());\n\n const interval = setInterval(() => {\n setFundingCountdown(calculateCountdown());\n }, 1000);\n\n return () => clearInterval(interval);\n }, []);\n\n return {\n marketData,\n isLoading: isPending,\n fundingCountdown,\n };\n}\n\nfunction normalizeRealtimeTickerPayload(\n payload: unknown,\n symbol: string,\n): Partial<MarketData> | null {\n if (Array.isArray(payload)) {\n const matched = payload.find((item) => {\n if (!item || typeof item !== \"object\") return false;\n return (item as { symbol?: string }).symbol === symbol;\n });\n return matched && typeof matched === \"object\"\n ? (matched as Partial<MarketData>)\n : null;\n }\n\n if (payload && typeof payload === \"object\") {\n return payload as Partial<MarketData>;\n }\n\n return null;\n}\n\nfunction toNumberOr(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return fallback;\n}\n\nfunction buildMarketData(\n base: MarketData | undefined,\n patch: Partial<MarketData>,\n symbol: string,\n): MarketData {\n return {\n symbol: patch.symbol ?? base?.symbol ?? symbol,\n price: toNumberOr(patch.price, base?.price ?? 0),\n change24h: toNumberOr(patch.change24h, base?.change24h ?? 0),\n volume24h: toNumberOr(patch.volume24h, base?.volume24h ?? 0),\n fundingRate: toNumberOr(patch.fundingRate, base?.fundingRate ?? 0),\n openInterest: toNumberOr(patch.openInterest, base?.openInterest ?? 0),\n markPrice: toNumberOr(patch.markPrice, base?.markPrice ?? 0),\n indexPrice:\n typeof patch.indexPrice === \"number\" && Number.isFinite(patch.indexPrice)\n ? patch.indexPrice\n : base?.indexPrice,\n high24h:\n typeof patch.high24h === \"number\" && Number.isFinite(patch.high24h)\n ? patch.high24h\n : base?.high24h,\n low24h:\n typeof patch.low24h === \"number\" && Number.isFinite(patch.low24h)\n ? patch.low24h\n : base?.low24h,\n };\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { MarketData } from \"../../types\";\n\nexport type CoinInfoUIProps = {\n marketData: MarketData;\n fundingCountdown: number;\n};\n\nfunction formatCountdown(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n return `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n}\n\nfunction formatNumber(num: number | undefined, decimals: number = 2): string {\n if (typeof num !== \"number\" || !Number.isFinite(num)) {\n return \"-\";\n }\n if (num >= 1e9) {\n return `$${(num / 1e9).toFixed(decimals)}B`;\n }\n if (num >= 1e6) {\n return `$${(num / 1e6).toFixed(decimals)}M`;\n }\n if (num >= 1e3) {\n return `$${(num / 1e3).toFixed(decimals)}K`;\n }\n return `$${num.toFixed(decimals)}`;\n}\n\nfunction formatPrice(price: number | undefined): string {\n if (typeof price !== \"number\" || !Number.isFinite(price)) {\n return \"-\";\n }\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nexport function CoinInfoUI({ marketData, fundingCountdown }: CoinInfoUIProps) {\n const {\n symbol,\n price,\n change24h,\n indexPrice,\n volume24h,\n openInterest,\n fundingRate,\n } = marketData;\n\n const safeChange24h =\n typeof change24h === \"number\" && Number.isFinite(change24h) ? change24h : 0;\n const safeFundingRate =\n typeof fundingRate === \"number\" && Number.isFinite(fundingRate)\n ? fundingRate\n : 0;\n const isPositiveChange = safeChange24h >= 0;\n const changePercent = (safeChange24h * 100).toFixed(2);\n\n return (\n <div className=\"flex items-center gap-6 px-4 py-3 bg-neutral-900 border-b border-neutral-800\">\n <div className=\"flex items-center gap-3\">\n <h2 className=\"text-lg font-semibold text-white\">{symbol}</h2>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold text-white\">\n {formatPrice(price)}\n </span>\n <span\n className={cn(\n \"text-sm font-medium\",\n isPositiveChange ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n </div>\n </div>\n\n <div className=\"h-8 w-px bg-neutral-800\" />\n\n <div className=\"flex items-center gap-6 text-sm\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">Oracle Price</span>\n <span className=\"text-white font-medium\">\n {indexPrice ? formatPrice(indexPrice) : \"-\"}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">24h Volume</span>\n <span className=\"text-white font-medium\">\n {formatNumber(volume24h)}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">Open Interest</span>\n <span className=\"text-white font-medium\">\n {formatNumber(openInterest)}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">Funding / Countdown</span>\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"font-medium\",\n safeFundingRate >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {(safeFundingRate * 100).toFixed(4)}%\n </span>\n <span className=\"text-neutral-400\">\n {formatCountdown(fundingCountdown)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { CoinInfoNotFoundUI } from \"./coin-info-notfound.ui\";\nimport { CoinInfoSkeletonsUI } from \"./coin-info-skeletons.ui\";\nimport { useCoinInfo } from \"./coin-info.script\";\nimport { CoinInfoUI } from \"./coin-info.ui\";\n\nexport type CoinInfoWidgetProps = {\n symbol: string;\n};\n\nexport function CoinInfoWidget({ symbol }: CoinInfoWidgetProps) {\n const { marketData, isLoading, fundingCountdown } = useCoinInfo(symbol);\n\n if (isLoading) {\n return <CoinInfoSkeletonsUI />;\n }\n\n if (!marketData) {\n return <CoinInfoNotFoundUI />;\n }\n\n return (\n <CoinInfoUI marketData={marketData} fundingCountdown={fundingCountdown} />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useCoinsQuery } from \"../../hooks/useCoinsQuery\";\nimport { useMarketsQuery } from \"../../hooks/useMarketsQuery\";\nimport type { MarketData } from \"../../types\";\n\nexport type UseSearchCoinsScriptParams = {\n onSelectCoin?: (symbol: string) => void;\n};\n\nexport type UseSearchCoinsScriptResult = {\n coins: MarketData[];\n isLoading: boolean;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n filteredCoins: MarketData[];\n handleSelectCoin: (symbol: string) => void;\n};\n\nexport function useSearchCoinsScript({\n onSelectCoin,\n}: UseSearchCoinsScriptParams = {}): UseSearchCoinsScriptResult {\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const [coins, setCoins] = useState<MarketData[]>([]);\n\n const { data: coinSymbols, isPending: isLoadingSymbols } = useCoinsQuery();\n\n const { data: marketsData, isPending: isLoadingMarkets } = useMarketsQuery(\n { symbols: coinSymbols },\n { enabled: !!coinSymbols && coinSymbols.length > 0 },\n );\n\n useEffect(() => {\n if (marketsData) {\n setCoins(marketsData);\n }\n }, [marketsData]);\n\n const filteredCoins = useMemo(() => {\n if (!searchQuery.trim()) {\n return coins;\n }\n\n const query = searchQuery.toLowerCase().trim();\n return coins.filter((coin) => coin.symbol.toLowerCase().includes(query));\n }, [coins, searchQuery]);\n\n const handleSelectCoin = (symbol: string) => {\n onSelectCoin?.(symbol);\n };\n\n return {\n coins,\n isLoading: isLoadingSymbols || isLoadingMarkets,\n searchQuery,\n setSearchQuery,\n filteredCoins,\n handleSelectCoin,\n };\n}\n","import {\n cn,\n Input,\n SearchIcon,\n StyledTable,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n} from \"@liberfi.io/ui\";\nimport type { MarketData } from \"../../types\";\n\nexport type SearchCoinsUIProps = {\n coins: MarketData[];\n searchQuery: string;\n onSearchChange: (query: string) => void;\n onSelectCoin: (symbol: string) => void;\n isLoading?: boolean;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n if (num >= 1e9) {\n return `$${(num / 1e9).toFixed(decimals)}B`;\n }\n if (num >= 1e6) {\n return `$${(num / 1e6).toFixed(decimals)}M`;\n }\n if (num >= 1e3) {\n return `$${(num / 1e3).toFixed(decimals)}K`;\n }\n return `$${num.toFixed(decimals)}`;\n}\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nexport function SearchCoinsUI({\n coins,\n searchQuery,\n onSearchChange,\n onSelectCoin,\n isLoading,\n}: SearchCoinsUIProps) {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950\">\n <div className=\"p-3 border-b border-neutral-800\">\n <Input\n type=\"text\"\n placeholder=\"Search coins...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n startContent={<SearchIcon className=\"w-4 h-4 text-neutral-400\" />}\n classNames={{\n input: \"text-sm\",\n inputWrapper: \"bg-neutral-900 border-neutral-800\",\n }}\n />\n </div>\n\n <div className=\"flex-1 overflow-hidden\">\n <StyledTable\n isVirtualized\n radius=\"none\"\n className=\"h-full\"\n classNames={{\n wrapper: \"bg-neutral-950\",\n th: \"bg-neutral-900 text-neutral-400 text-xs font-medium\",\n td: \"text-sm\",\n }}\n maxTableHeight={600}\n rowHeight={48}\n aria-label=\"Search Coins\"\n >\n <TableHeader>\n <TableColumn key=\"token\" width={140}>\n Token\n </TableColumn>\n <TableColumn key=\"lastPrice\" width={100} align=\"end\">\n Last Price\n </TableColumn>\n <TableColumn key=\"change24h\" width={100} align=\"end\">\n 24h Change\n </TableColumn>\n <TableColumn key=\"fundingRate\" width={100} align=\"end\">\n 8h Funding\n </TableColumn>\n <TableColumn key=\"volume24h\" width={100} align=\"end\">\n 24h Volume\n </TableColumn>\n <TableColumn key=\"openInterest\" width={100} align=\"end\">\n Open Interest\n </TableColumn>\n </TableHeader>\n\n <TableBody\n items={coins}\n isLoading={isLoading}\n emptyContent={\n <div className=\"flex flex-col items-center justify-center py-10\">\n <span className=\"text-neutral-400 text-sm\">\n {searchQuery ? \"No coins found\" : \"No coins available\"}\n </span>\n </div>\n }\n >\n {(coin) => {\n const isPositiveChange = coin.change24h >= 0;\n const changePercent = (coin.change24h * 100).toFixed(2);\n const fundingPercent = (coin.fundingRate * 100).toFixed(4);\n const isPositiveFunding = coin.fundingRate >= 0;\n\n return (\n <TableRow\n key={coin.symbol}\n onClick={() => onSelectCoin(coin.symbol)}\n className=\"cursor-pointer hover:bg-neutral-900/50 transition-colors\"\n >\n <TableCell>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-6 h-6 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center\">\n <span className=\"text-xs font-semibold text-white\">\n {coin.symbol.charAt(0)}\n </span>\n </div>\n <span className=\"font-medium text-white\">\n {coin.symbol}\n </span>\n </div>\n </TableCell>\n\n <TableCell>\n <span className=\"text-white font-medium\">\n {formatPrice(coin.price)}\n </span>\n </TableCell>\n\n <TableCell>\n <span\n className={cn(\n \"font-medium\",\n isPositiveChange ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n </TableCell>\n\n <TableCell>\n <span\n className={cn(\n \"font-medium\",\n isPositiveFunding ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {fundingPercent}%\n </span>\n </TableCell>\n\n <TableCell>\n <span className=\"text-neutral-300\">\n {formatNumber(coin.volume24h)}\n </span>\n </TableCell>\n\n <TableCell>\n <span className=\"text-neutral-300\">\n {formatNumber(coin.openInterest)}\n </span>\n </TableCell>\n </TableRow>\n );\n }}\n </TableBody>\n </StyledTable>\n </div>\n </div>\n );\n}\n","import { useSearchCoinsScript } from \"./search-coins.script\";\nimport { SearchCoinsUI } from \"./search-coins.ui\";\n\nexport type SearchCoinsWidgetProps = {\n onSelectCoin?: (symbol: string) => void;\n className?: string;\n};\n\nexport function SearchCoinsWidget({\n onSelectCoin,\n className,\n}: SearchCoinsWidgetProps) {\n const {\n filteredCoins,\n isLoading,\n searchQuery,\n setSearchQuery,\n handleSelectCoin,\n } = useSearchCoinsScript({ onSelectCoin });\n\n return (\n <div className={className}>\n <SearchCoinsUI\n coins={filteredCoins}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelectCoin={handleSelectCoin}\n isLoading={isLoading}\n />\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMarketDataSubscription } from \"../../hooks/useMarketDataSubscription\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderBook, OrderBookLevel } from \"../../types\";\n\nexport type PriceLevel = OrderBookLevel & {\n total: number;\n percentage: number;\n};\n\nexport type UseOrderBookScriptParams = {\n symbol: string;\n maxLevel?: number;\n precision?: number;\n};\n\nexport type UseOrderBookScriptResult = {\n bids: PriceLevel[];\n asks: PriceLevel[];\n spread: number;\n spreadPercentage: number;\n isLoading: boolean;\n precision: number;\n setPrecision: (precision: number) => void;\n};\n\nfunction aggregateByPrecision(\n levels: OrderBookLevel[],\n precision: number,\n): OrderBookLevel[] {\n if (precision <= 0) return levels;\n\n const aggregated = new Map<number, OrderBookLevel>();\n\n levels.forEach((level) => {\n const roundedPrice = Math.floor(level.price / precision) * precision;\n\n const existing = aggregated.get(roundedPrice);\n if (existing) {\n existing.quantity += level.quantity;\n if (level.count) {\n existing.count = (existing.count || 0) + level.count;\n }\n } else {\n aggregated.set(roundedPrice, {\n price: roundedPrice,\n quantity: level.quantity,\n count: level.count,\n });\n }\n });\n\n return Array.from(aggregated.values());\n}\n\nfunction calculateTotalsAndPercentages(levels: OrderBookLevel[]): PriceLevel[] {\n let total = 0;\n const withTotals = levels.map((level) => {\n total += level.quantity;\n return {\n ...level,\n total,\n percentage: 0,\n };\n });\n\n const maxTotal = total;\n return withTotals.map((level) => ({\n ...level,\n percentage: maxTotal > 0 ? (level.total / maxTotal) * 100 : 0,\n }));\n}\n\nexport function useOrderBookScript({\n symbol,\n maxLevel = 20,\n precision: initialPrecision = 0.01,\n}: UseOrderBookScriptParams): UseOrderBookScriptResult {\n const [orderBook, setOrderBook] = useState<OrderBook | null>(null);\n const [precision, setPrecision] = useState<number>(initialPrecision);\n\n const { data: initialData, isPending } = useOrderBookQuery({\n symbol,\n maxLevel,\n });\n\n const { data: realtimeData } = useMarketDataSubscription<OrderBook>({\n type: \"orderBook\",\n symbol,\n enabled: !!initialData,\n });\n\n useEffect(() => {\n if (realtimeData) {\n setOrderBook(realtimeData);\n } else if (initialData) {\n setOrderBook(initialData);\n }\n }, [realtimeData, initialData]);\n\n const processedData = useMemo(() => {\n if (!orderBook) {\n return {\n bids: [],\n asks: [],\n spread: 0,\n spreadPercentage: 0,\n };\n }\n\n const aggregatedBids = aggregateByPrecision(orderBook.bids, precision);\n const aggregatedAsks = aggregateByPrecision(orderBook.asks, precision);\n\n const sortedBids = aggregatedBids\n .sort((a, b) => b.price - a.price)\n .slice(0, maxLevel);\n\n const sortedAsks = aggregatedAsks\n .sort((a, b) => a.price - b.price)\n .slice(0, maxLevel);\n\n const bids = calculateTotalsAndPercentages(sortedBids);\n const asks = calculateTotalsAndPercentages(sortedAsks);\n\n const bestBid = bids[0]?.price || 0;\n const bestAsk = asks[0]?.price || 0;\n const spread = bestAsk - bestBid;\n const spreadPercentage = bestBid > 0 ? (spread / bestBid) * 100 : 0;\n\n return {\n bids,\n asks,\n spread,\n spreadPercentage,\n };\n }, [orderBook, precision, maxLevel]);\n\n return {\n ...processedData,\n isLoading: isPending,\n precision,\n setPrecision,\n };\n}\n","import type { PriceLevel } from \"./orderbook.script\";\n\nexport type OrderBookUIProps = {\n bids: PriceLevel[];\n asks: PriceLevel[];\n spread: number;\n spreadPercentage: number;\n onPriceClick?: (price: number) => void;\n};\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nfunction formatQuantity(qty: number): string {\n if (qty >= 1000000) {\n return (qty / 1000000).toFixed(2) + \"M\";\n }\n if (qty >= 1000) {\n return (qty / 1000).toFixed(2) + \"K\";\n }\n return qty.toFixed(2);\n}\n\nexport function OrderBookUI({\n bids,\n asks,\n spread,\n spreadPercentage,\n onPriceClick,\n}: OrderBookUIProps) {\n const reversedAsks = [...asks].reverse();\n\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 text-xs\">\n {/* V�:�\b�r\t */}\n <div className=\"flex-1 flex flex-col-reverse overflow-hidden\">\n {reversedAsks.map((ask, index) => (\n <div\n key={`ask-${ask.price}-${index}`}\n className=\"relative h-6 flex items-center justify-between px-2 cursor-pointer hover:bg-neutral-900/50 transition-colors\"\n onClick={() => onPriceClick?.(ask.price)}\n >\n {/* ��oa */}\n <div\n className=\"absolute inset-0 bg-red-500/10\"\n style={{\n width: `${ask.percentage}%`,\n right: 0,\n left: \"auto\",\n }}\n />\n\n {/* �< */}\n <span className=\"relative z-10 text-red-500 font-medium min-w-20\">\n {formatPrice(ask.price)}\n </span>\n\n {/* p� */}\n <div className=\"relative z-10 flex gap-4 text-neutral-300\">\n <span className=\"min-w-16 text-right\">\n {formatQuantity(ask.quantity)}\n </span>\n <span className=\"min-w-16 text-right\">\n {formatQuantity(ask.total)}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* ��>: */}\n <div className=\"flex items-center justify-center py-2 border-y border-neutral-800 bg-neutral-900\">\n <div className=\"flex items-center gap-3 text-xs\">\n <span className=\"text-neutral-400\">Spread:</span>\n <span className=\"text-neutral-200 font-medium\">\n {formatPrice(spread)}\n </span>\n <span className=\"text-neutral-400\">\n {spreadPercentage.toFixed(3)}%\n </span>\n </div>\n </div>\n\n {/* p�:�\b�r\t */}\n <div className=\"flex-1 overflow-hidden\">\n {bids.map((bid, index) => (\n <div\n key={`bid-${bid.price}-${index}`}\n className=\"relative h-6 flex items-center justify-between px-2 cursor-pointer hover:bg-neutral-900/50 transition-colors\"\n onClick={() => onPriceClick?.(bid.price)}\n >\n {/* ��oa */}\n <div\n className=\"absolute inset-0 bg-green-500/10\"\n style={{\n width: `${bid.percentage}%`,\n right: 0,\n left: \"auto\",\n }}\n />\n\n {/* �< */}\n <span className=\"relative z-10 text-green-500 font-medium min-w-20\">\n {formatPrice(bid.price)}\n </span>\n\n {/* p� */}\n <div className=\"relative z-10 flex gap-4 text-neutral-300\">\n <span className=\"min-w-16 text-right\">\n {formatQuantity(bid.quantity)}\n </span>\n <span className=\"min-w-16 text-right\">\n {formatQuantity(bid.total)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\nimport { useOrderBookScript } from \"./orderbook.script\";\nimport { OrderBookUI } from \"./orderbook.ui\";\n\nexport type OrderBookWidgetProps = {\n symbol: string;\n maxLevel?: number;\n onPriceClick?: (price: number) => void;\n className?: string;\n};\n\nfunction OrderBookSkeleton() {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 p-2 gap-1\">\n {Array.from({ length: 15 }).map((_, i) => (\n <div key={`ask-skeleton-${i}`} className=\"flex justify-between\">\n <Skeleton className=\"h-5 w-20 rounded\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n </div>\n ))}\n <div className=\"py-2\">\n <Skeleton className=\"h-6 w-40 mx-auto rounded\" />\n </div>\n {Array.from({ length: 15 }).map((_, i) => (\n <div key={`bid-skeleton-${i}`} className=\"flex justify-between\">\n <Skeleton className=\"h-5 w-20 rounded\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction OrderBookEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full bg-neutral-950\">\n <span className=\"text-neutral-400 text-sm\">\n No order book data available\n </span>\n </div>\n );\n}\n\nexport function OrderBookWidget({\n symbol,\n maxLevel = 20,\n onPriceClick,\n className,\n}: OrderBookWidgetProps) {\n const { bids, asks, spread, spreadPercentage, isLoading } =\n useOrderBookScript({\n symbol,\n maxLevel,\n });\n\n if (isLoading) {\n return <OrderBookSkeleton />;\n }\n\n if (bids.length === 0 && asks.length === 0) {\n return <OrderBookEmpty />;\n }\n\n return (\n <div className={className}>\n <OrderBookUI\n bids={bids}\n asks={asks}\n spread={spread}\n spreadPercentage={spreadPercentage}\n onPriceClick={onPriceClick}\n />\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMarketDataSubscription } from \"../../hooks/useMarketDataSubscription\";\nimport { useRecentTradesQuery } from \"../../hooks/useRecentTradesQuery\";\nimport type { Trade } from \"../../types\";\n\nexport type UseTradesScriptParams = {\n symbol: string;\n limit?: number;\n};\n\nexport type UseTradesScriptResult = {\n trades: Trade[];\n isLoading: boolean;\n};\n\nexport function useTradesScript({\n symbol,\n limit = 50,\n}: UseTradesScriptParams): UseTradesScriptResult {\n const [trades, setTrades] = useState<Trade[]>([]);\n\n const { data: initialData, isPending } = useRecentTradesQuery({\n symbol,\n limit,\n });\n\n const { data: realtimeTrade } = useMarketDataSubscription<Trade | Trade[]>({\n type: \"trades\",\n symbol,\n enabled: !!initialData,\n });\n\n useEffect(() => {\n if (initialData) {\n setTrades(initialData.filter(isValidTrade));\n }\n }, [initialData]);\n\n useEffect(() => {\n if (realtimeTrade) {\n setTrades((prevTrades) => {\n const normalizedTrades = normalizeRealtimeTrades(realtimeTrade);\n if (normalizedTrades.length === 0) return prevTrades;\n\n const deduped = normalizedTrades.filter((nextTrade) => {\n return !prevTrades.some(\n (existing) =>\n existing.timestamp === nextTrade.timestamp &&\n existing.price === nextTrade.price &&\n existing.quantity === nextTrade.quantity,\n );\n });\n\n if (deduped.length === 0) return prevTrades;\n\n const newTrades = [...deduped, ...prevTrades];\n return newTrades.slice(0, limit);\n });\n }\n }, [realtimeTrade, limit]);\n\n return {\n trades,\n isLoading: isPending,\n };\n}\n\nfunction normalizeRealtimeTrades(payload: Trade | Trade[]): Trade[] {\n const list = Array.isArray(payload) ? payload : [payload];\n return list.filter(isValidTrade);\n}\n\nfunction isValidTrade(trade: Partial<Trade> | undefined): trade is Trade {\n if (!trade) return false;\n return (\n typeof trade.symbol === \"string\" &&\n (trade.side === \"buy\" || trade.side === \"sell\") &&\n typeof trade.price === \"number\" &&\n Number.isFinite(trade.price) &&\n typeof trade.quantity === \"number\" &&\n Number.isFinite(trade.quantity) &&\n typeof trade.timestamp === \"number\" &&\n Number.isFinite(trade.timestamp)\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { Trade } from \"../../types\";\n\nexport type TradesUIProps = {\n trades: Trade[];\n onTradeClick?: (trade: Trade) => void;\n};\n\nfunction formatPrice(price: number | undefined): string {\n if (typeof price !== \"number\" || !Number.isFinite(price)) {\n return \"-\";\n }\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nfunction formatQuantity(qty: number | undefined): string {\n if (typeof qty !== \"number\" || !Number.isFinite(qty)) {\n return \"-\";\n }\n if (qty >= 1000000) {\n return (qty / 1000000).toFixed(2) + \"M\";\n }\n if (qty >= 1000) {\n return (qty / 1000).toFixed(2) + \"K\";\n }\n return qty.toFixed(2);\n}\n\nfunction formatTime(timestamp: number | undefined): string {\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp)) {\n return \"-\";\n }\n const date = new Date(timestamp);\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\nexport function TradesUI({ trades, onTradeClick }: TradesUIProps) {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 overflow-auto\">\n {/* h4 */}\n <div className=\"sticky top-0 z-10 bg-neutral-900 border-b border-neutral-800 px-2 py-2\">\n <div className=\"flex justify-between text-xs text-neutral-400\">\n <span className=\"min-w-20\">Price</span>\n <span className=\"min-w-16 text-right\">Amount</span>\n <span className=\"min-w-16 text-right\">Total</span>\n <span className=\"min-w-16 text-right\">Time</span>\n </div>\n </div>\n\n {/* \u0010�\u0017h */}\n <div className=\"flex-1\">\n {trades.map((trade, index) => {\n const isBuy = trade.side === \"buy\";\n const total =\n typeof trade.price === \"number\" &&\n Number.isFinite(trade.price) &&\n typeof trade.quantity === \"number\" &&\n Number.isFinite(trade.quantity)\n ? trade.price * trade.quantity\n : undefined;\n\n return (\n <div\n key={`${trade.timestamp}-${trade.price}-${index}`}\n className=\"flex justify-between items-center px-2 py-1 hover:bg-neutral-900/50 cursor-pointer transition-colors text-xs\"\n onClick={() => onTradeClick?.(trade)}\n >\n <span\n className={cn(\n \"min-w-20 font-medium\",\n isBuy ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPrice(trade.price)}\n </span>\n <span className=\"min-w-16 text-right text-neutral-300\">\n {formatQuantity(trade.quantity)}\n </span>\n <span className=\"min-w-16 text-right text-neutral-300\">\n {formatQuantity(total)}\n </span>\n <span className=\"min-w-16 text-right text-neutral-400\">\n {formatTime(trade.timestamp)}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\nimport type { Trade } from \"../../types\";\nimport { useTradesScript } from \"./trades.script\";\nimport { TradesUI } from \"./trades.ui\";\n\nexport type TradesWidgetProps = {\n symbol: string;\n limit?: number;\n onTradeClick?: (trade: Trade) => void;\n className?: string;\n};\n\nfunction TradesSkeleton() {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 p-2 gap-1\">\n <div className=\"flex justify-between mb-2\">\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-4 w-16 rounded\" />\n </div>\n {Array.from({ length: 20 }).map((_, i) => (\n <div key={`trade-skeleton-${i}`} className=\"flex justify-between\">\n <Skeleton className=\"h-5 w-20 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction TradesEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full bg-neutral-950\">\n <span className=\"text-neutral-400 text-sm\">No recent trades</span>\n </div>\n );\n}\n\nexport function TradesWidget({\n symbol,\n limit = 50,\n onTradeClick,\n className,\n}: TradesWidgetProps) {\n const { trades, isLoading } = useTradesScript({ symbol, limit });\n\n if (isLoading) {\n return <TradesSkeleton />;\n }\n\n if (trades.length === 0) {\n return <TradesEmpty />;\n }\n\n return (\n <div className={className}>\n <TradesUI trades={trades} onTradeClick={onTradeClick} />\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { useCreateOrderMutation } from \"../../hooks/useCreateOrderMutation\";\nimport { useMarketQuery } from \"../../hooks/useMarketQuery\";\nimport type { OrderSide, OrderType } from \"../../types\";\n\nexport type PlaceOrderFormData = {\n price?: number;\n amount: number;\n leverage: number;\n takeProfitPercent?: number;\n stopLossPercent?: number;\n};\n\nexport type UsePlaceOrderFormScriptParams = {\n symbol: string;\n userAddress?: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport type UsePlaceOrderFormScriptResult = {\n form: ReturnType<typeof useForm<PlaceOrderFormData>>;\n side: OrderSide;\n orderType: OrderType;\n setSide: (side: OrderSide) => void;\n setOrderType: (type: OrderType) => void;\n handleSubmit: (data: PlaceOrderFormData) => Promise<void>;\n isSubmitting: boolean;\n currentPrice?: number;\n estimatedFee: number;\n estimatedTotal: number;\n liquidationPrice?: number;\n availableMargin: number;\n accountValue: number;\n currentPosition?: number;\n};\n\nexport function usePlaceOrderFormScript({\n symbol,\n userAddress,\n onSuccess,\n onError,\n}: UsePlaceOrderFormScriptParams): UsePlaceOrderFormScriptResult {\n const [side, setSide] = useState<OrderSide>(\"long\");\n const [orderType, setOrderType] = useState<OrderType>(\"market\");\n\n const form = useForm<PlaceOrderFormData>({\n defaultValues: {\n amount: 0,\n leverage: 1,\n takeProfitPercent: 0,\n stopLossPercent: 0,\n },\n });\n\n const { data: marketData } = useMarketQuery({ symbol });\n\n const { mutateAsync: createOrder, isPending: isSubmitting } =\n useCreateOrderMutation({\n onSuccess: () => {\n form.reset();\n onSuccess?.();\n },\n onError: (error) => {\n onError?.(error);\n },\n });\n\n const watchedValues = form.watch();\n const { amount, leverage, price } = watchedValues;\n\n const currentPrice = useMemo(() => {\n if (orderType === \"limit\" && price) {\n return price;\n }\n return marketData?.price || 0;\n }, [orderType, price, marketData?.price]);\n\n const estimatedFee = useMemo(() => {\n if (!amount || !currentPrice) return 0;\n const feeRate = 0.0005;\n return amount * currentPrice * feeRate;\n }, [amount, currentPrice]);\n\n const estimatedTotal = useMemo(() => {\n if (!amount || !currentPrice) return 0;\n return amount * currentPrice + estimatedFee;\n }, [amount, currentPrice, estimatedFee]);\n\n const liquidationPrice = useMemo(() => {\n if (!amount || !currentPrice || !leverage || leverage === 1)\n return undefined;\n\n const maintenanceMarginRate = 0.005;\n const entryPrice = currentPrice;\n\n if (side === \"long\") {\n return entryPrice * (1 - (1 / leverage - maintenanceMarginRate));\n } else {\n return entryPrice * (1 + (1 / leverage - maintenanceMarginRate));\n }\n }, [amount, currentPrice, leverage, side]);\n\n const availableMargin = 10000;\n const accountValue = 10000;\n const currentPosition = 0;\n\n const handleSubmit = useCallback(\n async (data: PlaceOrderFormData) => {\n if (!userAddress) {\n throw new Error(\"User address is required\");\n }\n\n const finalPrice = orderType === \"limit\" ? data.price : undefined;\n\n let takeProfitPrice: number | undefined;\n let stopLossPrice: number | undefined;\n\n if (\n data.takeProfitPercent &&\n data.takeProfitPercent > 0 &&\n currentPrice\n ) {\n const tpPercent = data.takeProfitPercent / 100;\n takeProfitPrice =\n side === \"long\"\n ? currentPrice * (1 + tpPercent)\n : currentPrice * (1 - tpPercent);\n }\n\n if (data.stopLossPercent && data.stopLossPercent > 0 && currentPrice) {\n const slPercent = data.stopLossPercent / 100;\n stopLossPrice =\n side === \"long\"\n ? currentPrice * (1 - slPercent)\n : currentPrice * (1 + slPercent);\n }\n\n await createOrder({\n symbol,\n side,\n orderType,\n amount: data.amount,\n price: finalPrice,\n leverage: data.leverage,\n takeProfitPrice,\n stopLossPrice,\n userAddress,\n });\n },\n [symbol, side, orderType, currentPrice, userAddress, createOrder],\n );\n\n return {\n form,\n side,\n orderType,\n setSide,\n setOrderType,\n handleSubmit,\n isSubmitting,\n currentPrice,\n estimatedFee,\n estimatedTotal,\n liquidationPrice,\n availableMargin,\n accountValue,\n currentPosition,\n };\n}\n","import type { UseFormReturn } from \"react-hook-form\";\nimport { Button, cn, RHForm, RHNumberInput, Slider } from \"@liberfi.io/ui\";\nimport type { OrderSide, OrderType } from \"../../types\";\nimport type { PlaceOrderFormData } from \"./place-order-form.script\";\n\nexport type PlaceOrderFormUIProps = {\n methods: UseFormReturn<PlaceOrderFormData>;\n side: OrderSide;\n orderType: OrderType;\n onSideChange: (side: OrderSide) => void;\n onOrderTypeChange: (type: OrderType) => void;\n onSubmit: (data: PlaceOrderFormData) => Promise<void>;\n isSubmitting: boolean;\n symbol: string;\n currentPrice?: number;\n estimatedFee: number;\n estimatedTotal: number;\n liquidationPrice?: number;\n availableMargin: number;\n accountValue: number;\n currentPosition?: number;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\ntype FormNumberInputProps = {\n name: \"price\" | \"amount\";\n placeholder: string;\n endContent?: React.ReactNode;\n};\n\nfunction FormNumberInput({\n name,\n placeholder,\n endContent,\n}: FormNumberInputProps) {\n return (\n <RHNumberInput\n name={name}\n placeholder={placeholder}\n className=\"w-full\"\n endContent={endContent}\n />\n );\n}\n\nexport function PlaceOrderFormUI({\n methods,\n side,\n orderType,\n onSideChange,\n onOrderTypeChange,\n onSubmit,\n isSubmitting,\n symbol,\n currentPrice,\n estimatedFee,\n liquidationPrice,\n availableMargin,\n accountValue,\n currentPosition,\n}: PlaceOrderFormUIProps) {\n const leverage = methods.watch(\"leverage\") || 1;\n const tpPercent = methods.watch(\"takeProfitPercent\") || 0;\n const slPercent = methods.watch(\"stopLossPercent\") || 0;\n\n const tpSlOptions = [\n { label: \"0%\", value: 0 },\n { label: \"25%\", value: 25 },\n { label: \"50%\", value: 50 },\n { label: \"75%\", value: 75 },\n { label: \"100%\", value: 100 },\n ];\n\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 p-4 gap-4\">\n {/* Long/Short 切换 */}\n <div className=\"flex gap-2\">\n <Button\n className={cn(\n \"flex-1 h-10\",\n side === \"long\"\n ? \"bg-green-600 hover:bg-green-700 text-white\"\n : \"bg-neutral-800 hover:bg-neutral-700 text-neutral-400\",\n )}\n onClick={() => onSideChange(\"long\")}\n >\n Long\n </Button>\n <Button\n className={cn(\n \"flex-1 h-10\",\n side === \"short\"\n ? \"bg-red-600 hover:bg-red-700 text-white\"\n : \"bg-neutral-800 hover:bg-neutral-700 text-neutral-400\",\n )}\n onClick={() => onSideChange(\"short\")}\n >\n Short\n </Button>\n </div>\n\n {/* Market/Limit 选择 */}\n <div className=\"flex gap-2 text-sm\">\n <button\n type=\"button\"\n className={cn(\n \"px-4 py-2 rounded transition-colors\",\n orderType === \"market\"\n ? \"bg-neutral-800 text-white\"\n : \"text-neutral-400 hover:text-white\",\n )}\n onClick={() => onOrderTypeChange(\"market\")}\n >\n Market\n </button>\n <button\n type=\"button\"\n className={cn(\n \"px-4 py-2 rounded transition-colors\",\n orderType === \"limit\"\n ? \"bg-neutral-800 text-white\"\n : \"text-neutral-400 hover:text-white\",\n )}\n onClick={() => onOrderTypeChange(\"limit\")}\n >\n Limit\n </button>\n </div>\n\n <RHForm methods={methods} onSubmit={onSubmit}>\n <div className=\"flex flex-col gap-4\">\n {/* Limit 订单价格 */}\n {orderType === \"limit\" && (\n <div>\n <label className=\"text-xs text-neutral-400 mb-1 block\">\n Price\n </label>\n <FormNumberInput\n name=\"price\"\n placeholder=\"0.0\"\n endContent={\n <span className=\"text-neutral-400 text-xs\">USDC</span>\n }\n />\n </div>\n )}\n\n {/* 数量输入 */}\n <div>\n <label className=\"text-xs text-neutral-400 mb-1 block\">\n Buy Amount\n </label>\n <FormNumberInput\n name=\"amount\"\n placeholder=\"0.0\"\n endContent={\n <span className=\"text-neutral-400 text-xs\">\n {symbol.split(\"-\")[0]}\n </span>\n }\n />\n {currentPrice && (\n <div className=\"text-xs text-neutral-500 mt-1\">\n ≈ {formatNumber((methods.watch(\"amount\") || 0) * currentPrice)}{\" \"}\n USDC\n </div>\n )}\n </div>\n\n {/* 杠杆滑块 */}\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <label className=\"text-xs text-neutral-400\">Leverage</label>\n <span className=\"text-sm text-white font-medium\">\n {leverage}x\n </span>\n </div>\n <Slider\n value={[leverage]}\n onChange={(value: number | number[]) =>\n methods.setValue(\n \"leverage\",\n Array.isArray(value) ? value[0] : value,\n )\n }\n minValue={1}\n maxValue={10}\n step={1}\n className=\"w-full\"\n />\n <div className=\"flex justify-between text-xs text-neutral-500 mt-1\">\n <span>1x</span>\n <span>10x</span>\n </div>\n </div>\n\n {/* TP/SL 百分比 */}\n <div>\n <label className=\"text-xs text-neutral-400 mb-2 block\">TP/SL</label>\n <div className=\"flex gap-2 mb-2\">\n {tpSlOptions.map((option) => (\n <button\n key={`tp-${option.value}`}\n type=\"button\"\n className={cn(\n \"flex-1 py-1.5 text-xs rounded transition-colors\",\n tpPercent === option.value\n ? \"bg-green-600 text-white\"\n : \"bg-neutral-800 text-neutral-400 hover:bg-neutral-700\",\n )}\n onClick={() =>\n methods.setValue(\"takeProfitPercent\", option.value)\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n <div className=\"flex gap-2\">\n {tpSlOptions.map((option) => (\n <button\n key={`sl-${option.value}`}\n type=\"button\"\n className={cn(\n \"flex-1 py-1.5 text-xs rounded transition-colors\",\n slPercent === option.value\n ? \"bg-red-600 text-white\"\n : \"bg-neutral-800 text-neutral-400 hover:bg-neutral-700\",\n )}\n onClick={() =>\n methods.setValue(\"stopLossPercent\", option.value)\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* 提交按钮 */}\n <Button\n type=\"submit\"\n isLoading={isSubmitting}\n className={cn(\n \"w-full h-12 font-semibold text-white\",\n side === \"long\"\n ? \"bg-green-600 hover:bg-green-700\"\n : \"bg-red-600 hover:bg-red-700\",\n )}\n >\n {side === \"long\" ? \"Buy / Long\" : \"Sell / Short\"}\n </Button>\n\n {/* 添加资金按钮 */}\n <Button\n type=\"button\"\n className=\"w-full h-10 bg-green-600 hover:bg-green-700 text-white font-medium\"\n >\n Add More Funds\n </Button>\n\n {/* 账户信息 */}\n <div className=\"flex flex-col gap-2 text-xs border-t border-neutral-800 pt-4\">\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Available Margin</span>\n <span className=\"text-white\">\n {formatNumber(availableMargin)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Perps Account Value</span>\n <span className=\"text-white\">\n {formatNumber(accountValue)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Current Position</span>\n <span className=\"text-white\">\n {currentPosition ? formatNumber(currentPosition) : \"0.00\"}\n </span>\n </div>\n {liquidationPrice && (\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Est. Liquidation Price</span>\n <span className=\"text-red-400\">\n {formatNumber(liquidationPrice, 4)}\n </span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Est. Fee</span>\n <span className=\"text-white\">\n {formatNumber(estimatedFee, 4)} USDC\n </span>\n </div>\n </div>\n </div>\n </RHForm>\n </div>\n );\n}\n","import { usePlaceOrderFormScript } from \"./place-order-form.script\";\nimport { PlaceOrderFormUI } from \"./place-order-form.ui\";\n\nexport type PlaceOrderFormWidgetProps = {\n symbol: string;\n userAddress?: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n};\n\nexport function PlaceOrderFormWidget({\n symbol,\n userAddress,\n onSuccess,\n onError,\n className,\n}: PlaceOrderFormWidgetProps) {\n const {\n form,\n side,\n orderType,\n setSide,\n setOrderType,\n handleSubmit,\n isSubmitting,\n currentPrice,\n estimatedFee,\n estimatedTotal,\n liquidationPrice,\n availableMargin,\n accountValue,\n currentPosition,\n } = usePlaceOrderFormScript({\n symbol,\n userAddress,\n onSuccess,\n onError,\n });\n\n return (\n <div className={className}>\n <PlaceOrderFormUI\n methods={form}\n side={side}\n orderType={orderType}\n onSideChange={setSide}\n onOrderTypeChange={setOrderType}\n onSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n symbol={symbol}\n currentPrice={currentPrice}\n estimatedFee={estimatedFee}\n estimatedTotal={estimatedTotal}\n liquidationPrice={liquidationPrice}\n availableMargin={availableMargin}\n accountValue={accountValue}\n currentPosition={currentPosition}\n />\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useCreateOrderMutation } from \"../../hooks/useCreateOrderMutation\";\nimport { usePositionsQuery } from \"../../hooks/usePositionsQuery\";\nimport { useUserDataSubscription } from \"../../hooks/useUserDataSubscription\";\nimport type { Position } from \"../../types\";\n\nexport type UsePositionsScriptParams = {\n userAddress?: string;\n symbol?: string;\n onCloseSuccess?: () => void;\n onCloseError?: (error: Error) => void;\n};\n\nexport type UsePositionsScriptResult = {\n positions: Position[];\n isLoading: boolean;\n error: Error | null;\n handleClosePosition: (position: Position) => Promise<void>;\n isClosing: boolean;\n};\n\nexport function usePositionsScript({\n userAddress,\n symbol,\n onCloseSuccess,\n onCloseError,\n}: UsePositionsScriptParams): UsePositionsScriptResult {\n const [positions, setPositions] = useState<Position[]>([]);\n\n // Fetch initial positions data\n const {\n data: positionsData,\n isLoading,\n error,\n } = usePositionsQuery({ userAddress, symbol }, { enabled: !!userAddress });\n\n // Subscribe to realtime position updates\n const { data: realtimePosition } = useUserDataSubscription<Position>({\n type: \"positions\",\n userAddress: userAddress || \"\",\n enabled: !!userAddress,\n });\n\n // Mutation for closing position (by placing opposite order)\n const { mutateAsync: createOrder, isPending: isClosing } =\n useCreateOrderMutation({\n onSuccess: () => {\n onCloseSuccess?.();\n },\n onError: (error) => {\n onCloseError?.(error);\n },\n });\n\n // Initialize positions data\n useEffect(() => {\n if (positionsData?.positions) {\n setPositions(positionsData.positions);\n }\n }, [positionsData]);\n\n // Handle realtime position updates\n useEffect(() => {\n if (realtimePosition) {\n setPositions((prevPositions) => {\n const existingIndex = prevPositions.findIndex(\n (p) => p.symbol === realtimePosition.symbol,\n );\n\n // If position quantity is 0, remove the position\n if (realtimePosition.quantity === 0) {\n if (existingIndex !== -1) {\n return prevPositions.filter((_, i) => i !== existingIndex);\n }\n return prevPositions;\n }\n\n // Update existing position\n if (existingIndex !== -1) {\n const newPositions = [...prevPositions];\n newPositions[existingIndex] = realtimePosition;\n return newPositions;\n }\n\n // Add new position\n return [...prevPositions, realtimePosition];\n });\n }\n }, [realtimePosition]);\n\n // Close position by placing opposite market order\n const handleClosePosition = useCallback(\n async (position: Position) => {\n if (!userAddress) {\n throw new Error(\"User address is required\");\n }\n\n // Close = place opposite side market order\n const closeSide = position.side === \"long\" ? \"short\" : \"long\";\n\n await createOrder({\n symbol: position.symbol,\n side: closeSide,\n orderType: \"market\",\n amount: Math.abs(position.quantity),\n leverage: position.leverage,\n userAddress,\n });\n },\n [userAddress, createOrder],\n );\n\n return {\n positions,\n isLoading,\n error,\n handleClosePosition,\n isClosing,\n };\n}\n","import { Button, cn } from \"@liberfi.io/ui\";\nimport type { Position } from \"../../types\";\n\nexport type PositionsUIProps = {\n positions: Position[];\n onClosePosition: (position: Position) => void;\n isClosing: boolean;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction formatPrice(price: number): string {\n return formatNumber(price, 4);\n}\n\nfunction formatQuantity(quantity: number): string {\n return formatNumber(Math.abs(quantity), 4);\n}\n\nfunction formatPnl(pnl: number): string {\n const sign = pnl >= 0 ? \"+\" : \"\";\n return `${sign}${formatNumber(pnl, 2)}`;\n}\n\nfunction formatPnlPercent(percent: number): string {\n const sign = percent >= 0 ? \"+\" : \"\";\n return `${sign}${formatNumber(percent, 2)}%`;\n}\n\nexport function PositionsUI({\n positions,\n onClosePosition,\n isClosing,\n}: PositionsUIProps) {\n if (positions.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open positions\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-800\">\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Asset\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Position\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Position Value\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Entry Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Mark Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Liquidation Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Margin Used (PnL)\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n TP / SL\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Close\n </th>\n </tr>\n </thead>\n <tbody>\n {positions.map((position) => {\n const isProfitable = position.unrealizedPnl >= 0;\n const pnlColor = isProfitable ? \"text-green-500\" : \"text-red-500\";\n\n return (\n <tr\n key={position.symbol}\n className=\"border-b border-neutral-800 hover:bg-neutral-900/50\"\n >\n {/* Asset */}\n <td className=\"py-3 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"text-white font-medium\">\n {position.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n \"text-xs\",\n position.side === \"long\"\n ? \"text-green-500\"\n : \"text-red-500\",\n )}\n >\n {position.leverage}x {position.side.toUpperCase()}\n </span>\n </div>\n </td>\n\n {/* Position */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(position.quantity)}\n </td>\n\n {/* Position Value */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatNumber(position.notionalValue)}\n </td>\n\n {/* Entry Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatPrice(position.entryPrice)}\n </td>\n\n {/* Mark Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatPrice(position.markPrice)}\n </td>\n\n {/* Liquidation Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n {position.liquidationPrice\n ? `$${formatPrice(position.liquidationPrice)}`\n : \"-\"}\n </td>\n\n {/* Margin Used (PnL) */}\n <td className=\"py-3 px-4 text-right\">\n <div className=\"flex flex-col items-end\">\n <span className=\"text-white\">\n ${formatNumber(position.margin)}\n </span>\n <span className={cn(\"text-xs\", pnlColor)}>\n {formatPnl(position.unrealizedPnl)} (\n {formatPnlPercent(position.unrealizedPnlPercent)})\n </span>\n </div>\n </td>\n\n {/* TP / SL */}\n <td className=\"py-3 px-4 text-right text-neutral-400\">-</td>\n\n {/* Close */}\n <td className=\"py-3 px-4 text-right\">\n <Button\n size=\"sm\"\n onClick={() => onClosePosition(position)}\n isLoading={isClosing}\n className=\"bg-red-600 hover:bg-red-700 text-white text-xs px-3 py-1\"\n >\n Close\n </Button>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ��O��\nexport function PositionsSkeleton() {\n return (\n <div className=\"w-full space-y-4 p-4\">\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n </div>\n );\n}\n\n// z�\u0001��\nexport function PositionsEmpty() {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open positions\n </div>\n );\n}\n","import { usePositionsScript } from \"./positions.script\";\nimport { PositionsUI, PositionsSkeleton, PositionsEmpty } from \"./positions.ui\";\n\nexport type PositionsWidgetProps = {\n userAddress?: string;\n symbol?: string;\n onCloseSuccess?: () => void;\n onCloseError?: (error: Error) => void;\n className?: string;\n};\n\nexport function PositionsWidget({\n userAddress,\n symbol,\n onCloseSuccess,\n onCloseError,\n className,\n}: PositionsWidgetProps) {\n const { positions, isLoading, handleClosePosition, isClosing } =\n usePositionsScript({\n userAddress,\n symbol,\n onCloseSuccess,\n onCloseError,\n });\n\n if (isLoading) {\n return (\n <div className={className}>\n <PositionsSkeleton />\n </div>\n );\n }\n\n if (positions.length === 0) {\n return (\n <div className={className}>\n <PositionsEmpty />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <PositionsUI\n positions={positions}\n onClosePosition={handleClosePosition}\n isClosing={isClosing}\n />\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useCancelOrderMutation } from \"../../hooks/useCancelOrderMutation\";\nimport { useOrdersQuery } from \"../../hooks/useOrdersQuery\";\nimport { useUserDataSubscription } from \"../../hooks/useUserDataSubscription\";\nimport type { Order } from \"../../types\";\n\nexport type UseOpenOrdersScriptParams = {\n userAddress?: string;\n symbol?: string;\n onCancelSuccess?: () => void;\n onCancelError?: (error: Error) => void;\n};\n\nexport type UseOpenOrdersScriptResult = {\n orders: Order[];\n isLoading: boolean;\n error: Error | null;\n handleCancelOrder: (order: Order) => Promise<void>;\n isCanceling: boolean;\n};\n\nexport function useOpenOrdersScript({\n userAddress,\n symbol,\n onCancelSuccess,\n onCancelError,\n}: UseOpenOrdersScriptParams): UseOpenOrdersScriptResult {\n const [orders, setOrders] = useState<Order[]>([]);\n\n // Fetch initial orders data\n const {\n data: ordersData,\n isLoading,\n error,\n } = useOrdersQuery({ userAddress, symbol }, { enabled: !!userAddress });\n\n // Subscribe to realtime order updates\n const { data: realtimeOrder } = useUserDataSubscription<Order>({\n type: \"orders\",\n userAddress: userAddress || \"\",\n enabled: !!userAddress,\n });\n\n // Cancel order mutation\n const { mutateAsync: cancelOrder, isPending: isCanceling } =\n useCancelOrderMutation({\n onSuccess: () => {\n onCancelSuccess?.();\n },\n onError: (error) => {\n onCancelError?.(error);\n },\n });\n\n // Initialize orders data\n useEffect(() => {\n if (ordersData?.orders) {\n setOrders(ordersData.orders);\n }\n }, [ordersData]);\n\n // Handle realtime order updates\n useEffect(() => {\n if (realtimeOrder) {\n setOrders((prevOrders) => {\n const existingIndex = prevOrders.findIndex(\n (o) => o.orderId === realtimeOrder.orderId,\n );\n\n // If order is cancelled, filled or rejected, remove from list\n if (\n realtimeOrder.status === \"cancelled\" ||\n realtimeOrder.status === \"filled\" ||\n realtimeOrder.status === \"rejected\"\n ) {\n if (existingIndex !== -1) {\n return prevOrders.filter((_, i) => i !== existingIndex);\n }\n return prevOrders;\n }\n\n // Update existing order\n if (existingIndex !== -1) {\n const newOrders = [...prevOrders];\n newOrders[existingIndex] = realtimeOrder;\n return newOrders;\n }\n\n // Add new order\n return [realtimeOrder, ...prevOrders];\n });\n }\n }, [realtimeOrder]);\n\n // Handle cancel order\n const handleCancelOrder = useCallback(\n async (order: Order) => {\n if (!userAddress) {\n throw new Error(\"User address is required\");\n }\n\n await cancelOrder({\n orderId: order.orderId,\n symbol: order.symbol,\n userAddress,\n });\n },\n [userAddress, cancelOrder],\n );\n\n return {\n orders,\n isLoading,\n error,\n handleCancelOrder,\n isCanceling,\n };\n}\n","import { Button, cn } from \"@liberfi.io/ui\";\nimport type { Order } from \"../../types\";\n\nexport type OpenOrdersUIProps = {\n orders: Order[];\n onCancelOrder: (order: Order) => void;\n isCanceling: boolean;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction formatPrice(price: number): string {\n return formatNumber(price, 4);\n}\n\nfunction formatQuantity(quantity: number): string {\n return formatNumber(quantity, 4);\n}\n\nfunction formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\nexport function OpenOrdersUI({\n orders,\n onCancelOrder,\n isCanceling,\n}: OpenOrdersUIProps) {\n if (orders.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open orders\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-800\">\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Asset\n </th>\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Type\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Amount\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Filled\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Remaining\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Status\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Time\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {orders.map((order) => {\n return (\n <tr\n key={order.orderId}\n className=\"border-b border-neutral-800 hover:bg-neutral-900/50\"\n >\n {/* Asset */}\n <td className=\"py-3 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"text-white font-medium\">\n {order.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n \"text-xs\",\n order.side === \"long\"\n ? \"text-green-500\"\n : \"text-red-500\",\n )}\n >\n {order.side.toUpperCase()}\n {order.leverage ? ` ${order.leverage}x` : \"\"}\n </span>\n </div>\n </td>\n\n {/* Type */}\n <td className=\"py-3 px-4 text-white capitalize\">\n {order.orderType}\n </td>\n\n {/* Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n {order.orderType === \"market\" ? (\n <span className=\"text-neutral-400\">Market</span>\n ) : (\n `$${formatPrice(order.price)}`\n )}\n </td>\n\n {/* Amount */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(order.quantity)}\n </td>\n\n {/* Filled */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(order.filledQuantity)}\n </td>\n\n {/* Remaining */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(order.remainingQuantity)}\n </td>\n\n {/* Status */}\n <td className=\"py-3 px-4 text-right\">\n <span\n className={cn(\n \"text-xs px-2 py-1 rounded\",\n order.status === \"pending\" &&\n \"bg-yellow-600/20 text-yellow-500\",\n order.status === \"partially_filled\" &&\n \"bg-blue-600/20 text-blue-500\",\n order.status === \"filled\" &&\n \"bg-green-600/20 text-green-500\",\n order.status === \"cancelled\" &&\n \"bg-neutral-600/20 text-neutral-400\",\n order.status === \"rejected\" &&\n \"bg-red-600/20 text-red-500\",\n )}\n >\n {order.status.replace(\"_\", \" \")}\n </span>\n </td>\n\n {/* Time */}\n <td className=\"py-3 px-4 text-right text-neutral-400\">\n {formatTime(order.timestamp)}\n </td>\n\n {/* Action */}\n <td className=\"py-3 px-4 text-right\">\n {order.status === \"pending\" ||\n order.status === \"partially_filled\" ? (\n <Button\n size=\"sm\"\n onClick={() => onCancelOrder(order)}\n isLoading={isCanceling}\n className=\"bg-red-600 hover:bg-red-700 text-white text-xs px-3 py-1\"\n >\n Cancel\n </Button>\n ) : (\n <span className=\"text-neutral-600 text-xs\">-</span>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Loading skeleton component\nexport function OpenOrdersSkeleton() {\n return (\n <div className=\"w-full space-y-4 p-4\">\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n </div>\n );\n}\n\n// Empty state component\nexport function OpenOrdersEmpty() {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open orders\n </div>\n );\n}\n","import { useOpenOrdersScript } from \"./open-orders.script\";\nimport {\n OpenOrdersUI,\n OpenOrdersSkeleton,\n OpenOrdersEmpty,\n} from \"./open-orders.ui\";\n\nexport type OpenOrdersWidgetProps = {\n userAddress?: string;\n symbol?: string;\n onCancelSuccess?: () => void;\n onCancelError?: (error: Error) => void;\n className?: string;\n};\n\nexport function OpenOrdersWidget({\n userAddress,\n symbol,\n onCancelSuccess,\n onCancelError,\n className,\n}: OpenOrdersWidgetProps) {\n const { orders, isLoading, handleCancelOrder, isCanceling } =\n useOpenOrdersScript({\n userAddress,\n symbol,\n onCancelSuccess,\n onCancelError,\n });\n\n if (isLoading) {\n return (\n <div className={className}>\n <OpenOrdersSkeleton />\n </div>\n );\n }\n\n if (orders.length === 0) {\n return (\n <div className={className}>\n <OpenOrdersEmpty />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <OpenOrdersUI\n orders={orders}\n onCancelOrder={handleCancelOrder}\n isCanceling={isCanceling}\n />\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { useTradesQuery } from \"../../hooks/useTradesQuery\";\nimport type { TradeHistory } from \"../../types\";\n\nexport type TimeRange = \"today\" | \"7d\" | \"30d\" | \"all\";\n\nexport type UseTradeHistoryScriptParams = {\n userAddress?: string;\n symbol?: string;\n initialTimeRange?: TimeRange;\n pageSize?: number;\n};\n\nexport type UseTradeHistoryScriptResult = {\n trades: TradeHistory[];\n isLoading: boolean;\n error: Error | null;\n timeRange: TimeRange;\n setTimeRange: (range: TimeRange) => void;\n currentPage: number;\n totalPages: number;\n goToNextPage: () => void;\n goToPreviousPage: () => void;\n goToPage: (page: number) => void;\n};\n\nfunction getTimeRangeInMs(range: TimeRange): {\n startTime?: number;\n endTime?: number;\n} {\n const now = Date.now();\n const endTime = now;\n\n switch (range) {\n case \"today\":\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return { startTime: today.getTime(), endTime };\n case \"7d\":\n return { startTime: now - 7 * 24 * 60 * 60 * 1000, endTime };\n case \"30d\":\n return { startTime: now - 30 * 24 * 60 * 60 * 1000, endTime };\n case \"all\":\n default:\n return {};\n }\n}\n\nexport function useTradeHistoryScript({\n userAddress,\n symbol,\n initialTimeRange = \"7d\",\n pageSize = 50,\n}: UseTradeHistoryScriptParams): UseTradeHistoryScriptResult {\n const [timeRange, setTimeRange] = useState<TimeRange>(initialTimeRange);\n const [currentPage, setCurrentPage] = useState(1);\n const [allTrades, setAllTrades] = useState<TradeHistory[]>([]);\n\n const { startTime, endTime } = getTimeRangeInMs(timeRange);\n\n // Fetch trades with time range filter\n const {\n data: tradesData,\n isLoading,\n error,\n } = useTradesQuery(\n {\n userAddress,\n symbol,\n startTime,\n endTime,\n limit: 1000, // Fetch more data for client-side pagination\n },\n { enabled: !!userAddress },\n );\n\n // Update all trades when data changes\n useEffect(() => {\n if (tradesData?.trades) {\n setAllTrades(tradesData.trades);\n setCurrentPage(1); // Reset to first page when data changes\n }\n }, [tradesData]);\n\n // Reset page when time range changes\n useEffect(() => {\n setCurrentPage(1);\n }, [timeRange]);\n\n // Calculate pagination\n const totalPages = Math.ceil(allTrades.length / pageSize);\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n const trades = allTrades.slice(startIndex, endIndex);\n\n const goToNextPage = () => {\n if (currentPage < totalPages) {\n setCurrentPage(currentPage + 1);\n }\n };\n\n const goToPreviousPage = () => {\n if (currentPage > 1) {\n setCurrentPage(currentPage - 1);\n }\n };\n\n const goToPage = (page: number) => {\n if (page >= 1 && page <= totalPages) {\n setCurrentPage(page);\n }\n };\n\n return {\n trades,\n isLoading,\n error,\n timeRange,\n setTimeRange,\n currentPage,\n totalPages,\n goToNextPage,\n goToPreviousPage,\n goToPage,\n };\n}\n","import { Button, cn } from \"@liberfi.io/ui\";\nimport type { TradeHistory } from \"../../types\";\nimport type { TimeRange } from \"./trade-history.script\";\n\nexport type TradeHistoryUIProps = {\n trades: TradeHistory[];\n timeRange: TimeRange;\n onTimeRangeChange: (range: TimeRange) => void;\n currentPage: number;\n totalPages: number;\n onNextPage: () => void;\n onPreviousPage: () => void;\n onGoToPage: (page: number) => void;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction formatPrice(price: number): string {\n return formatNumber(price, 4);\n}\n\nfunction formatQuantity(quantity: number): string {\n return formatNumber(quantity, 4);\n}\n\nfunction formatDateTime(timestamp: number): string {\n const date = new Date(timestamp);\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${month}/${day} ${hours}:${minutes}:${seconds}`;\n}\n\nconst TIME_RANGE_OPTIONS: { label: string; value: TimeRange }[] = [\n { label: \"Today\", value: \"today\" },\n { label: \"7 Days\", value: \"7d\" },\n { label: \"30 Days\", value: \"30d\" },\n { label: \"All\", value: \"all\" },\n];\n\nexport function TradeHistoryUI({\n trades,\n timeRange,\n onTimeRangeChange,\n currentPage,\n totalPages,\n onNextPage,\n onPreviousPage,\n onGoToPage,\n}: TradeHistoryUIProps) {\n return (\n <div className=\"w-full flex flex-col gap-4\">\n {/* Time range filter */}\n <div className=\"flex gap-2\">\n {TIME_RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"px-4 py-2 text-sm rounded transition-colors\",\n timeRange === option.value\n ? \"bg-neutral-800 text-white\"\n : \"text-neutral-400 hover:text-white hover:bg-neutral-800/50\",\n )}\n onClick={() => onTimeRangeChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n {/* Trade history table */}\n {trades.length === 0 ? (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No trade history\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-800\">\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Asset\n </th>\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Side\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Quantity\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Fee\n </th>\n <th className=\"text-center py-3 px-4 text-neutral-400 font-normal\">\n Maker/Taker\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Time\n </th>\n </tr>\n </thead>\n <tbody>\n {trades.map((trade) => (\n <tr\n key={trade.tradeId}\n className=\"border-b border-neutral-800 hover:bg-neutral-900/50\"\n >\n {/* Asset */}\n <td className=\"py-3 px-4 text-white font-medium\">\n {trade.symbol.split(\"-\")[0]}\n </td>\n\n {/* Side */}\n <td className=\"py-3 px-4\">\n <span\n className={cn(\n \"text-xs px-2 py-1 rounded\",\n trade.side === \"long\"\n ? \"bg-green-600/20 text-green-500\"\n : \"bg-red-600/20 text-red-500\",\n )}\n >\n {trade.side.toUpperCase()}\n </span>\n </td>\n\n {/* Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatPrice(trade.price)}\n </td>\n\n {/* Quantity */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(trade.quantity)}\n </td>\n\n {/* Fee */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatNumber(trade.fee, 4)} {trade.feeCurrency}\n </td>\n\n {/* Maker/Taker */}\n <td className=\"py-3 px-4 text-center\">\n <span\n className={cn(\n \"text-xs px-2 py-1 rounded\",\n trade.isMaker\n ? \"bg-blue-600/20 text-blue-500\"\n : \"bg-purple-600/20 text-purple-500\",\n )}\n >\n {trade.isMaker ? \"Maker\" : \"Taker\"}\n </span>\n </td>\n\n {/* Time */}\n <td className=\"py-3 px-4 text-right text-neutral-400\">\n {formatDateTime(trade.timestamp)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-neutral-400\">\n Page {currentPage} of {totalPages}\n </div>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n onClick={onPreviousPage}\n disabled={currentPage === 1}\n className=\"bg-neutral-800 hover:bg-neutral-700 text-white disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Previous\n </Button>\n {/* Page numbers */}\n <div className=\"flex gap-1\">\n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\n let pageNum: number;\n if (totalPages <= 5) {\n pageNum = i + 1;\n } else if (currentPage <= 3) {\n pageNum = i + 1;\n } else if (currentPage >= totalPages - 2) {\n pageNum = totalPages - 4 + i;\n } else {\n pageNum = currentPage - 2 + i;\n }\n\n return (\n <button\n key={pageNum}\n type=\"button\"\n className={cn(\n \"w-8 h-8 text-sm rounded transition-colors\",\n currentPage === pageNum\n ? \"bg-neutral-700 text-white\"\n : \"text-neutral-400 hover:bg-neutral-800 hover:text-white\",\n )}\n onClick={() => onGoToPage(pageNum)}\n >\n {pageNum}\n </button>\n );\n })}\n </div>\n <Button\n size=\"sm\"\n onClick={onNextPage}\n disabled={currentPage === totalPages}\n className=\"bg-neutral-800 hover:bg-neutral-700 text-white disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Next\n </Button>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// Loading skeleton component\nexport function TradeHistorySkeleton() {\n return (\n <div className=\"w-full space-y-4 p-4\">\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n </div>\n );\n}\n\n// Empty state component\nexport function TradeHistoryEmpty() {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No trade history\n </div>\n );\n}\n","import { useTradeHistoryScript } from \"./trade-history.script\";\nimport type { TimeRange } from \"./trade-history.script\";\nimport {\n TradeHistoryUI,\n TradeHistorySkeleton,\n TradeHistoryEmpty,\n} from \"./trade-history.ui\";\n\nexport type TradeHistoryWidgetProps = {\n userAddress?: string;\n symbol?: string;\n initialTimeRange?: TimeRange;\n pageSize?: number;\n className?: string;\n};\n\nexport function TradeHistoryWidget({\n userAddress,\n symbol,\n initialTimeRange = \"7d\",\n pageSize = 50,\n className,\n}: TradeHistoryWidgetProps) {\n const {\n trades,\n isLoading,\n timeRange,\n setTimeRange,\n currentPage,\n totalPages,\n goToNextPage,\n goToPreviousPage,\n goToPage,\n } = useTradeHistoryScript({\n userAddress,\n symbol,\n initialTimeRange,\n pageSize,\n });\n\n if (isLoading) {\n return (\n <div className={className}>\n <TradeHistorySkeleton />\n </div>\n );\n }\n\n if (trades.length === 0) {\n return (\n <div className={className}>\n <TradeHistoryEmpty />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <TradeHistoryUI\n trades={trades}\n timeRange={timeRange}\n onTimeRangeChange={setTimeRange}\n currentPage={currentPage}\n totalPages={totalPages}\n onNextPage={goToNextPage}\n onPreviousPage={goToPreviousPage}\n onGoToPage={goToPage}\n />\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/client/hyperliquid/WebSocketManager.ts","../src/client/hyperliquid/HyperliquidPerpetualsClient.ts","../src/context/PerpetualsContext.ts","../src/providers/PerpetualsProvider.tsx","../src/hooks/usePerpetualsClient.ts","../src/hooks/useCoinsQuery.ts","../src/hooks/useMarketQuery.ts","../src/hooks/useMarketsQuery.ts","../src/hooks/useKlinesQuery.ts","../src/hooks/useOrderBookQuery.ts","../src/hooks/useRecentTradesQuery.ts","../src/hooks/usePositionsQuery.ts","../src/hooks/useOrdersQuery.ts","../src/hooks/useTradesQuery.ts","../src/hooks/useCreateOrderMutation.ts","../src/hooks/useCancelOrderMutation.ts","../src/hooks/useMarketDataSubscription.ts","../src/hooks/useCandlesSubscription.ts","../src/hooks/useUserDataSubscription.ts","../src/components/coin-info/coin-info-notfound.ui.tsx","../src/components/coin-info/coin-info-skeletons.ui.tsx","../src/components/coin-info/coin-info.script.tsx","../src/components/coin-info/coin-info.ui.tsx","../src/components/coin-info/coin-info.widget.tsx","../src/components/search-coins/search-coins.script.tsx","../src/components/search-coins/search-coins.ui.tsx","../src/components/search-coins/search-coins.widget.tsx","../src/components/orderbook/orderbook.script.tsx","../src/components/orderbook/orderbook.ui.tsx","../src/components/orderbook/orderbook.widget.tsx","../src/components/trades/trades.script.tsx","../src/components/trades/trades.ui.tsx","../src/components/trades/trades.widget.tsx","../src/components/place-order/place-order-form.script.tsx","../src/components/place-order/place-order-form.ui.tsx","../src/components/place-order/place-order-form.widget.tsx","../src/components/positions/positions.script.tsx","../src/components/positions/positions.ui.tsx","../src/components/positions/positions.widget.tsx","../src/components/open-orders/open-orders.script.tsx","../src/components/open-orders/open-orders.ui.tsx","../src/components/open-orders/open-orders.widget.tsx","../src/components/trade-history/trade-history.script.tsx","../src/components/trade-history/trade-history.ui.tsx","../src/components/trade-history/trade-history.widget.tsx"],"names":["version_default","WebSocketManager","wsEndpoint","resolve","reject","event","error","delay","message","subscription","data","channel","subscriptionId","transformedData","type","_param","param","mids","coin","price","symbol","trade","bids","asks","level","fill","interval","unsubscription","callback","HYPERLIQUID_ENDPOINTS","HyperliquidPerpetualsClient","config","endpoint","body","url","controller","timeoutId","response","HyperliquidApiError","meta","asset","markets","symbols","assetCtxs","allMarkets","index","ctx","currentPrice","prevPrice","change24h","symbolSet","m","limit","intervalMs","endTime","startTime","candle","maxLevel","_params","params","positions","assetPos","pos","quantity","entryPrice","unrealizedPnl","positionValue","filteredPositions","p","sum","orders","order","origSz","remainingSz","filledSz","filteredOrders","o","trades","isLong","t","userAddress","subscriptionType","statusCode","responseBody","PerpetualsContext","createContext","PerpetualsProvider","client","children","jsx","usePerpetualsClient","context","useContext","coinsQueryKey","fetchCoins","useCoinsQuery","options","useQuery","marketQueryKey","fetchMarket","useMarketQuery","marketsQueryKey","fetchMarkets","useMarketsQuery","klinesQueryKey","fetchKlines","useKlinesQuery","orderBookQueryKey","fetchOrderBook","useOrderBookQuery","recentTradesQueryKey","fetchRecentTrades","useRecentTradesQuery","positionsQueryKey","fetchPositions","usePositionsQuery","enabled","queryParams","ordersQueryKey","fetchOrders","useOrdersQuery","tradesQueryKey","fetchTrades","useTradesQuery","createOrder","useCreateOrderMutation","useMutation","cancelOrder","useCancelOrderMutation","useMarketDataSubscription","setData","useState","isConnected","setIsConnected","setError","handleData","useCallback","newData","useEffect","isSubscribed","err","useCandlesSubscription","useUserDataSubscription","CoinInfoNotFoundUI","CoinInfoSkeletonsUI","jsxs","Skeleton","useCoinInfo","marketData","setMarketData","fundingCountdown","setFundingCountdown","initialData","isPending","realtimeData","normalized","normalizeRealtimeTickerPayload","previous","buildMarketData","calculateCountdown","now","eightHours","remainder","timeUntilNext","payload","matched","item","toNumberOr","value","fallback","base","patch","formatCountdown","seconds","hours","minutes","secs","formatNumber","num","decimals","formatPrice","CoinInfoUI","indexPrice","volume24h","openInterest","fundingRate","safeChange24h","safeFundingRate","isPositiveChange","changePercent","cn","CoinInfoWidget","isLoading","useSearchCoinsScript","onSelectCoin","searchQuery","setSearchQuery","coins","setCoins","coinSymbols","isLoadingSymbols","marketsData","isLoadingMarkets","filteredCoins","useMemo","query","SearchCoinsUI","onSearchChange","Input","e","SearchIcon","StyledTable","TableHeader","TableColumn","TableBody","fundingPercent","isPositiveFunding","TableRow","TableCell","SearchCoinsWidget","className","handleSelectCoin","aggregateByPrecision","levels","precision","aggregated","roundedPrice","existing","calculateTotalsAndPercentages","total","withTotals","maxTotal","useOrderBookScript","initialPrecision","orderBook","setOrderBook","setPrecision","aggregatedBids","aggregatedAsks","sortedBids","a","b","sortedAsks","bestBid","spread","spreadPercentage","formatQuantity","qty","OrderBookUI","onPriceClick","reversedAsks","ask","bid","OrderBookSkeleton","_","i","OrderBookEmpty","OrderBookWidget","useTradesScript","setTrades","realtimeTrade","isValidTrade","prevTrades","normalizedTrades","normalizeRealtimeTrades","deduped","nextTrade","formatTime","timestamp","date","TradesUI","onTradeClick","isBuy","TradesSkeleton","TradesEmpty","TradesWidget","usePlaceOrderFormScript","onSuccess","onError","side","setSide","orderType","setOrderType","form","useForm","isSubmitting","watchedValues","amount","leverage","estimatedFee","estimatedTotal","liquidationPrice","maintenanceMarginRate","availableMargin","accountValue","currentPosition","handleSubmit","finalPrice","takeProfitPrice","stopLossPrice","tpPercent","slPercent","FormNumberInput","name","placeholder","endContent","RHNumberInput","PlaceOrderFormUI","methods","onSideChange","onOrderTypeChange","onSubmit","tpSlOptions","Button","RHForm","Slider","option","PlaceOrderFormWidget","usePositionsScript","onCloseSuccess","onCloseError","setPositions","positionsData","realtimePosition","isClosing","prevPositions","existingIndex","newPositions","handleClosePosition","position","closeSide","formatPnl","pnl","formatPnlPercent","percent","PositionsUI","onClosePosition","pnlColor","PositionsSkeleton","PositionsEmpty","PositionsWidget","useOpenOrdersScript","onCancelSuccess","onCancelError","setOrders","ordersData","realtimeOrder","isCanceling","prevOrders","newOrders","handleCancelOrder","OpenOrdersUI","onCancelOrder","OpenOrdersSkeleton","OpenOrdersEmpty","OpenOrdersWidget","getTimeRangeInMs","range","today","useTradeHistoryScript","initialTimeRange","pageSize","timeRange","setTimeRange","currentPage","setCurrentPage","allTrades","setAllTrades","tradesData","totalPages","startIndex","endIndex","page","formatDateTime","month","day","TIME_RANGE_OPTIONS","TradeHistoryUI","onTimeRangeChange","onNextPage","onPreviousPage","onGoToPage","Fragment","pageNum","TradeHistorySkeleton","TradeHistoryEmpty","TradeHistoryWidget","goToNextPage","goToPreviousPage","goToPage"],"mappings":"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","file":"index.js","sourcesContent":["declare global {\n interface Window {\n __LIBERFI_VERSION__?: {\n [key: string]: string;\n };\n }\n}\nif (typeof window !== \"undefined\") {\n window.__LIBERFI_VERSION__ = window.__LIBERFI_VERSION__ || {};\n window.__LIBERFI_VERSION__[\"@liberfi.io/ui-perpetuals\"] = \"0.1.78\";\n}\n\nexport default \"0.1.78\";\n","import type { Kline } from \"../../types\";\n\n/**\n * WebSocket subscription callback function type\n */\ntype SubscriptionCallback = (data: any) => void;\n\n/**\n * WebSocket subscription metadata\n */\ninterface Subscription {\n type: string;\n param: string;\n callback: SubscriptionCallback;\n}\n\n/**\n * WebSocket Manager for Hyperliquid\n *\n * Handles WebSocket connection lifecycle, including:\n * - Connection management (connect/disconnect)\n * - Automatic reconnection with exponential backoff\n * - Heartbeat to keep connection alive\n * - Subscription management (subscribe/unsubscribe)\n * - Message queue for offline messages\n */\nexport class WebSocketManager {\n private ws: WebSocket | null = null;\n private wsEndpoint: string;\n private subscriptions: Map<string, Subscription> = new Map();\n private reconnectAttempts: number = 0;\n private maxReconnectAttempts: number = 10;\n private reconnectDelay: number = 1000; // Initial reconnect delay: 1 second\n private heartbeatInterval: number | null = null;\n private messageQueue: any[] = []; // Message queue before connection established\n private isConnected: boolean = false;\n private pingInterval: number = 30000; // 30 second heartbeat\n private reconnectTimeout: number | null = null;\n private isReconnecting: boolean = false;\n\n /**\n * Create a new WebSocketManager\n * @param wsEndpoint WebSocket endpoint URL\n */\n constructor(wsEndpoint: string) {\n this.wsEndpoint = wsEndpoint;\n }\n\n /**\n * Connect to WebSocket server\n * @returns Promise that resolves when connection is established\n */\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n // Close existing connection if any\n if (this.ws) {\n this.ws.close();\n }\n\n this.ws = new WebSocket(this.wsEndpoint);\n\n this.ws.onopen = () => {\n console.log(\"[WebSocket] Connected to Hyperliquid\");\n this.isConnected = true;\n this.reconnectAttempts = 0;\n this.isReconnecting = false;\n this.startHeartbeat();\n this.flushMessageQueue();\n resolve();\n };\n\n this.ws.onmessage = (event: MessageEvent) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (error: Event) => {\n console.error(\"[WebSocket] Error:\", error);\n this.isConnected = false;\n if (!this.isReconnecting) {\n reject(new Error(\"WebSocket connection failed\"));\n }\n };\n\n this.ws.onclose = (event: CloseEvent) => {\n console.log(\n `[WebSocket] Closed: ${event.code} - ${event.reason || \"No reason provided\"}`,\n );\n this.isConnected = false;\n this.stopHeartbeat();\n\n // Only attempt reconnect if not manually disconnected (code 1000 = normal closure)\n if (event.code !== 1000) {\n this.attemptReconnect();\n }\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Disconnect from WebSocket server\n */\n disconnect(): void {\n this.stopHeartbeat();\n this.subscriptions.clear();\n\n // Clear reconnect timeout\n if (this.reconnectTimeout !== null) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close(1000, \"Normal closure\");\n this.ws = null;\n }\n\n this.isConnected = false;\n this.isReconnecting = false;\n this.reconnectAttempts = 0;\n }\n\n /**\n * Attempt to reconnect with exponential backoff\n */\n private attemptReconnect(): void {\n if (this.isReconnecting) {\n return; // Already attempting to reconnect\n }\n\n if (this.reconnectAttempts >= this.maxReconnectAttempts) {\n console.error(\"[WebSocket] Max reconnection attempts reached\");\n return;\n }\n\n this.isReconnecting = true;\n this.reconnectAttempts++;\n\n // Exponential backoff: min(1000 * 2^attempts, 30000)\n const delay = Math.min(\n this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000, // Max 30 seconds\n );\n\n console.log(\n `[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`,\n );\n\n this.reconnectTimeout = window.setTimeout(() => {\n this.connect()\n .then(() => {\n // Resubscribe to all previous subscriptions\n this.resubscribeAll();\n })\n .catch((error) => {\n console.error(\"[WebSocket] Reconnection failed:\", error);\n this.isReconnecting = false;\n // attemptReconnect will be called again by onclose event\n });\n }, delay);\n }\n\n /**\n * Start heartbeat interval to keep connection alive\n */\n private startHeartbeat(): void {\n this.heartbeatInterval = window.setInterval(() => {\n if (\n this.isConnected &&\n this.ws &&\n this.ws.readyState === WebSocket.OPEN\n ) {\n // Send a ping message to keep connection alive\n // Hyperliquid WebSocket accepts JSON messages\n this.send({ method: \"ping\" });\n }\n }, this.pingInterval);\n }\n\n /**\n * Stop heartbeat interval\n */\n private stopHeartbeat(): void {\n if (this.heartbeatInterval !== null) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n }\n }\n\n /**\n * Send message to WebSocket server\n * @param message Message object to send\n */\n private send(message: any): void {\n if (this.isConnected && this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n } else {\n // Connection not established, add to queue\n this.messageQueue.push(message);\n }\n }\n\n /**\n * Flush message queue after connection established\n */\n private flushMessageQueue(): void {\n while (this.messageQueue.length > 0) {\n const message = this.messageQueue.shift();\n if (message) {\n this.send(message);\n }\n }\n }\n\n /**\n * Resubscribe to all subscriptions after reconnection\n */\n private resubscribeAll(): void {\n this.subscriptions.forEach((subscription) => {\n this.sendSubscription(subscription.type, subscription.param);\n });\n }\n\n /**\n * Handle incoming WebSocket message\n * @param data Raw message data\n */\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data);\n\n // Handle different message types\n if (message.channel) {\n this.handleChannelMessage(message);\n } else if (message.method === \"pong\") {\n // Heartbeat response\n // No action needed\n }\n } catch (error) {\n console.error(\"[WebSocket] Failed to parse message:\", error, data);\n }\n }\n\n /**\n * Handle channel-specific messages\n * @param message Parsed message object\n */\n private handleChannelMessage(message: any): void {\n const channel = message.channel;\n\n // Find matching subscriptions and trigger callbacks\n this.subscriptions.forEach((subscription, subscriptionId) => {\n if (this.isChannelMatch(channel, subscription.type, subscription.param)) {\n try {\n const transformedData = this.transformData(\n subscription.type,\n message.data,\n subscription.param,\n );\n subscription.callback(transformedData);\n } catch (error) {\n console.error(\n `[WebSocket] Error in subscription callback (${subscriptionId}):`,\n error,\n );\n }\n }\n });\n }\n\n /**\n * Check if channel matches subscription\n * @param channel Channel name from message\n * @param type Subscription type\n * @param _param Subscription parameter (reserved for future use)\n * @returns True if channel matches subscription\n */\n private isChannelMatch(\n channel: string,\n type: string,\n _param: string,\n ): boolean {\n // Match channel to subscription type\n if (type === \"ticker\") {\n return channel === \"allMids\";\n } else if (type === \"trades\") {\n return channel === \"trades\";\n } else if (type === \"orderBook\") {\n return channel === \"l2Book\";\n } else if (type === \"candle\") {\n return channel === \"candle\";\n } else if (type === \"userFills\") {\n return channel === \"userFills\";\n } else if (type === \"userEvents\") {\n return channel === \"userEvents\";\n }\n\n return false;\n }\n\n /**\n * Transform raw data to standard format\n * @param type Subscription type\n * @param data Raw data from WebSocket\n * @param param Subscription parameter (e.g., symbol, interval)\n * @returns Transformed data\n */\n private transformData(type: string, data: any, param: string): any {\n if (type === \"ticker\") {\n return this.transformTickerData(data);\n } else if (type === \"trades\") {\n return this.transformTradesData(data, param);\n } else if (type === \"orderBook\") {\n return this.transformOrderBookData(data, param);\n } else if (type === \"candle\") {\n return this.transformCandleData(data, param);\n } else if (type === \"userFills\") {\n return this.transformUserFillsData(data);\n } else if (type === \"userEvents\") {\n return this.transformUserEventsData(data);\n }\n\n return data;\n }\n\n /**\n * Transform ticker data (allMids)\n */\n private transformTickerData(data: any): any {\n const mids = data.mids || {};\n return Object.entries(mids).map(([coin, price]) => ({\n symbol: `${coin}-USDC`,\n price: parseFloat(price as string),\n timestamp: Date.now(),\n }));\n }\n\n /**\n * Transform trades data\n */\n private transformTradesData(data: any, symbol: string): any {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.map((trade: any) => ({\n symbol,\n side: trade.side === \"B\" ? \"buy\" : \"sell\",\n price: parseFloat(trade.px),\n quantity: parseFloat(trade.sz),\n timestamp: trade.time,\n tradeId: trade.tid,\n }));\n }\n\n /**\n * Transform order book data\n */\n private transformOrderBookData(data: any, symbol: string): any {\n const [bids, asks] = data.levels || [[], []];\n\n return {\n symbol,\n bids: bids.map((level: any) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n asks: asks.map((level: any) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n timestamp: data.time || Date.now(),\n };\n }\n\n /**\n * Transform candle data\n */\n private transformCandleData(data: any, param: string): Kline {\n const [symbol] = param.split(\":\");\n\n return {\n symbol,\n open: parseFloat(data.o),\n high: parseFloat(data.h),\n low: parseFloat(data.l),\n close: parseFloat(data.c),\n volume: parseFloat(data.v),\n timestamp: data.t,\n closeTimestamp: data.T,\n };\n }\n\n /**\n * Transform user fills data\n */\n private transformUserFillsData(data: any): any {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.map((fill: any) => ({\n tradeId: fill.tid?.toString(),\n orderId: fill.oid?.toString(),\n symbol: `${fill.coin}-USDC`,\n side: fill.dir?.includes(\"Long\") ? \"long\" : \"short\",\n price: parseFloat(fill.px),\n quantity: parseFloat(fill.sz),\n fee: parseFloat(fill.fee || \"0\"),\n feeCurrency: fill.feeToken || \"USDC\",\n isMaker: fill.side === \"M\",\n timestamp: fill.time,\n }));\n }\n\n /**\n * Transform user events data (orders and positions)\n */\n private transformUserEventsData(data: any): any {\n // User events can contain both order updates and position updates\n // Return the data as-is for now, let the callback handle it\n return data;\n }\n\n /**\n * Send subscription message to Hyperliquid WebSocket\n * @param type Subscription type\n * @param param Subscription parameter\n */\n private sendSubscription(type: string, param: string): void {\n let subscription: any;\n\n if (type === \"ticker\") {\n // Subscribe to all mids (ticker data)\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"allMids\",\n },\n };\n } else if (type === \"trades\") {\n // Subscribe to trades for specific coin\n const coin = param.split(\"-\")[0]; // \"BTC-USDC\" -> \"BTC\"\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"trades\",\n coin,\n },\n };\n } else if (type === \"orderBook\") {\n // Subscribe to order book for specific coin\n const coin = param.split(\"-\")[0];\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"l2Book\",\n coin,\n },\n };\n } else if (type === \"candle\") {\n // Subscribe to candles\n const [symbol, interval] = param.split(\":\");\n const coin = symbol.split(\"-\")[0];\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"candle\",\n coin,\n interval,\n },\n };\n } else if (type === \"userFills\") {\n // Subscribe to user fills\n const userAddress = param;\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"userFills\",\n user: userAddress,\n },\n };\n } else if (type === \"userEvents\") {\n // Subscribe to user events (orders + positions)\n const userAddress = param;\n subscription = {\n method: \"subscribe\",\n subscription: {\n type: \"userEvents\",\n user: userAddress,\n },\n };\n }\n\n if (subscription) {\n this.send(subscription);\n }\n }\n\n /**\n * Send unsubscription message to Hyperliquid WebSocket\n * @param type Subscription type\n * @param param Subscription parameter\n */\n private sendUnsubscription(type: string, param: string): void {\n let unsubscription: any;\n\n if (type === \"ticker\") {\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"allMids\",\n },\n };\n } else if (type === \"trades\") {\n const coin = param.split(\"-\")[0];\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"trades\",\n coin,\n },\n };\n } else if (type === \"orderBook\") {\n const coin = param.split(\"-\")[0];\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"l2Book\",\n coin,\n },\n };\n } else if (type === \"candle\") {\n const [symbol, interval] = param.split(\":\");\n const coin = symbol.split(\"-\")[0];\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"candle\",\n coin,\n interval,\n },\n };\n } else if (type === \"userFills\") {\n const userAddress = param;\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"userFills\",\n user: userAddress,\n },\n };\n } else if (type === \"userEvents\") {\n const userAddress = param;\n unsubscription = {\n method: \"unsubscribe\",\n subscription: {\n type: \"userEvents\",\n user: userAddress,\n },\n };\n }\n\n if (unsubscription) {\n this.send(unsubscription);\n }\n }\n\n /**\n * Subscribe to a data stream\n * @param type Subscription type\n * @param param Subscription parameter (symbol, user address, etc.)\n * @param callback Callback function to receive data\n * @returns Subscription ID (for unsubscribing)\n */\n subscribe(\n type: string,\n param: string,\n callback: SubscriptionCallback,\n ): string {\n const subscriptionId = `${type}:${param}`;\n\n // Store subscription\n this.subscriptions.set(subscriptionId, { type, param, callback });\n\n // Send subscription message\n this.sendSubscription(type, param);\n\n return subscriptionId;\n }\n\n /**\n * Unsubscribe from a data stream\n * @param subscriptionId Subscription ID returned from subscribe()\n */\n unsubscribe(subscriptionId: string): void {\n const subscription = this.subscriptions.get(subscriptionId);\n\n if (subscription) {\n // Send unsubscription message\n this.sendUnsubscription(subscription.type, subscription.param);\n\n // Remove subscription\n this.subscriptions.delete(subscriptionId);\n }\n }\n\n /**\n * Check if WebSocket is connected\n * @returns True if connected\n */\n isConnectedNow(): boolean {\n return this.isConnected;\n }\n}\n","import type {\n IPerpetualsClient,\n MarketData,\n Kline,\n KlineInterval,\n OrderBook,\n Trade,\n PlaceOrderParams,\n PlaceOrderResult,\n CancelOrderParams,\n CancelOrderResult,\n GetPositionsParams,\n GetPositionsResult,\n GetOpenOrdersParams,\n GetOpenOrdersResult,\n GetTradesParams,\n GetTradesResult,\n} from \"../../types\";\nimport { WebSocketManager } from \"./WebSocketManager\";\n\n/**\n * Hyperliquid 环境类型\n */\nexport type HyperliquidEnvironment = \"testnet\" | \"mainnet\";\n\n/**\n * Hyperliquid 客户端配置\n */\nexport interface HyperliquidClientConfig {\n /**\n * 环境配置\n * @default \"testnet\"\n */\n environment?: HyperliquidEnvironment;\n\n /**\n * 自定义 API 端点(可选)\n * 如果不提供,将根据 environment 自动选择\n */\n apiEndpoint?: string;\n\n /**\n * 自定义 WebSocket 端点(可选)\n * 如果不提供,将根据 environment 自动选择\n */\n wsEndpoint?: string;\n\n /**\n * 请求超时时间(毫秒)\n * @default 30000\n */\n timeout?: number;\n}\n\n/**\n * Hyperliquid API 端点配置\n */\nconst HYPERLIQUID_ENDPOINTS = {\n testnet: {\n api: \"https://api.hyperliquid-testnet.xyz\",\n ws: \"wss://api.hyperliquid-testnet.xyz/ws\",\n },\n mainnet: {\n api: \"https://api.hyperliquid.xyz\",\n ws: \"wss://api.hyperliquid.xyz/ws\",\n },\n} as const;\n\n/**\n * HyperliquidPerpetualsClient 类\n *\n * 实现 IPerpetualsClient 接口,提供 Hyperliquid 永续合约交易功能\n */\nexport class HyperliquidPerpetualsClient implements IPerpetualsClient {\n private readonly apiEndpoint: string;\n private readonly _wsEndpoint: string;\n private readonly timeout: number;\n private readonly environment: HyperliquidEnvironment;\n private wsManager: WebSocketManager | null = null;\n\n /**\n * 构造 Hyperliquid 客户端\n *\n * @param config 客户端配置,不传则使用默认配置(testnet)\n */\n constructor(config: HyperliquidClientConfig = {}) {\n // 1. 确定环境\n this.environment = config.environment || \"testnet\";\n\n // 2. 确定 API 端点\n this.apiEndpoint =\n config.apiEndpoint || HYPERLIQUID_ENDPOINTS[this.environment].api;\n\n // 3. 确定 WebSocket 端点\n this._wsEndpoint =\n config.wsEndpoint || HYPERLIQUID_ENDPOINTS[this.environment].ws;\n\n // 4. 设置超时时间\n this.timeout = config.timeout || 30000;\n }\n\n /**\n * 内部 HTTP 请求方法\n *\n * @param endpoint API 端点路径\n * @param body 请求体\n * @returns 响应数据\n * @throws {HyperliquidApiError} API 请求失败\n */\n private async request<T = any>(endpoint: string, body: any): Promise<T> {\n const url = `${this.apiEndpoint}${endpoint}`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n throw new HyperliquidApiError(\n `HTTP ${response.status}: ${response.statusText}`,\n response.status,\n await response.text(),\n );\n }\n\n const data = await response.json();\n return data;\n } catch (error: any) {\n if (error.name === \"AbortError\") {\n throw new HyperliquidApiError(\n `Request timeout after ${this.timeout}ms`,\n 408,\n \"\",\n );\n }\n\n if (error instanceof HyperliquidApiError) {\n throw error;\n }\n\n throw new HyperliquidApiError(`Network error: ${error.message}`, 0, \"\");\n }\n }\n\n /**\n * 辅助方法:将符号格式转换为 Hyperliquid 币种名称\n * @param symbol 统一格式符号(例如 \"BTC-USDC\")\n * @returns Hyperliquid 币种名称(例如 \"BTC\")\n */\n private symbolToCoin(symbol: string): string {\n return symbol.split(\"-\")[0];\n }\n\n /**\n * 辅助方法:将 KlineInterval 转换为毫秒数\n * @param interval K线时间间隔\n * @returns 毫秒数\n */\n private parseInterval(interval: KlineInterval): number {\n const intervalMap: Record<KlineInterval, number> = {\n \"1m\": 60 * 1000,\n \"5m\": 5 * 60 * 1000,\n \"15m\": 15 * 60 * 1000,\n \"30m\": 30 * 60 * 1000,\n \"1h\": 60 * 60 * 1000,\n \"4h\": 4 * 60 * 60 * 1000,\n \"1d\": 24 * 60 * 60 * 1000,\n \"1w\": 7 * 24 * 60 * 60 * 1000,\n };\n return intervalMap[interval];\n }\n\n // ===================================\n // 市场数据查询接口(6个方法)\n // ===================================\n\n /**\n * 获取所有支持的币种列表\n * @returns 币种符号数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getSupportedCoins(): Promise<string[]> {\n const [meta] = await this.request<[{ universe: Array<{ name: string }> }]>(\n \"/info\",\n { type: \"metaAndAssetCtxs\" },\n );\n\n // 转换:coin.name -> \"BTC-USDC\"\n return meta.universe.map((asset) => `${asset.name}-USDC`);\n }\n\n /**\n * 获取指定币种的市场数据\n * @param symbol 币种符号\n * @returns 市场数据,币种不存在时返回 null\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getMarket(symbol: string): Promise<MarketData | null> {\n const markets = await this.getMarkets([symbol]);\n return markets.length > 0 ? markets[0] : null;\n }\n\n /**\n * 获取多个或所有币种的市场数据\n * @param symbols 币种符号数组(可选)\n * @returns 市场数据数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getMarkets(symbols?: string[]): Promise<MarketData[]> {\n const [meta, assetCtxs] = await this.request<\n [\n { universe: Array<{ name: string }> },\n Array<{\n funding?: string;\n openInterest?: string;\n prevDayPx?: string;\n dayNtlVlm?: string;\n oraclePx?: string;\n markPx?: string;\n midPx?: string;\n }>,\n ]\n >(\"/info\", { type: \"metaAndAssetCtxs\" });\n\n // 合并 meta 和 assetCtxs 数据\n const allMarkets = meta.universe.map((asset, index) => {\n const ctx = assetCtxs[index];\n const symbol = `${asset.name}-USDC`;\n\n // 使用 midPx 作为当前价格,fallback 到 markPx\n const currentPrice = parseFloat(ctx.midPx || ctx.markPx || \"0\");\n const prevPrice = ctx.prevDayPx\n ? parseFloat(ctx.prevDayPx)\n : currentPrice;\n const change24h =\n prevPrice > 0 ? ((currentPrice - prevPrice) / prevPrice) * 100 : 0;\n\n return {\n symbol,\n price: currentPrice,\n change24h,\n volume24h: parseFloat(ctx.dayNtlVlm || \"0\"),\n fundingRate: parseFloat(ctx.funding || \"0\"),\n openInterest: parseFloat(ctx.openInterest || \"0\"),\n markPrice: parseFloat(ctx.markPx || \"0\"),\n indexPrice: parseFloat(ctx.oraclePx || ctx.midPx || \"0\"),\n } as MarketData;\n });\n\n // 如果指定了 symbols,进行过滤\n if (symbols && symbols.length > 0) {\n const symbolSet = new Set(symbols);\n return allMarkets.filter((m) => symbolSet.has(m.symbol));\n }\n\n return allMarkets;\n }\n\n /**\n * 获取K线数据\n * @param symbol 交易对符号\n * @param interval 时间间隔\n * @param limit 返回K线数量\n * @returns K线数据数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getKlines(\n symbol: string,\n interval: KlineInterval,\n limit: number = 100,\n ): Promise<Kline[]> {\n const coin = this.symbolToCoin(symbol);\n\n // 计算时间范围\n const intervalMs = this.parseInterval(interval);\n const endTime = Date.now();\n const startTime = endTime - intervalMs * limit;\n\n const data = await this.request<\n Array<{\n t: number;\n T: number;\n s: string;\n i: string;\n o: string;\n c: string;\n h: string;\n l: string;\n v: string;\n n: number;\n }>\n >(\"/info\", {\n type: \"candleSnapshot\",\n req: { coin, interval, startTime, endTime },\n });\n\n // 转换为统一格式\n return data.map((candle) => ({\n symbol,\n open: parseFloat(candle.o),\n high: parseFloat(candle.h),\n low: parseFloat(candle.l),\n close: parseFloat(candle.c),\n volume: parseFloat(candle.v),\n timestamp: candle.t,\n closeTimestamp: candle.T,\n }));\n }\n\n /**\n * 获取订单簿\n * @param symbol 交易对符号\n * @param maxLevel 最大深度档位\n * @returns 订单簿数据\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getOrderBook(\n symbol: string,\n maxLevel: number = 10,\n ): Promise<OrderBook> {\n const coin = this.symbolToCoin(symbol);\n\n const data = await this.request<{\n coin: string;\n time: number;\n levels: [\n Array<{ px: string; sz: string; n: number }>,\n Array<{ px: string; sz: string; n: number }>,\n ];\n }>(\"/info\", { type: \"l2Book\", coin });\n\n const [bids, asks] = data.levels;\n\n return {\n symbol,\n bids: bids.slice(0, maxLevel).map((level) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n asks: asks.slice(0, maxLevel).map((level) => ({\n price: parseFloat(level.px),\n quantity: parseFloat(level.sz),\n count: level.n,\n })),\n timestamp: data.time,\n };\n }\n\n /**\n * 获取最近成交记录\n * @param symbol 交易对符号\n * @param limit 最大成交记录数\n * @returns 成交记录数组\n * @throws {HyperliquidApiError} API 请求失败\n */\n async getRecentTrades(symbol: string, limit: number = 50): Promise<Trade[]> {\n const coin = this.symbolToCoin(symbol);\n\n const data = await this.request<\n Array<{\n coin: string;\n side: string;\n px: string;\n sz: string;\n time: number;\n tid: number;\n }>\n >(\"/info\", { type: \"recentTrades\", coin });\n\n return data.slice(0, limit).map((trade) => ({\n symbol,\n side: trade.side === \"B\" ? \"buy\" : \"sell\",\n price: parseFloat(trade.px),\n quantity: parseFloat(trade.sz),\n timestamp: trade.time,\n tradeId: trade.tid,\n }));\n }\n\n // ===================================\n // 交易操作接口(2个方法)\n // ===================================\n\n /**\n * 下单(买入或卖出合约)\n *\n * ⚠️ 注意:此方法需要配置钱包私钥进行 EIP-712 签名认证\n *\n * @param params 下单参数\n * @returns 下单结果\n * @throws {HyperliquidApiError} API 请求失败、余额不足、参数错误等\n * @throws {Error} 未配置认证信息\n *\n * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n */\n async placeOrder(_params: PlaceOrderParams): Promise<PlaceOrderResult> {\n throw new Error(\n \"placeOrder() requires wallet private key configuration for EIP-712 signature. \" +\n \"Please configure authentication before calling this method. \" +\n \"See: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\",\n );\n }\n\n /**\n * 取消订单\n *\n * ⚠️ 注意:此方法需要配置钱包私钥进行 EIP-712 签名认证\n *\n * @param params 取消订单参数\n * @returns 取消订单结果\n * @throws {HyperliquidApiError} API 请求失败、订单不存在等\n * @throws {Error} 未配置认证信息\n *\n * @see https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\n */\n async cancelOrder(_params: CancelOrderParams): Promise<CancelOrderResult> {\n throw new Error(\n \"cancelOrder() requires wallet private key configuration for EIP-712 signature. \" +\n \"Please configure authentication before calling this method. \" +\n \"See: https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint\",\n );\n }\n\n // ===================================\n // 账户查询接口(3个方法)\n // ===================================\n\n /**\n * 获取用户持仓信息\n *\n * ⚠️ Hyperliquid 要求:必须提供 userAddress 参数\n *\n * @param params 查询参数\n * @returns 持仓结果\n * @throws {HyperliquidApiError} API 请求失败\n * @throws {Error} 缺少必需参数\n */\n async getPositions(\n params: GetPositionsParams = {},\n ): Promise<GetPositionsResult> {\n if (!params.userAddress) {\n throw new Error(\n \"Hyperliquid requires userAddress parameter. \" +\n \"Example: { userAddress: '0x...' }\",\n );\n }\n\n const data = await this.request<{\n assetPositions: Array<{\n position: {\n coin: string;\n szi: string;\n leverage: { type: string; value: number };\n entryPx: string;\n positionValue: string;\n unrealizedPnl: string;\n returnOnEquity: string;\n liquidationPx: string | null;\n marginUsed: string;\n };\n }>;\n marginSummary: {\n accountValue: string;\n totalMarginUsed: string;\n totalNtlPos: string;\n totalRawUsd: string;\n };\n crossMarginSummary: {\n accountValue: string;\n totalMarginUsed: string;\n totalNtlPos: string;\n totalRawUsd: string;\n };\n }>(\"/info\", { type: \"clearinghouseState\", user: params.userAddress });\n\n // 转换持仓数据\n const positions = data.assetPositions\n .map((assetPos) => {\n const pos = assetPos.position;\n const symbol = `${pos.coin}-USDC`;\n const quantity = parseFloat(pos.szi);\n\n // 数量为 0 表示没有持仓\n if (quantity === 0) {\n return null;\n }\n\n const entryPrice = parseFloat(pos.entryPx);\n const unrealizedPnl = parseFloat(pos.unrealizedPnl);\n const positionValue = parseFloat(pos.positionValue);\n\n return {\n symbol,\n side: quantity > 0 ? (\"long\" as const) : (\"short\" as const),\n quantity: Math.abs(quantity),\n entryPrice,\n markPrice: entryPrice, // Hyperliquid 不直接提供,可从 assetCtxs 获取\n unrealizedPnl,\n unrealizedPnlPercent: parseFloat(pos.returnOnEquity) * 100,\n leverage: pos.leverage.value,\n liquidationPrice: pos.liquidationPx\n ? parseFloat(pos.liquidationPx)\n : undefined,\n margin: parseFloat(pos.marginUsed),\n notionalValue: Math.abs(positionValue),\n };\n })\n .filter(Boolean) as any[];\n\n // 过滤指定币种\n const filteredPositions = params.symbol\n ? positions.filter((p) => p.symbol === params.symbol)\n : positions;\n\n return {\n positions: filteredPositions,\n totalEquity: parseFloat(data.marginSummary.accountValue),\n availableBalance:\n parseFloat(data.marginSummary.accountValue) -\n parseFloat(data.marginSummary.totalMarginUsed),\n totalUnrealizedPnl: filteredPositions.reduce(\n (sum, p) => sum + p.unrealizedPnl,\n 0,\n ),\n raw: data,\n };\n }\n\n /**\n * 获取用户挂单信息\n *\n * ⚠️ Hyperliquid 要求:必须提供 userAddress 参数\n *\n * @param params 查询参数\n * @returns 挂单结果\n * @throws {HyperliquidApiError} API 请求失败\n * @throws {Error} 缺少必需参数\n */\n async getOpenOrders(\n params: GetOpenOrdersParams = {},\n ): Promise<GetOpenOrdersResult> {\n if (!params.userAddress) {\n throw new Error(\n \"Hyperliquid requires userAddress parameter. \" +\n \"Example: { userAddress: '0x...' }\",\n );\n }\n\n const data = await this.request<\n Array<{\n coin: string;\n side: boolean;\n limitPx: string;\n sz: string;\n origSz: string;\n oid: number;\n cloid?: string;\n timestamp: number;\n orderType: any;\n }>\n >(\"/info\", { type: \"openOrders\", user: params.userAddress });\n\n // 转换订单数据\n const orders = data.map((order) => {\n const symbol = `${order.coin}-USDC`;\n const origSz = parseFloat(order.origSz);\n const remainingSz = parseFloat(order.sz);\n const filledSz = origSz - remainingSz;\n\n return {\n orderId: order.oid.toString(),\n clientOrderId: order.cloid,\n symbol,\n side: order.side ? (\"long\" as const) : (\"short\" as const),\n orderType: \"limit\" as const,\n price: parseFloat(order.limitPx),\n quantity: origSz,\n filledQuantity: filledSz,\n remainingQuantity: remainingSz,\n status: (filledSz > 0 && remainingSz > 0\n ? \"partially_filled\"\n : \"pending\") as any,\n timestamp: order.timestamp,\n updateTimestamp: order.timestamp,\n };\n });\n\n // 过滤指定币种\n const filteredOrders = params.symbol\n ? orders.filter((o) => o.symbol === params.symbol)\n : orders;\n\n return {\n orders: filteredOrders,\n totalCount: filteredOrders.length,\n raw: data,\n };\n }\n\n /**\n * 获取用户交易历史\n *\n * ⚠️ Hyperliquid 要求:必须提供 userAddress 参数\n *\n * @param params 查询参数\n * @returns 交易历史结果\n * @throws {HyperliquidApiError} API 请求失败\n * @throws {Error} 缺少必需参数\n */\n async getTrades(params: GetTradesParams = {}): Promise<GetTradesResult> {\n if (!params.userAddress) {\n throw new Error(\n \"Hyperliquid requires userAddress parameter. \" +\n \"Example: { userAddress: '0x...' }\",\n );\n }\n\n const data = await this.request<\n Array<{\n coin: string;\n side: string;\n px: string;\n sz: string;\n time: number;\n dir: string;\n oid: number;\n tid: number;\n fee?: string;\n feeToken?: string;\n }>\n >(\"/info\", { type: \"userFills\", user: params.userAddress });\n\n // 转换交易数据\n let trades = data.map((fill) => {\n const symbol = `${fill.coin}-USDC`;\n const isLong = fill.dir.includes(\"Long\");\n\n return {\n tradeId: fill.tid.toString(),\n orderId: fill.oid.toString(),\n symbol,\n side: isLong ? (\"long\" as const) : (\"short\" as const),\n price: parseFloat(fill.px),\n quantity: parseFloat(fill.sz),\n fee: parseFloat(fill.fee || \"0\"),\n feeCurrency: fill.feeToken || \"USDC\",\n isMaker: fill.side === \"M\", // \"M\" = Maker, \"T\" = Taker\n timestamp: fill.time,\n };\n });\n\n // 过滤指定币种\n if (params.symbol) {\n trades = trades.filter((t) => t.symbol === params.symbol);\n }\n\n // 过滤时间范围\n if (params.startTime) {\n trades = trades.filter((t) => t.timestamp >= params.startTime!);\n }\n if (params.endTime) {\n trades = trades.filter((t) => t.timestamp <= params.endTime!);\n }\n\n // 限制返回数量\n if (params.limit) {\n trades = trades.slice(0, params.limit);\n }\n\n return {\n trades,\n totalCount: trades.length,\n raw: data,\n };\n }\n\n // ===================================\n // WebSocket 连接管理(2个方法)\n // ===================================\n\n /**\n * Connect to WebSocket server\n *\n * Establishes WebSocket connection for real-time data streaming.\n * Connection will auto-reconnect on disconnect.\n *\n * @throws {Error} Connection failed\n */\n async connectWebSocket(): Promise<void> {\n if (!this.wsManager) {\n this.wsManager = new WebSocketManager(this._wsEndpoint);\n }\n\n if (this.wsManager.isConnectedNow()) {\n console.log(\"[WebSocket] Already connected\");\n return;\n }\n\n await this.wsManager.connect();\n }\n\n /**\n * Disconnect from WebSocket server\n *\n * Closes WebSocket connection and cleans up all subscriptions.\n */\n disconnectWebSocket(): void {\n if (this.wsManager) {\n this.wsManager.disconnect();\n this.wsManager = null;\n }\n }\n\n // ===================================\n // WebSocket 订阅(4个方法)\n // ===================================\n\n /**\n * Subscribe to market data (price, trades, order book)\n *\n * @param type Subscription type: 'ticker' | 'trades' | 'orderBook'\n * @param symbol Trading pair symbol (e.g., \"BTC-USDC\")\n * @param callback Data callback function\n * @returns Subscription ID (for unsubscribing)\n */\n subscribeMarketData(\n type: \"ticker\" | \"trades\" | \"orderBook\",\n symbol: string,\n callback: (data: any) => void,\n ): string {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n\n return this.wsManager.subscribe(type, symbol, callback);\n }\n\n /**\n * Subscribe to kline (candlestick) data\n *\n * @param symbol Trading pair symbol (e.g., \"BTC-USDC\")\n * @param interval Time interval (e.g., \"1m\", \"1h\", \"1d\")\n * @param callback Data callback function\n * @returns Subscription ID (for unsubscribing)\n */\n subscribeCandles(\n symbol: string,\n interval: KlineInterval,\n callback: (candle: Kline) => void,\n ): string {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n\n // Combine symbol and interval as parameter\n const param = `${symbol}:${interval}`;\n return this.wsManager.subscribe(\"candle\", param, callback);\n }\n\n /**\n * Subscribe to user data (orders, positions, fills)\n *\n * @param type Subscription type: 'orders' | 'positions' | 'fills'\n * @param userAddress User wallet address\n * @param callback Data callback function\n * @returns Subscription ID (for unsubscribing)\n */\n subscribeUserData(\n type: \"orders\" | \"positions\" | \"fills\",\n userAddress: string,\n callback: (data: any) => void,\n ): string {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n\n // Use userEvents for orders and positions, userFills for fills\n const subscriptionType = type === \"fills\" ? \"userFills\" : \"userEvents\";\n\n return this.wsManager.subscribe(subscriptionType, userAddress, callback);\n }\n\n /**\n * Unsubscribe from a data stream\n *\n * @param subscriptionId Subscription ID returned from subscribe methods\n */\n unsubscribe(subscriptionId: string): void {\n if (this.wsManager) {\n this.wsManager.unsubscribe(subscriptionId);\n }\n }\n}\n\n/**\n * Hyperliquid API 错误类\n */\nexport class HyperliquidApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly responseBody: string,\n ) {\n super(message);\n this.name = \"HyperliquidApiError\";\n }\n}\n","import { createContext } from \"react\";\nimport type { IPerpetualsClient } from \"../types\";\n\n/**\n * Perpetuals context value type\n *\n * Provides access to the perpetuals trading client instance\n */\nexport interface PerpetualsContextValue {\n /**\n * Perpetuals client instance for trading operations\n */\n client: IPerpetualsClient;\n}\n\n/**\n * Perpetuals Context\n *\n * React context for accessing perpetuals trading functionality throughout the app\n */\nexport const PerpetualsContext = createContext<PerpetualsContextValue>(\n {} as PerpetualsContextValue,\n);\n","import { PropsWithChildren } from \"react\";\nimport {\n PerpetualsContext,\n PerpetualsContextValue,\n} from \"../context/PerpetualsContext\";\n\n/**\n * Perpetuals provider props type\n */\nexport type PerpetualsProviderProps = PropsWithChildren<PerpetualsContextValue>;\n\n/**\n * Perpetuals Provider Component\n *\n * Provides perpetuals trading client to all child components via React Context\n *\n * @param props Provider props containing client and children\n * @returns Provider component wrapping children\n */\nexport function PerpetualsProvider({\n client,\n children,\n}: PerpetualsProviderProps) {\n return (\n <PerpetualsContext.Provider value={{ client }}>\n {children}\n </PerpetualsContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport {\n PerpetualsContext,\n PerpetualsContextValue,\n} from \"../context/PerpetualsContext\";\n\n/**\n * Hook to access perpetuals client from context\n *\n * Must be used within a PerpetualsProvider component\n *\n * @returns Perpetuals context value containing the client instance\n * @throws Error if used outside of PerpetualsProvider\n */\nexport function usePerpetualsClient(): PerpetualsContextValue {\n const context = useContext(PerpetualsContext);\n\n if (!context || !context.client) {\n throw new Error(\n \"usePerpetualsClient must be used within a PerpetualsProvider\",\n );\n }\n\n return context;\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport function coinsQueryKey(): string[] {\n return [\"perps\", \"coins\"];\n}\n\nexport async function fetchCoins(client: IPerpetualsClient): Promise<string[]> {\n return await client.getSupportedCoins();\n}\n\nexport function useCoinsQuery(\n options: Omit<\n UseQueryOptions<string[], Error, string[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: coinsQueryKey(),\n queryFn: async () => fetchCoins(client),\n staleTime: 5 * 60 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, MarketData } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseMarketQueryParams {\n symbol: string;\n}\n\nexport function marketQueryKey(params: UseMarketQueryParams): string[] {\n return [\"perps\", \"market\", params.symbol];\n}\n\nexport async function fetchMarket(\n client: IPerpetualsClient,\n { symbol }: UseMarketQueryParams,\n): Promise<MarketData | null> {\n return await client.getMarket(symbol);\n}\n\nexport function useMarketQuery(\n params: UseMarketQueryParams,\n options: Omit<\n UseQueryOptions<MarketData | null, Error, MarketData | null, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: marketQueryKey(params),\n queryFn: async () => fetchMarket(client, params),\n staleTime: 10 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, MarketData } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseMarketsQueryParams {\n symbols?: string[];\n}\n\nexport function marketsQueryKey(params: UseMarketsQueryParams = {}): string[] {\n return [\"perps\", \"markets\", JSON.stringify((params.symbols ?? []).sort())];\n}\n\nexport async function fetchMarkets(\n client: IPerpetualsClient,\n { symbols }: UseMarketsQueryParams = {},\n): Promise<MarketData[]> {\n return await client.getMarkets(symbols);\n}\n\nexport function useMarketsQuery(\n params: UseMarketsQueryParams = {},\n options: Omit<\n UseQueryOptions<MarketData[], Error, MarketData[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: marketsQueryKey(params),\n queryFn: async () => fetchMarkets(client, params),\n staleTime: 10 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, Kline, KlineInterval } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseKlinesQueryParams {\n symbol: string;\n interval: KlineInterval;\n limit?: number;\n}\n\nexport function klinesQueryKey(params: UseKlinesQueryParams): string[] {\n return [\n \"perps\",\n \"klines\",\n params.symbol,\n params.interval,\n String(params.limit ?? 100),\n ];\n}\n\nexport async function fetchKlines(\n client: IPerpetualsClient,\n { symbol, interval, limit }: UseKlinesQueryParams,\n): Promise<Kline[]> {\n return await client.getKlines(symbol, interval, limit);\n}\n\nexport function useKlinesQuery(\n params: UseKlinesQueryParams,\n options: Omit<\n UseQueryOptions<Kline[], Error, Kline[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: klinesQueryKey(params),\n queryFn: async () => fetchKlines(client, params),\n staleTime: 30 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, OrderBook } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseOrderBookQueryParams {\n symbol: string;\n maxLevel?: number;\n}\n\nexport function orderBookQueryKey(params: UseOrderBookQueryParams): string[] {\n return [\"perps\", \"orderBook\", params.symbol, String(params.maxLevel ?? 20)];\n}\n\nexport async function fetchOrderBook(\n client: IPerpetualsClient,\n { symbol, maxLevel }: UseOrderBookQueryParams,\n): Promise<OrderBook> {\n return await client.getOrderBook(symbol, maxLevel);\n}\n\nexport function useOrderBookQuery(\n params: UseOrderBookQueryParams,\n options: Omit<\n UseQueryOptions<OrderBook, Error, OrderBook, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: orderBookQueryKey(params),\n queryFn: async () => fetchOrderBook(client, params),\n staleTime: 5 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type { IPerpetualsClient, Trade } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseRecentTradesQueryParams {\n symbol: string;\n limit?: number;\n}\n\nexport function recentTradesQueryKey(\n params: UseRecentTradesQueryParams,\n): string[] {\n return [\"perps\", \"recentTrades\", params.symbol, String(params.limit ?? 50)];\n}\n\nexport async function fetchRecentTrades(\n client: IPerpetualsClient,\n { symbol, limit }: UseRecentTradesQueryParams,\n): Promise<Trade[]> {\n return await client.getRecentTrades(symbol, limit);\n}\n\nexport function useRecentTradesQuery(\n params: UseRecentTradesQueryParams,\n options: Omit<\n UseQueryOptions<Trade[], Error, Trade[], string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useQuery({\n queryKey: recentTradesQueryKey(params),\n queryFn: async () => fetchRecentTrades(client, params),\n staleTime: 5 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n GetPositionsResult,\n GetPositionsParams,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UsePositionsQueryParams extends GetPositionsParams {\n enabled?: boolean;\n}\n\nexport function positionsQueryKey(\n params: Omit<UsePositionsQueryParams, \"enabled\">,\n): string[] {\n return [\"perps\", \"positions\", params.userAddress ?? \"\", params.symbol ?? \"\"];\n}\n\nexport async function fetchPositions(\n client: IPerpetualsClient,\n params: GetPositionsParams,\n): Promise<GetPositionsResult> {\n return await client.getPositions(params);\n}\n\nexport function usePositionsQuery(\n params: UsePositionsQueryParams,\n options: Omit<\n UseQueryOptions<GetPositionsResult, Error, GetPositionsResult, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n const { enabled = true, ...queryParams } = params;\n\n return useQuery({\n queryKey: positionsQueryKey(queryParams),\n queryFn: async () => fetchPositions(client, queryParams),\n enabled: enabled && !!queryParams.userAddress,\n staleTime: 10 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n GetOpenOrdersResult,\n GetOpenOrdersParams,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseOrdersQueryParams extends GetOpenOrdersParams {\n enabled?: boolean;\n}\n\nexport function ordersQueryKey(\n params: Omit<UseOrdersQueryParams, \"enabled\">,\n): string[] {\n return [\"perps\", \"orders\", params.userAddress ?? \"\", params.symbol ?? \"\"];\n}\n\nexport async function fetchOrders(\n client: IPerpetualsClient,\n params: GetOpenOrdersParams,\n): Promise<GetOpenOrdersResult> {\n return await client.getOpenOrders(params);\n}\n\nexport function useOrdersQuery(\n params: UseOrdersQueryParams,\n options: Omit<\n UseQueryOptions<GetOpenOrdersResult, Error, GetOpenOrdersResult, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n const { enabled = true, ...queryParams } = params;\n\n return useQuery({\n queryKey: ordersQueryKey(queryParams),\n queryFn: async () => fetchOrders(client, queryParams),\n enabled: enabled && !!queryParams.userAddress,\n staleTime: 5 * 1000,\n ...options,\n });\n}\n","import { useQuery, UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n GetTradesResult,\n GetTradesParams,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseTradesQueryParams extends GetTradesParams {\n enabled?: boolean;\n}\n\nexport function tradesQueryKey(\n params: Omit<UseTradesQueryParams, \"enabled\">,\n): string[] {\n return [\n \"perps\",\n \"trades\",\n params.userAddress ?? \"\",\n params.symbol ?? \"\",\n String(params.limit ?? 50),\n String(params.startTime ?? \"\"),\n String(params.endTime ?? \"\"),\n ];\n}\n\nexport async function fetchTrades(\n client: IPerpetualsClient,\n params: GetTradesParams,\n): Promise<GetTradesResult> {\n return await client.getTrades(params);\n}\n\nexport function useTradesQuery(\n params: UseTradesQueryParams,\n options: Omit<\n UseQueryOptions<GetTradesResult, Error, GetTradesResult, string[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n const { enabled = true, ...queryParams } = params;\n\n return useQuery({\n queryKey: tradesQueryKey(queryParams),\n queryFn: async () => fetchTrades(client, queryParams),\n enabled: enabled && !!queryParams.userAddress,\n staleTime: 30 * 1000,\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n PlaceOrderParams,\n PlaceOrderResult,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type UseCreateOrderMutationParams = PlaceOrderParams;\n\nexport async function createOrder(\n client: IPerpetualsClient,\n params: UseCreateOrderMutationParams,\n): Promise<PlaceOrderResult> {\n return await client.placeOrder(params);\n}\n\nexport function useCreateOrderMutation(\n options: Omit<\n UseMutationOptions<PlaceOrderResult, Error, UseCreateOrderMutationParams>,\n \"mutationFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useMutation({\n mutationFn: async (params: UseCreateOrderMutationParams) =>\n createOrder(client, params),\n ...options,\n });\n}\n","import { useMutation, UseMutationOptions } from \"@tanstack/react-query\";\nimport type {\n IPerpetualsClient,\n CancelOrderParams,\n CancelOrderResult,\n} from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type UseCancelOrderMutationParams = CancelOrderParams;\n\nexport async function cancelOrder(\n client: IPerpetualsClient,\n params: UseCancelOrderMutationParams,\n): Promise<CancelOrderResult> {\n return await client.cancelOrder(params);\n}\n\nexport function useCancelOrderMutation(\n options: Omit<\n UseMutationOptions<CancelOrderResult, Error, UseCancelOrderMutationParams>,\n \"mutationFn\"\n > = {},\n) {\n const { client } = usePerpetualsClient();\n return useMutation({\n mutationFn: async (params: UseCancelOrderMutationParams) =>\n cancelOrder(client, params),\n ...options,\n });\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { MarketData, Trade, OrderBook } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type MarketDataType = \"ticker\" | \"trades\" | \"orderBook\";\n\nexport interface UseMarketDataSubscriptionParams {\n type: MarketDataType;\n symbol: string;\n enabled?: boolean;\n}\n\nexport interface UseMarketDataSubscriptionResult<T> {\n data: T | null;\n isConnected: boolean;\n error: Error | null;\n}\n\nexport function useMarketDataSubscription<\n T = MarketDataType extends \"ticker\"\n ? MarketData\n : MarketDataType extends \"trades\"\n ? Trade\n : OrderBook,\n>(params: UseMarketDataSubscriptionParams): UseMarketDataSubscriptionResult<T> {\n const { type, symbol, enabled = true } = params;\n const { client } = usePerpetualsClient();\n const [data, setData] = useState<T | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const handleData = useCallback((newData: T) => {\n setData(newData);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n let subscriptionId: string | null = null;\n let isSubscribed = true;\n\n const connect = async () => {\n try {\n await client.connectWebSocket();\n\n if (!isSubscribed) return;\n\n setIsConnected(true);\n setError(null);\n\n subscriptionId = client.subscribeMarketData(type, symbol, handleData);\n } catch (err) {\n if (isSubscribed) {\n setError(err instanceof Error ? err : new Error(\"Connection failed\"));\n setIsConnected(false);\n }\n }\n };\n\n connect();\n\n return () => {\n isSubscribed = false;\n if (subscriptionId) {\n try {\n client.unsubscribe(subscriptionId);\n } catch (err) {\n console.error(\"Failed to unsubscribe:\", err);\n }\n }\n client.disconnectWebSocket();\n setIsConnected(false);\n setData(null);\n };\n }, [client, type, symbol, enabled, handleData]);\n\n return { data, isConnected, error };\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { Kline, KlineInterval } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport interface UseCandlesSubscriptionParams {\n symbol: string;\n interval: KlineInterval;\n enabled?: boolean;\n}\n\nexport interface UseCandlesSubscriptionResult {\n data: Kline | null;\n isConnected: boolean;\n error: Error | null;\n}\n\nexport function useCandlesSubscription(\n params: UseCandlesSubscriptionParams,\n): UseCandlesSubscriptionResult {\n const { symbol, interval, enabled = true } = params;\n const { client } = usePerpetualsClient();\n const [data, setData] = useState<Kline | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const handleData = useCallback((newData: Kline) => {\n setData(newData);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n return;\n }\n\n let subscriptionId: string | null = null;\n let isSubscribed = true;\n\n const connect = async () => {\n try {\n await client.connectWebSocket();\n\n if (!isSubscribed) return;\n\n setIsConnected(true);\n setError(null);\n\n subscriptionId = client.subscribeCandles(symbol, interval, handleData);\n } catch (err) {\n if (isSubscribed) {\n setError(err instanceof Error ? err : new Error(\"Connection failed\"));\n setIsConnected(false);\n }\n }\n };\n\n connect();\n\n return () => {\n isSubscribed = false;\n if (subscriptionId) {\n try {\n client.unsubscribe(subscriptionId);\n } catch (err) {\n console.error(\"Failed to unsubscribe:\", err);\n }\n }\n client.disconnectWebSocket();\n setIsConnected(false);\n setData(null);\n };\n }, [client, symbol, interval, enabled, handleData]);\n\n return { data, isConnected, error };\n}\n","import { useEffect, useState, useCallback } from \"react\";\nimport type { Order, Position, TradeHistory } from \"../types\";\nimport { usePerpetualsClient } from \"./usePerpetualsClient\";\n\nexport type UserDataType = \"orders\" | \"positions\" | \"fills\";\n\nexport interface UseUserDataSubscriptionParams {\n type: UserDataType;\n userAddress: string;\n enabled?: boolean;\n}\n\nexport interface UseUserDataSubscriptionResult<T> {\n data: T | null;\n isConnected: boolean;\n error: Error | null;\n}\n\nexport function useUserDataSubscription<\n T = UserDataType extends \"orders\"\n ? Order\n : UserDataType extends \"positions\"\n ? Position\n : TradeHistory,\n>(params: UseUserDataSubscriptionParams): UseUserDataSubscriptionResult<T> {\n const { type, userAddress, enabled = true } = params;\n const { client } = usePerpetualsClient();\n const [data, setData] = useState<T | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const handleData = useCallback((newData: T) => {\n setData(newData);\n }, []);\n\n useEffect(() => {\n if (!enabled || !userAddress) {\n return;\n }\n\n let subscriptionId: string | null = null;\n let isSubscribed = true;\n\n const connect = async () => {\n try {\n await client.connectWebSocket();\n\n if (!isSubscribed) return;\n\n setIsConnected(true);\n setError(null);\n\n subscriptionId = client.subscribeUserData(\n type,\n userAddress,\n handleData,\n );\n } catch (err) {\n if (isSubscribed) {\n setError(err instanceof Error ? err : new Error(\"Connection failed\"));\n setIsConnected(false);\n }\n }\n };\n\n connect();\n\n return () => {\n isSubscribed = false;\n if (subscriptionId) {\n try {\n client.unsubscribe(subscriptionId);\n } catch (err) {\n console.error(\"Failed to unsubscribe:\", err);\n }\n }\n client.disconnectWebSocket();\n setIsConnected(false);\n setData(null);\n };\n }, [client, type, userAddress, enabled, handleData]);\n\n return { data, isConnected, error };\n}\n","export function CoinInfoNotFoundUI() {\n return (\n <div className=\"flex items-center justify-center px-4 py-3 bg-neutral-900 border-b border-neutral-800\">\n <span className=\"text-neutral-400 text-sm\">\n Market data not available\n </span>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\n\nexport function CoinInfoSkeletonsUI() {\n return (\n <div className=\"flex items-center gap-6 px-4 py-3 bg-neutral-900 border-b border-neutral-800\">\n <div className=\"flex items-center gap-3\">\n <Skeleton className=\"h-6 w-20 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-8 w-28 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n </div>\n\n <div className=\"h-8 w-px bg-neutral-800\" />\n\n <div className=\"flex items-center gap-6 text-sm\">\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-20 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-20 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-24 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n\n <div className=\"flex flex-col gap-1\">\n <Skeleton className=\"h-3 w-32 rounded\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-20 rounded\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMarketDataSubscription } from \"../../hooks/useMarketDataSubscription\";\nimport { useMarketQuery } from \"../../hooks/useMarketQuery\";\nimport type { MarketData } from \"../../types\";\n\nexport type UseCoinInfoReturnType = {\n marketData?: MarketData;\n isLoading: boolean;\n fundingCountdown: number;\n};\n\nexport function useCoinInfo(symbol: string): UseCoinInfoReturnType {\n const [marketData, setMarketData] = useState<MarketData | undefined>();\n const [fundingCountdown, setFundingCountdown] = useState<number>(0);\n\n const { data: initialData, isPending } = useMarketQuery({ symbol });\n\n const { data: realtimeData, isConnected } =\n useMarketDataSubscription<MarketData>({\n type: \"ticker\",\n symbol,\n enabled: !!initialData,\n });\n\n useEffect(() => {\n if (!initialData) return;\n setMarketData(initialData);\n }, [initialData]);\n\n useEffect(() => {\n if (!realtimeData) return;\n\n const normalized = normalizeRealtimeTickerPayload(realtimeData, symbol);\n if (!normalized) return;\n\n setMarketData((previous) =>\n buildMarketData(previous ?? initialData ?? undefined, normalized, symbol),\n );\n }, [realtimeData, initialData, symbol]);\n\n useEffect(() => {\n const calculateCountdown = () => {\n const now = Date.now();\n const eightHours = 8 * 60 * 60 * 1000;\n const remainder = now % eightHours;\n const timeUntilNext = eightHours - remainder;\n return Math.floor(timeUntilNext / 1000);\n };\n\n setFundingCountdown(calculateCountdown());\n\n const interval = setInterval(() => {\n setFundingCountdown(calculateCountdown());\n }, 1000);\n\n return () => clearInterval(interval);\n }, []);\n\n return {\n marketData,\n isLoading: isPending,\n fundingCountdown,\n };\n}\n\nfunction normalizeRealtimeTickerPayload(\n payload: unknown,\n symbol: string,\n): Partial<MarketData> | null {\n if (Array.isArray(payload)) {\n const matched = payload.find((item) => {\n if (!item || typeof item !== \"object\") return false;\n return (item as { symbol?: string }).symbol === symbol;\n });\n return matched && typeof matched === \"object\"\n ? (matched as Partial<MarketData>)\n : null;\n }\n\n if (payload && typeof payload === \"object\") {\n return payload as Partial<MarketData>;\n }\n\n return null;\n}\n\nfunction toNumberOr(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return fallback;\n}\n\nfunction buildMarketData(\n base: MarketData | undefined,\n patch: Partial<MarketData>,\n symbol: string,\n): MarketData {\n return {\n symbol: patch.symbol ?? base?.symbol ?? symbol,\n price: toNumberOr(patch.price, base?.price ?? 0),\n change24h: toNumberOr(patch.change24h, base?.change24h ?? 0),\n volume24h: toNumberOr(patch.volume24h, base?.volume24h ?? 0),\n fundingRate: toNumberOr(patch.fundingRate, base?.fundingRate ?? 0),\n openInterest: toNumberOr(patch.openInterest, base?.openInterest ?? 0),\n markPrice: toNumberOr(patch.markPrice, base?.markPrice ?? 0),\n indexPrice:\n typeof patch.indexPrice === \"number\" && Number.isFinite(patch.indexPrice)\n ? patch.indexPrice\n : base?.indexPrice,\n high24h:\n typeof patch.high24h === \"number\" && Number.isFinite(patch.high24h)\n ? patch.high24h\n : base?.high24h,\n low24h:\n typeof patch.low24h === \"number\" && Number.isFinite(patch.low24h)\n ? patch.low24h\n : base?.low24h,\n };\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { MarketData } from \"../../types\";\n\nexport type CoinInfoUIProps = {\n marketData: MarketData;\n fundingCountdown: number;\n};\n\nfunction formatCountdown(seconds: number): string {\n const hours = Math.floor(seconds / 3600);\n const minutes = Math.floor((seconds % 3600) / 60);\n const secs = seconds % 60;\n return `${String(hours).padStart(2, \"0\")}:${String(minutes).padStart(2, \"0\")}:${String(secs).padStart(2, \"0\")}`;\n}\n\nfunction formatNumber(num: number | undefined, decimals: number = 2): string {\n if (typeof num !== \"number\" || !Number.isFinite(num)) {\n return \"-\";\n }\n if (num >= 1e9) {\n return `$${(num / 1e9).toFixed(decimals)}B`;\n }\n if (num >= 1e6) {\n return `$${(num / 1e6).toFixed(decimals)}M`;\n }\n if (num >= 1e3) {\n return `$${(num / 1e3).toFixed(decimals)}K`;\n }\n return `$${num.toFixed(decimals)}`;\n}\n\nfunction formatPrice(price: number | undefined): string {\n if (typeof price !== \"number\" || !Number.isFinite(price)) {\n return \"-\";\n }\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nexport function CoinInfoUI({ marketData, fundingCountdown }: CoinInfoUIProps) {\n const {\n symbol,\n price,\n change24h,\n indexPrice,\n volume24h,\n openInterest,\n fundingRate,\n } = marketData;\n\n const safeChange24h =\n typeof change24h === \"number\" && Number.isFinite(change24h) ? change24h : 0;\n const safeFundingRate =\n typeof fundingRate === \"number\" && Number.isFinite(fundingRate)\n ? fundingRate\n : 0;\n const isPositiveChange = safeChange24h >= 0;\n const changePercent = (safeChange24h * 100).toFixed(2);\n\n return (\n <div className=\"flex items-center gap-6 px-4 py-3 bg-neutral-900 border-b border-neutral-800\">\n <div className=\"flex items-center gap-3\">\n <h2 className=\"text-lg font-semibold text-white\">{symbol}</h2>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-2xl font-bold text-white\">\n {formatPrice(price)}\n </span>\n <span\n className={cn(\n \"text-sm font-medium\",\n isPositiveChange ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n </div>\n </div>\n\n <div className=\"h-8 w-px bg-neutral-800\" />\n\n <div className=\"flex items-center gap-6 text-sm\">\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">Oracle Price</span>\n <span className=\"text-white font-medium\">\n {indexPrice ? formatPrice(indexPrice) : \"-\"}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">24h Volume</span>\n <span className=\"text-white font-medium\">\n {formatNumber(volume24h)}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">Open Interest</span>\n <span className=\"text-white font-medium\">\n {formatNumber(openInterest)}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span className=\"text-neutral-400 text-xs\">Funding / Countdown</span>\n <div className=\"flex items-center gap-2\">\n <span\n className={cn(\n \"font-medium\",\n safeFundingRate >= 0 ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {(safeFundingRate * 100).toFixed(4)}%\n </span>\n <span className=\"text-neutral-400\">\n {formatCountdown(fundingCountdown)}\n </span>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import { CoinInfoNotFoundUI } from \"./coin-info-notfound.ui\";\nimport { CoinInfoSkeletonsUI } from \"./coin-info-skeletons.ui\";\nimport { useCoinInfo } from \"./coin-info.script\";\nimport { CoinInfoUI } from \"./coin-info.ui\";\n\nexport type CoinInfoWidgetProps = {\n symbol: string;\n};\n\nexport function CoinInfoWidget({ symbol }: CoinInfoWidgetProps) {\n const { marketData, isLoading, fundingCountdown } = useCoinInfo(symbol);\n\n if (isLoading) {\n return <CoinInfoSkeletonsUI />;\n }\n\n if (!marketData) {\n return <CoinInfoNotFoundUI />;\n }\n\n return (\n <CoinInfoUI marketData={marketData} fundingCountdown={fundingCountdown} />\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useCoinsQuery } from \"../../hooks/useCoinsQuery\";\nimport { useMarketsQuery } from \"../../hooks/useMarketsQuery\";\nimport type { MarketData } from \"../../types\";\n\nexport type UseSearchCoinsScriptParams = {\n onSelectCoin?: (symbol: string) => void;\n};\n\nexport type UseSearchCoinsScriptResult = {\n coins: MarketData[];\n isLoading: boolean;\n searchQuery: string;\n setSearchQuery: (query: string) => void;\n filteredCoins: MarketData[];\n handleSelectCoin: (symbol: string) => void;\n};\n\nexport function useSearchCoinsScript({\n onSelectCoin,\n}: UseSearchCoinsScriptParams = {}): UseSearchCoinsScriptResult {\n const [searchQuery, setSearchQuery] = useState<string>(\"\");\n const [coins, setCoins] = useState<MarketData[]>([]);\n\n const { data: coinSymbols, isPending: isLoadingSymbols } = useCoinsQuery();\n\n const { data: marketsData, isPending: isLoadingMarkets } = useMarketsQuery(\n { symbols: coinSymbols },\n { enabled: !!coinSymbols && coinSymbols.length > 0 },\n );\n\n useEffect(() => {\n if (marketsData) {\n setCoins(marketsData);\n }\n }, [marketsData]);\n\n const filteredCoins = useMemo(() => {\n if (!searchQuery.trim()) {\n return coins;\n }\n\n const query = searchQuery.toLowerCase().trim();\n return coins.filter((coin) => coin.symbol.toLowerCase().includes(query));\n }, [coins, searchQuery]);\n\n const handleSelectCoin = (symbol: string) => {\n onSelectCoin?.(symbol);\n };\n\n return {\n coins,\n isLoading: isLoadingSymbols || isLoadingMarkets,\n searchQuery,\n setSearchQuery,\n filteredCoins,\n handleSelectCoin,\n };\n}\n","import {\n cn,\n Input,\n SearchIcon,\n StyledTable,\n TableBody,\n TableCell,\n TableColumn,\n TableHeader,\n TableRow,\n} from \"@liberfi.io/ui\";\nimport type { MarketData } from \"../../types\";\n\nexport type SearchCoinsUIProps = {\n coins: MarketData[];\n searchQuery: string;\n onSearchChange: (query: string) => void;\n onSelectCoin: (symbol: string) => void;\n isLoading?: boolean;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n if (num >= 1e9) {\n return `$${(num / 1e9).toFixed(decimals)}B`;\n }\n if (num >= 1e6) {\n return `$${(num / 1e6).toFixed(decimals)}M`;\n }\n if (num >= 1e3) {\n return `$${(num / 1e3).toFixed(decimals)}K`;\n }\n return `$${num.toFixed(decimals)}`;\n}\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nexport function SearchCoinsUI({\n coins,\n searchQuery,\n onSearchChange,\n onSelectCoin,\n isLoading,\n}: SearchCoinsUIProps) {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950\">\n <div className=\"p-3 border-b border-neutral-800\">\n <Input\n type=\"text\"\n placeholder=\"Search coins...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n startContent={<SearchIcon className=\"w-4 h-4 text-neutral-400\" />}\n classNames={{\n input: \"text-sm\",\n inputWrapper: \"bg-neutral-900 border-neutral-800\",\n }}\n />\n </div>\n\n <div className=\"flex-1 overflow-hidden\">\n <StyledTable\n isVirtualized\n radius=\"none\"\n className=\"h-full\"\n classNames={{\n wrapper: \"bg-neutral-950\",\n th: \"bg-neutral-900 text-neutral-400 text-xs font-medium\",\n td: \"text-sm\",\n }}\n maxTableHeight={600}\n rowHeight={48}\n aria-label=\"Search Coins\"\n >\n <TableHeader>\n <TableColumn key=\"token\" width={140}>\n Token\n </TableColumn>\n <TableColumn key=\"lastPrice\" width={100} align=\"end\">\n Last Price\n </TableColumn>\n <TableColumn key=\"change24h\" width={100} align=\"end\">\n 24h Change\n </TableColumn>\n <TableColumn key=\"fundingRate\" width={100} align=\"end\">\n 8h Funding\n </TableColumn>\n <TableColumn key=\"volume24h\" width={100} align=\"end\">\n 24h Volume\n </TableColumn>\n <TableColumn key=\"openInterest\" width={100} align=\"end\">\n Open Interest\n </TableColumn>\n </TableHeader>\n\n <TableBody\n items={coins}\n isLoading={isLoading}\n emptyContent={\n <div className=\"flex flex-col items-center justify-center py-10\">\n <span className=\"text-neutral-400 text-sm\">\n {searchQuery ? \"No coins found\" : \"No coins available\"}\n </span>\n </div>\n }\n >\n {(coin) => {\n const isPositiveChange = coin.change24h >= 0;\n const changePercent = (coin.change24h * 100).toFixed(2);\n const fundingPercent = (coin.fundingRate * 100).toFixed(4);\n const isPositiveFunding = coin.fundingRate >= 0;\n\n return (\n <TableRow\n key={coin.symbol}\n onClick={() => onSelectCoin(coin.symbol)}\n className=\"cursor-pointer hover:bg-neutral-900/50 transition-colors\"\n >\n <TableCell>\n <div className=\"flex items-center gap-2\">\n <div className=\"w-6 h-6 rounded-full bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center\">\n <span className=\"text-xs font-semibold text-white\">\n {coin.symbol.charAt(0)}\n </span>\n </div>\n <span className=\"font-medium text-white\">\n {coin.symbol}\n </span>\n </div>\n </TableCell>\n\n <TableCell>\n <span className=\"text-white font-medium\">\n {formatPrice(coin.price)}\n </span>\n </TableCell>\n\n <TableCell>\n <span\n className={cn(\n \"font-medium\",\n isPositiveChange ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n </TableCell>\n\n <TableCell>\n <span\n className={cn(\n \"font-medium\",\n isPositiveFunding ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {fundingPercent}%\n </span>\n </TableCell>\n\n <TableCell>\n <span className=\"text-neutral-300\">\n {formatNumber(coin.volume24h)}\n </span>\n </TableCell>\n\n <TableCell>\n <span className=\"text-neutral-300\">\n {formatNumber(coin.openInterest)}\n </span>\n </TableCell>\n </TableRow>\n );\n }}\n </TableBody>\n </StyledTable>\n </div>\n </div>\n );\n}\n","import { useSearchCoinsScript } from \"./search-coins.script\";\nimport { SearchCoinsUI } from \"./search-coins.ui\";\n\nexport type SearchCoinsWidgetProps = {\n onSelectCoin?: (symbol: string) => void;\n className?: string;\n};\n\nexport function SearchCoinsWidget({\n onSelectCoin,\n className,\n}: SearchCoinsWidgetProps) {\n const {\n filteredCoins,\n isLoading,\n searchQuery,\n setSearchQuery,\n handleSelectCoin,\n } = useSearchCoinsScript({ onSelectCoin });\n\n return (\n <div className={className}>\n <SearchCoinsUI\n coins={filteredCoins}\n searchQuery={searchQuery}\n onSearchChange={setSearchQuery}\n onSelectCoin={handleSelectCoin}\n isLoading={isLoading}\n />\n </div>\n );\n}\n","import { useEffect, useMemo, useState } from \"react\";\nimport { useMarketDataSubscription } from \"../../hooks/useMarketDataSubscription\";\nimport { useOrderBookQuery } from \"../../hooks/useOrderBookQuery\";\nimport type { OrderBook, OrderBookLevel } from \"../../types\";\n\nexport type PriceLevel = OrderBookLevel & {\n total: number;\n percentage: number;\n};\n\nexport type UseOrderBookScriptParams = {\n symbol: string;\n maxLevel?: number;\n precision?: number;\n};\n\nexport type UseOrderBookScriptResult = {\n bids: PriceLevel[];\n asks: PriceLevel[];\n spread: number;\n spreadPercentage: number;\n isLoading: boolean;\n precision: number;\n setPrecision: (precision: number) => void;\n};\n\nfunction aggregateByPrecision(\n levels: OrderBookLevel[],\n precision: number,\n): OrderBookLevel[] {\n if (precision <= 0) return levels;\n\n const aggregated = new Map<number, OrderBookLevel>();\n\n levels.forEach((level) => {\n const roundedPrice = Math.floor(level.price / precision) * precision;\n\n const existing = aggregated.get(roundedPrice);\n if (existing) {\n existing.quantity += level.quantity;\n if (level.count) {\n existing.count = (existing.count || 0) + level.count;\n }\n } else {\n aggregated.set(roundedPrice, {\n price: roundedPrice,\n quantity: level.quantity,\n count: level.count,\n });\n }\n });\n\n return Array.from(aggregated.values());\n}\n\nfunction calculateTotalsAndPercentages(levels: OrderBookLevel[]): PriceLevel[] {\n let total = 0;\n const withTotals = levels.map((level) => {\n total += level.quantity;\n return {\n ...level,\n total,\n percentage: 0,\n };\n });\n\n const maxTotal = total;\n return withTotals.map((level) => ({\n ...level,\n percentage: maxTotal > 0 ? (level.total / maxTotal) * 100 : 0,\n }));\n}\n\nexport function useOrderBookScript({\n symbol,\n maxLevel = 20,\n precision: initialPrecision = 0.01,\n}: UseOrderBookScriptParams): UseOrderBookScriptResult {\n const [orderBook, setOrderBook] = useState<OrderBook | null>(null);\n const [precision, setPrecision] = useState<number>(initialPrecision);\n\n const { data: initialData, isPending } = useOrderBookQuery({\n symbol,\n maxLevel,\n });\n\n const { data: realtimeData } = useMarketDataSubscription<OrderBook>({\n type: \"orderBook\",\n symbol,\n enabled: !!initialData,\n });\n\n useEffect(() => {\n if (realtimeData) {\n setOrderBook(realtimeData);\n } else if (initialData) {\n setOrderBook(initialData);\n }\n }, [realtimeData, initialData]);\n\n const processedData = useMemo(() => {\n if (!orderBook) {\n return {\n bids: [],\n asks: [],\n spread: 0,\n spreadPercentage: 0,\n };\n }\n\n const aggregatedBids = aggregateByPrecision(orderBook.bids, precision);\n const aggregatedAsks = aggregateByPrecision(orderBook.asks, precision);\n\n const sortedBids = aggregatedBids\n .sort((a, b) => b.price - a.price)\n .slice(0, maxLevel);\n\n const sortedAsks = aggregatedAsks\n .sort((a, b) => a.price - b.price)\n .slice(0, maxLevel);\n\n const bids = calculateTotalsAndPercentages(sortedBids);\n const asks = calculateTotalsAndPercentages(sortedAsks);\n\n const bestBid = bids[0]?.price || 0;\n const bestAsk = asks[0]?.price || 0;\n const spread = bestAsk - bestBid;\n const spreadPercentage = bestBid > 0 ? (spread / bestBid) * 100 : 0;\n\n return {\n bids,\n asks,\n spread,\n spreadPercentage,\n };\n }, [orderBook, precision, maxLevel]);\n\n return {\n ...processedData,\n isLoading: isPending,\n precision,\n setPrecision,\n };\n}\n","import type { PriceLevel } from \"./orderbook.script\";\n\nexport type OrderBookUIProps = {\n bids: PriceLevel[];\n asks: PriceLevel[];\n spread: number;\n spreadPercentage: number;\n onPriceClick?: (price: number) => void;\n};\n\nfunction formatPrice(price: number): string {\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nfunction formatQuantity(qty: number): string {\n if (qty >= 1000000) {\n return (qty / 1000000).toFixed(2) + \"M\";\n }\n if (qty >= 1000) {\n return (qty / 1000).toFixed(2) + \"K\";\n }\n return qty.toFixed(2);\n}\n\nexport function OrderBookUI({\n bids,\n asks,\n spread,\n spreadPercentage,\n onPriceClick,\n}: OrderBookUIProps) {\n const reversedAsks = [...asks].reverse();\n\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 text-xs\">\n {/* V�:�\b�r\t */}\n <div className=\"flex-1 flex flex-col-reverse overflow-hidden\">\n {reversedAsks.map((ask, index) => (\n <div\n key={`ask-${ask.price}-${index}`}\n className=\"relative h-6 flex items-center justify-between px-2 cursor-pointer hover:bg-neutral-900/50 transition-colors\"\n onClick={() => onPriceClick?.(ask.price)}\n >\n {/* ��oa */}\n <div\n className=\"absolute inset-0 bg-red-500/10\"\n style={{\n width: `${ask.percentage}%`,\n right: 0,\n left: \"auto\",\n }}\n />\n\n {/* �< */}\n <span className=\"relative z-10 text-red-500 font-medium min-w-20\">\n {formatPrice(ask.price)}\n </span>\n\n {/* p� */}\n <div className=\"relative z-10 flex gap-4 text-neutral-300\">\n <span className=\"min-w-16 text-right\">\n {formatQuantity(ask.quantity)}\n </span>\n <span className=\"min-w-16 text-right\">\n {formatQuantity(ask.total)}\n </span>\n </div>\n </div>\n ))}\n </div>\n\n {/* ��>: */}\n <div className=\"flex items-center justify-center py-2 border-y border-neutral-800 bg-neutral-900\">\n <div className=\"flex items-center gap-3 text-xs\">\n <span className=\"text-neutral-400\">Spread:</span>\n <span className=\"text-neutral-200 font-medium\">\n {formatPrice(spread)}\n </span>\n <span className=\"text-neutral-400\">\n {spreadPercentage.toFixed(3)}%\n </span>\n </div>\n </div>\n\n {/* p�:�\b�r\t */}\n <div className=\"flex-1 overflow-hidden\">\n {bids.map((bid, index) => (\n <div\n key={`bid-${bid.price}-${index}`}\n className=\"relative h-6 flex items-center justify-between px-2 cursor-pointer hover:bg-neutral-900/50 transition-colors\"\n onClick={() => onPriceClick?.(bid.price)}\n >\n {/* ��oa */}\n <div\n className=\"absolute inset-0 bg-green-500/10\"\n style={{\n width: `${bid.percentage}%`,\n right: 0,\n left: \"auto\",\n }}\n />\n\n {/* �< */}\n <span className=\"relative z-10 text-green-500 font-medium min-w-20\">\n {formatPrice(bid.price)}\n </span>\n\n {/* p� */}\n <div className=\"relative z-10 flex gap-4 text-neutral-300\">\n <span className=\"min-w-16 text-right\">\n {formatQuantity(bid.quantity)}\n </span>\n <span className=\"min-w-16 text-right\">\n {formatQuantity(bid.total)}\n </span>\n </div>\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\nimport { useOrderBookScript } from \"./orderbook.script\";\nimport { OrderBookUI } from \"./orderbook.ui\";\n\nexport type OrderBookWidgetProps = {\n symbol: string;\n maxLevel?: number;\n onPriceClick?: (price: number) => void;\n className?: string;\n};\n\nfunction OrderBookSkeleton() {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 p-2 gap-1\">\n {Array.from({ length: 15 }).map((_, i) => (\n <div key={`ask-skeleton-${i}`} className=\"flex justify-between\">\n <Skeleton className=\"h-5 w-20 rounded\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n </div>\n ))}\n <div className=\"py-2\">\n <Skeleton className=\"h-6 w-40 mx-auto rounded\" />\n </div>\n {Array.from({ length: 15 }).map((_, i) => (\n <div key={`bid-skeleton-${i}`} className=\"flex justify-between\">\n <Skeleton className=\"h-5 w-20 rounded\" />\n <div className=\"flex gap-2\">\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction OrderBookEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full bg-neutral-950\">\n <span className=\"text-neutral-400 text-sm\">\n No order book data available\n </span>\n </div>\n );\n}\n\nexport function OrderBookWidget({\n symbol,\n maxLevel = 20,\n onPriceClick,\n className,\n}: OrderBookWidgetProps) {\n const { bids, asks, spread, spreadPercentage, isLoading } =\n useOrderBookScript({\n symbol,\n maxLevel,\n });\n\n if (isLoading) {\n return <OrderBookSkeleton />;\n }\n\n if (bids.length === 0 && asks.length === 0) {\n return <OrderBookEmpty />;\n }\n\n return (\n <div className={className}>\n <OrderBookUI\n bids={bids}\n asks={asks}\n spread={spread}\n spreadPercentage={spreadPercentage}\n onPriceClick={onPriceClick}\n />\n </div>\n );\n}\n","import { useEffect, useState } from \"react\";\nimport { useMarketDataSubscription } from \"../../hooks/useMarketDataSubscription\";\nimport { useRecentTradesQuery } from \"../../hooks/useRecentTradesQuery\";\nimport type { Trade } from \"../../types\";\n\nexport type UseTradesScriptParams = {\n symbol: string;\n limit?: number;\n};\n\nexport type UseTradesScriptResult = {\n trades: Trade[];\n isLoading: boolean;\n};\n\nexport function useTradesScript({\n symbol,\n limit = 50,\n}: UseTradesScriptParams): UseTradesScriptResult {\n const [trades, setTrades] = useState<Trade[]>([]);\n\n const { data: initialData, isPending } = useRecentTradesQuery({\n symbol,\n limit,\n });\n\n const { data: realtimeTrade } = useMarketDataSubscription<Trade | Trade[]>({\n type: \"trades\",\n symbol,\n enabled: !!initialData,\n });\n\n useEffect(() => {\n if (initialData) {\n setTrades(initialData.filter(isValidTrade));\n }\n }, [initialData]);\n\n useEffect(() => {\n if (realtimeTrade) {\n setTrades((prevTrades) => {\n const normalizedTrades = normalizeRealtimeTrades(realtimeTrade);\n if (normalizedTrades.length === 0) return prevTrades;\n\n const deduped = normalizedTrades.filter((nextTrade) => {\n return !prevTrades.some(\n (existing) =>\n existing.timestamp === nextTrade.timestamp &&\n existing.price === nextTrade.price &&\n existing.quantity === nextTrade.quantity,\n );\n });\n\n if (deduped.length === 0) return prevTrades;\n\n const newTrades = [...deduped, ...prevTrades];\n return newTrades.slice(0, limit);\n });\n }\n }, [realtimeTrade, limit]);\n\n return {\n trades,\n isLoading: isPending,\n };\n}\n\nfunction normalizeRealtimeTrades(payload: Trade | Trade[]): Trade[] {\n const list = Array.isArray(payload) ? payload : [payload];\n return list.filter(isValidTrade);\n}\n\nfunction isValidTrade(trade: Partial<Trade> | undefined): trade is Trade {\n if (!trade) return false;\n return (\n typeof trade.symbol === \"string\" &&\n (trade.side === \"buy\" || trade.side === \"sell\") &&\n typeof trade.price === \"number\" &&\n Number.isFinite(trade.price) &&\n typeof trade.quantity === \"number\" &&\n Number.isFinite(trade.quantity) &&\n typeof trade.timestamp === \"number\" &&\n Number.isFinite(trade.timestamp)\n );\n}\n","import { cn } from \"@liberfi.io/ui\";\nimport type { Trade } from \"../../types\";\n\nexport type TradesUIProps = {\n trades: Trade[];\n onTradeClick?: (trade: Trade) => void;\n};\n\nfunction formatPrice(price: number | undefined): string {\n if (typeof price !== \"number\" || !Number.isFinite(price)) {\n return \"-\";\n }\n if (price >= 1000) {\n return price.toFixed(2);\n }\n if (price >= 1) {\n return price.toFixed(4);\n }\n return price.toFixed(6);\n}\n\nfunction formatQuantity(qty: number | undefined): string {\n if (typeof qty !== \"number\" || !Number.isFinite(qty)) {\n return \"-\";\n }\n if (qty >= 1000000) {\n return (qty / 1000000).toFixed(2) + \"M\";\n }\n if (qty >= 1000) {\n return (qty / 1000).toFixed(2) + \"K\";\n }\n return qty.toFixed(2);\n}\n\nfunction formatTime(timestamp: number | undefined): string {\n if (typeof timestamp !== \"number\" || !Number.isFinite(timestamp)) {\n return \"-\";\n }\n const date = new Date(timestamp);\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\nexport function TradesUI({ trades, onTradeClick }: TradesUIProps) {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 overflow-auto\">\n {/* h4 */}\n <div className=\"sticky top-0 z-10 bg-neutral-900 border-b border-neutral-800 px-2 py-2\">\n <div className=\"flex justify-between text-xs text-neutral-400\">\n <span className=\"min-w-20\">Price</span>\n <span className=\"min-w-16 text-right\">Amount</span>\n <span className=\"min-w-16 text-right\">Total</span>\n <span className=\"min-w-16 text-right\">Time</span>\n </div>\n </div>\n\n {/* \u0010�\u0017h */}\n <div className=\"flex-1\">\n {trades.map((trade, index) => {\n const isBuy = trade.side === \"buy\";\n const total =\n typeof trade.price === \"number\" &&\n Number.isFinite(trade.price) &&\n typeof trade.quantity === \"number\" &&\n Number.isFinite(trade.quantity)\n ? trade.price * trade.quantity\n : undefined;\n\n return (\n <div\n key={`${trade.timestamp}-${trade.price}-${index}`}\n className=\"flex justify-between items-center px-2 py-1 hover:bg-neutral-900/50 cursor-pointer transition-colors text-xs\"\n onClick={() => onTradeClick?.(trade)}\n >\n <span\n className={cn(\n \"min-w-20 font-medium\",\n isBuy ? \"text-green-500\" : \"text-red-500\",\n )}\n >\n {formatPrice(trade.price)}\n </span>\n <span className=\"min-w-16 text-right text-neutral-300\">\n {formatQuantity(trade.quantity)}\n </span>\n <span className=\"min-w-16 text-right text-neutral-300\">\n {formatQuantity(total)}\n </span>\n <span className=\"min-w-16 text-right text-neutral-400\">\n {formatTime(trade.timestamp)}\n </span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import { Skeleton } from \"@liberfi.io/ui\";\nimport type { Trade } from \"../../types\";\nimport { useTradesScript } from \"./trades.script\";\nimport { TradesUI } from \"./trades.ui\";\n\nexport type TradesWidgetProps = {\n symbol: string;\n limit?: number;\n onTradeClick?: (trade: Trade) => void;\n className?: string;\n};\n\nfunction TradesSkeleton() {\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 p-2 gap-1\">\n <div className=\"flex justify-between mb-2\">\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-4 w-16 rounded\" />\n <Skeleton className=\"h-4 w-16 rounded\" />\n </div>\n {Array.from({ length: 20 }).map((_, i) => (\n <div key={`trade-skeleton-${i}`} className=\"flex justify-between\">\n <Skeleton className=\"h-5 w-20 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n <Skeleton className=\"h-5 w-16 rounded\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction TradesEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full bg-neutral-950\">\n <span className=\"text-neutral-400 text-sm\">No recent trades</span>\n </div>\n );\n}\n\nexport function TradesWidget({\n symbol,\n limit = 50,\n onTradeClick,\n className,\n}: TradesWidgetProps) {\n const { trades, isLoading } = useTradesScript({ symbol, limit });\n\n if (isLoading) {\n return <TradesSkeleton />;\n }\n\n if (trades.length === 0) {\n return <TradesEmpty />;\n }\n\n return (\n <div className={className}>\n <TradesUI trades={trades} onTradeClick={onTradeClick} />\n </div>\n );\n}\n","import { useState, useMemo, useCallback } from \"react\";\nimport { useForm } from \"react-hook-form\";\nimport { useCreateOrderMutation } from \"../../hooks/useCreateOrderMutation\";\nimport { useMarketQuery } from \"../../hooks/useMarketQuery\";\nimport type { OrderSide, OrderType } from \"../../types\";\n\nexport type PlaceOrderFormData = {\n price?: number;\n amount: number;\n leverage: number;\n takeProfitPercent?: number;\n stopLossPercent?: number;\n};\n\nexport type UsePlaceOrderFormScriptParams = {\n symbol: string;\n userAddress?: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n};\n\nexport type UsePlaceOrderFormScriptResult = {\n form: ReturnType<typeof useForm<PlaceOrderFormData>>;\n side: OrderSide;\n orderType: OrderType;\n setSide: (side: OrderSide) => void;\n setOrderType: (type: OrderType) => void;\n handleSubmit: (data: PlaceOrderFormData) => Promise<void>;\n isSubmitting: boolean;\n currentPrice?: number;\n estimatedFee: number;\n estimatedTotal: number;\n liquidationPrice?: number;\n availableMargin: number;\n accountValue: number;\n currentPosition?: number;\n};\n\nexport function usePlaceOrderFormScript({\n symbol,\n userAddress,\n onSuccess,\n onError,\n}: UsePlaceOrderFormScriptParams): UsePlaceOrderFormScriptResult {\n const [side, setSide] = useState<OrderSide>(\"long\");\n const [orderType, setOrderType] = useState<OrderType>(\"market\");\n\n const form = useForm<PlaceOrderFormData>({\n defaultValues: {\n amount: 0,\n leverage: 1,\n takeProfitPercent: 0,\n stopLossPercent: 0,\n },\n });\n\n const { data: marketData } = useMarketQuery({ symbol });\n\n const { mutateAsync: createOrder, isPending: isSubmitting } =\n useCreateOrderMutation({\n onSuccess: () => {\n form.reset();\n onSuccess?.();\n },\n onError: (error) => {\n onError?.(error);\n },\n });\n\n const watchedValues = form.watch();\n const { amount, leverage, price } = watchedValues;\n\n const currentPrice = useMemo(() => {\n if (orderType === \"limit\" && price) {\n return price;\n }\n return marketData?.price || 0;\n }, [orderType, price, marketData?.price]);\n\n const estimatedFee = useMemo(() => {\n if (!amount || !currentPrice) return 0;\n const feeRate = 0.0005;\n return amount * currentPrice * feeRate;\n }, [amount, currentPrice]);\n\n const estimatedTotal = useMemo(() => {\n if (!amount || !currentPrice) return 0;\n return amount * currentPrice + estimatedFee;\n }, [amount, currentPrice, estimatedFee]);\n\n const liquidationPrice = useMemo(() => {\n if (!amount || !currentPrice || !leverage || leverage === 1)\n return undefined;\n\n const maintenanceMarginRate = 0.005;\n const entryPrice = currentPrice;\n\n if (side === \"long\") {\n return entryPrice * (1 - (1 / leverage - maintenanceMarginRate));\n } else {\n return entryPrice * (1 + (1 / leverage - maintenanceMarginRate));\n }\n }, [amount, currentPrice, leverage, side]);\n\n const availableMargin = 10000;\n const accountValue = 10000;\n const currentPosition = 0;\n\n const handleSubmit = useCallback(\n async (data: PlaceOrderFormData) => {\n if (!userAddress) {\n throw new Error(\"User address is required\");\n }\n\n const finalPrice = orderType === \"limit\" ? data.price : undefined;\n\n let takeProfitPrice: number | undefined;\n let stopLossPrice: number | undefined;\n\n if (\n data.takeProfitPercent &&\n data.takeProfitPercent > 0 &&\n currentPrice\n ) {\n const tpPercent = data.takeProfitPercent / 100;\n takeProfitPrice =\n side === \"long\"\n ? currentPrice * (1 + tpPercent)\n : currentPrice * (1 - tpPercent);\n }\n\n if (data.stopLossPercent && data.stopLossPercent > 0 && currentPrice) {\n const slPercent = data.stopLossPercent / 100;\n stopLossPrice =\n side === \"long\"\n ? currentPrice * (1 - slPercent)\n : currentPrice * (1 + slPercent);\n }\n\n await createOrder({\n symbol,\n side,\n orderType,\n amount: data.amount,\n price: finalPrice,\n leverage: data.leverage,\n takeProfitPrice,\n stopLossPrice,\n userAddress,\n });\n },\n [symbol, side, orderType, currentPrice, userAddress, createOrder],\n );\n\n return {\n form,\n side,\n orderType,\n setSide,\n setOrderType,\n handleSubmit,\n isSubmitting,\n currentPrice,\n estimatedFee,\n estimatedTotal,\n liquidationPrice,\n availableMargin,\n accountValue,\n currentPosition,\n };\n}\n","import type { UseFormReturn } from \"react-hook-form\";\nimport { Button, cn, RHForm, RHNumberInput, Slider } from \"@liberfi.io/ui\";\nimport type { OrderSide, OrderType } from \"../../types\";\nimport type { PlaceOrderFormData } from \"./place-order-form.script\";\n\nexport type PlaceOrderFormUIProps = {\n methods: UseFormReturn<PlaceOrderFormData>;\n side: OrderSide;\n orderType: OrderType;\n onSideChange: (side: OrderSide) => void;\n onOrderTypeChange: (type: OrderType) => void;\n onSubmit: (data: PlaceOrderFormData) => Promise<void>;\n isSubmitting: boolean;\n symbol: string;\n currentPrice?: number;\n estimatedFee: number;\n estimatedTotal: number;\n liquidationPrice?: number;\n availableMargin: number;\n accountValue: number;\n currentPosition?: number;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\ntype FormNumberInputProps = {\n name: \"price\" | \"amount\";\n placeholder: string;\n endContent?: React.ReactNode;\n};\n\nfunction FormNumberInput({\n name,\n placeholder,\n endContent,\n}: FormNumberInputProps) {\n return (\n <RHNumberInput\n name={name}\n placeholder={placeholder}\n className=\"w-full\"\n endContent={endContent}\n />\n );\n}\n\nexport function PlaceOrderFormUI({\n methods,\n side,\n orderType,\n onSideChange,\n onOrderTypeChange,\n onSubmit,\n isSubmitting,\n symbol,\n currentPrice,\n estimatedFee,\n liquidationPrice,\n availableMargin,\n accountValue,\n currentPosition,\n}: PlaceOrderFormUIProps) {\n const leverage = methods.watch(\"leverage\") || 1;\n const tpPercent = methods.watch(\"takeProfitPercent\") || 0;\n const slPercent = methods.watch(\"stopLossPercent\") || 0;\n\n const tpSlOptions = [\n { label: \"0%\", value: 0 },\n { label: \"25%\", value: 25 },\n { label: \"50%\", value: 50 },\n { label: \"75%\", value: 75 },\n { label: \"100%\", value: 100 },\n ];\n\n return (\n <div className=\"flex flex-col h-full bg-neutral-950 p-4 gap-4\">\n {/* Long/Short 切换 */}\n <div className=\"flex gap-2\">\n <Button\n className={cn(\n \"flex-1 h-10\",\n side === \"long\"\n ? \"bg-green-600 hover:bg-green-700 text-white\"\n : \"bg-neutral-800 hover:bg-neutral-700 text-neutral-400\",\n )}\n onClick={() => onSideChange(\"long\")}\n >\n Long\n </Button>\n <Button\n className={cn(\n \"flex-1 h-10\",\n side === \"short\"\n ? \"bg-red-600 hover:bg-red-700 text-white\"\n : \"bg-neutral-800 hover:bg-neutral-700 text-neutral-400\",\n )}\n onClick={() => onSideChange(\"short\")}\n >\n Short\n </Button>\n </div>\n\n {/* Market/Limit 选择 */}\n <div className=\"flex gap-2 text-sm\">\n <button\n type=\"button\"\n className={cn(\n \"px-4 py-2 rounded transition-colors\",\n orderType === \"market\"\n ? \"bg-neutral-800 text-white\"\n : \"text-neutral-400 hover:text-white\",\n )}\n onClick={() => onOrderTypeChange(\"market\")}\n >\n Market\n </button>\n <button\n type=\"button\"\n className={cn(\n \"px-4 py-2 rounded transition-colors\",\n orderType === \"limit\"\n ? \"bg-neutral-800 text-white\"\n : \"text-neutral-400 hover:text-white\",\n )}\n onClick={() => onOrderTypeChange(\"limit\")}\n >\n Limit\n </button>\n </div>\n\n <RHForm methods={methods} onSubmit={onSubmit}>\n <div className=\"flex flex-col gap-4\">\n {/* Limit 订单价格 */}\n {orderType === \"limit\" && (\n <div>\n <label className=\"text-xs text-neutral-400 mb-1 block\">\n Price\n </label>\n <FormNumberInput\n name=\"price\"\n placeholder=\"0.0\"\n endContent={\n <span className=\"text-neutral-400 text-xs\">USDC</span>\n }\n />\n </div>\n )}\n\n {/* 数量输入 */}\n <div>\n <label className=\"text-xs text-neutral-400 mb-1 block\">\n Buy Amount\n </label>\n <FormNumberInput\n name=\"amount\"\n placeholder=\"0.0\"\n endContent={\n <span className=\"text-neutral-400 text-xs\">\n {symbol.split(\"-\")[0]}\n </span>\n }\n />\n {currentPrice && (\n <div className=\"text-xs text-neutral-500 mt-1\">\n ≈ {formatNumber((methods.watch(\"amount\") || 0) * currentPrice)}{\" \"}\n USDC\n </div>\n )}\n </div>\n\n {/* 杠杆滑块 */}\n <div>\n <div className=\"flex justify-between items-center mb-2\">\n <label className=\"text-xs text-neutral-400\">Leverage</label>\n <span className=\"text-sm text-white font-medium\">\n {leverage}x\n </span>\n </div>\n <Slider\n value={[leverage]}\n onChange={(value: number | number[]) =>\n methods.setValue(\n \"leverage\",\n Array.isArray(value) ? value[0] : value,\n )\n }\n minValue={1}\n maxValue={10}\n step={1}\n className=\"w-full\"\n />\n <div className=\"flex justify-between text-xs text-neutral-500 mt-1\">\n <span>1x</span>\n <span>10x</span>\n </div>\n </div>\n\n {/* TP/SL 百分比 */}\n <div>\n <label className=\"text-xs text-neutral-400 mb-2 block\">TP/SL</label>\n <div className=\"flex gap-2 mb-2\">\n {tpSlOptions.map((option) => (\n <button\n key={`tp-${option.value}`}\n type=\"button\"\n className={cn(\n \"flex-1 py-1.5 text-xs rounded transition-colors\",\n tpPercent === option.value\n ? \"bg-green-600 text-white\"\n : \"bg-neutral-800 text-neutral-400 hover:bg-neutral-700\",\n )}\n onClick={() =>\n methods.setValue(\"takeProfitPercent\", option.value)\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n <div className=\"flex gap-2\">\n {tpSlOptions.map((option) => (\n <button\n key={`sl-${option.value}`}\n type=\"button\"\n className={cn(\n \"flex-1 py-1.5 text-xs rounded transition-colors\",\n slPercent === option.value\n ? \"bg-red-600 text-white\"\n : \"bg-neutral-800 text-neutral-400 hover:bg-neutral-700\",\n )}\n onClick={() =>\n methods.setValue(\"stopLossPercent\", option.value)\n }\n >\n {option.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* 提交按钮 */}\n <Button\n type=\"submit\"\n isLoading={isSubmitting}\n className={cn(\n \"w-full h-12 font-semibold text-white\",\n side === \"long\"\n ? \"bg-green-600 hover:bg-green-700\"\n : \"bg-red-600 hover:bg-red-700\",\n )}\n >\n {side === \"long\" ? \"Buy / Long\" : \"Sell / Short\"}\n </Button>\n\n {/* 添加资金按钮 */}\n <Button\n type=\"button\"\n className=\"w-full h-10 bg-green-600 hover:bg-green-700 text-white font-medium\"\n >\n Add More Funds\n </Button>\n\n {/* 账户信息 */}\n <div className=\"flex flex-col gap-2 text-xs border-t border-neutral-800 pt-4\">\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Available Margin</span>\n <span className=\"text-white\">\n {formatNumber(availableMargin)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Perps Account Value</span>\n <span className=\"text-white\">\n {formatNumber(accountValue)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Current Position</span>\n <span className=\"text-white\">\n {currentPosition ? formatNumber(currentPosition) : \"0.00\"}\n </span>\n </div>\n {liquidationPrice && (\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Est. Liquidation Price</span>\n <span className=\"text-red-400\">\n {formatNumber(liquidationPrice, 4)}\n </span>\n </div>\n )}\n <div className=\"flex justify-between\">\n <span className=\"text-neutral-400\">Est. Fee</span>\n <span className=\"text-white\">\n {formatNumber(estimatedFee, 4)} USDC\n </span>\n </div>\n </div>\n </div>\n </RHForm>\n </div>\n );\n}\n","import { usePlaceOrderFormScript } from \"./place-order-form.script\";\nimport { PlaceOrderFormUI } from \"./place-order-form.ui\";\n\nexport type PlaceOrderFormWidgetProps = {\n symbol: string;\n userAddress?: string;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n};\n\nexport function PlaceOrderFormWidget({\n symbol,\n userAddress,\n onSuccess,\n onError,\n className,\n}: PlaceOrderFormWidgetProps) {\n const {\n form,\n side,\n orderType,\n setSide,\n setOrderType,\n handleSubmit,\n isSubmitting,\n currentPrice,\n estimatedFee,\n estimatedTotal,\n liquidationPrice,\n availableMargin,\n accountValue,\n currentPosition,\n } = usePlaceOrderFormScript({\n symbol,\n userAddress,\n onSuccess,\n onError,\n });\n\n return (\n <div className={className}>\n <PlaceOrderFormUI\n methods={form}\n side={side}\n orderType={orderType}\n onSideChange={setSide}\n onOrderTypeChange={setOrderType}\n onSubmit={handleSubmit}\n isSubmitting={isSubmitting}\n symbol={symbol}\n currentPrice={currentPrice}\n estimatedFee={estimatedFee}\n estimatedTotal={estimatedTotal}\n liquidationPrice={liquidationPrice}\n availableMargin={availableMargin}\n accountValue={accountValue}\n currentPosition={currentPosition}\n />\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useCreateOrderMutation } from \"../../hooks/useCreateOrderMutation\";\nimport { usePositionsQuery } from \"../../hooks/usePositionsQuery\";\nimport { useUserDataSubscription } from \"../../hooks/useUserDataSubscription\";\nimport type { Position } from \"../../types\";\n\nexport type UsePositionsScriptParams = {\n userAddress?: string;\n symbol?: string;\n onCloseSuccess?: () => void;\n onCloseError?: (error: Error) => void;\n};\n\nexport type UsePositionsScriptResult = {\n positions: Position[];\n isLoading: boolean;\n error: Error | null;\n handleClosePosition: (position: Position) => Promise<void>;\n isClosing: boolean;\n};\n\nexport function usePositionsScript({\n userAddress,\n symbol,\n onCloseSuccess,\n onCloseError,\n}: UsePositionsScriptParams): UsePositionsScriptResult {\n const [positions, setPositions] = useState<Position[]>([]);\n\n // Fetch initial positions data\n const {\n data: positionsData,\n isLoading,\n error,\n } = usePositionsQuery({ userAddress, symbol }, { enabled: !!userAddress });\n\n // Subscribe to realtime position updates\n const { data: realtimePosition } = useUserDataSubscription<Position>({\n type: \"positions\",\n userAddress: userAddress || \"\",\n enabled: !!userAddress,\n });\n\n // Mutation for closing position (by placing opposite order)\n const { mutateAsync: createOrder, isPending: isClosing } =\n useCreateOrderMutation({\n onSuccess: () => {\n onCloseSuccess?.();\n },\n onError: (error) => {\n onCloseError?.(error);\n },\n });\n\n // Initialize positions data\n useEffect(() => {\n if (positionsData?.positions) {\n setPositions(positionsData.positions);\n }\n }, [positionsData]);\n\n // Handle realtime position updates\n useEffect(() => {\n if (realtimePosition) {\n setPositions((prevPositions) => {\n const existingIndex = prevPositions.findIndex(\n (p) => p.symbol === realtimePosition.symbol,\n );\n\n // If position quantity is 0, remove the position\n if (realtimePosition.quantity === 0) {\n if (existingIndex !== -1) {\n return prevPositions.filter((_, i) => i !== existingIndex);\n }\n return prevPositions;\n }\n\n // Update existing position\n if (existingIndex !== -1) {\n const newPositions = [...prevPositions];\n newPositions[existingIndex] = realtimePosition;\n return newPositions;\n }\n\n // Add new position\n return [...prevPositions, realtimePosition];\n });\n }\n }, [realtimePosition]);\n\n // Close position by placing opposite market order\n const handleClosePosition = useCallback(\n async (position: Position) => {\n if (!userAddress) {\n throw new Error(\"User address is required\");\n }\n\n // Close = place opposite side market order\n const closeSide = position.side === \"long\" ? \"short\" : \"long\";\n\n await createOrder({\n symbol: position.symbol,\n side: closeSide,\n orderType: \"market\",\n amount: Math.abs(position.quantity),\n leverage: position.leverage,\n userAddress,\n });\n },\n [userAddress, createOrder],\n );\n\n return {\n positions,\n isLoading,\n error,\n handleClosePosition,\n isClosing,\n };\n}\n","import { Button, cn } from \"@liberfi.io/ui\";\nimport type { Position } from \"../../types\";\n\nexport type PositionsUIProps = {\n positions: Position[];\n onClosePosition: (position: Position) => void;\n isClosing: boolean;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction formatPrice(price: number): string {\n return formatNumber(price, 4);\n}\n\nfunction formatQuantity(quantity: number): string {\n return formatNumber(Math.abs(quantity), 4);\n}\n\nfunction formatPnl(pnl: number): string {\n const sign = pnl >= 0 ? \"+\" : \"\";\n return `${sign}${formatNumber(pnl, 2)}`;\n}\n\nfunction formatPnlPercent(percent: number): string {\n const sign = percent >= 0 ? \"+\" : \"\";\n return `${sign}${formatNumber(percent, 2)}%`;\n}\n\nexport function PositionsUI({\n positions,\n onClosePosition,\n isClosing,\n}: PositionsUIProps) {\n if (positions.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open positions\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-800\">\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Asset\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Position\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Position Value\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Entry Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Mark Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Liquidation Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Margin Used (PnL)\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n TP / SL\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Close\n </th>\n </tr>\n </thead>\n <tbody>\n {positions.map((position) => {\n const isProfitable = position.unrealizedPnl >= 0;\n const pnlColor = isProfitable ? \"text-green-500\" : \"text-red-500\";\n\n return (\n <tr\n key={position.symbol}\n className=\"border-b border-neutral-800 hover:bg-neutral-900/50\"\n >\n {/* Asset */}\n <td className=\"py-3 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"text-white font-medium\">\n {position.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n \"text-xs\",\n position.side === \"long\"\n ? \"text-green-500\"\n : \"text-red-500\",\n )}\n >\n {position.leverage}x {position.side.toUpperCase()}\n </span>\n </div>\n </td>\n\n {/* Position */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(position.quantity)}\n </td>\n\n {/* Position Value */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatNumber(position.notionalValue)}\n </td>\n\n {/* Entry Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatPrice(position.entryPrice)}\n </td>\n\n {/* Mark Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatPrice(position.markPrice)}\n </td>\n\n {/* Liquidation Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n {position.liquidationPrice\n ? `$${formatPrice(position.liquidationPrice)}`\n : \"-\"}\n </td>\n\n {/* Margin Used (PnL) */}\n <td className=\"py-3 px-4 text-right\">\n <div className=\"flex flex-col items-end\">\n <span className=\"text-white\">\n ${formatNumber(position.margin)}\n </span>\n <span className={cn(\"text-xs\", pnlColor)}>\n {formatPnl(position.unrealizedPnl)} (\n {formatPnlPercent(position.unrealizedPnlPercent)})\n </span>\n </div>\n </td>\n\n {/* TP / SL */}\n <td className=\"py-3 px-4 text-right text-neutral-400\">-</td>\n\n {/* Close */}\n <td className=\"py-3 px-4 text-right\">\n <Button\n size=\"sm\"\n onClick={() => onClosePosition(position)}\n isLoading={isClosing}\n className=\"bg-red-600 hover:bg-red-700 text-white text-xs px-3 py-1\"\n >\n Close\n </Button>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// ��O��\nexport function PositionsSkeleton() {\n return (\n <div className=\"w-full space-y-4 p-4\">\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n </div>\n );\n}\n\n// z�\u0001��\nexport function PositionsEmpty() {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open positions\n </div>\n );\n}\n","import { usePositionsScript } from \"./positions.script\";\nimport { PositionsUI, PositionsSkeleton, PositionsEmpty } from \"./positions.ui\";\n\nexport type PositionsWidgetProps = {\n userAddress?: string;\n symbol?: string;\n onCloseSuccess?: () => void;\n onCloseError?: (error: Error) => void;\n className?: string;\n};\n\nexport function PositionsWidget({\n userAddress,\n symbol,\n onCloseSuccess,\n onCloseError,\n className,\n}: PositionsWidgetProps) {\n const { positions, isLoading, handleClosePosition, isClosing } =\n usePositionsScript({\n userAddress,\n symbol,\n onCloseSuccess,\n onCloseError,\n });\n\n if (isLoading) {\n return (\n <div className={className}>\n <PositionsSkeleton />\n </div>\n );\n }\n\n if (positions.length === 0) {\n return (\n <div className={className}>\n <PositionsEmpty />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <PositionsUI\n positions={positions}\n onClosePosition={handleClosePosition}\n isClosing={isClosing}\n />\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from \"react\";\nimport { useCancelOrderMutation } from \"../../hooks/useCancelOrderMutation\";\nimport { useOrdersQuery } from \"../../hooks/useOrdersQuery\";\nimport { useUserDataSubscription } from \"../../hooks/useUserDataSubscription\";\nimport type { Order } from \"../../types\";\n\nexport type UseOpenOrdersScriptParams = {\n userAddress?: string;\n symbol?: string;\n onCancelSuccess?: () => void;\n onCancelError?: (error: Error) => void;\n};\n\nexport type UseOpenOrdersScriptResult = {\n orders: Order[];\n isLoading: boolean;\n error: Error | null;\n handleCancelOrder: (order: Order) => Promise<void>;\n isCanceling: boolean;\n};\n\nexport function useOpenOrdersScript({\n userAddress,\n symbol,\n onCancelSuccess,\n onCancelError,\n}: UseOpenOrdersScriptParams): UseOpenOrdersScriptResult {\n const [orders, setOrders] = useState<Order[]>([]);\n\n // Fetch initial orders data\n const {\n data: ordersData,\n isLoading,\n error,\n } = useOrdersQuery({ userAddress, symbol }, { enabled: !!userAddress });\n\n // Subscribe to realtime order updates\n const { data: realtimeOrder } = useUserDataSubscription<Order>({\n type: \"orders\",\n userAddress: userAddress || \"\",\n enabled: !!userAddress,\n });\n\n // Cancel order mutation\n const { mutateAsync: cancelOrder, isPending: isCanceling } =\n useCancelOrderMutation({\n onSuccess: () => {\n onCancelSuccess?.();\n },\n onError: (error) => {\n onCancelError?.(error);\n },\n });\n\n // Initialize orders data\n useEffect(() => {\n if (ordersData?.orders) {\n setOrders(ordersData.orders);\n }\n }, [ordersData]);\n\n // Handle realtime order updates\n useEffect(() => {\n if (realtimeOrder) {\n setOrders((prevOrders) => {\n const existingIndex = prevOrders.findIndex(\n (o) => o.orderId === realtimeOrder.orderId,\n );\n\n // If order is cancelled, filled or rejected, remove from list\n if (\n realtimeOrder.status === \"cancelled\" ||\n realtimeOrder.status === \"filled\" ||\n realtimeOrder.status === \"rejected\"\n ) {\n if (existingIndex !== -1) {\n return prevOrders.filter((_, i) => i !== existingIndex);\n }\n return prevOrders;\n }\n\n // Update existing order\n if (existingIndex !== -1) {\n const newOrders = [...prevOrders];\n newOrders[existingIndex] = realtimeOrder;\n return newOrders;\n }\n\n // Add new order\n return [realtimeOrder, ...prevOrders];\n });\n }\n }, [realtimeOrder]);\n\n // Handle cancel order\n const handleCancelOrder = useCallback(\n async (order: Order) => {\n if (!userAddress) {\n throw new Error(\"User address is required\");\n }\n\n await cancelOrder({\n orderId: order.orderId,\n symbol: order.symbol,\n userAddress,\n });\n },\n [userAddress, cancelOrder],\n );\n\n return {\n orders,\n isLoading,\n error,\n handleCancelOrder,\n isCanceling,\n };\n}\n","import { Button, cn } from \"@liberfi.io/ui\";\nimport type { Order } from \"../../types\";\n\nexport type OpenOrdersUIProps = {\n orders: Order[];\n onCancelOrder: (order: Order) => void;\n isCanceling: boolean;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction formatPrice(price: number): string {\n return formatNumber(price, 4);\n}\n\nfunction formatQuantity(quantity: number): string {\n return formatNumber(quantity, 4);\n}\n\nfunction formatTime(timestamp: number): string {\n const date = new Date(timestamp);\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\nexport function OpenOrdersUI({\n orders,\n onCancelOrder,\n isCanceling,\n}: OpenOrdersUIProps) {\n if (orders.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open orders\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-800\">\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Asset\n </th>\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Type\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Amount\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Filled\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Remaining\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Status\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Time\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {orders.map((order) => {\n return (\n <tr\n key={order.orderId}\n className=\"border-b border-neutral-800 hover:bg-neutral-900/50\"\n >\n {/* Asset */}\n <td className=\"py-3 px-4\">\n <div className=\"flex flex-col\">\n <span className=\"text-white font-medium\">\n {order.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n \"text-xs\",\n order.side === \"long\"\n ? \"text-green-500\"\n : \"text-red-500\",\n )}\n >\n {order.side.toUpperCase()}\n {order.leverage ? ` ${order.leverage}x` : \"\"}\n </span>\n </div>\n </td>\n\n {/* Type */}\n <td className=\"py-3 px-4 text-white capitalize\">\n {order.orderType}\n </td>\n\n {/* Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n {order.orderType === \"market\" ? (\n <span className=\"text-neutral-400\">Market</span>\n ) : (\n `$${formatPrice(order.price)}`\n )}\n </td>\n\n {/* Amount */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(order.quantity)}\n </td>\n\n {/* Filled */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(order.filledQuantity)}\n </td>\n\n {/* Remaining */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(order.remainingQuantity)}\n </td>\n\n {/* Status */}\n <td className=\"py-3 px-4 text-right\">\n <span\n className={cn(\n \"text-xs px-2 py-1 rounded\",\n order.status === \"pending\" &&\n \"bg-yellow-600/20 text-yellow-500\",\n order.status === \"partially_filled\" &&\n \"bg-blue-600/20 text-blue-500\",\n order.status === \"filled\" &&\n \"bg-green-600/20 text-green-500\",\n order.status === \"cancelled\" &&\n \"bg-neutral-600/20 text-neutral-400\",\n order.status === \"rejected\" &&\n \"bg-red-600/20 text-red-500\",\n )}\n >\n {order.status.replace(\"_\", \" \")}\n </span>\n </td>\n\n {/* Time */}\n <td className=\"py-3 px-4 text-right text-neutral-400\">\n {formatTime(order.timestamp)}\n </td>\n\n {/* Action */}\n <td className=\"py-3 px-4 text-right\">\n {order.status === \"pending\" ||\n order.status === \"partially_filled\" ? (\n <Button\n size=\"sm\"\n onClick={() => onCancelOrder(order)}\n isLoading={isCanceling}\n className=\"bg-red-600 hover:bg-red-700 text-white text-xs px-3 py-1\"\n >\n Cancel\n </Button>\n ) : (\n <span className=\"text-neutral-600 text-xs\">-</span>\n )}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n );\n}\n\n// Loading skeleton component\nexport function OpenOrdersSkeleton() {\n return (\n <div className=\"w-full space-y-4 p-4\">\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n </div>\n );\n}\n\n// Empty state component\nexport function OpenOrdersEmpty() {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No open orders\n </div>\n );\n}\n","import { useOpenOrdersScript } from \"./open-orders.script\";\nimport {\n OpenOrdersUI,\n OpenOrdersSkeleton,\n OpenOrdersEmpty,\n} from \"./open-orders.ui\";\n\nexport type OpenOrdersWidgetProps = {\n userAddress?: string;\n symbol?: string;\n onCancelSuccess?: () => void;\n onCancelError?: (error: Error) => void;\n className?: string;\n};\n\nexport function OpenOrdersWidget({\n userAddress,\n symbol,\n onCancelSuccess,\n onCancelError,\n className,\n}: OpenOrdersWidgetProps) {\n const { orders, isLoading, handleCancelOrder, isCanceling } =\n useOpenOrdersScript({\n userAddress,\n symbol,\n onCancelSuccess,\n onCancelError,\n });\n\n if (isLoading) {\n return (\n <div className={className}>\n <OpenOrdersSkeleton />\n </div>\n );\n }\n\n if (orders.length === 0) {\n return (\n <div className={className}>\n <OpenOrdersEmpty />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <OpenOrdersUI\n orders={orders}\n onCancelOrder={handleCancelOrder}\n isCanceling={isCanceling}\n />\n </div>\n );\n}\n","import { useState, useEffect } from \"react\";\nimport { useTradesQuery } from \"../../hooks/useTradesQuery\";\nimport type { TradeHistory } from \"../../types\";\n\nexport type TimeRange = \"today\" | \"7d\" | \"30d\" | \"all\";\n\nexport type UseTradeHistoryScriptParams = {\n userAddress?: string;\n symbol?: string;\n initialTimeRange?: TimeRange;\n pageSize?: number;\n};\n\nexport type UseTradeHistoryScriptResult = {\n trades: TradeHistory[];\n isLoading: boolean;\n error: Error | null;\n timeRange: TimeRange;\n setTimeRange: (range: TimeRange) => void;\n currentPage: number;\n totalPages: number;\n goToNextPage: () => void;\n goToPreviousPage: () => void;\n goToPage: (page: number) => void;\n};\n\nfunction getTimeRangeInMs(range: TimeRange): {\n startTime?: number;\n endTime?: number;\n} {\n const now = Date.now();\n const endTime = now;\n\n switch (range) {\n case \"today\":\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return { startTime: today.getTime(), endTime };\n case \"7d\":\n return { startTime: now - 7 * 24 * 60 * 60 * 1000, endTime };\n case \"30d\":\n return { startTime: now - 30 * 24 * 60 * 60 * 1000, endTime };\n case \"all\":\n default:\n return {};\n }\n}\n\nexport function useTradeHistoryScript({\n userAddress,\n symbol,\n initialTimeRange = \"7d\",\n pageSize = 50,\n}: UseTradeHistoryScriptParams): UseTradeHistoryScriptResult {\n const [timeRange, setTimeRange] = useState<TimeRange>(initialTimeRange);\n const [currentPage, setCurrentPage] = useState(1);\n const [allTrades, setAllTrades] = useState<TradeHistory[]>([]);\n\n const { startTime, endTime } = getTimeRangeInMs(timeRange);\n\n // Fetch trades with time range filter\n const {\n data: tradesData,\n isLoading,\n error,\n } = useTradesQuery(\n {\n userAddress,\n symbol,\n startTime,\n endTime,\n limit: 1000, // Fetch more data for client-side pagination\n },\n { enabled: !!userAddress },\n );\n\n // Update all trades when data changes\n useEffect(() => {\n if (tradesData?.trades) {\n setAllTrades(tradesData.trades);\n setCurrentPage(1); // Reset to first page when data changes\n }\n }, [tradesData]);\n\n // Reset page when time range changes\n useEffect(() => {\n setCurrentPage(1);\n }, [timeRange]);\n\n // Calculate pagination\n const totalPages = Math.ceil(allTrades.length / pageSize);\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n const trades = allTrades.slice(startIndex, endIndex);\n\n const goToNextPage = () => {\n if (currentPage < totalPages) {\n setCurrentPage(currentPage + 1);\n }\n };\n\n const goToPreviousPage = () => {\n if (currentPage > 1) {\n setCurrentPage(currentPage - 1);\n }\n };\n\n const goToPage = (page: number) => {\n if (page >= 1 && page <= totalPages) {\n setCurrentPage(page);\n }\n };\n\n return {\n trades,\n isLoading,\n error,\n timeRange,\n setTimeRange,\n currentPage,\n totalPages,\n goToNextPage,\n goToPreviousPage,\n goToPage,\n };\n}\n","import { Button, cn } from \"@liberfi.io/ui\";\nimport type { TradeHistory } from \"../../types\";\nimport type { TimeRange } from \"./trade-history.script\";\n\nexport type TradeHistoryUIProps = {\n trades: TradeHistory[];\n timeRange: TimeRange;\n onTimeRangeChange: (range: TimeRange) => void;\n currentPage: number;\n totalPages: number;\n onNextPage: () => void;\n onPreviousPage: () => void;\n onGoToPage: (page: number) => void;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction formatPrice(price: number): string {\n return formatNumber(price, 4);\n}\n\nfunction formatQuantity(quantity: number): string {\n return formatNumber(quantity, 4);\n}\n\nfunction formatDateTime(timestamp: number): string {\n const date = new Date(timestamp);\n const month = String(date.getMonth() + 1).padStart(2, \"0\");\n const day = String(date.getDate()).padStart(2, \"0\");\n const hours = String(date.getHours()).padStart(2, \"0\");\n const minutes = String(date.getMinutes()).padStart(2, \"0\");\n const seconds = String(date.getSeconds()).padStart(2, \"0\");\n return `${month}/${day} ${hours}:${minutes}:${seconds}`;\n}\n\nconst TIME_RANGE_OPTIONS: { label: string; value: TimeRange }[] = [\n { label: \"Today\", value: \"today\" },\n { label: \"7 Days\", value: \"7d\" },\n { label: \"30 Days\", value: \"30d\" },\n { label: \"All\", value: \"all\" },\n];\n\nexport function TradeHistoryUI({\n trades,\n timeRange,\n onTimeRangeChange,\n currentPage,\n totalPages,\n onNextPage,\n onPreviousPage,\n onGoToPage,\n}: TradeHistoryUIProps) {\n return (\n <div className=\"w-full flex flex-col gap-4\">\n {/* Time range filter */}\n <div className=\"flex gap-2\">\n {TIME_RANGE_OPTIONS.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"px-4 py-2 text-sm rounded transition-colors\",\n timeRange === option.value\n ? \"bg-neutral-800 text-white\"\n : \"text-neutral-400 hover:text-white hover:bg-neutral-800/50\",\n )}\n onClick={() => onTimeRangeChange(option.value)}\n >\n {option.label}\n </button>\n ))}\n </div>\n\n {/* Trade history table */}\n {trades.length === 0 ? (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No trade history\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-neutral-800\">\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Asset\n </th>\n <th className=\"text-left py-3 px-4 text-neutral-400 font-normal\">\n Side\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Price\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Quantity\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Fee\n </th>\n <th className=\"text-center py-3 px-4 text-neutral-400 font-normal\">\n Maker/Taker\n </th>\n <th className=\"text-right py-3 px-4 text-neutral-400 font-normal\">\n Time\n </th>\n </tr>\n </thead>\n <tbody>\n {trades.map((trade) => (\n <tr\n key={trade.tradeId}\n className=\"border-b border-neutral-800 hover:bg-neutral-900/50\"\n >\n {/* Asset */}\n <td className=\"py-3 px-4 text-white font-medium\">\n {trade.symbol.split(\"-\")[0]}\n </td>\n\n {/* Side */}\n <td className=\"py-3 px-4\">\n <span\n className={cn(\n \"text-xs px-2 py-1 rounded\",\n trade.side === \"long\"\n ? \"bg-green-600/20 text-green-500\"\n : \"bg-red-600/20 text-red-500\",\n )}\n >\n {trade.side.toUpperCase()}\n </span>\n </td>\n\n {/* Price */}\n <td className=\"py-3 px-4 text-right text-white\">\n ${formatPrice(trade.price)}\n </td>\n\n {/* Quantity */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatQuantity(trade.quantity)}\n </td>\n\n {/* Fee */}\n <td className=\"py-3 px-4 text-right text-white\">\n {formatNumber(trade.fee, 4)} {trade.feeCurrency}\n </td>\n\n {/* Maker/Taker */}\n <td className=\"py-3 px-4 text-center\">\n <span\n className={cn(\n \"text-xs px-2 py-1 rounded\",\n trade.isMaker\n ? \"bg-blue-600/20 text-blue-500\"\n : \"bg-purple-600/20 text-purple-500\",\n )}\n >\n {trade.isMaker ? \"Maker\" : \"Taker\"}\n </span>\n </td>\n\n {/* Time */}\n <td className=\"py-3 px-4 text-right text-neutral-400\">\n {formatDateTime(trade.timestamp)}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n {/* Pagination */}\n {totalPages > 1 && (\n <div className=\"flex items-center justify-between\">\n <div className=\"text-sm text-neutral-400\">\n Page {currentPage} of {totalPages}\n </div>\n <div className=\"flex gap-2\">\n <Button\n size=\"sm\"\n onClick={onPreviousPage}\n disabled={currentPage === 1}\n className=\"bg-neutral-800 hover:bg-neutral-700 text-white disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Previous\n </Button>\n {/* Page numbers */}\n <div className=\"flex gap-1\">\n {Array.from({ length: Math.min(5, totalPages) }, (_, i) => {\n let pageNum: number;\n if (totalPages <= 5) {\n pageNum = i + 1;\n } else if (currentPage <= 3) {\n pageNum = i + 1;\n } else if (currentPage >= totalPages - 2) {\n pageNum = totalPages - 4 + i;\n } else {\n pageNum = currentPage - 2 + i;\n }\n\n return (\n <button\n key={pageNum}\n type=\"button\"\n className={cn(\n \"w-8 h-8 text-sm rounded transition-colors\",\n currentPage === pageNum\n ? \"bg-neutral-700 text-white\"\n : \"text-neutral-400 hover:bg-neutral-800 hover:text-white\",\n )}\n onClick={() => onGoToPage(pageNum)}\n >\n {pageNum}\n </button>\n );\n })}\n </div>\n <Button\n size=\"sm\"\n onClick={onNextPage}\n disabled={currentPage === totalPages}\n className=\"bg-neutral-800 hover:bg-neutral-700 text-white disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n Next\n </Button>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// Loading skeleton component\nexport function TradeHistorySkeleton() {\n return (\n <div className=\"w-full space-y-4 p-4\">\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n <div className=\"h-4 bg-neutral-800 rounded w-full animate-pulse\" />\n </div>\n );\n}\n\n// Empty state component\nexport function TradeHistoryEmpty() {\n return (\n <div className=\"flex items-center justify-center h-48 text-neutral-400 text-sm\">\n No trade history\n </div>\n );\n}\n","import { useTradeHistoryScript } from \"./trade-history.script\";\nimport type { TimeRange } from \"./trade-history.script\";\nimport {\n TradeHistoryUI,\n TradeHistorySkeleton,\n TradeHistoryEmpty,\n} from \"./trade-history.ui\";\n\nexport type TradeHistoryWidgetProps = {\n userAddress?: string;\n symbol?: string;\n initialTimeRange?: TimeRange;\n pageSize?: number;\n className?: string;\n};\n\nexport function TradeHistoryWidget({\n userAddress,\n symbol,\n initialTimeRange = \"7d\",\n pageSize = 50,\n className,\n}: TradeHistoryWidgetProps) {\n const {\n trades,\n isLoading,\n timeRange,\n setTimeRange,\n currentPage,\n totalPages,\n goToNextPage,\n goToPreviousPage,\n goToPage,\n } = useTradeHistoryScript({\n userAddress,\n symbol,\n initialTimeRange,\n pageSize,\n });\n\n if (isLoading) {\n return (\n <div className={className}>\n <TradeHistorySkeleton />\n </div>\n );\n }\n\n if (trades.length === 0) {\n return (\n <div className={className}>\n <TradeHistoryEmpty />\n </div>\n );\n }\n\n return (\n <div className={className}>\n <TradeHistoryUI\n trades={trades}\n timeRange={timeRange}\n onTimeRangeChange={setTimeRange}\n currentPage={currentPage}\n totalPages={totalPages}\n onNextPage={goToNextPage}\n onPreviousPage={goToPreviousPage}\n onGoToPage={goToPage}\n />\n </div>\n );\n}\n"]}
|