@liberfi.io/ui-perpetuals 0.2.0 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/version.ts","../src/client/hyperliquid/WebSocketManager.ts","../src/client/hyperliquid/HyperliquidPerpetualsClient.ts","../src/client/liberfi/LiberFiPerpetualsClient.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","trades","isLong","t","userAddress","subscriptionType","statusCode","responseBody","LiberFiApiError","DEFAULT_WS_ENDPOINT","DEFAULT_TIMEOUT_MS","LiberFiPerpetualsClient","path","query","key","value","qs","method","text","safeText","err","result","fills","prepared","signature","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","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","fallback","base","patch","formatCountdown","seconds","hours","minutes","secs","formatNumber","num","decimals","formatPrice","CoinInfoUI","indexPrice","volume24h","openInterest","fundingRate","safeChange24h","safeFundingRate","isPositiveChange","changePercent","CoinInfoWidget","isLoading","useSearchCoinsScript","onSelectCoin","searchQuery","setSearchQuery","coins","setCoins","coinSymbols","isLoadingSymbols","marketsData","isLoadingMarkets","filteredCoins","useMemo","SearchCoinsUI","onSearchChange","SearchIcon","e","fundingPercent","isPositiveFunding","tokenName","target","SearchCoinsWidget","className","handleSelectCoin","aggregateByPrecision","levels","precision","aggregated","roundedPrice","existing","calculateTotalsAndPercentages","total","withTotals","usdAmount","maxTotal","useOrderBookScript","initialPrecision","orderBook","setOrderBook","setPrecision","aggregatedBids","aggregatedAsks","sortedBids","a","b","sortedAsks","bestBid","spread","spreadPercentage","formatQuantity","qty","OBRow","percentage","side","onClick","isAsk","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","maxLeverageProp","onSuccess","onError","setSide","orderType","setOrderType","form","useForm","isSubmitting","watchedValues","amount","leverage","estimatedFee","estimatedTotal","liquidationPrice","maintenanceMarginRate","availableMargin","accountValue","currentPosition","handleSubmit","finalPrice","takeProfitPrice","stopLossPrice","tpPercent","slPercent","LeverageModal","maxLeverage","onLeverageChange","onClose","presets","v","Slider","preset","cn","PlaceOrderFormUI","methods","onSideChange","onOrderTypeChange","onSubmit","showLeverageModal","setShowLeverageModal","showTpSl","setShowTpSl","tokenSymbol","positionPercent","handlePositionSlider","pct","maxAmount","tab","RHForm","RHNumberInput","PlaceOrderFormWidget","resolvedMaxLeverage","usePositionsScript","onCloseSuccess","onCloseError","setPositions","positionsData","realtimePosition","isClosing","prevPositions","existingIndex","newPositions","handleClosePosition","position","closeSide","formatPnl","pnl","formatPnlPercent","percent","PositionsUI","onClosePosition","headerRow","pnlColor","Button","PositionsSkeleton","PositionsEmpty","PositionsWidget","useOpenOrdersScript","onCancelSuccess","onCancelError","setOrders","ordersData","realtimeOrder","isCanceling","prevOrders","o","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","option","selected","Fragment","pageNum","TradeHistorySkeleton","TradeHistoryEmpty","TradeHistoryWidget","goToNextPage","goToPreviousPage","goToPage"],"mappings":"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","file":"index.mjs","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.2.0\";\n}\n\nexport default \"0.2.0\";\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 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 Position,\n Order,\n TradeHistory,\n} from \"../../types\";\nimport { WebSocketManager } from \"../hyperliquid/WebSocketManager\";\n\n// ===== Public configuration & errors ============================================\n\n/**\n * `signTypedData` is invoked once per place / cancel during the\n * `prepare → submit` flow. The hosting app injects this so the user's wallet\n * (privy / wagmi / etc.) controls the keys — perpetuals-server never sees them.\n *\n * The `typedData` argument is the EIP-712 envelope returned verbatim by the\n * server. The function must return the resulting compact signature as a\n * `0x`-prefixed hex string.\n */\nexport type SignTypedDataFn = (\n typedData: Record<string, unknown>,\n) => Promise<`0x${string}`>;\n\n/** Configuration for {@link LiberFiPerpetualsClient}. */\nexport interface LiberFiPerpetualsClientConfig {\n /**\n * REST base URL, with NO trailing slash. Examples:\n * - Local dev: `http://localhost:8080`\n * - Staging: `https://api.liberfi.io/staging/perpetuals`\n * - Production: `https://api.liberfi.io/perpetuals`\n *\n * The client appends `/v1/...` paths to this value.\n */\n baseUrl: string;\n\n /**\n * Optional WebSocket endpoint. Real-time data is NOT proxied by\n * perpetuals-server today — the WS subscription methods connect directly to\n * the upstream exchange. Defaults to Hyperliquid mainnet.\n */\n wsEndpoint?: string;\n\n /**\n * EIP-712 signer injected by the hosting app. REQUIRED for `placeOrder` /\n * `cancelOrder`; read-only methods work without it.\n */\n signTypedData?: SignTypedDataFn;\n\n /**\n * Per-request timeout in milliseconds. Defaults to 30 000 ms.\n */\n timeout?: number;\n\n /**\n * Optional provider override sent as `?provider=...`. Defaults to the server\n * configuration (currently `hyperliquid`). Only set this when the gateway\n * has multiple providers configured and you want a non-default one.\n */\n provider?: string;\n\n /**\n * Optional extra request headers (auth tokens, tracing, etc.) merged into\n * every fetch.\n */\n headers?: Record<string, string>;\n}\n\n/** Thrown when perpetuals-server returns a non-2xx HTTP status. */\nexport class LiberFiApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly responseBody: string,\n ) {\n super(message);\n this.name = \"LiberFiApiError\";\n }\n}\n\nconst DEFAULT_WS_ENDPOINT = \"wss://api.hyperliquid.xyz/ws\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n// ===== Server-side wire types (mirror perpetuals-server/internal/domain) =======\n//\n// These intentionally use snake-free camelCase exactly matching the Go\n// `json:\"…\"` tags. They are kept private so consumers depend only on the\n// stable IPerpetualsClient surface above.\n\ninterface CoinDTO {\n symbol: string;\n name: string;\n tickSize?: number;\n stepSize?: number;\n minOrderSize?: number;\n maxLeverage?: number;\n}\n\ntype MarketDTO = MarketData;\ntype OrderBookDTO = OrderBook;\ntype TradeDTO = Trade;\ntype KlineDTO = Kline;\n\ninterface AccountDTO {\n totalEquity: number;\n availableBalance: number;\n totalUnrealizedPnl: number;\n usedMargin?: number;\n accountLeverage?: number;\n}\n\ninterface PositionsResultDTO {\n positions: Position[];\n account?: AccountDTO;\n}\n\ntype OrderDTO = Order;\n\ninterface UserFillDTO {\n tradeId: string;\n orderId: string;\n symbol: string;\n side: \"long\" | \"short\";\n price: number;\n quantity: number;\n fee: number;\n feeCurrency: string;\n isMaker: boolean;\n timestamp: number;\n}\n\ninterface PreparedActionDTO {\n typedData: Record<string, unknown>;\n action: Record<string, unknown>;\n nonce: number;\n vaultAddress?: string;\n}\n\ntype PlaceOrderResultDTO = PlaceOrderResult;\ntype CancelOrderResultDTO = CancelOrderResult;\n\n// ===== Implementation ============================================================\n\n/**\n * REST + injected-signer implementation of {@link IPerpetualsClient} that talks\n * to a deployed `perpetuals-server` instead of Hyperliquid directly.\n *\n * - Read-only methods are plain `fetch GET`s.\n * - `placeOrder` / `cancelOrder` follow the two-phase flow:\n * 1. POST `…/prepare` → server builds upstream action + EIP-712 typed data.\n * 2. Host wallet signs `typedData` via the injected `signTypedData`.\n * 3. POST `…/submit` with the original `action`, the user signature, and\n * the server-issued `nonce`. The server forwards to upstream and\n * normalises the response.\n * - WebSocket subscriptions are NOT proxied through perpetuals-server today.\n * They reuse the existing {@link WebSocketManager} pointed at the upstream\n * exchange (`wsEndpoint`, default Hyperliquid mainnet).\n */\nexport class LiberFiPerpetualsClient implements IPerpetualsClient {\n private readonly baseUrl: string;\n private readonly wsEndpoint: string;\n private readonly timeout: number;\n private readonly provider?: string;\n private readonly headers?: Record<string, string>;\n private readonly signTypedData?: SignTypedDataFn;\n private wsManager: WebSocketManager | null = null;\n\n constructor(config: LiberFiPerpetualsClientConfig) {\n if (!config.baseUrl) {\n throw new Error(\n \"LiberFiPerpetualsClient: `baseUrl` is required (e.g. https://api.liberfi.io/perpetuals).\",\n );\n }\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.wsEndpoint = config.wsEndpoint ?? DEFAULT_WS_ENDPOINT;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT_MS;\n this.provider = config.provider;\n this.headers = config.headers;\n this.signTypedData = config.signTypedData;\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Build a fully-qualified URL with optional query string. */\n private url(\n path: string,\n query?: Record<string, string | undefined>,\n ): string {\n const params = new URLSearchParams();\n if (this.provider) params.set(\"provider\", this.provider);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === \"\") continue;\n params.set(key, value);\n }\n }\n const qs = params.toString();\n return `${this.baseUrl}${path}${qs ? `?${qs}` : \"\"}`;\n }\n\n /** Common fetch wrapper with timeout + structured error mapping. */\n private async request<T>(\n method: \"GET\" | \"POST\",\n url: string,\n body?: unknown,\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Accept: \"application/json\",\n ...(method === \"POST\" ? { \"Content-Type\": \"application/json\" } : {}),\n ...this.headers,\n },\n body: method === \"POST\" ? JSON.stringify(body ?? {}) : undefined,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await safeText(response);\n throw new LiberFiApiError(\n `HTTP ${response.status} ${response.statusText} from ${method} ${url}`,\n response.status,\n text,\n );\n }\n\n // 204 No Content / empty body — return undefined cast to T.\n if (response.status === 204) return undefined as T;\n const data = (await response.json()) as T;\n return data;\n } catch (err: unknown) {\n if (err instanceof LiberFiApiError) throw err;\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new LiberFiApiError(\n `Request timeout after ${this.timeout}ms: ${method} ${url}`,\n 408,\n \"\",\n );\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new LiberFiApiError(\n `Network error: ${method} ${url}: ${message}`,\n 0,\n \"\",\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ── IPerpetualsClient: market data ────────────────────────────────────────\n\n async getSupportedCoins(): Promise<string[]> {\n const coins = await this.request<CoinDTO[]>(\"GET\", this.url(\"/v1/coins\"));\n return coins.map((coin) => coin.symbol);\n }\n\n async getMarket(symbol: string): Promise<MarketData | null> {\n try {\n return await this.request<MarketDTO>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}`),\n );\n } catch (err) {\n if (err instanceof LiberFiApiError && err.statusCode === 404) return null;\n throw err;\n }\n }\n\n async getMarkets(symbols?: string[]): Promise<MarketData[]> {\n const query =\n symbols && symbols.length > 0\n ? { symbols: symbols.join(\",\") }\n : undefined;\n return this.request<MarketDTO[]>(\"GET\", this.url(\"/v1/markets\", query));\n }\n\n async getKlines(\n symbol: string,\n interval: KlineInterval,\n limit: number = 100,\n ): Promise<Kline[]> {\n return this.request<KlineDTO[]>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}/klines`, {\n interval,\n limit: String(limit),\n }),\n );\n }\n\n async getOrderBook(\n symbol: string,\n maxLevel: number = 10,\n ): Promise<OrderBook> {\n return this.request<OrderBookDTO>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}/orderbook`, {\n maxLevel: String(maxLevel),\n }),\n );\n }\n\n async getRecentTrades(symbol: string, limit: number = 50): Promise<Trade[]> {\n return this.request<TradeDTO[]>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}/trades`, {\n limit: String(limit),\n }),\n );\n }\n\n // ── IPerpetualsClient: account ────────────────────────────────────────────\n\n async getPositions(\n params: GetPositionsParams = {},\n ): Promise<GetPositionsResult> {\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.getPositions requires `userAddress`.\",\n );\n }\n const result = await this.request<PositionsResultDTO>(\n \"GET\",\n this.url(\n `/v1/users/${encodeURIComponent(params.userAddress)}/positions`,\n { symbol: params.symbol },\n ),\n );\n\n return {\n positions: result.positions,\n totalEquity: result.account?.totalEquity,\n availableBalance: result.account?.availableBalance,\n totalUnrealizedPnl: result.account?.totalUnrealizedPnl,\n raw: result,\n };\n }\n\n async getOpenOrders(\n params: GetOpenOrdersParams = {},\n ): Promise<GetOpenOrdersResult> {\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.getOpenOrders requires `userAddress`.\",\n );\n }\n const orders = await this.request<OrderDTO[]>(\n \"GET\",\n this.url(`/v1/users/${encodeURIComponent(params.userAddress)}/orders`, {\n symbol: params.symbol,\n }),\n );\n return { orders, totalCount: orders.length, raw: orders };\n }\n\n async getTrades(params: GetTradesParams = {}): Promise<GetTradesResult> {\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.getTrades requires `userAddress`.\",\n );\n }\n const fills = await this.request<UserFillDTO[]>(\n \"GET\",\n this.url(`/v1/users/${encodeURIComponent(params.userAddress)}/fills`, {\n symbol: params.symbol,\n limit: params.limit !== undefined ? String(params.limit) : undefined,\n startTime:\n params.startTime !== undefined ? String(params.startTime) : undefined,\n endTime:\n params.endTime !== undefined ? String(params.endTime) : undefined,\n }),\n );\n const trades: TradeHistory[] = fills.map((fill) => ({\n tradeId: fill.tradeId,\n orderId: fill.orderId,\n symbol: fill.symbol,\n side: fill.side,\n price: fill.price,\n quantity: fill.quantity,\n fee: fill.fee,\n feeCurrency: fill.feeCurrency,\n isMaker: fill.isMaker,\n timestamp: fill.timestamp,\n }));\n return { trades, totalCount: trades.length, raw: fills };\n }\n\n // ── IPerpetualsClient: trading (two-phase signing) ────────────────────────\n\n async placeOrder(params: PlaceOrderParams): Promise<PlaceOrderResult> {\n if (!this.signTypedData) {\n throw new Error(\n \"LiberFiPerpetualsClient.placeOrder requires `signTypedData` to be configured.\",\n );\n }\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.placeOrder requires `userAddress` (the signing wallet).\",\n );\n }\n\n const prepared = await this.request<PreparedActionDTO>(\n \"POST\",\n this.url(\"/v1/orders/prepare\"),\n {\n userAddress: params.userAddress,\n symbol: params.symbol,\n side: params.side,\n orderType: params.orderType,\n amount: params.amount,\n price: params.price,\n leverage: params.leverage,\n reduceOnly: params.reduceOnly,\n takeProfitPrice: params.takeProfitPrice,\n stopLossPrice: params.stopLossPrice,\n clientOrderId: params.clientOrderId,\n },\n );\n\n const signature = await this.signTypedData(prepared.typedData);\n\n return this.request<PlaceOrderResultDTO>(\n \"POST\",\n this.url(\"/v1/orders/submit\"),\n {\n action: prepared.action,\n signature,\n nonce: prepared.nonce,\n vaultAddress: prepared.vaultAddress,\n },\n );\n }\n\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n if (!this.signTypedData) {\n throw new Error(\n \"LiberFiPerpetualsClient.cancelOrder requires `signTypedData` to be configured.\",\n );\n }\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.cancelOrder requires `userAddress` (the signing wallet).\",\n );\n }\n\n const prepared = await this.request<PreparedActionDTO>(\n \"POST\",\n this.url(\"/v1/orders/cancel/prepare\"),\n {\n userAddress: params.userAddress,\n symbol: params.symbol,\n orderId: params.orderId,\n clientOrderId: params.clientOrderId,\n },\n );\n\n const signature = await this.signTypedData(prepared.typedData);\n\n return this.request<CancelOrderResultDTO>(\n \"POST\",\n this.url(\"/v1/orders/cancel/submit\"),\n {\n action: prepared.action,\n signature,\n nonce: prepared.nonce,\n vaultAddress: prepared.vaultAddress,\n },\n );\n }\n\n // ── IPerpetualsClient: WebSocket (direct upstream, NOT proxied) ───────────\n\n async connectWebSocket(): Promise<void> {\n if (!this.wsManager) {\n this.wsManager = new WebSocketManager(this.wsEndpoint);\n }\n if (this.wsManager.isConnectedNow()) return;\n await this.wsManager.connect();\n }\n\n disconnectWebSocket(): void {\n if (this.wsManager) {\n this.wsManager.disconnect();\n this.wsManager = null;\n }\n }\n\n subscribeMarketData(\n type: \"ticker\" | \"trades\" | \"orderBook\",\n symbol: string,\n callback: (data: unknown) => void,\n ): string {\n return this.requireWS().subscribe(type, symbol, callback);\n }\n\n subscribeCandles(\n symbol: string,\n interval: KlineInterval,\n callback: (candle: Kline) => void,\n ): string {\n return this.requireWS().subscribe(\n \"candle\",\n `${symbol}:${interval}`,\n callback,\n );\n }\n\n subscribeUserData(\n type: \"orders\" | \"positions\" | \"fills\",\n userAddress: string,\n callback: (data: unknown) => void,\n ): string {\n const channel = type === \"fills\" ? \"userFills\" : \"userEvents\";\n return this.requireWS().subscribe(channel, userAddress, callback);\n }\n\n unsubscribe(subscriptionId: string): void {\n if (this.wsManager) {\n this.wsManager.unsubscribe(subscriptionId);\n }\n }\n\n private requireWS(): WebSocketManager {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n return this.wsManager;\n }\n}\n\nasync function safeText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"\";\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.toLocaleString(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n }\n if (price >= 1) {\n return price.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 4,\n });\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.toFixed(2);\n\n return (\n <div\n className=\"flex items-center px-4\"\n style={{ minHeight: 64, maxHeight: 64, gap: 16 }}\n >\n <div className=\"flex items-baseline\" style={{ gap: 8 }}>\n <span\n style={{\n fontSize: 18,\n fontWeight: 500,\n lineHeight: \"23px\",\n letterSpacing: \"-0.36px\",\n color: \"#ffffff\",\n }}\n >\n {formatPrice(price)}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: \"16px\",\n color: isPositiveChange ? \"#C7FF2E\" : \"#F76816\",\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n </div>\n\n <div className=\"flex items-center\" style={{ gap: 16 }}>\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n Oracle Price\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\n {indexPrice ? formatPrice(indexPrice) : \"-\"}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n 24h Volume\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\n {formatNumber(volume24h, 0)}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n Open Interest\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\n {formatNumber(openInterest * (marketData.markPrice || price))}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n Funding / Countdown\n </span>\n <div className=\"flex items-center\" style={{ gap: 8 }}>\n <span\n style={{\n fontSize: 13,\n lineHeight: \"17px\",\n color: safeFundingRate >= 0 ? \"#C7FF2E\" : \"#F76816\",\n }}\n >\n {(safeFundingRate * 100).toFixed(5)}%\n </span>\n <span\n style={{\n fontSize: 13,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\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 { SearchIcon } 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\n className=\"flex flex-col\"\n style={{ backgroundColor: \"#1A1A1A\", flex: \"1 1 0\", minHeight: 0 }}\n >\n <div style={{ padding: \"16px 16px 12px\" }}>\n <div\n className=\"flex items-center\"\n style={{\n height: 32,\n border: \"1px solid #2a2a2a\",\n borderRadius: 4,\n padding: \"0 6px 0 12px\",\n gap: 8,\n }}\n >\n <SearchIcon\n className=\"flex-shrink-0\"\n style={{ width: 14, height: 14, color: \"#6b6b6b\" }}\n />\n <input\n type=\"text\"\n placeholder=\"Search coins...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"flex-1 bg-transparent outline-none\"\n style={{ fontSize: 12, color: \"#ffffff\", border: \"none\" }}\n />\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n {/* Header */}\n <div\n className=\"flex items-center\"\n style={{\n height: 28,\n padding: \"0 16px\",\n borderBottom: \"1px solid rgba(42,42,42,0.5)\",\n position: \"sticky\",\n top: 0,\n backgroundColor: \"#1A1A1A\",\n zIndex: 1,\n }}\n >\n <span style={{ flex: \"0 0 140px\", fontSize: 12, color: \"#6b6b6b\" }}>\n Token\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n Last Price\n </span>\n <span\n style={{\n flex: \"0 0 120px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n 24h Change\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n 8h Funding\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n 24h Volume\n </span>\n <span\n style={{\n flex: \"1\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n Open Interest\n </span>\n </div>\n\n {/* Rows */}\n {isLoading ? (\n <div\n className=\"flex items-center justify-center\"\n style={{ height: 100 }}\n >\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>Loading...</span>\n </div>\n ) : coins.length === 0 ? (\n <div\n className=\"flex items-center justify-center\"\n style={{ height: 100 }}\n >\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n {searchQuery ? \"No coins found\" : \"No coins available\"}\n </span>\n </div>\n ) : (\n coins.map((coin) => {\n const isPositiveChange = coin.change24h >= 0;\n const changePercent = coin.change24h.toFixed(2);\n const fundingPercent = (coin.fundingRate * 100).toFixed(4);\n const isPositiveFunding = coin.fundingRate >= 0;\n const tokenName = coin.symbol.split(\"-\")[0];\n\n return (\n <div\n key={coin.symbol}\n className=\"flex items-center cursor-pointer transition-colors\"\n style={{\n height: 36,\n padding: \"0 16px\",\n borderBottom: \"1px solid rgba(42,42,42,0.5)\",\n }}\n onClick={() => onSelectCoin(coin.symbol)}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.backgroundColor =\n \"rgba(255,255,255,0.03)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.backgroundColor =\n \"transparent\";\n }}\n >\n <div\n className=\"flex items-center\"\n style={{ flex: \"0 0 140px\", gap: 8 }}\n >\n <img\n src={`https://app.hyperliquid.xyz/coins/${tokenName}.svg`}\n alt={tokenName}\n className=\"rounded-full\"\n style={{ width: 20, height: 20 }}\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = \"none\";\n }}\n />\n <span\n style={{ fontSize: 12, fontWeight: 500, color: \"#ffffff\" }}\n >\n {tokenName}\n </span>\n </div>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#ffffff\",\n textAlign: \"right\",\n }}\n >\n {formatPrice(coin.price)}\n </span>\n <span\n style={{\n flex: \"0 0 120px\",\n fontSize: 12,\n fontWeight: 500,\n color: isPositiveChange ? \"#C7FF2E\" : \"#F76816\",\n textAlign: \"right\",\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: isPositiveFunding ? \"#C7FF2E\" : \"#F76816\",\n textAlign: \"right\",\n }}\n >\n {fundingPercent}%\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#b5b5b5\",\n textAlign: \"right\",\n }}\n >\n {formatNumber(coin.volume24h)}\n </span>\n <span\n style={{\n flex: \"1\",\n fontSize: 12,\n color: \"#b5b5b5\",\n textAlign: \"right\",\n }}\n >\n {formatNumber(coin.openInterest * coin.price)}\n </span>\n </div>\n );\n })\n )}\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\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: \"1 1 0\",\n minHeight: 0,\n overflow: \"hidden\",\n }}\n >\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 const usdAmount = level.quantity * level.price;\n total += usdAmount;\n return {\n ...level,\n quantity: usdAmount,\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.toLocaleString(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n }\n if (price >= 1) {\n return price.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 4,\n });\n }\n return price.toFixed(6);\n}\n\nfunction formatQuantity(qty: number): string {\n return Math.round(qty).toLocaleString(\"en-US\");\n}\n\nfunction OBRow({\n price,\n quantity,\n total,\n percentage,\n side,\n onClick,\n}: {\n price: number;\n quantity: number;\n total: number;\n percentage: number;\n side: \"ask\" | \"bid\";\n onClick?: () => void;\n}) {\n const isAsk = side === \"ask\";\n return (\n <div\n className=\"relative flex items-center cursor-pointer hover:bg-white/5 transition-colors\"\n style={{\n height: 22,\n minHeight: 22,\n maxHeight: 22,\n padding: \"0 16px\",\n gap: 16,\n fontSize: 11,\n }}\n onClick={onClick}\n >\n <div\n className=\"absolute left-0 top-0\"\n style={{\n height: 20,\n width: `${percentage}%`,\n background: isAsk\n ? \"linear-gradient(to right, rgba(247,104,22,0), #F76816)\"\n : \"linear-gradient(to right, rgba(199,255,46,0), #C7FF2E)\",\n opacity: 0.15,\n }}\n />\n <div\n className=\"relative z-10 flex items-center\"\n style={{ flex: \"1 1 0%\" }}\n >\n <span style={{ color: isAsk ? \"#F76816\" : \"#C7FF2E\", fontWeight: 400 }}>\n {formatPrice(price)}\n </span>\n </div>\n <div\n className=\"relative z-10 flex items-center justify-end\"\n style={{ flex: \"1 1 0%\", color: \"#ffffff\" }}\n >\n {formatQuantity(quantity)}\n </div>\n <div\n className=\"relative z-10 flex items-center justify-end\"\n style={{ flex: \"1 1 0%\", color: \"#ffffff\" }}\n >\n {formatQuantity(total)}\n </div>\n </div>\n );\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\n className=\"flex flex-col h-full\"\n style={{ backgroundColor: \"#000000\", fontSize: 11 }}\n >\n {/* Header */}\n <div\n className=\"flex items-center\"\n style={{\n height: 28,\n minHeight: 28,\n padding: \"0 16px\",\n gap: 16,\n color: \"#6b6b6b\",\n fontSize: 11,\n }}\n >\n <div className=\"flex items-center\" style={{ flex: \"1 1 0%\" }}>\n Price\n </div>\n <div\n className=\"flex items-center justify-end\"\n style={{ flex: \"1 1 0%\" }}\n >\n Amount (USD)\n </div>\n <div\n className=\"flex items-center justify-end\"\n style={{ flex: \"1 1 0%\" }}\n >\n Total (USD)\n </div>\n </div>\n\n {/* Asks (reversed) */}\n <div className=\"flex-1 flex flex-col-reverse overflow-hidden\">\n {reversedAsks.map((ask, index) => (\n <OBRow\n key={`ask-${ask.price}-${index}`}\n price={ask.price}\n quantity={ask.quantity}\n total={ask.total}\n percentage={ask.percentage}\n side=\"ask\"\n onClick={() => onPriceClick?.(ask.price)}\n />\n ))}\n </div>\n\n {/* Spread bar */}\n <div\n className=\"flex items-center justify-center\"\n style={{\n height: 24,\n minHeight: 24,\n padding: \"0 16px\",\n backgroundColor: \"rgba(26,26,26,0.5)\",\n }}\n >\n <div\n className=\"flex items-center\"\n style={{ gap: 12, fontSize: 12, color: \"#ffffff\" }}\n >\n <span style={{ color: \"#ffffff\" }}>Spread:</span>\n <button\n type=\"button\"\n className=\"hover:text-white transition-colors cursor-pointer\"\n style={{\n color: \"#ffffff\",\n fontWeight: 400,\n background: \"none\",\n border: \"none\",\n padding: 0,\n }}\n onClick={() => onPriceClick?.(spread)}\n >\n {spread >= 1\n ? Math.round(spread).toLocaleString(\"en-US\")\n : spread.toFixed(4)}\n </button>\n <span style={{ color: \"#ffffff\", fontWeight: 500 }}>\n {spreadPercentage.toFixed(3)}%\n </span>\n </div>\n </div>\n\n {/* Bids */}\n <div className=\"flex-1 overflow-hidden\">\n {bids.map((bid, index) => (\n <OBRow\n key={`bid-${bid.price}-${index}`}\n price={bid.price}\n quantity={bid.quantity}\n total={bid.total}\n percentage={bid.percentage}\n side=\"bid\"\n onClick={() => onPriceClick?.(bid.price)}\n />\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\" style={{ padding: \"0 16px\" }}>\n <div\n className=\"flex justify-between items-center\"\n style={{ height: 28, marginBottom: 4 }}\n >\n <Skeleton className=\"h-3 w-12 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n </div>\n {Array.from({ length: 10 }).map((_, i) => (\n <div\n key={`ask-skeleton-${i}`}\n className=\"flex justify-between items-center\"\n style={{ height: 22 }}\n >\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n </div>\n ))}\n <div className=\"flex justify-center items-center\" style={{ height: 28 }}>\n <Skeleton className=\"h-4 w-32 rounded\" />\n </div>\n {Array.from({ length: 10 }).map((_, i) => (\n <div\n key={`bid-skeleton-${i}`}\n className=\"flex justify-between items-center\"\n style={{ height: 22 }}\n >\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction OrderBookEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full\">\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 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\n className=\"flex flex-col h-full overflow-auto\"\n style={{ backgroundColor: \"#000000\", fontSize: 11 }}\n >\n {/* Header */}\n <div\n className=\"sticky top-0 z-10 flex items-center\"\n style={{\n height: 28,\n minHeight: 28,\n padding: \"0 16px\",\n gap: 16,\n color: \"#6b6b6b\",\n fontSize: 11,\n }}\n >\n <div className=\"flex-1\" style={{ maxWidth: 100 }}>\n Price\n </div>\n <div className=\"flex-1 text-right\">Amount</div>\n <div className=\"flex-1 text-right\" style={{ maxWidth: 100 }}>\n Total\n </div>\n <div className=\"flex-1 text-right\" style={{ maxWidth: 70 }}>\n Time\n </div>\n </div>\n\n {/* Rows */}\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 items-center cursor-pointer hover:bg-white/5 transition-colors\"\n style={{\n height: 22,\n minHeight: 22,\n maxHeight: 22,\n padding: \"0 16px\",\n gap: 16,\n fontSize: 11,\n }}\n onClick={() => onTradeClick?.(trade)}\n >\n <div className=\"flex-1\" style={{ maxWidth: 100 }}>\n <span\n style={{\n color: isBuy ? \"#C7FF2E\" : \"#F76816\",\n fontWeight: 400,\n }}\n >\n {formatPrice(trade.price)}\n </span>\n </div>\n <div className=\"flex-1 text-right\" style={{ color: \"#ffffff\" }}>\n {formatQuantity(trade.quantity)}\n </div>\n <div\n className=\"flex-1 text-right\"\n style={{ maxWidth: 100, color: \"#ffffff\" }}\n >\n {formatQuantity(total)}\n </div>\n <div\n className=\"flex-1 text-right\"\n style={{ maxWidth: 70, color: \"#b5b5b5\" }}\n >\n {formatTime(trade.timestamp)}\n </div>\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\" style={{ padding: \"0 16px\" }}>\n <div\n className=\"flex justify-between items-center\"\n style={{ height: 28, marginBottom: 4 }}\n >\n <Skeleton className=\"h-3 w-12 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-12 rounded\" />\n </div>\n {Array.from({ length: 12 }).map((_, i) => (\n <div\n key={`trade-skeleton-${i}`}\n className=\"flex justify-between items-center\"\n style={{ height: 22 }}\n >\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-12 rounded\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction TradesEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full\">\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 takeProfitPrice?: number;\n takeProfitPercent?: number;\n stopLossPrice?: number;\n stopLossPercent?: number;\n};\n\nexport type UsePlaceOrderFormScriptParams = {\n symbol: string;\n userAddress?: string;\n maxLeverage?: number;\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 maxLeverage: number;\n};\n\nexport function usePlaceOrderFormScript({\n symbol,\n userAddress,\n maxLeverage: maxLeverageProp = 150,\n onSuccess,\n onError,\n}: UsePlaceOrderFormScriptParams): UsePlaceOrderFormScriptResult {\n const [side, setSide] = useState<OrderSide>(\"long\");\n const [orderType, setOrderType] = useState<OrderType>(\"market\");\n const form = useForm<PlaceOrderFormData>({\n defaultValues: {\n amount: 0,\n leverage: 20,\n takeProfitPrice: undefined,\n takeProfitPercent: undefined,\n stopLossPrice: undefined,\n stopLossPercent: undefined,\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 = data.takeProfitPrice;\n let stopLossPrice = data.stopLossPrice;\n\n if (\n !takeProfitPrice &&\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 (\n !stopLossPrice &&\n data.stopLossPercent &&\n data.stopLossPercent > 0 &&\n currentPrice\n ) {\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 maxLeverage: maxLeverageProp,\n };\n}\n","import { useState } from \"react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { 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 maxLeverage: number;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction LeverageModal({\n leverage,\n maxLeverage,\n onLeverageChange,\n onClose,\n}: {\n leverage: number;\n maxLeverage: number;\n onLeverageChange: (v: number) => void;\n onClose: () => void;\n}) {\n const presets = [1, 2, 3, 5, 10, 20, 25, 50, 100].filter(\n (v) => v <= maxLeverage,\n );\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/60\"\n onClick={onClose}\n onKeyDown={(e) => e.key === \"Escape\" && onClose()}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Close\"\n />\n <div className=\"relative z-10 w-72 bg-neutral-900 border border-neutral-700 rounded-lg p-4 shadow-2xl\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-sm font-medium text-white\">Adjust Leverage</h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-neutral-400 hover:text-white\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"text-center text-2xl font-bold text-white mb-4\">\n {leverage}x\n </div>\n\n <Slider\n value={[leverage]}\n onChange={(value: number | number[]) =>\n onLeverageChange(Array.isArray(value) ? value[0] : value)\n }\n minValue={1}\n maxValue={maxLeverage}\n step={1}\n className=\"w-full mb-3\"\n />\n\n <div className=\"flex flex-wrap gap-1.5\">\n {presets.map((preset) => (\n <button\n key={preset}\n type=\"button\"\n className={cn(\n \"px-2.5 py-1 text-xs rounded transition-colors\",\n leverage === preset\n ? \"bg-green-600 text-white\"\n : \"bg-neutral-800 text-neutral-400 hover:bg-neutral-700\",\n )}\n onClick={() => onLeverageChange(preset)}\n >\n {preset}x\n </button>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"w-full mt-4 text-white h-9 rounded cursor-pointer transition-colors\"\n style={{ backgroundColor: \"#C7FF2E\" }}\n onClick={onClose}\n >\n Confirm\n </button>\n </div>\n </div>\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 maxLeverage,\n}: PlaceOrderFormUIProps) {\n const [showLeverageModal, setShowLeverageModal] = useState(false);\n const [showTpSl, setShowTpSl] = useState(false);\n const leverage = methods.watch(\"leverage\") || 20;\n const amount = methods.watch(\"amount\") || 0;\n const tokenSymbol = symbol.split(\"-\")[0];\n\n const positionPercent =\n availableMargin > 0 && currentPrice\n ? Math.min(\n ((amount * currentPrice) / (availableMargin * leverage)) * 100,\n 100,\n )\n : 0;\n\n const handlePositionSlider = (value: number | number[]) => {\n const pct = (Array.isArray(value) ? value[0] : value) / 100;\n if (currentPrice && currentPrice > 0) {\n const maxAmount = (availableMargin * leverage * pct) / currentPrice;\n methods.setValue(\"amount\", Number(maxAmount.toFixed(6)));\n }\n };\n\n return (\n <div\n className=\"flex flex-col h-full\"\n style={{ backgroundColor: \"#000000\" }}\n >\n <div\n className=\"perp-order-form flex-1 overflow-y-auto\"\n style={{\n padding: \"16px 16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n {/* Long / Short */}\n <div\n className=\"flex\"\n style={{\n border: \"1px solid rgba(26,26,26,0.5)\",\n borderRadius: 8,\n padding: 4,\n gap: 4,\n }}\n >\n <button\n type=\"button\"\n className=\"flex-1 cursor-pointer transition-colors\"\n style={{\n height: 32,\n fontSize: 16,\n borderRadius: 4,\n backgroundColor: side === \"long\" ? \"#C7FF2E\" : \"transparent\",\n color: side === \"long\" ? \"#000000\" : \"#b5b5b5\",\n fontWeight: side === \"long\" ? 700 : 500,\n }}\n onClick={() => onSideChange(\"long\")}\n >\n Long\n </button>\n <button\n type=\"button\"\n className=\"flex-1 cursor-pointer transition-colors\"\n style={{\n height: 32,\n fontSize: 16,\n borderRadius: 4,\n backgroundColor: side === \"short\" ? \"#F76816\" : \"transparent\",\n color: side === \"short\" ? \"#000000\" : \"#b5b5b5\",\n fontWeight: side === \"short\" ? 700 : 500,\n }}\n onClick={() => onSideChange(\"short\")}\n >\n Short\n </button>\n </div>\n\n {/* Market / Limit + Leverage button */}\n <div className=\"flex items-center\" style={{ gap: 8 }}>\n <div className=\"flex\">\n {[\n { key: \"market\" as const, label: \"Market\" },\n { key: \"limit\" as const, label: \"Limit\" },\n ].map((tab) => (\n <div\n key={tab.key}\n style={{\n height: 32,\n display: \"flex\",\n alignItems: \"center\",\n borderBottom:\n orderType === tab.key\n ? \"2px solid #ffffff\"\n : \"2px solid transparent\",\n padding: \"2px 0 0\",\n cursor: \"pointer\",\n }}\n >\n <button\n type=\"button\"\n className=\"cursor-pointer transition-colors\"\n style={{\n padding: \"0 8px\",\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: \"transparent\",\n color: orderType === tab.key ? \"#ffffff\" : \"#b5b5b5\",\n border: \"none\",\n }}\n onClick={() => onOrderTypeChange(tab.key)}\n >\n {tab.label}\n </button>\n </div>\n ))}\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n className=\"cursor-pointer transition-colors\"\n style={{\n height: 24,\n padding: \"0 5px\",\n fontSize: 12,\n borderRadius: 4,\n backgroundColor: \"rgba(26,26,26,0.5)\",\n color: \"#ffffff\",\n fontWeight: 400,\n border: \"1px solid rgba(26,26,26,0.5)\",\n }}\n onClick={() => setShowLeverageModal(true)}\n >\n Leverage: {leverage}x\n </button>\n </div>\n\n <RHForm methods={methods} onSubmit={onSubmit}>\n <div className=\"space-y-3 w-full\">\n {/* Limit price input */}\n {orderType === \"limit\" && (\n <div\n className=\"perp-price-box\"\n style={{\n borderRadius: 4,\n padding: 8,\n backgroundColor: \"rgba(26,26,26,0.5)\",\n border: \"1px solid #1c1c1c\",\n height: 64,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n }}\n >\n <div className=\"flex justify-between items-center\">\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>Price</span>\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>USDC</span>\n </div>\n <RHNumberInput\n name=\"price\"\n placeholder=\"0.0 USDC\"\n className=\"w-full\"\n />\n </div>\n )}\n\n {/* Buy Amount */}\n <div\n className=\"perp-buy-amt\"\n style={{\n borderRadius: 4,\n padding: 8,\n backgroundColor: \"rgba(26,26,26,0.5)\",\n border: \"1px solid #1c1c1c\",\n height: 64,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n }}\n >\n <div className=\"flex justify-between items-center\">\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n Buy Amount\n </span>\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n {tokenSymbol}\n </span>\n </div>\n <RHNumberInput\n name=\"amount\"\n placeholder=\"0.0 USDC\"\n className=\"w-full\"\n />\n </div>\n\n {/* Position size slider */}\n <div>\n <style>{`\n .perp-buy-amt input, .perp-price-box input { font-size: 18px !important; line-height: 23px !important; }\n .perp-order-form .group,\n .perp-order-form .group div { background: transparent !important; border: none !important; padding: 0 !important; border-radius: 0 !important; min-height: 0 !important; height: auto !important; }\n .perp-order-form .group input { color: #ffffff !important; }\n .perp-slider { -webkit-appearance: none; appearance: none; background: transparent; cursor: pointer; width: 100%; height: 16px; }\n .perp-slider::-webkit-slider-runnable-track { height: 4px; border-radius: 2px; background: #1c1c1c; }\n .perp-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; border-radius: 50%; background: #C7FF2E; margin-top: -4px; border: none; }\n .perp-slider::-moz-range-track { height: 4px; border-radius: 2px; background: #1c1c1c; border: none; }\n .perp-slider::-moz-range-thumb { width: 12px; height: 12px; border-radius: 50%; background: #C7FF2E; border: none; }\n `}</style>\n <input\n type=\"range\"\n value={Math.round(positionPercent)}\n onChange={(e) => handlePositionSlider(Number(e.target.value))}\n min={0}\n max={100}\n step={1}\n className=\"perp-slider\"\n />\n <div\n className=\"flex justify-between\"\n style={{ fontSize: 10, color: \"#b5b5b5\", marginTop: 4 }}\n >\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n {/* TP/SL + Est. Liq. Price */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\" style={{ gap: 6 }}>\n <div\n onClick={() => setShowTpSl((v) => !v)}\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: \"1px solid #2a2a2a\",\n backgroundColor: showTpSl ? \"#C7FF2E\" : \"transparent\",\n flexShrink: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {showTpSl && (\n <svg width=\"10\" height=\"8\" viewBox=\"0 0 10 8\" fill=\"none\">\n <path\n d=\"M1 4L3.5 6.5L9 1\"\n stroke=\"#000000\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n <span\n style={{ fontSize: 12, fontWeight: 500, color: \"#b5b5b5\" }}\n >\n TP/SL\n </span>\n </div>\n <div style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n <span>Est. Liq. Price: </span>\n <span style={{ color: \"#b5b5b5\" }}>\n {liquidationPrice ? formatNumber(liquidationPrice, 2) : \"--\"}\n </span>\n </div>\n </div>\n\n {/* TP Price inputs (visible when TP/SL checked) */}\n {showTpSl && (\n <div className=\"flex\" style={{ gap: 8 }}>\n <div className=\"flex-1\">\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n TP Price\n </span>\n <RHNumberInput\n name=\"takeProfitPrice\"\n placeholder=\"Enter TP price\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n <div style={{ width: 70 }}>\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n TP %\n </span>\n <RHNumberInput\n name=\"takeProfitPercent\"\n placeholder=\"0.0\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n </div>\n )}\n\n {/* Add More Funds */}\n <button\n type=\"button\"\n className=\"w-full cursor-pointer transition-colors\"\n style={{\n height: 36,\n fontSize: 14,\n fontWeight: 700,\n color: \"#000000\",\n backgroundColor: \"#C7FF2E\",\n borderRadius: 9999,\n border: \"none\",\n }}\n >\n Add More Funds\n </button>\n\n {/* SL Price inputs (visible when TP/SL checked) */}\n {showTpSl && (\n <div className=\"flex\" style={{ gap: 8 }}>\n <div className=\"flex-1\">\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n SL Price\n </span>\n <RHNumberInput\n name=\"stopLossPrice\"\n placeholder=\"Enter SL price\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n <div style={{ width: 70 }}>\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n SL %\n </span>\n <RHNumberInput\n name=\"stopLossPercent\"\n placeholder=\"0.0\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n </div>\n )}\n </div>\n </RHForm>\n </div>\n\n {/* Account info + branding footer */}\n <div\n style={{\n padding: \"10px 16px\",\n fontSize: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div className=\"flex justify-between items-center\">\n <span style={{ color: \"#6b6b6b\" }}>Available Margin</span>\n <span style={{ color: \"#C7FF2E\", fontSize: 12, fontWeight: 500 }}>\n {formatNumber(availableMargin)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span style={{ color: \"#6b6b6b\" }}>Perps Account Value</span>\n <span style={{ color: \"#b5b5b5\", fontSize: 12 }}>\n {formatNumber(accountValue)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span style={{ color: \"#6b6b6b\" }}>Current Position</span>\n <span style={{ color: \"#b5b5b5\", fontSize: 12 }}>\n {currentPosition ? formatNumber(currentPosition) : \"--\"}\n </span>\n </div>\n <div\n className=\"flex items-center justify-end\"\n style={{ gap: 6, paddingTop: 8 }}\n >\n <span style={{ fontSize: 11, color: \"#6b6b6b\" }}>powered by</span>\n <img\n src=\"https://axiom-assets.sfo3.cdn.digitaloceanspaces.com/images/hyperliquid-logo.svg\"\n alt=\"Hyperliquid\"\n className=\"h-3 opacity-60\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = \"none\";\n }}\n />\n </div>\n </div>\n\n {/* Leverage modal */}\n {showLeverageModal && (\n <LeverageModal\n leverage={leverage}\n maxLeverage={maxLeverage}\n onLeverageChange={(v) => methods.setValue(\"leverage\", v)}\n onClose={() => setShowLeverageModal(false)}\n />\n )}\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 maxLeverage?: number;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n};\n\nexport function PlaceOrderFormWidget({\n symbol,\n userAddress,\n maxLeverage,\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 maxLeverage: resolvedMaxLeverage,\n } = usePlaceOrderFormScript({\n symbol,\n userAddress,\n maxLeverage,\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 maxLeverage={resolvedMaxLeverage}\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 const headerRow = (\n <tr style={{ borderBottom: \"1px solid #1c1c1c\" }}>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Asset\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Position\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Position Value\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Entry Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Mark Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Liquidation\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n {\"Margin Used (PNL) \\u2193\"}\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n TP\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n SL\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Close\n </th>\n </tr>\n );\n\n if (positions.length === 0) {\n return (\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 12 }}>\n <thead>{headerRow}</thead>\n </table>\n <div\n className=\"flex items-center justify-center\"\n style={{ fontSize: 14, color: \"#b5b5b5\", padding: \"24px 0\" }}\n >\n No open positions\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 12 }}>\n <thead>{headerRow}</thead>\n <tbody>\n {positions.map((position) => {\n const isProfitable = position.unrealizedPnl >= 0;\n const pnlColor = isProfitable ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <tr\n key={position.symbol}\n className=\"hover:bg-neutral-900/50\"\n style={{ borderBottom: \"1px solid #1c1c1c\" }}\n >\n {/* Asset */}\n <td className=\"py-1.5 px-3\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\" style={{ color: \"#ffffff\" }}>\n {position.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n position.side === \"long\"\n ? \"text-bullish\"\n : \"text-bearish\",\n )}\n >\n {position.leverage}x {position.side.toUpperCase()}\n </span>\n </div>\n </td>\n\n {/* Position */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(position.quantity)}\n </td>\n\n {/* Position Value */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatNumber(position.notionalValue)}\n </td>\n\n {/* Entry Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatPrice(position.entryPrice)}\n </td>\n\n {/* Mark Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatPrice(position.markPrice)}\n </td>\n\n {/* Liquidation Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {position.liquidationPrice\n ? `$${formatPrice(position.liquidationPrice)}`\n : \"-\"}\n </td>\n\n {/* Margin Used (PnL) */}\n <td className=\"py-1.5 px-3 text-right\">\n <div className=\"flex flex-col items-end\">\n <span style={{ color: \"#ffffff\" }}>\n ${formatNumber(position.margin)}\n </span>\n <span className={pnlColor}>\n {formatPnl(position.unrealizedPnl)} (\n {formatPnlPercent(position.unrealizedPnlPercent)})\n </span>\n </div>\n </td>\n\n {/* TP */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\n -\n </td>\n\n {/* SL */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\n -\n </td>\n\n {/* Close */}\n <td className=\"py-1.5 px-3 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/** Loading skeleton for positions panel */\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/** Empty state when there are no open positions */\nexport function PositionsEmpty() {\n return (\n <div\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 14, color: \"#b5b5b5\" }}\n >\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 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\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n No open orders\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 11 }}>\n <thead>\n <tr style={{ borderBottom: \"1px solid #1c1c1c\" }}>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Asset\n </th>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Type\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Amount\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Filled\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Remaining\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Status\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Time\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {orders.map((order) => {\n return (\n <tr\n key={order.orderId}\n className=\"hover:bg-neutral-900/50\"\n style={{ borderBottom: \"1px solid #1c1c1c\" }}\n >\n {/* Asset */}\n <td className=\"py-1.5 px-3\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\" style={{ color: \"#ffffff\" }}>\n {order.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n order.side === \"long\" ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {order.side.toUpperCase()}\n {order.leverage ? ` ${order.leverage}x` : \"\"}\n </span>\n </div>\n </td>\n\n {/* Type */}\n <td\n className=\"py-1.5 px-3 capitalize\"\n style={{ color: \"#ffffff\" }}\n >\n {order.orderType}\n </td>\n\n {/* Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {order.orderType === \"market\" ? (\n <span style={{ color: \"#b5b5b5\" }}>Market</span>\n ) : (\n `$${formatPrice(order.price)}`\n )}\n </td>\n\n {/* Amount */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(order.quantity)}\n </td>\n\n {/* Filled */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(order.filledQuantity)}\n </td>\n\n {/* Remaining */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(order.remainingQuantity)}\n </td>\n\n {/* Status */}\n <td className=\"py-1.5 px-3 text-right\">\n <span\n className={cn(\n \"px-2 py-0.5 rounded\",\n \"text-[11px]\",\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\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\n {formatTime(order.timestamp)}\n </td>\n\n {/* Action */}\n <td className=\"py-1.5 px-3 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-[11px]\" style={{ color: \"#6b6d7a\" }}>\n -\n </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\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\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 const selected = timeRange === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"rounded px-3 transition-colors\",\n !selected && \"hover:bg-[#1A1A1A]\",\n )}\n style={{\n height: 24,\n fontSize: 11,\n border: \"1px solid #1c1c1c\",\n backgroundColor: selected ? \"#1c1c1c\" : \"transparent\",\n color: selected ? \"#ffffff\" : \"#b5b5b5\",\n }}\n onClick={() => onTimeRangeChange(option.value)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n\n {/* Trade history table */}\n {trades.length === 0 ? (\n <div\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n No trade history\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 11 }}>\n <thead>\n <tr style={{ borderBottom: \"1px solid #1c1c1c\" }}>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Asset\n </th>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Side\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Quantity\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Fee\n </th>\n <th\n className=\"text-center py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Maker/Taker\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Time\n </th>\n </tr>\n </thead>\n <tbody>\n {trades.map((trade) => (\n <tr\n key={trade.tradeId}\n className=\"hover:bg-neutral-900/50\"\n style={{ borderBottom: \"1px solid #1c1c1c\" }}\n >\n {/* Asset */}\n <td\n className=\"py-1.5 px-3 font-medium\"\n style={{ color: \"#ffffff\" }}\n >\n {trade.symbol.split(\"-\")[0]}\n </td>\n\n {/* Side */}\n <td className=\"py-1.5 px-3\">\n <span\n className={cn(\n \"px-2 py-0.5 rounded text-[11px]\",\n trade.side === \"long\"\n ? \"bg-bullish/20 text-bullish\"\n : \"bg-bearish/20 text-bearish\",\n )}\n >\n {trade.side.toUpperCase()}\n </span>\n </td>\n\n {/* Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatPrice(trade.price)}\n </td>\n\n {/* Quantity */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(trade.quantity)}\n </td>\n\n {/* Fee */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatNumber(trade.fee, 4)} {trade.feeCurrency}\n </td>\n\n {/* Maker/Taker */}\n <td className=\"py-1.5 px-3 text-center\">\n <span\n className={cn(\n \"px-2 py-0.5 rounded text-[11px]\",\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\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\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\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\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/client/liberfi/LiberFiPerpetualsClient.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","trades","isLong","t","userAddress","subscriptionType","statusCode","responseBody","LiberFiApiError","DEFAULT_WS_ENDPOINT","DEFAULT_TIMEOUT_MS","LiberFiPerpetualsClient","path","query","key","value","qs","method","text","safeText","err","result","fills","prepared","signature","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","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","fallback","base","patch","formatCountdown","seconds","hours","minutes","secs","formatNumber","num","decimals","formatPrice","CoinInfoUI","indexPrice","volume24h","openInterest","fundingRate","safeChange24h","safeFundingRate","isPositiveChange","changePercent","CoinInfoWidget","isLoading","useSearchCoinsScript","onSelectCoin","searchQuery","setSearchQuery","coins","setCoins","coinSymbols","isLoadingSymbols","marketsData","isLoadingMarkets","filteredCoins","useMemo","SearchCoinsUI","onSearchChange","SearchIcon","e","fundingPercent","isPositiveFunding","tokenName","target","SearchCoinsWidget","className","handleSelectCoin","aggregateByPrecision","levels","precision","aggregated","roundedPrice","existing","calculateTotalsAndPercentages","total","withTotals","usdAmount","maxTotal","useOrderBookScript","initialPrecision","orderBook","setOrderBook","setPrecision","aggregatedBids","aggregatedAsks","sortedBids","a","b","sortedAsks","bestBid","spread","spreadPercentage","formatQuantity","qty","OBRow","percentage","side","onClick","isAsk","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","maxLeverageProp","onSuccess","onError","setSide","orderType","setOrderType","form","useForm","isSubmitting","watchedValues","amount","leverage","estimatedFee","estimatedTotal","liquidationPrice","maintenanceMarginRate","positionsData","accountValue","availableMargin","currentPosition","handleSubmit","finalPrice","takeProfitPrice","stopLossPrice","tpPercent","slPercent","LeverageModal","maxLeverage","onLeverageChange","onClose","presets","v","Slider","preset","cn","PlaceOrderFormUI","methods","onSideChange","onOrderTypeChange","onSubmit","showLeverageModal","setShowLeverageModal","showTpSl","setShowTpSl","tokenSymbol","positionPercent","handlePositionSlider","pct","maxAmount","tab","RHForm","RHNumberInput","PlaceOrderFormWidget","resolvedMaxLeverage","usePositionsScript","onCloseSuccess","onCloseError","setPositions","realtimePosition","isClosing","prevPositions","existingIndex","newPositions","handleClosePosition","position","closeSide","formatPnl","pnl","formatPnlPercent","percent","PositionsUI","onClosePosition","headerRow","pnlColor","Button","PositionsSkeleton","PositionsEmpty","PositionsWidget","useOpenOrdersScript","onCancelSuccess","onCancelError","setOrders","ordersData","realtimeOrder","isCanceling","prevOrders","o","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","option","selected","Fragment","pageNum","TradeHistorySkeleton","TradeHistoryEmpty","TradeHistoryWidget","goToNextPage","goToPreviousPage","goToPage"],"mappings":"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","file":"index.mjs","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.2.1\";\n}\n\nexport default \"0.2.1\";\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 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 Position,\n Order,\n TradeHistory,\n} from \"../../types\";\nimport { WebSocketManager } from \"../hyperliquid/WebSocketManager\";\n\n// ===== Public configuration & errors ============================================\n\n/**\n * `signTypedData` is invoked once per place / cancel during the\n * `prepare → submit` flow. The hosting app injects this so the user's wallet\n * (privy / wagmi / etc.) controls the keys — perpetuals-server never sees them.\n *\n * The `typedData` argument is the EIP-712 envelope returned verbatim by the\n * server. The function must return the resulting compact signature as a\n * `0x`-prefixed hex string.\n */\nexport type SignTypedDataFn = (\n typedData: Record<string, unknown>,\n) => Promise<`0x${string}`>;\n\n/** Configuration for {@link LiberFiPerpetualsClient}. */\nexport interface LiberFiPerpetualsClientConfig {\n /**\n * REST base URL, with NO trailing slash. Examples:\n * - Local dev: `http://localhost:8080`\n * - Staging: `https://api.liberfi.io/staging/perpetuals`\n * - Production: `https://api.liberfi.io/perpetuals`\n *\n * The client appends `/v1/...` paths to this value.\n */\n baseUrl: string;\n\n /**\n * Optional WebSocket endpoint. Real-time data is NOT proxied by\n * perpetuals-server today — the WS subscription methods connect directly to\n * the upstream exchange. Defaults to Hyperliquid mainnet.\n */\n wsEndpoint?: string;\n\n /**\n * EIP-712 signer injected by the hosting app. REQUIRED for `placeOrder` /\n * `cancelOrder`; read-only methods work without it.\n */\n signTypedData?: SignTypedDataFn;\n\n /**\n * Per-request timeout in milliseconds. Defaults to 30 000 ms.\n */\n timeout?: number;\n\n /**\n * Optional provider override sent as `?provider=...`. Defaults to the server\n * configuration (currently `hyperliquid`). Only set this when the gateway\n * has multiple providers configured and you want a non-default one.\n */\n provider?: string;\n\n /**\n * Optional extra request headers (auth tokens, tracing, etc.) merged into\n * every fetch.\n */\n headers?: Record<string, string>;\n}\n\n/** Thrown when perpetuals-server returns a non-2xx HTTP status. */\nexport class LiberFiApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly responseBody: string,\n ) {\n super(message);\n this.name = \"LiberFiApiError\";\n }\n}\n\nconst DEFAULT_WS_ENDPOINT = \"wss://api.hyperliquid.xyz/ws\";\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n// ===== Server-side wire types (mirror perpetuals-server/internal/domain) =======\n//\n// These intentionally use snake-free camelCase exactly matching the Go\n// `json:\"…\"` tags. They are kept private so consumers depend only on the\n// stable IPerpetualsClient surface above.\n\ninterface CoinDTO {\n symbol: string;\n name: string;\n tickSize?: number;\n stepSize?: number;\n minOrderSize?: number;\n maxLeverage?: number;\n}\n\ntype MarketDTO = MarketData;\ntype OrderBookDTO = OrderBook;\ntype TradeDTO = Trade;\ntype KlineDTO = Kline;\n\ninterface AccountDTO {\n totalEquity: number;\n availableBalance: number;\n totalUnrealizedPnl: number;\n usedMargin?: number;\n accountLeverage?: number;\n}\n\ninterface PositionsResultDTO {\n positions: Position[];\n account?: AccountDTO;\n}\n\ntype OrderDTO = Order;\n\ninterface UserFillDTO {\n tradeId: string;\n orderId: string;\n symbol: string;\n side: \"long\" | \"short\";\n price: number;\n quantity: number;\n fee: number;\n feeCurrency: string;\n isMaker: boolean;\n timestamp: number;\n}\n\ninterface PreparedActionDTO {\n typedData: Record<string, unknown>;\n action: Record<string, unknown>;\n nonce: number;\n vaultAddress?: string;\n}\n\ntype PlaceOrderResultDTO = PlaceOrderResult;\ntype CancelOrderResultDTO = CancelOrderResult;\n\n// ===== Implementation ============================================================\n\n/**\n * REST + injected-signer implementation of {@link IPerpetualsClient} that talks\n * to a deployed `perpetuals-server` instead of Hyperliquid directly.\n *\n * - Read-only methods are plain `fetch GET`s.\n * - `placeOrder` / `cancelOrder` follow the two-phase flow:\n * 1. POST `…/prepare` → server builds upstream action + EIP-712 typed data.\n * 2. Host wallet signs `typedData` via the injected `signTypedData`.\n * 3. POST `…/submit` with the original `action`, the user signature, and\n * the server-issued `nonce`. The server forwards to upstream and\n * normalises the response.\n * - WebSocket subscriptions are NOT proxied through perpetuals-server today.\n * They reuse the existing {@link WebSocketManager} pointed at the upstream\n * exchange (`wsEndpoint`, default Hyperliquid mainnet).\n */\nexport class LiberFiPerpetualsClient implements IPerpetualsClient {\n private readonly baseUrl: string;\n private readonly wsEndpoint: string;\n private readonly timeout: number;\n private readonly provider?: string;\n private readonly headers?: Record<string, string>;\n private readonly signTypedData?: SignTypedDataFn;\n private wsManager: WebSocketManager | null = null;\n\n constructor(config: LiberFiPerpetualsClientConfig) {\n if (!config.baseUrl) {\n throw new Error(\n \"LiberFiPerpetualsClient: `baseUrl` is required (e.g. https://api.liberfi.io/perpetuals).\",\n );\n }\n this.baseUrl = config.baseUrl.replace(/\\/+$/, \"\");\n this.wsEndpoint = config.wsEndpoint ?? DEFAULT_WS_ENDPOINT;\n this.timeout = config.timeout ?? DEFAULT_TIMEOUT_MS;\n this.provider = config.provider;\n this.headers = config.headers;\n this.signTypedData = config.signTypedData;\n }\n\n // ── Internal helpers ──────────────────────────────────────────────────────\n\n /** Build a fully-qualified URL with optional query string. */\n private url(\n path: string,\n query?: Record<string, string | undefined>,\n ): string {\n const params = new URLSearchParams();\n if (this.provider) params.set(\"provider\", this.provider);\n if (query) {\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === \"\") continue;\n params.set(key, value);\n }\n }\n const qs = params.toString();\n return `${this.baseUrl}${path}${qs ? `?${qs}` : \"\"}`;\n }\n\n /** Common fetch wrapper with timeout + structured error mapping. */\n private async request<T>(\n method: \"GET\" | \"POST\",\n url: string,\n body?: unknown,\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n method,\n headers: {\n Accept: \"application/json\",\n ...(method === \"POST\" ? { \"Content-Type\": \"application/json\" } : {}),\n ...this.headers,\n },\n body: method === \"POST\" ? JSON.stringify(body ?? {}) : undefined,\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const text = await safeText(response);\n throw new LiberFiApiError(\n `HTTP ${response.status} ${response.statusText} from ${method} ${url}`,\n response.status,\n text,\n );\n }\n\n // 204 No Content / empty body — return undefined cast to T.\n if (response.status === 204) return undefined as T;\n const data = (await response.json()) as T;\n return data;\n } catch (err: unknown) {\n if (err instanceof LiberFiApiError) throw err;\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new LiberFiApiError(\n `Request timeout after ${this.timeout}ms: ${method} ${url}`,\n 408,\n \"\",\n );\n }\n const message = err instanceof Error ? err.message : String(err);\n throw new LiberFiApiError(\n `Network error: ${method} ${url}: ${message}`,\n 0,\n \"\",\n );\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n // ── IPerpetualsClient: market data ────────────────────────────────────────\n\n async getSupportedCoins(): Promise<string[]> {\n const coins = await this.request<CoinDTO[]>(\"GET\", this.url(\"/v1/coins\"));\n return coins.map((coin) => coin.symbol);\n }\n\n async getMarket(symbol: string): Promise<MarketData | null> {\n try {\n return await this.request<MarketDTO>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}`),\n );\n } catch (err) {\n if (err instanceof LiberFiApiError && err.statusCode === 404) return null;\n throw err;\n }\n }\n\n async getMarkets(symbols?: string[]): Promise<MarketData[]> {\n const query =\n symbols && symbols.length > 0\n ? { symbols: symbols.join(\",\") }\n : undefined;\n return this.request<MarketDTO[]>(\"GET\", this.url(\"/v1/markets\", query));\n }\n\n async getKlines(\n symbol: string,\n interval: KlineInterval,\n limit: number = 100,\n ): Promise<Kline[]> {\n return this.request<KlineDTO[]>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}/klines`, {\n interval,\n limit: String(limit),\n }),\n );\n }\n\n async getOrderBook(\n symbol: string,\n maxLevel: number = 10,\n ): Promise<OrderBook> {\n return this.request<OrderBookDTO>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}/orderbook`, {\n maxLevel: String(maxLevel),\n }),\n );\n }\n\n async getRecentTrades(symbol: string, limit: number = 50): Promise<Trade[]> {\n return this.request<TradeDTO[]>(\n \"GET\",\n this.url(`/v1/markets/${encodeURIComponent(symbol)}/trades`, {\n limit: String(limit),\n }),\n );\n }\n\n // ── IPerpetualsClient: account ────────────────────────────────────────────\n\n async getPositions(\n params: GetPositionsParams = {},\n ): Promise<GetPositionsResult> {\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.getPositions requires `userAddress`.\",\n );\n }\n const result = await this.request<PositionsResultDTO>(\n \"GET\",\n this.url(\n `/v1/users/${encodeURIComponent(params.userAddress)}/positions`,\n { symbol: params.symbol },\n ),\n );\n\n return {\n positions: result.positions,\n totalEquity: result.account?.totalEquity,\n availableBalance: result.account?.availableBalance,\n totalUnrealizedPnl: result.account?.totalUnrealizedPnl,\n raw: result,\n };\n }\n\n async getOpenOrders(\n params: GetOpenOrdersParams = {},\n ): Promise<GetOpenOrdersResult> {\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.getOpenOrders requires `userAddress`.\",\n );\n }\n const orders = await this.request<OrderDTO[]>(\n \"GET\",\n this.url(`/v1/users/${encodeURIComponent(params.userAddress)}/orders`, {\n symbol: params.symbol,\n }),\n );\n return { orders, totalCount: orders.length, raw: orders };\n }\n\n async getTrades(params: GetTradesParams = {}): Promise<GetTradesResult> {\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.getTrades requires `userAddress`.\",\n );\n }\n const fills = await this.request<UserFillDTO[]>(\n \"GET\",\n this.url(`/v1/users/${encodeURIComponent(params.userAddress)}/fills`, {\n symbol: params.symbol,\n limit: params.limit !== undefined ? String(params.limit) : undefined,\n startTime:\n params.startTime !== undefined ? String(params.startTime) : undefined,\n endTime:\n params.endTime !== undefined ? String(params.endTime) : undefined,\n }),\n );\n const trades: TradeHistory[] = fills.map((fill) => ({\n tradeId: fill.tradeId,\n orderId: fill.orderId,\n symbol: fill.symbol,\n side: fill.side,\n price: fill.price,\n quantity: fill.quantity,\n fee: fill.fee,\n feeCurrency: fill.feeCurrency,\n isMaker: fill.isMaker,\n timestamp: fill.timestamp,\n }));\n return { trades, totalCount: trades.length, raw: fills };\n }\n\n // ── IPerpetualsClient: trading (two-phase signing) ────────────────────────\n\n async placeOrder(params: PlaceOrderParams): Promise<PlaceOrderResult> {\n if (!this.signTypedData) {\n throw new Error(\n \"LiberFiPerpetualsClient.placeOrder requires `signTypedData` to be configured.\",\n );\n }\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.placeOrder requires `userAddress` (the signing wallet).\",\n );\n }\n\n const prepared = await this.request<PreparedActionDTO>(\n \"POST\",\n this.url(\"/v1/orders/prepare\"),\n {\n userAddress: params.userAddress,\n symbol: params.symbol,\n side: params.side,\n orderType: params.orderType,\n amount: params.amount,\n price: params.price,\n leverage: params.leverage,\n reduceOnly: params.reduceOnly,\n takeProfitPrice: params.takeProfitPrice,\n stopLossPrice: params.stopLossPrice,\n clientOrderId: params.clientOrderId,\n },\n );\n\n const signature = await this.signTypedData(prepared.typedData);\n\n return this.request<PlaceOrderResultDTO>(\n \"POST\",\n this.url(\"/v1/orders/submit\"),\n {\n action: prepared.action,\n signature,\n nonce: prepared.nonce,\n vaultAddress: prepared.vaultAddress,\n },\n );\n }\n\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n if (!this.signTypedData) {\n throw new Error(\n \"LiberFiPerpetualsClient.cancelOrder requires `signTypedData` to be configured.\",\n );\n }\n if (!params.userAddress) {\n throw new Error(\n \"LiberFiPerpetualsClient.cancelOrder requires `userAddress` (the signing wallet).\",\n );\n }\n\n const prepared = await this.request<PreparedActionDTO>(\n \"POST\",\n this.url(\"/v1/orders/cancel/prepare\"),\n {\n userAddress: params.userAddress,\n symbol: params.symbol,\n orderId: params.orderId,\n clientOrderId: params.clientOrderId,\n },\n );\n\n const signature = await this.signTypedData(prepared.typedData);\n\n return this.request<CancelOrderResultDTO>(\n \"POST\",\n this.url(\"/v1/orders/cancel/submit\"),\n {\n action: prepared.action,\n signature,\n nonce: prepared.nonce,\n vaultAddress: prepared.vaultAddress,\n },\n );\n }\n\n // ── IPerpetualsClient: WebSocket (direct upstream, NOT proxied) ───────────\n\n async connectWebSocket(): Promise<void> {\n if (!this.wsManager) {\n this.wsManager = new WebSocketManager(this.wsEndpoint);\n }\n if (this.wsManager.isConnectedNow()) return;\n await this.wsManager.connect();\n }\n\n disconnectWebSocket(): void {\n if (this.wsManager) {\n this.wsManager.disconnect();\n this.wsManager = null;\n }\n }\n\n subscribeMarketData(\n type: \"ticker\" | \"trades\" | \"orderBook\",\n symbol: string,\n callback: (data: unknown) => void,\n ): string {\n return this.requireWS().subscribe(type, symbol, callback);\n }\n\n subscribeCandles(\n symbol: string,\n interval: KlineInterval,\n callback: (candle: Kline) => void,\n ): string {\n return this.requireWS().subscribe(\n \"candle\",\n `${symbol}:${interval}`,\n callback,\n );\n }\n\n subscribeUserData(\n type: \"orders\" | \"positions\" | \"fills\",\n userAddress: string,\n callback: (data: unknown) => void,\n ): string {\n const channel = type === \"fills\" ? \"userFills\" : \"userEvents\";\n return this.requireWS().subscribe(channel, userAddress, callback);\n }\n\n unsubscribe(subscriptionId: string): void {\n if (this.wsManager) {\n this.wsManager.unsubscribe(subscriptionId);\n }\n }\n\n private requireWS(): WebSocketManager {\n if (!this.wsManager) {\n throw new Error(\n \"WebSocket not connected. Call connectWebSocket() first.\",\n );\n }\n return this.wsManager;\n }\n}\n\nasync function safeText(response: Response): Promise<string> {\n try {\n return await response.text();\n } catch {\n return \"\";\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.toLocaleString(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n }\n if (price >= 1) {\n return price.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 4,\n });\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.toFixed(2);\n\n return (\n <div\n className=\"flex items-center px-4\"\n style={{ minHeight: 64, maxHeight: 64, gap: 16 }}\n >\n <div className=\"flex items-baseline\" style={{ gap: 8 }}>\n <span\n style={{\n fontSize: 18,\n fontWeight: 500,\n lineHeight: \"23px\",\n letterSpacing: \"-0.36px\",\n color: \"#ffffff\",\n }}\n >\n {formatPrice(price)}\n </span>\n <span\n style={{\n fontSize: 12,\n fontWeight: 400,\n lineHeight: \"16px\",\n color: isPositiveChange ? \"#C7FF2E\" : \"#F76816\",\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n </div>\n\n <div className=\"flex items-center\" style={{ gap: 16 }}>\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n Oracle Price\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\n {indexPrice ? formatPrice(indexPrice) : \"-\"}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n 24h Volume\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\n {formatNumber(volume24h, 0)}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n Open Interest\n </span>\n <span\n style={{\n fontSize: 13,\n fontWeight: 400,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\n {formatNumber(openInterest * (marketData.markPrice || price))}\n </span>\n </div>\n\n <div className=\"flex flex-col\">\n <span\n style={{\n fontSize: 12,\n color: \"#b5b5b5\",\n lineHeight: \"16px\",\n letterSpacing: \"-0.12px\",\n }}\n >\n Funding / Countdown\n </span>\n <div className=\"flex items-center\" style={{ gap: 8 }}>\n <span\n style={{\n fontSize: 13,\n lineHeight: \"17px\",\n color: safeFundingRate >= 0 ? \"#C7FF2E\" : \"#F76816\",\n }}\n >\n {(safeFundingRate * 100).toFixed(5)}%\n </span>\n <span\n style={{\n fontSize: 13,\n lineHeight: \"17px\",\n color: \"#ffffff\",\n }}\n >\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 { SearchIcon } 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\n className=\"flex flex-col\"\n style={{ backgroundColor: \"#1A1A1A\", flex: \"1 1 0\", minHeight: 0 }}\n >\n <div style={{ padding: \"16px 16px 12px\" }}>\n <div\n className=\"flex items-center\"\n style={{\n height: 32,\n border: \"1px solid #2a2a2a\",\n borderRadius: 4,\n padding: \"0 6px 0 12px\",\n gap: 8,\n }}\n >\n <SearchIcon\n className=\"flex-shrink-0\"\n style={{ width: 14, height: 14, color: \"#6b6b6b\" }}\n />\n <input\n type=\"text\"\n placeholder=\"Search coins...\"\n value={searchQuery}\n onChange={(e) => onSearchChange(e.target.value)}\n className=\"flex-1 bg-transparent outline-none\"\n style={{ fontSize: 12, color: \"#ffffff\", border: \"none\" }}\n />\n </div>\n </div>\n\n <div className=\"flex-1 overflow-auto\">\n {/* Header */}\n <div\n className=\"flex items-center\"\n style={{\n height: 28,\n padding: \"0 16px\",\n borderBottom: \"1px solid rgba(42,42,42,0.5)\",\n position: \"sticky\",\n top: 0,\n backgroundColor: \"#1A1A1A\",\n zIndex: 1,\n }}\n >\n <span style={{ flex: \"0 0 140px\", fontSize: 12, color: \"#6b6b6b\" }}>\n Token\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n Last Price\n </span>\n <span\n style={{\n flex: \"0 0 120px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n 24h Change\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n 8h Funding\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n 24h Volume\n </span>\n <span\n style={{\n flex: \"1\",\n fontSize: 12,\n color: \"#6b6b6b\",\n textAlign: \"right\",\n }}\n >\n Open Interest\n </span>\n </div>\n\n {/* Rows */}\n {isLoading ? (\n <div\n className=\"flex items-center justify-center\"\n style={{ height: 100 }}\n >\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>Loading...</span>\n </div>\n ) : coins.length === 0 ? (\n <div\n className=\"flex items-center justify-center\"\n style={{ height: 100 }}\n >\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n {searchQuery ? \"No coins found\" : \"No coins available\"}\n </span>\n </div>\n ) : (\n coins.map((coin) => {\n const isPositiveChange = coin.change24h >= 0;\n const changePercent = coin.change24h.toFixed(2);\n const fundingPercent = (coin.fundingRate * 100).toFixed(4);\n const isPositiveFunding = coin.fundingRate >= 0;\n const tokenName = coin.symbol.split(\"-\")[0];\n\n return (\n <div\n key={coin.symbol}\n className=\"flex items-center cursor-pointer transition-colors\"\n style={{\n height: 36,\n padding: \"0 16px\",\n borderBottom: \"1px solid rgba(42,42,42,0.5)\",\n }}\n onClick={() => onSelectCoin(coin.symbol)}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.backgroundColor =\n \"rgba(255,255,255,0.03)\";\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.backgroundColor =\n \"transparent\";\n }}\n >\n <div\n className=\"flex items-center\"\n style={{ flex: \"0 0 140px\", gap: 8 }}\n >\n <img\n src={`https://app.hyperliquid.xyz/coins/${tokenName}.svg`}\n alt={tokenName}\n className=\"rounded-full\"\n style={{ width: 20, height: 20 }}\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = \"none\";\n }}\n />\n <span\n style={{ fontSize: 12, fontWeight: 500, color: \"#ffffff\" }}\n >\n {tokenName}\n </span>\n </div>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#ffffff\",\n textAlign: \"right\",\n }}\n >\n {formatPrice(coin.price)}\n </span>\n <span\n style={{\n flex: \"0 0 120px\",\n fontSize: 12,\n fontWeight: 500,\n color: isPositiveChange ? \"#C7FF2E\" : \"#F76816\",\n textAlign: \"right\",\n }}\n >\n {isPositiveChange ? \"+\" : \"\"}\n {changePercent}%\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: isPositiveFunding ? \"#C7FF2E\" : \"#F76816\",\n textAlign: \"right\",\n }}\n >\n {fundingPercent}%\n </span>\n <span\n style={{\n flex: \"0 0 100px\",\n fontSize: 12,\n color: \"#b5b5b5\",\n textAlign: \"right\",\n }}\n >\n {formatNumber(coin.volume24h)}\n </span>\n <span\n style={{\n flex: \"1\",\n fontSize: 12,\n color: \"#b5b5b5\",\n textAlign: \"right\",\n }}\n >\n {formatNumber(coin.openInterest * coin.price)}\n </span>\n </div>\n );\n })\n )}\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\n className={className}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n flex: \"1 1 0\",\n minHeight: 0,\n overflow: \"hidden\",\n }}\n >\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 const usdAmount = level.quantity * level.price;\n total += usdAmount;\n return {\n ...level,\n quantity: usdAmount,\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.toLocaleString(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n });\n }\n if (price >= 1) {\n return price.toLocaleString(\"en-US\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 4,\n });\n }\n return price.toFixed(6);\n}\n\nfunction formatQuantity(qty: number): string {\n return Math.round(qty).toLocaleString(\"en-US\");\n}\n\nfunction OBRow({\n price,\n quantity,\n total,\n percentage,\n side,\n onClick,\n}: {\n price: number;\n quantity: number;\n total: number;\n percentage: number;\n side: \"ask\" | \"bid\";\n onClick?: () => void;\n}) {\n const isAsk = side === \"ask\";\n return (\n <div\n className=\"relative flex items-center cursor-pointer hover:bg-white/5 transition-colors\"\n style={{\n height: 22,\n minHeight: 22,\n maxHeight: 22,\n padding: \"0 16px\",\n gap: 16,\n fontSize: 11,\n }}\n onClick={onClick}\n >\n <div\n className=\"absolute left-0 top-0\"\n style={{\n height: 20,\n width: `${percentage}%`,\n background: isAsk\n ? \"linear-gradient(to right, rgba(247,104,22,0), #F76816)\"\n : \"linear-gradient(to right, rgba(199,255,46,0), #C7FF2E)\",\n opacity: 0.15,\n }}\n />\n <div\n className=\"relative z-10 flex items-center\"\n style={{ flex: \"1 1 0%\" }}\n >\n <span style={{ color: isAsk ? \"#F76816\" : \"#C7FF2E\", fontWeight: 400 }}>\n {formatPrice(price)}\n </span>\n </div>\n <div\n className=\"relative z-10 flex items-center justify-end\"\n style={{ flex: \"1 1 0%\", color: \"#ffffff\" }}\n >\n {formatQuantity(quantity)}\n </div>\n <div\n className=\"relative z-10 flex items-center justify-end\"\n style={{ flex: \"1 1 0%\", color: \"#ffffff\" }}\n >\n {formatQuantity(total)}\n </div>\n </div>\n );\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\n className=\"flex flex-col h-full\"\n style={{ backgroundColor: \"#000000\", fontSize: 11 }}\n >\n {/* Header */}\n <div\n className=\"flex items-center\"\n style={{\n height: 28,\n minHeight: 28,\n padding: \"0 16px\",\n gap: 16,\n color: \"#6b6b6b\",\n fontSize: 11,\n }}\n >\n <div className=\"flex items-center\" style={{ flex: \"1 1 0%\" }}>\n Price\n </div>\n <div\n className=\"flex items-center justify-end\"\n style={{ flex: \"1 1 0%\" }}\n >\n Amount (USD)\n </div>\n <div\n className=\"flex items-center justify-end\"\n style={{ flex: \"1 1 0%\" }}\n >\n Total (USD)\n </div>\n </div>\n\n {/* Asks (reversed) */}\n <div className=\"flex-1 flex flex-col-reverse overflow-hidden\">\n {reversedAsks.map((ask, index) => (\n <OBRow\n key={`ask-${ask.price}-${index}`}\n price={ask.price}\n quantity={ask.quantity}\n total={ask.total}\n percentage={ask.percentage}\n side=\"ask\"\n onClick={() => onPriceClick?.(ask.price)}\n />\n ))}\n </div>\n\n {/* Spread bar */}\n <div\n className=\"flex items-center justify-center\"\n style={{\n height: 24,\n minHeight: 24,\n padding: \"0 16px\",\n backgroundColor: \"rgba(26,26,26,0.5)\",\n }}\n >\n <div\n className=\"flex items-center\"\n style={{ gap: 12, fontSize: 12, color: \"#ffffff\" }}\n >\n <span style={{ color: \"#ffffff\" }}>Spread:</span>\n <button\n type=\"button\"\n className=\"hover:text-white transition-colors cursor-pointer\"\n style={{\n color: \"#ffffff\",\n fontWeight: 400,\n background: \"none\",\n border: \"none\",\n padding: 0,\n }}\n onClick={() => onPriceClick?.(spread)}\n >\n {spread >= 1\n ? Math.round(spread).toLocaleString(\"en-US\")\n : spread.toFixed(4)}\n </button>\n <span style={{ color: \"#ffffff\", fontWeight: 500 }}>\n {spreadPercentage.toFixed(3)}%\n </span>\n </div>\n </div>\n\n {/* Bids */}\n <div className=\"flex-1 overflow-hidden\">\n {bids.map((bid, index) => (\n <OBRow\n key={`bid-${bid.price}-${index}`}\n price={bid.price}\n quantity={bid.quantity}\n total={bid.total}\n percentage={bid.percentage}\n side=\"bid\"\n onClick={() => onPriceClick?.(bid.price)}\n />\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\" style={{ padding: \"0 16px\" }}>\n <div\n className=\"flex justify-between items-center\"\n style={{ height: 28, marginBottom: 4 }}\n >\n <Skeleton className=\"h-3 w-12 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n </div>\n {Array.from({ length: 10 }).map((_, i) => (\n <div\n key={`ask-skeleton-${i}`}\n className=\"flex justify-between items-center\"\n style={{ height: 22 }}\n >\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n </div>\n ))}\n <div className=\"flex justify-center items-center\" style={{ height: 28 }}>\n <Skeleton className=\"h-4 w-32 rounded\" />\n </div>\n {Array.from({ length: 10 }).map((_, i) => (\n <div\n key={`bid-skeleton-${i}`}\n className=\"flex justify-between items-center\"\n style={{ height: 22 }}\n >\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-14 rounded\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction OrderBookEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full\">\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 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\n className=\"flex flex-col h-full overflow-auto\"\n style={{ backgroundColor: \"#000000\", fontSize: 11 }}\n >\n {/* Header */}\n <div\n className=\"sticky top-0 z-10 flex items-center\"\n style={{\n height: 28,\n minHeight: 28,\n padding: \"0 16px\",\n gap: 16,\n color: \"#6b6b6b\",\n fontSize: 11,\n }}\n >\n <div className=\"flex-1\" style={{ maxWidth: 100 }}>\n Price\n </div>\n <div className=\"flex-1 text-right\">Amount</div>\n <div className=\"flex-1 text-right\" style={{ maxWidth: 100 }}>\n Total\n </div>\n <div className=\"flex-1 text-right\" style={{ maxWidth: 70 }}>\n Time\n </div>\n </div>\n\n {/* Rows */}\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 items-center cursor-pointer hover:bg-white/5 transition-colors\"\n style={{\n height: 22,\n minHeight: 22,\n maxHeight: 22,\n padding: \"0 16px\",\n gap: 16,\n fontSize: 11,\n }}\n onClick={() => onTradeClick?.(trade)}\n >\n <div className=\"flex-1\" style={{ maxWidth: 100 }}>\n <span\n style={{\n color: isBuy ? \"#C7FF2E\" : \"#F76816\",\n fontWeight: 400,\n }}\n >\n {formatPrice(trade.price)}\n </span>\n </div>\n <div className=\"flex-1 text-right\" style={{ color: \"#ffffff\" }}>\n {formatQuantity(trade.quantity)}\n </div>\n <div\n className=\"flex-1 text-right\"\n style={{ maxWidth: 100, color: \"#ffffff\" }}\n >\n {formatQuantity(total)}\n </div>\n <div\n className=\"flex-1 text-right\"\n style={{ maxWidth: 70, color: \"#b5b5b5\" }}\n >\n {formatTime(trade.timestamp)}\n </div>\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\" style={{ padding: \"0 16px\" }}>\n <div\n className=\"flex justify-between items-center\"\n style={{ height: 28, marginBottom: 4 }}\n >\n <Skeleton className=\"h-3 w-12 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-12 rounded\" />\n </div>\n {Array.from({ length: 12 }).map((_, i) => (\n <div\n key={`trade-skeleton-${i}`}\n className=\"flex justify-between items-center\"\n style={{ height: 22 }}\n >\n <Skeleton className=\"h-3 w-14 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-10 rounded\" />\n <Skeleton className=\"h-3 w-12 rounded\" />\n </div>\n ))}\n </div>\n );\n}\n\nfunction TradesEmpty() {\n return (\n <div className=\"flex items-center justify-center h-full\">\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 { usePositionsQuery } from \"../../hooks/usePositionsQuery\";\nimport type { OrderSide, OrderType } from \"../../types\";\n\nexport type PlaceOrderFormData = {\n price?: number;\n amount: number;\n leverage: number;\n takeProfitPrice?: number;\n takeProfitPercent?: number;\n stopLossPrice?: number;\n stopLossPercent?: number;\n};\n\nexport type UsePlaceOrderFormScriptParams = {\n symbol: string;\n userAddress?: string;\n maxLeverage?: number;\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 maxLeverage: number;\n};\n\nexport function usePlaceOrderFormScript({\n symbol,\n userAddress,\n maxLeverage: maxLeverageProp = 150,\n onSuccess,\n onError,\n}: UsePlaceOrderFormScriptParams): UsePlaceOrderFormScriptResult {\n const [side, setSide] = useState<OrderSide>(\"long\");\n const [orderType, setOrderType] = useState<OrderType>(\"market\");\n const form = useForm<PlaceOrderFormData>({\n defaultValues: {\n amount: 0,\n leverage: 20,\n takeProfitPrice: undefined,\n takeProfitPercent: undefined,\n stopLossPrice: undefined,\n stopLossPercent: undefined,\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 // Real account / position data sourced from Hyperliquid `clearinghouseState`.\n // Falls back to 0 when the wallet isn't connected (the query stays disabled\n // until `userAddress` is set; see `usePositionsQuery`'s internal guard).\n const { data: positionsData } = usePositionsQuery({\n userAddress,\n symbol,\n });\n\n const accountValue = positionsData?.totalEquity ?? 0;\n const availableMargin = positionsData?.availableBalance ?? 0;\n const currentPosition = useMemo(() => {\n const pos = positionsData?.positions?.[0];\n if (!pos) return 0;\n return pos.side === \"short\" ? -pos.quantity : pos.quantity;\n }, [positionsData?.positions]);\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 = data.takeProfitPrice;\n let stopLossPrice = data.stopLossPrice;\n\n if (\n !takeProfitPrice &&\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 (\n !stopLossPrice &&\n data.stopLossPercent &&\n data.stopLossPercent > 0 &&\n currentPrice\n ) {\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 maxLeverage: maxLeverageProp,\n };\n}\n","import { useState } from \"react\";\nimport type { UseFormReturn } from \"react-hook-form\";\nimport { 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 maxLeverage: number;\n};\n\nfunction formatNumber(num: number, decimals: number = 2): string {\n return num.toFixed(decimals);\n}\n\nfunction LeverageModal({\n leverage,\n maxLeverage,\n onLeverageChange,\n onClose,\n}: {\n leverage: number;\n maxLeverage: number;\n onLeverageChange: (v: number) => void;\n onClose: () => void;\n}) {\n const presets = [1, 2, 3, 5, 10, 20, 25, 50, 100].filter(\n (v) => v <= maxLeverage,\n );\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black/60\"\n onClick={onClose}\n onKeyDown={(e) => e.key === \"Escape\" && onClose()}\n role=\"button\"\n tabIndex={-1}\n aria-label=\"Close\"\n />\n <div className=\"relative z-10 w-72 bg-neutral-900 border border-neutral-700 rounded-lg p-4 shadow-2xl\">\n <div className=\"flex items-center justify-between mb-4\">\n <h3 className=\"text-sm font-medium text-white\">Adjust Leverage</h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-neutral-400 hover:text-white\"\n >\n <svg\n className=\"w-4 h-4\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n </div>\n\n <div className=\"text-center text-2xl font-bold text-white mb-4\">\n {leverage}x\n </div>\n\n <Slider\n value={[leverage]}\n onChange={(value: number | number[]) =>\n onLeverageChange(Array.isArray(value) ? value[0] : value)\n }\n minValue={1}\n maxValue={maxLeverage}\n step={1}\n className=\"w-full mb-3\"\n />\n\n <div className=\"flex flex-wrap gap-1.5\">\n {presets.map((preset) => (\n <button\n key={preset}\n type=\"button\"\n className={cn(\n \"px-2.5 py-1 text-xs rounded transition-colors\",\n leverage === preset\n ? \"bg-green-600 text-white\"\n : \"bg-neutral-800 text-neutral-400 hover:bg-neutral-700\",\n )}\n onClick={() => onLeverageChange(preset)}\n >\n {preset}x\n </button>\n ))}\n </div>\n\n <button\n type=\"button\"\n className=\"w-full mt-4 text-white h-9 rounded cursor-pointer transition-colors\"\n style={{ backgroundColor: \"#C7FF2E\" }}\n onClick={onClose}\n >\n Confirm\n </button>\n </div>\n </div>\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 maxLeverage,\n}: PlaceOrderFormUIProps) {\n const [showLeverageModal, setShowLeverageModal] = useState(false);\n const [showTpSl, setShowTpSl] = useState(false);\n const leverage = methods.watch(\"leverage\") || 20;\n const amount = methods.watch(\"amount\") || 0;\n const tokenSymbol = symbol.split(\"-\")[0];\n\n const positionPercent =\n availableMargin > 0 && currentPrice\n ? Math.min(\n ((amount * currentPrice) / (availableMargin * leverage)) * 100,\n 100,\n )\n : 0;\n\n const handlePositionSlider = (value: number | number[]) => {\n const pct = (Array.isArray(value) ? value[0] : value) / 100;\n if (currentPrice && currentPrice > 0) {\n const maxAmount = (availableMargin * leverage * pct) / currentPrice;\n methods.setValue(\"amount\", Number(maxAmount.toFixed(6)));\n }\n };\n\n return (\n <div\n className=\"flex flex-col h-full\"\n style={{ backgroundColor: \"#000000\" }}\n >\n <div\n className=\"perp-order-form flex-1 overflow-y-auto\"\n style={{\n padding: \"16px 16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: 16,\n }}\n >\n {/* Long / Short */}\n <div\n className=\"flex\"\n style={{\n border: \"1px solid rgba(26,26,26,0.5)\",\n borderRadius: 8,\n padding: 4,\n gap: 4,\n }}\n >\n <button\n type=\"button\"\n className=\"flex-1 cursor-pointer transition-colors\"\n style={{\n height: 32,\n fontSize: 16,\n borderRadius: 4,\n backgroundColor: side === \"long\" ? \"#C7FF2E\" : \"transparent\",\n color: side === \"long\" ? \"#000000\" : \"#b5b5b5\",\n fontWeight: side === \"long\" ? 700 : 500,\n }}\n onClick={() => onSideChange(\"long\")}\n >\n Long\n </button>\n <button\n type=\"button\"\n className=\"flex-1 cursor-pointer transition-colors\"\n style={{\n height: 32,\n fontSize: 16,\n borderRadius: 4,\n backgroundColor: side === \"short\" ? \"#F76816\" : \"transparent\",\n color: side === \"short\" ? \"#000000\" : \"#b5b5b5\",\n fontWeight: side === \"short\" ? 700 : 500,\n }}\n onClick={() => onSideChange(\"short\")}\n >\n Short\n </button>\n </div>\n\n {/* Market / Limit + Leverage button */}\n <div className=\"flex items-center\" style={{ gap: 8 }}>\n <div className=\"flex\">\n {[\n { key: \"market\" as const, label: \"Market\" },\n { key: \"limit\" as const, label: \"Limit\" },\n ].map((tab) => (\n <div\n key={tab.key}\n style={{\n height: 32,\n display: \"flex\",\n alignItems: \"center\",\n borderBottom:\n orderType === tab.key\n ? \"2px solid #ffffff\"\n : \"2px solid transparent\",\n padding: \"2px 0 0\",\n cursor: \"pointer\",\n }}\n >\n <button\n type=\"button\"\n className=\"cursor-pointer transition-colors\"\n style={{\n padding: \"0 8px\",\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: \"transparent\",\n color: orderType === tab.key ? \"#ffffff\" : \"#b5b5b5\",\n border: \"none\",\n }}\n onClick={() => onOrderTypeChange(tab.key)}\n >\n {tab.label}\n </button>\n </div>\n ))}\n </div>\n <div className=\"flex-1\" />\n <button\n type=\"button\"\n className=\"cursor-pointer transition-colors\"\n style={{\n height: 24,\n padding: \"0 5px\",\n fontSize: 12,\n borderRadius: 4,\n backgroundColor: \"rgba(26,26,26,0.5)\",\n color: \"#ffffff\",\n fontWeight: 400,\n border: \"1px solid rgba(26,26,26,0.5)\",\n }}\n onClick={() => setShowLeverageModal(true)}\n >\n Leverage: {leverage}x\n </button>\n </div>\n\n <RHForm methods={methods} onSubmit={onSubmit}>\n <div className=\"space-y-3 w-full\">\n {/* Limit price input */}\n {orderType === \"limit\" && (\n <div\n className=\"perp-price-box\"\n style={{\n borderRadius: 4,\n padding: 8,\n backgroundColor: \"rgba(26,26,26,0.5)\",\n border: \"1px solid #1c1c1c\",\n height: 64,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n }}\n >\n <div className=\"flex justify-between items-center\">\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>Price</span>\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>USDC</span>\n </div>\n <RHNumberInput\n name=\"price\"\n placeholder=\"0.0 USDC\"\n className=\"w-full\"\n />\n </div>\n )}\n\n {/* Buy Amount */}\n <div\n className=\"perp-buy-amt\"\n style={{\n borderRadius: 4,\n padding: 8,\n backgroundColor: \"rgba(26,26,26,0.5)\",\n border: \"1px solid #1c1c1c\",\n height: 64,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"center\",\n }}\n >\n <div className=\"flex justify-between items-center\">\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n Buy Amount\n </span>\n <span style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n {tokenSymbol}\n </span>\n </div>\n <RHNumberInput\n name=\"amount\"\n placeholder=\"0.0 USDC\"\n className=\"w-full\"\n />\n </div>\n\n {/* Position size slider */}\n <div>\n <style>{`\n .perp-buy-amt input, .perp-price-box input { font-size: 18px !important; line-height: 23px !important; }\n .perp-order-form .group,\n .perp-order-form .group div { background: transparent !important; border: none !important; padding: 0 !important; border-radius: 0 !important; min-height: 0 !important; height: auto !important; }\n .perp-order-form .group input { color: #ffffff !important; }\n .perp-slider { -webkit-appearance: none; appearance: none; background: transparent; cursor: pointer; width: 100%; height: 16px; }\n .perp-slider::-webkit-slider-runnable-track { height: 4px; border-radius: 2px; background: #1c1c1c; }\n .perp-slider::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; border-radius: 50%; background: #C7FF2E; margin-top: -4px; border: none; }\n .perp-slider::-moz-range-track { height: 4px; border-radius: 2px; background: #1c1c1c; border: none; }\n .perp-slider::-moz-range-thumb { width: 12px; height: 12px; border-radius: 50%; background: #C7FF2E; border: none; }\n `}</style>\n <input\n type=\"range\"\n value={Math.round(positionPercent)}\n onChange={(e) => handlePositionSlider(Number(e.target.value))}\n min={0}\n max={100}\n step={1}\n className=\"perp-slider\"\n />\n <div\n className=\"flex justify-between\"\n style={{ fontSize: 10, color: \"#b5b5b5\", marginTop: 4 }}\n >\n <span>0%</span>\n <span>25%</span>\n <span>50%</span>\n <span>75%</span>\n <span>100%</span>\n </div>\n </div>\n\n {/* TP/SL + Est. Liq. Price */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center\" style={{ gap: 6 }}>\n <div\n onClick={() => setShowTpSl((v) => !v)}\n style={{\n width: 16,\n height: 16,\n borderRadius: 4,\n border: \"1px solid #2a2a2a\",\n backgroundColor: showTpSl ? \"#C7FF2E\" : \"transparent\",\n flexShrink: 0,\n cursor: \"pointer\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n {showTpSl && (\n <svg width=\"10\" height=\"8\" viewBox=\"0 0 10 8\" fill=\"none\">\n <path\n d=\"M1 4L3.5 6.5L9 1\"\n stroke=\"#000000\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )}\n </div>\n <span\n style={{ fontSize: 12, fontWeight: 500, color: \"#b5b5b5\" }}\n >\n TP/SL\n </span>\n </div>\n <div style={{ fontSize: 12, color: \"#6b6b6b\" }}>\n <span>Est. Liq. Price: </span>\n <span style={{ color: \"#b5b5b5\" }}>\n {liquidationPrice ? formatNumber(liquidationPrice, 2) : \"--\"}\n </span>\n </div>\n </div>\n\n {/* TP Price inputs (visible when TP/SL checked) */}\n {showTpSl && (\n <div className=\"flex\" style={{ gap: 8 }}>\n <div className=\"flex-1\">\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n TP Price\n </span>\n <RHNumberInput\n name=\"takeProfitPrice\"\n placeholder=\"Enter TP price\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n <div style={{ width: 70 }}>\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n TP %\n </span>\n <RHNumberInput\n name=\"takeProfitPercent\"\n placeholder=\"0.0\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n </div>\n )}\n\n {/* Add More Funds */}\n <button\n type=\"button\"\n className=\"w-full cursor-pointer transition-colors\"\n style={{\n height: 36,\n fontSize: 14,\n fontWeight: 700,\n color: \"#000000\",\n backgroundColor: \"#C7FF2E\",\n borderRadius: 9999,\n border: \"none\",\n }}\n >\n Add More Funds\n </button>\n\n {/* SL Price inputs (visible when TP/SL checked) */}\n {showTpSl && (\n <div className=\"flex\" style={{ gap: 8 }}>\n <div className=\"flex-1\">\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n SL Price\n </span>\n <RHNumberInput\n name=\"stopLossPrice\"\n placeholder=\"Enter SL price\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n <div style={{ width: 70 }}>\n <span\n style={{\n fontSize: 12,\n color: \"#6b6b6b\",\n marginBottom: 2,\n display: \"block\",\n }}\n >\n SL %\n </span>\n <RHNumberInput\n name=\"stopLossPercent\"\n placeholder=\"0.0\"\n className=\"w-full\"\n style={{\n fontSize: 12,\n height: 32,\n padding: \"0 8px\",\n border: \"1px solid #1c1c1c\",\n borderRadius: 4,\n }}\n />\n </div>\n </div>\n )}\n </div>\n </RHForm>\n </div>\n\n {/* Account info + branding footer */}\n <div\n style={{\n padding: \"10px 16px\",\n fontSize: 12,\n display: \"flex\",\n flexDirection: \"column\",\n gap: 6,\n }}\n >\n <div className=\"flex justify-between items-center\">\n <span style={{ color: \"#6b6b6b\" }}>Available Margin</span>\n <span style={{ color: \"#C7FF2E\", fontSize: 12, fontWeight: 500 }}>\n {formatNumber(availableMargin)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span style={{ color: \"#6b6b6b\" }}>Perps Account Value</span>\n <span style={{ color: \"#b5b5b5\", fontSize: 12 }}>\n {formatNumber(accountValue)} USDC\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span style={{ color: \"#6b6b6b\" }}>Current Position</span>\n <span style={{ color: \"#b5b5b5\", fontSize: 12 }}>\n {currentPosition ? formatNumber(currentPosition) : \"--\"}\n </span>\n </div>\n <div\n className=\"flex items-center justify-end\"\n style={{ gap: 6, paddingTop: 8 }}\n >\n <span style={{ fontSize: 11, color: \"#6b6b6b\" }}>powered by</span>\n <img\n src=\"https://axiom-assets.sfo3.cdn.digitaloceanspaces.com/images/hyperliquid-logo.svg\"\n alt=\"Hyperliquid\"\n className=\"h-3 opacity-60\"\n onError={(e) => {\n const target = e.target as HTMLImageElement;\n target.style.display = \"none\";\n }}\n />\n </div>\n </div>\n\n {/* Leverage modal */}\n {showLeverageModal && (\n <LeverageModal\n leverage={leverage}\n maxLeverage={maxLeverage}\n onLeverageChange={(v) => methods.setValue(\"leverage\", v)}\n onClose={() => setShowLeverageModal(false)}\n />\n )}\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 maxLeverage?: number;\n onSuccess?: () => void;\n onError?: (error: Error) => void;\n className?: string;\n};\n\nexport function PlaceOrderFormWidget({\n symbol,\n userAddress,\n maxLeverage,\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 maxLeverage: resolvedMaxLeverage,\n } = usePlaceOrderFormScript({\n symbol,\n userAddress,\n maxLeverage,\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 maxLeverage={resolvedMaxLeverage}\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 const headerRow = (\n <tr style={{ borderBottom: \"1px solid #1c1c1c\" }}>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Asset\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Position\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Position Value\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Entry Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Mark Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Liquidation\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n {\"Margin Used (PNL) \\u2193\"}\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n TP\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n SL\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 12, color: \"#6b6b6b\" }}\n >\n Close\n </th>\n </tr>\n );\n\n if (positions.length === 0) {\n return (\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 12 }}>\n <thead>{headerRow}</thead>\n </table>\n <div\n className=\"flex items-center justify-center\"\n style={{ fontSize: 14, color: \"#b5b5b5\", padding: \"24px 0\" }}\n >\n No open positions\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 12 }}>\n <thead>{headerRow}</thead>\n <tbody>\n {positions.map((position) => {\n const isProfitable = position.unrealizedPnl >= 0;\n const pnlColor = isProfitable ? \"text-bullish\" : \"text-bearish\";\n\n return (\n <tr\n key={position.symbol}\n className=\"hover:bg-neutral-900/50\"\n style={{ borderBottom: \"1px solid #1c1c1c\" }}\n >\n {/* Asset */}\n <td className=\"py-1.5 px-3\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\" style={{ color: \"#ffffff\" }}>\n {position.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n position.side === \"long\"\n ? \"text-bullish\"\n : \"text-bearish\",\n )}\n >\n {position.leverage}x {position.side.toUpperCase()}\n </span>\n </div>\n </td>\n\n {/* Position */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(position.quantity)}\n </td>\n\n {/* Position Value */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatNumber(position.notionalValue)}\n </td>\n\n {/* Entry Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatPrice(position.entryPrice)}\n </td>\n\n {/* Mark Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatPrice(position.markPrice)}\n </td>\n\n {/* Liquidation Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {position.liquidationPrice\n ? `$${formatPrice(position.liquidationPrice)}`\n : \"-\"}\n </td>\n\n {/* Margin Used (PnL) */}\n <td className=\"py-1.5 px-3 text-right\">\n <div className=\"flex flex-col items-end\">\n <span style={{ color: \"#ffffff\" }}>\n ${formatNumber(position.margin)}\n </span>\n <span className={pnlColor}>\n {formatPnl(position.unrealizedPnl)} (\n {formatPnlPercent(position.unrealizedPnlPercent)})\n </span>\n </div>\n </td>\n\n {/* TP */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\n -\n </td>\n\n {/* SL */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\n -\n </td>\n\n {/* Close */}\n <td className=\"py-1.5 px-3 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/** Loading skeleton for positions panel */\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/** Empty state when there are no open positions */\nexport function PositionsEmpty() {\n return (\n <div\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 14, color: \"#b5b5b5\" }}\n >\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 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\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n No open orders\n </div>\n );\n }\n\n return (\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 11 }}>\n <thead>\n <tr style={{ borderBottom: \"1px solid #1c1c1c\" }}>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Asset\n </th>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Type\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Amount\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Filled\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Remaining\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Status\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Time\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Action\n </th>\n </tr>\n </thead>\n <tbody>\n {orders.map((order) => {\n return (\n <tr\n key={order.orderId}\n className=\"hover:bg-neutral-900/50\"\n style={{ borderBottom: \"1px solid #1c1c1c\" }}\n >\n {/* Asset */}\n <td className=\"py-1.5 px-3\">\n <div className=\"flex flex-col\">\n <span className=\"font-medium\" style={{ color: \"#ffffff\" }}>\n {order.symbol.split(\"-\")[0]}\n </span>\n <span\n className={cn(\n order.side === \"long\" ? \"text-bullish\" : \"text-bearish\",\n )}\n >\n {order.side.toUpperCase()}\n {order.leverage ? ` ${order.leverage}x` : \"\"}\n </span>\n </div>\n </td>\n\n {/* Type */}\n <td\n className=\"py-1.5 px-3 capitalize\"\n style={{ color: \"#ffffff\" }}\n >\n {order.orderType}\n </td>\n\n {/* Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {order.orderType === \"market\" ? (\n <span style={{ color: \"#b5b5b5\" }}>Market</span>\n ) : (\n `$${formatPrice(order.price)}`\n )}\n </td>\n\n {/* Amount */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(order.quantity)}\n </td>\n\n {/* Filled */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(order.filledQuantity)}\n </td>\n\n {/* Remaining */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(order.remainingQuantity)}\n </td>\n\n {/* Status */}\n <td className=\"py-1.5 px-3 text-right\">\n <span\n className={cn(\n \"px-2 py-0.5 rounded\",\n \"text-[11px]\",\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\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\n {formatTime(order.timestamp)}\n </td>\n\n {/* Action */}\n <td className=\"py-1.5 px-3 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-[11px]\" style={{ color: \"#6b6d7a\" }}>\n -\n </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\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\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 const selected = timeRange === option.value;\n return (\n <button\n key={option.value}\n type=\"button\"\n className={cn(\n \"rounded px-3 transition-colors\",\n !selected && \"hover:bg-[#1A1A1A]\",\n )}\n style={{\n height: 24,\n fontSize: 11,\n border: \"1px solid #1c1c1c\",\n backgroundColor: selected ? \"#1c1c1c\" : \"transparent\",\n color: selected ? \"#ffffff\" : \"#b5b5b5\",\n }}\n onClick={() => onTimeRangeChange(option.value)}\n >\n {option.label}\n </button>\n );\n })}\n </div>\n\n {/* Trade history table */}\n {trades.length === 0 ? (\n <div\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n No trade history\n </div>\n ) : (\n <>\n <div className=\"w-full overflow-x-auto bg-transparent\">\n <table className=\"w-full\" style={{ fontSize: 11 }}>\n <thead>\n <tr style={{ borderBottom: \"1px solid #1c1c1c\" }}>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Asset\n </th>\n <th\n className=\"text-left py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Side\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Price\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Quantity\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Fee\n </th>\n <th\n className=\"text-center py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Maker/Taker\n </th>\n <th\n className=\"text-right py-1.5 px-3 font-normal\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\n Time\n </th>\n </tr>\n </thead>\n <tbody>\n {trades.map((trade) => (\n <tr\n key={trade.tradeId}\n className=\"hover:bg-neutral-900/50\"\n style={{ borderBottom: \"1px solid #1c1c1c\" }}\n >\n {/* Asset */}\n <td\n className=\"py-1.5 px-3 font-medium\"\n style={{ color: \"#ffffff\" }}\n >\n {trade.symbol.split(\"-\")[0]}\n </td>\n\n {/* Side */}\n <td className=\"py-1.5 px-3\">\n <span\n className={cn(\n \"px-2 py-0.5 rounded text-[11px]\",\n trade.side === \"long\"\n ? \"bg-bullish/20 text-bullish\"\n : \"bg-bearish/20 text-bearish\",\n )}\n >\n {trade.side.toUpperCase()}\n </span>\n </td>\n\n {/* Price */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n ${formatPrice(trade.price)}\n </td>\n\n {/* Quantity */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatQuantity(trade.quantity)}\n </td>\n\n {/* Fee */}\n <td\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#ffffff\" }}\n >\n {formatNumber(trade.fee, 4)} {trade.feeCurrency}\n </td>\n\n {/* Maker/Taker */}\n <td className=\"py-1.5 px-3 text-center\">\n <span\n className={cn(\n \"px-2 py-0.5 rounded text-[11px]\",\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\n className=\"py-1.5 px-3 text-right\"\n style={{ color: \"#b5b5b5\" }}\n >\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\n className=\"flex items-center justify-center h-24\"\n style={{ fontSize: 11, color: \"#b5b5b5\" }}\n >\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"]}