@liberfi.io/react-predict 0.1.38 → 0.1.40

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/client/client.ts","../src/client/ws.ts","../src/providers/PredictContext.ts","../src/providers/PredictProvider.tsx","../src/utils/polymarket-hmac.ts","../src/providers/PolymarketContext.ts","../src/providers/PolymarketProvider.tsx","../src/hooks/predict/usePredictClient.ts","../src/hooks/predict/useEvents.ts","../src/hooks/predict/events.params.ts","../src/hooks/predict/useEvent.ts","../src/hooks/predict/useInfiniteEvents.ts","../src/hooks/predict/useSearchEvents.ts","../src/hooks/predict/useSimilarEvents.ts","../src/hooks/predict/market.params.ts","../src/hooks/predict/useMarket.ts","../src/hooks/predict/usePriceHistory.ts","../src/hooks/predict/useMarketHistory.ts","../src/hooks/predict/useOrderbook.ts","../src/hooks/predict/useMarketTrades.ts","../src/hooks/predict/useCandlesticks.ts","../src/hooks/predict/usePositions.ts","../src/hooks/predict/useBalance.ts","../src/hooks/predict/useOrders.ts","../src/hooks/predict/useInfiniteOrders.ts","../src/hooks/predict/useOrder.ts","../src/hooks/predict/useCancelOrder.ts","../src/hooks/predict/matches.params.ts","../src/hooks/predict/useMatches.ts","../src/hooks/predict/matchMarkets.params.ts","../src/hooks/predict/useMatchMarkets.ts","../src/hooks/predict/useTrades.ts","../src/hooks/predict/useInfiniteTrades.ts","../src/hooks/predict/useDFlowQuote.ts","../src/hooks/predict/useDFlowSubmit.ts","../src/hooks/predict/useDFlowKYC.ts","../src/hooks/predict/usePolymarketSetup.ts","../src/hooks/predict/useWithdrawBuildMutation.ts","../src/hooks/predict/useWithdrawSubmitMutation.ts","../src/hooks/predict/useWithdrawStatusQuery.ts","../src/hooks/predict/usePolymarketDeposit.ts","../src/hooks/predict/usePolymarketDepositAddresses.ts","../src/hooks/predict/usePolymarketWithdraw.ts","../src/hooks/predict/useTickSize.ts","../src/hooks/predict/usePredictWsClient.ts","../src/hooks/predict/usePricesSubscription.ts","../src/hooks/predict/useOrderbookSubscription.ts","../src/hooks/predict/useTradesSubscription.ts","../src/hooks/predict/useRealtimeOrderbook.ts","../src/hooks/predict/useRealtimePrices.ts","../src/hooks/predict/useRealtimeTrades.ts","../src/hooks/polymarket/usePolymarket.ts","../src/utils/polymarket-order.ts","../src/hooks/polymarket/useCreatePolymarketOrder.ts"],"names":["createContext","jsx","useQuery","useMemo","useInfiniteQuery","useQueryClient","useMutation","useContext","useState","useRef","useCallback","useEffect","TX_POLL_INTERVAL","TX_POLL_MAX_ATTEMPTS"],"mappings":"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","file":"index.mjs","sourcesContent":["import { httpGet, httpPost, httpDelete } from \"@liberfi.io/utils\";\nimport type {\n BalanceResponse,\n CancelOrderResult,\n Candlestick,\n CreateOrderInput,\n DepositBuildRequest,\n DepositBuildResponse,\n DepositSubmitRequest,\n DepositSubmitResponse,\n DepositStatusResponse,\n DFlowKYCStatus,\n DFlowQuoteRequest,\n DFlowQuoteResponse,\n DFlowSubmitRequest,\n DFlowSubmitResponse,\n ListCandlesticksParams,\n ListEventsParams,\n ListMarketTradesParams,\n ListOrdersParams,\n ListTradesParams,\n MatchesParams,\n MatchGroup,\n MatchGroupPage,\n MatchMarketParams,\n MatchMarketPage,\n Orderbook,\n PolymarketDepositAddresses,\n PolymarketSetupStatus,\n PolymarketWithdrawRequest,\n PolymarketWithdrawResponse,\n PredictEvent,\n PredictMarket,\n PredictOrder,\n PredictPage,\n PredictTrade,\n PositionsResponse,\n PriceHistoryRange,\n PriceHistoryResponse,\n ProviderSource,\n SimilarEventsParams,\n WithdrawBuildRequest,\n WithdrawBuildResponse,\n WithdrawSubmitRequest,\n WithdrawSubmitResponse,\n WithdrawStatusResponse,\n TickSizeResponse,\n} from \"./types\";\n\n/**\n * Build a URL query string from a params object.\n * `undefined` and `null` values are omitted.\n * Boolean values are serialised as \"true\" / \"false\" strings.\n */\nfunction buildQuery(params: Record<string, unknown>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/**\n * HTTP client for the prediction-server REST API.\n *\n * Covers all prediction, market, order, position, and trading endpoints.\n *\n * @example\n * ```ts\n * const client = new PredictClient(\"https://api.example.com\");\n * const page = await client.listEvents({ status: \"open\", limit: 20 });\n * const event = await client.getEvent(\"will-trump-win-2024\");\n * const market = await client.getMarket(\"will-trump-win-2024-yes\");\n * ```\n */\nexport class PredictClient {\n constructor(private readonly endpoint: string) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * List prediction events with optional filtering, sorting, and pagination.\n *\n * Maps to `GET /api/v1/events`.\n *\n * @param params - Optional query parameters (filter, sort, pagination).\n * @returns A paginated page of events.\n */\n async listEvents(\n params?: ListEventsParams,\n ): Promise<PredictPage<PredictEvent>> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/events${query}`;\n return await httpGet<PredictPage<PredictEvent>>(url);\n }\n\n /**\n * Fetch a single prediction event by its slug.\n *\n * Maps to `GET /api/v1/events/:slug?source=...`.\n *\n * @param slug - Canonical event slug (e.g. \"will-trump-win-2024\" for Polymarket\n * or \"KXBTCD-25FEB-T68000\" for Kalshi).\n * @param source - Upstream provider (`\"kalshi\"` or `\"polymarket\"`).\n * @returns The matching event.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getEvent(slug: string, source?: ProviderSource): Promise<PredictEvent> {\n const query = source ? buildQuery({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}${query}`;\n return await httpGet<PredictEvent>(url);\n }\n\n /**\n * Fetch events similar to the given slug.\n *\n * Maps to `GET /api/v1/events/:slug/similar?source=...`.\n */\n async getSimilarEvents(\n slug: string,\n source: ProviderSource,\n params?: SimilarEventsParams,\n ): Promise<PredictEvent[]> {\n const query = buildQuery({ source, ...params });\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}/similar${query}`;\n return await httpGet<PredictEvent[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Markets\n // -------------------------------------------------------------------------\n\n /**\n * Fetch a single prediction market by its slug.\n *\n * Maps to `GET /api/v1/markets/:slug?source=...`.\n *\n * @param slug - Canonical market slug.\n * @param source - Upstream provider (`\"kalshi\"` or `\"polymarket\"`).\n * @returns The matching market.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getMarket(\n slug: string,\n source?: ProviderSource,\n ): Promise<PredictMarket> {\n const query = source ? buildQuery({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}${query}`;\n return await httpGet<PredictMarket>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/orderbook?source=...`. */\n async getOrderbook(slug: string, source: ProviderSource): Promise<Orderbook> {\n const query = buildQuery({ source });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/orderbook${query}`;\n return await httpGet<Orderbook>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/trades?source=...`. */\n async listMarketTrades(\n slug: string,\n params: ListMarketTradesParams,\n ): Promise<PredictPage<PredictTrade>> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/trades${query}`;\n return await httpGet<PredictPage<PredictTrade>>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/price-history?source=...&range=...`. */\n async getPriceHistory(\n slug: string,\n source: ProviderSource,\n range?: PriceHistoryRange,\n ): Promise<PriceHistoryResponse> {\n const query = buildQuery({ source, range });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/price-history${query}`;\n return await httpGet<PriceHistoryResponse>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/candlesticks?interval=...&limit=...`. */\n async listCandlesticks(\n slug: string,\n params?: ListCandlesticksParams,\n ): Promise<Candlestick[]> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/candlesticks${query}`;\n return await httpGet<Candlestick[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Positions\n // -------------------------------------------------------------------------\n\n /**\n * Maps to `GET /api/v1/positions`.\n *\n * Single-source: `getPositions(\"addr\", \"kalshi\")`.\n * Multi-wallet: `getPositions({ kalshi_user: \"SOLaddr\", polymarket_user: \"EVMaddr\" })`.\n * Legacy agg: `getPositions(\"addr\")` (same address for all providers).\n */\n async getPositions(\n userOrWallets: string | { kalshi_user?: string; polymarket_user?: string },\n source?: ProviderSource,\n ): Promise<PositionsResponse> {\n let query: string;\n if (typeof userOrWallets === \"string\") {\n query = buildQuery({ source, user: userOrWallets });\n } else {\n query = buildQuery(userOrWallets as Record<string, unknown>);\n }\n const url = `${this.endpoint}/api/v1/positions${query}`;\n return await httpGet<PositionsResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Balance\n // -------------------------------------------------------------------------\n\n /**\n * Get the on-chain USDC balance for a wallet.\n *\n * Maps to `GET /api/v1/balance?source=...&user=...`.\n *\n * @param source - Provider source (`\"kalshi\"` for Solana, `\"polymarket\"` for Polygon).\n * @param user - Wallet address.\n */\n async getBalance(\n source: ProviderSource,\n user: string,\n ): Promise<BalanceResponse> {\n const query = buildQuery({ source, user });\n const url = `${this.endpoint}/api/v1/balance${query}`;\n return await httpGet<BalanceResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Orders\n // -------------------------------------------------------------------------\n\n /**\n * Maps to `GET /api/v1/orders?source=...&wallet_address=...`.\n *\n * @param params - Query parameters (source, wallet_address, etc.).\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async listOrders(\n params: ListOrdersParams,\n headers?: Record<string, string>,\n ): Promise<PredictPage<PredictOrder>> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/orders${query}`;\n return await httpGet<PredictPage<PredictOrder>>(\n url,\n headers ? { headers } : undefined,\n );\n }\n\n /**\n * Maps to `GET /api/v1/orders/:id?source=...`.\n *\n * @param id - Order ID.\n * @param source - Provider source.\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async getOrder(\n id: string,\n source: ProviderSource,\n headers?: Record<string, string>,\n ): Promise<PredictOrder> {\n const query = buildQuery({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpGet<PredictOrder>(url, headers ? { headers } : undefined);\n }\n\n /**\n * Maps to `DELETE /api/v1/orders/:id?source=...`.\n *\n * @param id - Order ID.\n * @param source - Provider source.\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async cancelOrder(\n id: string,\n source: ProviderSource,\n headers?: Record<string, string>,\n ): Promise<CancelOrderResult> {\n const query = buildQuery({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpDelete<CancelOrderResult>(\n url,\n headers ? { headers } : undefined,\n );\n }\n\n // -------------------------------------------------------------------------\n // Polymarket trading\n // -------------------------------------------------------------------------\n\n /**\n * Create a Polymarket limit order via the prediction-server proxy.\n *\n * Maps to `POST /api/v1/orders/polymarket`.\n *\n * The caller must attach Polymarket CLOB authentication headers:\n * - `POLY_ADDRESS` — the EVM wallet address.\n * - `POLY_SIGNATURE` — L1 signature or L2 API key.\n * - `POLY_TIMESTAMP` — Unix milliseconds string.\n * - `POLY_NONCE` — credential nonce (use `\"0\"` for in-session derived creds).\n *\n * @param input - Order parameters.\n * @param headers - Polymarket CLOB auth headers (`POLY_*`).\n */\n async createPolymarketOrder(\n input: CreateOrderInput,\n headers: Record<string, string>,\n ): Promise<PredictOrder> {\n const url = `${this.endpoint}/api/v1/orders/polymarket`;\n return await httpPost<PredictOrder>(url, input, { headers });\n }\n\n /** Maps to `GET /api/v1/polymarket/tick-size?token_id=xxx`. */\n async getPolymarketTickSize(tokenId: string): Promise<TickSizeResponse> {\n const url = `${this.endpoint}/api/v1/polymarket/tick-size?token_id=${encodeURIComponent(tokenId)}`;\n return await httpGet<TickSizeResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // DFlow trading\n // -------------------------------------------------------------------------\n\n /** Maps to `POST /api/v1/orders/kalshi/quote`. */\n async createDFlowQuote(body: DFlowQuoteRequest): Promise<DFlowQuoteResponse> {\n const url = `${this.endpoint}/api/v1/orders/kalshi/quote`;\n return await httpPost<DFlowQuoteResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/orders/kalshi/submit`. */\n async submitDFlowTransaction(\n body: DFlowSubmitRequest,\n ): Promise<DFlowSubmitResponse> {\n const url = `${this.endpoint}/api/v1/orders/kalshi/submit`;\n return await httpPost<DFlowSubmitResponse>(url, body);\n }\n\n // -------------------------------------------------------------------------\n // KYC\n // -------------------------------------------------------------------------\n\n /**\n * Check DFlow KYC verification status for a wallet address.\n *\n * Maps to `GET /api/v1/kyc/kalshi?wallet_address=...`.\n */\n async checkDFlowKYC(walletAddress: string): Promise<DFlowKYCStatus> {\n const query = buildQuery({ wallet_address: walletAddress });\n const url = `${this.endpoint}/api/v1/kyc/kalshi${query}`;\n return await httpGet<DFlowKYCStatus>(url);\n }\n\n // -------------------------------------------------------------------------\n // Polymarket wallet setup\n // -------------------------------------------------------------------------\n\n /**\n * Check Polymarket wallet setup status (Safe deployed + USDC.e approved).\n *\n * Maps to `GET /api/v1/setup/polymarket?wallet_address=...`.\n */\n async checkPolymarketSetup(\n walletAddress: string,\n ): Promise<PolymarketSetupStatus> {\n const query = buildQuery({ wallet_address: walletAddress });\n const url = `${this.endpoint}/api/v1/setup/polymarket${query}`;\n return await httpGet<PolymarketSetupStatus>(url);\n }\n\n /**\n * Run Polymarket wallet setup (deploy Safe + approve USDC.e).\n *\n * Maps to `POST /api/v1/setup/polymarket`.\n */\n async runPolymarketSetup(\n walletAddress: string,\n ): Promise<PolymarketSetupStatus> {\n const url = `${this.endpoint}/api/v1/setup/polymarket`;\n return await httpPost<PolymarketSetupStatus>(url, {\n wallet_address: walletAddress,\n });\n }\n\n // -------------------------------------------------------------------------\n // Cross-platform matches\n // -------------------------------------------------------------------------\n\n /**\n * List cross-platform matched event groups with inline aggregate stats.\n *\n * Maps to `GET /api/v1/matches`.\n */\n async listMatches(params?: MatchesParams): Promise<MatchGroupPage> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/matches${query}`;\n return await httpGet<MatchGroupPage>(url);\n }\n\n /**\n * Fetch a single match group by ID.\n *\n * Maps to `GET /api/v1/matches/:id`.\n */\n async getMatch(id: number): Promise<MatchGroup> {\n const url = `${this.endpoint}/api/v1/matches/${id}`;\n return await httpGet<MatchGroup>(url);\n }\n\n /**\n * List flattened market pairs across match groups (market-level granularity).\n *\n * Maps to `GET /api/v1/matches/markets`.\n */\n async listMatchMarkets(params?: MatchMarketParams): Promise<MatchMarketPage> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/matches/markets${query}`;\n return await httpGet<MatchMarketPage>(url);\n }\n\n // -------------------------------------------------------------------------\n // Trades by wallet\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/trades?source=...&wallet=...`. */\n async listTrades(\n params: ListTradesParams,\n ): Promise<PredictPage<PredictTrade>> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/trades${query}`;\n return await httpGet<PredictPage<PredictTrade>>(url);\n }\n\n // -------------------------------------------------------------------------\n // Withdraw\n // -------------------------------------------------------------------------\n\n /** Maps to `POST /api/v1/withdraw/build`. */\n async withdrawBuild(\n body: WithdrawBuildRequest,\n ): Promise<WithdrawBuildResponse> {\n const url = `${this.endpoint}/api/v1/withdraw/build`;\n return await httpPost<WithdrawBuildResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/withdraw/submit`. */\n async withdrawSubmit(\n body: WithdrawSubmitRequest,\n ): Promise<WithdrawSubmitResponse> {\n const url = `${this.endpoint}/api/v1/withdraw/submit`;\n return await httpPost<WithdrawSubmitResponse>(url, body);\n }\n\n /** Maps to `GET /api/v1/withdraw/status?tx_hash=...&source=...`. */\n async withdrawStatus(\n txHash: string,\n source: ProviderSource,\n ): Promise<WithdrawStatusResponse> {\n const query = buildQuery({ tx_hash: txHash, source });\n const url = `${this.endpoint}/api/v1/withdraw/status${query}`;\n return await httpGet<WithdrawStatusResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Deposit (native USDC → USDC.e for Polymarket)\n // -------------------------------------------------------------------------\n\n /**\n * Build unsigned deposit transactions (approve + Uniswap V3 swap).\n *\n * The server checks the Safe's USDC.e balance and returns only\n * the transactions needed to cover the shortfall.\n *\n * Maps to `POST /api/v1/deposit/polymarket/build`.\n */\n async depositBuild(body: DepositBuildRequest): Promise<DepositBuildResponse> {\n const url = `${this.endpoint}/api/v1/deposit/polymarket/build`;\n return await httpPost<DepositBuildResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/deposit/polymarket/submit`. */\n async depositSubmit(\n body: DepositSubmitRequest,\n ): Promise<DepositSubmitResponse> {\n const url = `${this.endpoint}/api/v1/deposit/polymarket/submit`;\n return await httpPost<DepositSubmitResponse>(url, body);\n }\n\n /** Maps to `GET /api/v1/deposit/polymarket/status?tx_hash=...&source=...`. */\n async depositStatus(\n txHash: string,\n source: ProviderSource,\n ): Promise<DepositStatusResponse> {\n const query = buildQuery({ tx_hash: txHash, source });\n const url = `${this.endpoint}/api/v1/deposit/polymarket/status${query}`;\n return await httpGet<DepositStatusResponse>(url);\n }\n\n /**\n * Get multi-chain deposit addresses for a Polymarket Safe wallet via Bridge API.\n *\n * Maps to `GET /api/v1/deposit/polymarket/addresses?safe_address=...`.\n */\n async getPolymarketDepositAddresses(\n safeAddress: string,\n ): Promise<PolymarketDepositAddresses> {\n const query = buildQuery({ safe_address: safeAddress });\n const url = `${this.endpoint}/api/v1/deposit/polymarket/addresses${query}`;\n return await httpGet<PolymarketDepositAddresses>(url);\n }\n\n // -------------------------------------------------------------------------\n // Polymarket Relayer Withdraw\n // -------------------------------------------------------------------------\n\n /**\n * Execute a gasless USDC.e withdrawal from a Polymarket Safe wallet via Relayer.\n *\n * Maps to `POST /api/v1/withdraw/polymarket/execute`.\n */\n async executePolymarketWithdraw(\n body: PolymarketWithdrawRequest,\n ): Promise<PolymarketWithdrawResponse> {\n const url = `${this.endpoint}/api/v1/withdraw/polymarket/execute`;\n return await httpPost<PolymarketWithdrawResponse>(url, body);\n }\n}\n\n/**\n * Factory function for `PredictClient`.\n *\n * @param endpoint - Base URL of the prediction-server, without a trailing slash.\n */\nexport function createPredictClient(endpoint: string): PredictClient {\n return new PredictClient(endpoint);\n}\n","/**\n * PredictWsClient — WebSocket client for prediction-server real-time data.\n *\n * Connects to `GET /api/v1/ws` (RFC 6455) and supports three channels:\n * `orderbook`, `prices`, and `trades`.\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Application-level ping/pong keepalive\n * - Subscription state tracking with automatic restore after reconnect\n * - Event-emitter pattern for typed message dispatch\n */\nimport type {\n WsChannel,\n WsChannelEvent,\n WsClientMessage,\n WsConnectionStatus,\n WsDataMessage,\n WsErrorCode,\n WsOrderbookEvent,\n WsPriceEvent,\n WsTradeEvent,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\n/** Configuration for `PredictWsClient`. */\nexport interface PredictWsClientConfig {\n /** Full WebSocket URL, e.g. `\"wss://api.example.com/api/v1/ws\"`. */\n wsUrl: string;\n /** Connect immediately on construction. Default: `true`. */\n autoConnect?: boolean;\n /** Reconnect automatically on unexpected close. Default: `true`. */\n autoReconnect?: boolean;\n /** Base delay (ms) for exponential backoff. Default: `1000`. */\n reconnectIntervalBase?: number;\n /** Maximum reconnect delay (ms). Default: `30000`. */\n reconnectMaxInterval?: number;\n /** Interval (ms) between application-level pings. Default: `30000`. */\n pingInterval?: number;\n /**\n * How long (ms) to wait for a pong after sending a ping before\n * considering the connection dead. Default: `10000`.\n * Must be less than `pingInterval`.\n */\n pongTimeout?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_BASE = 1000;\nconst DEFAULT_RECONNECT_MAX = 30000;\nconst DEFAULT_PING_INTERVAL = 20000;\nconst DEFAULT_PONG_TIMEOUT = 10000;\n\n// ---------------------------------------------------------------------------\n// Internal event-emitter types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<{ code: WsErrorCode; message: string }>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channels: WsChannel[];\n market_slugs: string[];\n }>[];\n orderbook: EventCallback<WsDataMessage<WsOrderbookEvent>>[];\n prices: EventCallback<WsDataMessage<WsPriceEvent>>[];\n trades: EventCallback<WsDataMessage<WsTradeEvent>>[];\n}\n\ntype WsEventType = keyof EventListeners;\n\n// ---------------------------------------------------------------------------\n// Subscription tracking\n// ---------------------------------------------------------------------------\n\ninterface SubscriptionState {\n /** channel → Set<market_slug> */\n channels: Map<WsChannel, Set<string>>;\n}\n\n// ---------------------------------------------------------------------------\n// PredictWsClient\n// ---------------------------------------------------------------------------\n\nexport class PredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectBase: number;\n private readonly reconnectMax: number;\n private readonly pingMs: number;\n private readonly pongTimeoutMs: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pongTimer: ReturnType<typeof setTimeout> | null = null;\n private shouldReconnect = true;\n\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n status: [],\n subscribed: [],\n orderbook: [],\n prices: [],\n trades: [],\n };\n\n private subs: SubscriptionState = {\n channels: new Map([\n [\"orderbook\", new Set()],\n [\"prices\", new Set()],\n [\"trades\", new Set()],\n ]),\n };\n\n constructor(config: PredictWsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectBase = config.reconnectIntervalBase ?? DEFAULT_RECONNECT_BASE;\n this.reconnectMax = config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX;\n this.pingMs = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n this.pongTimeoutMs = config.pongTimeout ?? DEFAULT_PONG_TIMEOUT;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // -------------------------------------------------------------------------\n // Connection management\n // -------------------------------------------------------------------------\n\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n this.restoreSubscriptions();\n this.startPing();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n\n this.ws.onerror = () => {\n // The close event fires immediately after, which handles reconnect.\n };\n\n this.ws.onclose = (event) => {\n this.stopPing();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch {\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPing();\n this.clearReconnectTimer();\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.setStatus(\"disconnected\");\n }\n\n /** Disconnect and clear all subscription state and listeners. */\n destroy(): void {\n this.disconnect();\n for (const ch of this.subs.channels.values()) ch.clear();\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n // -------------------------------------------------------------------------\n // Subscription — low-level (multi-channel, multi-slug)\n // -------------------------------------------------------------------------\n\n /**\n * Subscribe to one or more channels for the given market slugs.\n * The server acknowledges with a `subscribed` message.\n */\n subscribe(channels: WsChannel[], marketSlugs: string[]): void {\n for (const ch of channels) {\n const set = this.subs.channels.get(ch)!;\n for (const slug of marketSlugs) set.add(slug);\n }\n this.send({ type: \"subscribe\", channels, market_slugs: marketSlugs });\n }\n\n /**\n * Unsubscribe from one or more channels for the given market slugs.\n */\n unsubscribe(channels: WsChannel[], marketSlugs: string[]): void {\n for (const ch of channels) {\n const set = this.subs.channels.get(ch)!;\n for (const slug of marketSlugs) set.delete(slug);\n }\n this.send({ type: \"unsubscribe\", channels, market_slugs: marketSlugs });\n }\n\n // -------------------------------------------------------------------------\n // Subscription — convenience (single channel)\n // -------------------------------------------------------------------------\n\n /**\n * Subscribe to price updates for the given slugs.\n * Returns an unsubscribe function.\n */\n subscribePrices(\n slugs: string[],\n onUpdate: (msg: WsDataMessage<WsPriceEvent>) => void,\n ): () => void {\n this.subscribe([\"prices\"], slugs);\n const off = this.on(\"prices\", onUpdate);\n return () => {\n off();\n this.unsubscribe([\"prices\"], slugs);\n };\n }\n\n /**\n * Subscribe to orderbook snapshots for the given slugs.\n * Returns an unsubscribe function.\n */\n subscribeOrderbook(\n slugs: string[],\n onUpdate: (msg: WsDataMessage<WsOrderbookEvent>) => void,\n ): () => void {\n this.subscribe([\"orderbook\"], slugs);\n const off = this.on(\"orderbook\", onUpdate);\n return () => {\n off();\n this.unsubscribe([\"orderbook\"], slugs);\n };\n }\n\n /**\n * Subscribe to trade events for the given slugs.\n * Returns an unsubscribe function.\n */\n subscribeTrades(\n slugs: string[],\n onUpdate: (msg: WsDataMessage<WsTradeEvent>) => void,\n ): () => void {\n this.subscribe([\"trades\"], slugs);\n const off = this.on(\"trades\", onUpdate);\n return () => {\n off();\n this.unsubscribe([\"trades\"], slugs);\n };\n }\n\n // -------------------------------------------------------------------------\n // Status observation\n // -------------------------------------------------------------------------\n\n /** Register a callback for connection status changes. Returns unsubscribe. */\n onStatusChange(cb: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", cb);\n }\n\n /** Register a callback for server-sent errors. Returns unsubscribe. */\n onError(\n cb: (err: { code: WsErrorCode; message: string }) => void,\n ): () => void {\n return this.on(\"error\", cb);\n }\n\n // -------------------------------------------------------------------------\n // Event emitter\n // -------------------------------------------------------------------------\n\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const list = this.listeners[event] as EventCallback<unknown>[];\n list.push(callback as EventCallback<unknown>);\n return () => this.off(event, callback);\n }\n\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const list = this.listeners[event] as EventCallback<unknown>[];\n const idx = list.indexOf(callback as EventCallback<unknown>);\n if (idx !== -1) list.splice(idx, 1);\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const list = this.listeners[event] as EventCallback<typeof data>[];\n for (const cb of list) {\n try {\n cb(data);\n } catch (e) {\n console.error(`[PredictWsClient] Error in \"${event}\" listener:`, e);\n }\n }\n }\n\n private send(msg: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return false;\n try {\n this.ws.send(JSON.stringify(msg));\n return true;\n } catch {\n return false;\n }\n }\n\n private setStatus(next: WsConnectionStatus): void {\n if (this.status !== next) {\n this.status = next;\n this.emit(\"status\", next);\n }\n }\n\n private handleMessage(raw: string): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return;\n }\n\n // Control messages (have `type`)\n if (msg.type) {\n switch (msg.type) {\n case \"pong\":\n this.clearPongTimer();\n return;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channels: msg.channels as WsChannel[],\n market_slugs: msg.market_slugs as string[],\n });\n return;\n case \"error\":\n this.emit(\"error\", {\n code: msg.code as WsErrorCode,\n message: msg.message as string,\n });\n return;\n }\n }\n\n // Data messages (have `channel` + `data`)\n if (msg.channel && msg.data) {\n const dataMsg = msg as unknown as WsDataMessage<WsChannelEvent>;\n switch (dataMsg.channel) {\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsDataMessage<WsOrderbookEvent>);\n break;\n case \"prices\":\n this.emit(\"prices\", dataMsg as WsDataMessage<WsPriceEvent>);\n break;\n case \"trades\":\n this.emit(\"trades\", dataMsg as WsDataMessage<WsTradeEvent>);\n break;\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n const delay = Math.min(\n this.reconnectBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMax,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private restoreSubscriptions(): void {\n for (const [channel, slugs] of this.subs.channels.entries()) {\n if (slugs.size > 0) {\n this.send({\n type: \"subscribe\",\n channels: [channel],\n market_slugs: Array.from(slugs),\n });\n }\n }\n }\n\n private startPing(): void {\n this.stopPing();\n this.pingTimer = setInterval(() => {\n this.send({ type: \"ping\" });\n this.armPongTimeout();\n }, this.pingMs);\n }\n\n private stopPing(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n this.clearPongTimer();\n }\n\n /**\n * Start a timer that fires if the server does not reply with pong\n * within `pongTimeoutMs`. On timeout the socket is closed so\n * the normal reconnect flow kicks in.\n */\n private armPongTimeout(): void {\n this.clearPongTimer();\n this.pongTimer = setTimeout(() => {\n this.pongTimer = null;\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(4000, \"pong timeout\");\n }\n }, this.pongTimeoutMs);\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n }\n}\n\n/**\n * Factory function for `PredictWsClient`.\n *\n * @param config - WebSocket client configuration.\n */\nexport function createPredictWsClient(\n config: PredictWsClientConfig,\n): PredictWsClient {\n return new PredictWsClient(config);\n}\n","import { createContext } from \"react\";\nimport type { PredictClient } from \"../client\";\nimport type { PredictWsClient } from \"../client/ws\";\n\nexport interface PredictContextValue {\n /** The prediction-server HTTP client instance. */\n client: PredictClient;\n /** Optional WebSocket client for real-time data. `null` when not provided. */\n wsClient: PredictWsClient | null;\n}\n\n/**\n * Context that carries the prediction client (prediction-server backend).\n *\n * Consumers must be wrapped in `PredictProvider`.\n */\nexport const PredictContext = createContext<PredictContextValue | null>(null);\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport type { PredictClient } from \"../client\";\nimport type { PredictWsClient } from \"../client/ws\";\nimport { PredictContext } from \"./PredictContext\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n /**\n * A `PredictClient` instance pointed at the prediction-server endpoint.\n *\n * @example\n * ```tsx\n * import { createPredictClient, PredictProvider } from \"@liberfi.io/react-predict\";\n *\n * const client = createPredictClient(\"https://api.example.com\");\n *\n * <PredictProvider client={client}>\n * <App />\n * </PredictProvider>\n * ```\n */\n client: PredictClient;\n /**\n * Optional WebSocket client for real-time market data.\n *\n * When provided, subscription hooks (`usePricesSubscription`, etc.)\n * and high-level realtime hooks (`useRealtimeOrderbook`, etc.) become\n * functional. Without it they gracefully degrade to REST polling.\n *\n * @example\n * ```tsx\n * import { createPredictWsClient } from \"@liberfi.io/react-predict\";\n *\n * const wsClient = createPredictWsClient({\n * wsUrl: \"wss://api.example.com/api/v1/ws\",\n * });\n *\n * <PredictProvider client={client} wsClient={wsClient}>\n * <App />\n * </PredictProvider>\n * ```\n */\n wsClient?: PredictWsClient | null;\n}>;\n\n/**\n * Provides the prediction client via React context.\n *\n * Place this provider at the application root (or any subtree boundary)\n * where prediction hooks are used.\n */\nexport function PredictProvider({\n client,\n wsClient,\n children,\n}: PredictProviderProps) {\n const ws = wsClient ?? null;\n const value = useMemo(() => ({ client, wsClient: ws }), [client, ws]);\n\n return (\n <PredictContext.Provider value={value}>{children}</PredictContext.Provider>\n );\n}\n","/**\n * Polymarket L2 HMAC-SHA256 signing utilities.\n *\n * Uses the Web Crypto API (available in all modern browsers and Node ≥18) to\n * avoid taking a dependency on Node.js `crypto` or any third-party library.\n *\n * References:\n * https://docs.polymarket.com/#authentication\n * https://github.com/Polymarket/clob-client/blob/main/src/headers/index.ts\n */\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Encode a string to a Uint8Array using UTF-8. */\nfunction encode(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/** Decode a Uint8Array as a UTF-8 string. */\nfunction decode(buf: ArrayBuffer): string {\n return new TextDecoder().decode(buf);\n}\n\n/**\n * Convert a base64 or base64url string to a Uint8Array.\n * Normalises base64url (`-`, `_`, no padding) to standard base64 before decoding.\n */\nfunction base64ToBytes(b64: string): Uint8Array {\n let std = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (std.length % 4 !== 0) std += \"=\";\n const binary = atob(std);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/** Convert a Uint8Array to a base64 string. */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n// ---------------------------------------------------------------------------\n// HMAC-SHA256\n// ---------------------------------------------------------------------------\n\n/**\n * Compute an HMAC-SHA256 signature using the Web Crypto API.\n *\n * @param secretBase64 - The signing secret encoded as base64.\n * @param message - The plaintext message to sign.\n * @returns The signature as a base64 string.\n */\nexport async function hmacSha256Base64(\n secretBase64: string,\n message: string,\n): Promise<string> {\n const keyBytes = base64ToBytes(secretBase64);\n const cryptoKey = await crypto.subtle.importKey(\n \"raw\",\n keyBytes.buffer as ArrayBuffer,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const msgBytes = encode(message);\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n cryptoKey,\n msgBytes.buffer as ArrayBuffer,\n );\n const b64 = bytesToBase64(new Uint8Array(signature));\n // Polymarket requires base64url encoding (keep trailing '=')\n return b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n// ---------------------------------------------------------------------------\n// Polymarket L2 auth headers\n// ---------------------------------------------------------------------------\n\n/** HTTP method values accepted by Polymarket CLOB. */\nexport type HttpMethod = \"GET\" | \"DELETE\" | \"POST\" | \"PUT\";\n\nexport interface PolymarketL2HeadersInput {\n /** L2 API key (from credential exchange). */\n apiKey: string;\n /** L2 HMAC secret (base64-encoded). */\n secret: string;\n /** L2 passphrase. */\n passphrase: string;\n /** HTTP method of the request. */\n method: HttpMethod;\n /** Request path without host, e.g. \"/order\". */\n requestPath: string;\n /** Raw JSON request body string; empty string for GET/DELETE. */\n body?: string;\n}\n\nexport interface PolymarketL2Headers {\n POLY_ADDRESS: string;\n POLY_SIGNATURE: string;\n POLY_TIMESTAMP: string;\n POLY_API_KEY: string;\n POLY_PASSPHRASE: string;\n}\n\n/**\n * Build Polymarket L2 HMAC authentication headers for a CLOB API request.\n *\n * The signature is `HMAC-SHA256(secret, timestamp + method + requestPath + body)`.\n *\n * @param address - EVM wallet address (owner of the credentials).\n * @param input - Credential and request details.\n * @returns An object containing all required `POLY_*` headers.\n */\nexport async function buildPolymarketL2Headers(\n address: string,\n input: PolymarketL2HeadersInput,\n): Promise<PolymarketL2Headers> {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const body = input.body ?? \"\";\n const message = `${timestamp}${input.method}${input.requestPath}${body}`;\n\n const signature = await hmacSha256Base64(input.secret, message);\n\n return {\n POLY_ADDRESS: address,\n POLY_SIGNATURE: signature,\n POLY_TIMESTAMP: timestamp,\n POLY_API_KEY: input.apiKey,\n POLY_PASSPHRASE: input.passphrase,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Polymarket L1 auth (credential derivation)\n// ---------------------------------------------------------------------------\n\n/** EIP-712 domain used by Polymarket CLOB for L1 authentication. */\nexport const CLOB_AUTH_DOMAIN = {\n name: \"ClobAuthDomain\",\n version: \"1\",\n chainId: 137,\n} as const;\n\n/** EIP-712 types for the `ClobAuth` struct. */\nexport const CLOB_AUTH_TYPES = {\n ClobAuth: [\n { name: \"address\", type: \"address\" },\n { name: \"timestamp\", type: \"string\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"message\", type: \"string\" },\n ],\n} as const;\n\nexport interface BuildClobAuthMessageInput {\n /** EVM wallet address. */\n address: string;\n /** Unix seconds string. */\n timestamp: string;\n /** Credential nonce. Use `0` for a permanent / deterministic credential. */\n nonce: number;\n}\n\n/**\n * Build the EIP-712 typed data value for a `ClobAuth` message.\n * The resulting object is passed to `eth_signTypedData_v4`.\n */\nexport function buildClobAuthMessage(\n input: BuildClobAuthMessageInput,\n): Record<string, unknown> {\n return {\n address: input.address,\n timestamp: input.timestamp,\n nonce: input.nonce,\n message: \"This message attests that I control the given wallet\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Credential exchange\n// ---------------------------------------------------------------------------\n\ntype ApiKeyCreds = { apiKey: string; secret: string; passphrase: string };\n\nfunction buildL1Headers(\n address: string,\n signature: string,\n timestamp: string,\n nonce: number,\n): Record<string, string> {\n return {\n POLY_ADDRESS: address,\n POLY_SIGNATURE: signature,\n POLY_TIMESTAMP: timestamp,\n POLY_NONCE: String(nonce),\n };\n}\n\n/**\n * Create or derive Polymarket L2 API credentials from an L1 EIP-712 signature.\n *\n * Polymarket exposes two endpoints:\n * - `POST /auth/api-key` — create new credentials (required for first-time wallets)\n * - `GET /auth/derive-api-key` — derive existing credentials\n *\n * This function tries to derive first; on failure it creates, matching the\n * official `createOrDeriveApiKey()` behaviour from `@polymarket/clob-client`.\n *\n * @returns `{ apiKey, secret, passphrase }`.\n */\nexport async function derivePolymarketApiKey(\n address: string,\n signature: string,\n timestamp: string,\n nonce: number,\n): Promise<ApiKeyCreds> {\n const headers = buildL1Headers(address, signature, timestamp, nonce);\n\n // Try deriving existing credentials first.\n const deriveRes = await fetch(\n `https://clob.polymarket.com/auth/derive-api-key?nonce=${nonce}`,\n { method: \"GET\", headers },\n );\n\n if (deriveRes.ok) {\n return deriveRes.json() as Promise<ApiKeyCreds>;\n }\n\n // Derive failed — wallet likely has no API key yet; create one.\n const createRes = await fetch(\"https://clob.polymarket.com/auth/api-key\", {\n method: \"POST\",\n headers,\n });\n\n if (createRes.ok) {\n return createRes.json() as Promise<ApiKeyCreds>;\n }\n\n const text = await createRes.text().catch(() => createRes.statusText);\n throw new Error(\n `Polymarket credential exchange failed (${createRes.status}): ${text}`,\n );\n}\n","import { createContext } from \"react\";\n\n/**\n * Polymarket L2 API credentials derived from an L1 signature.\n * These are stored in memory (never persisted) and cleared on page unload.\n */\nexport interface PolymarketCredentials {\n /** L2 API key (hex string). */\n apiKey: string;\n /** L2 HMAC secret (hex string). */\n secret: string;\n /** L2 passphrase (hex string). */\n passphrase: string;\n /** EVM wallet address that owns the credentials. */\n address: string;\n}\n\n/**\n * Minimal interface for signing EIP-712 typed data.\n * Implemented by the consuming app (IoC — decouples from any wallet library).\n *\n * @example\n * ```ts\n * const signer: PolymarketSigner = {\n * address: walletAddress,\n * signatureType: 2, // EOA = 0, MAGIC_LINK = 1, POLY_PROXY = 2\n * signTypedData: async (domain, types, primaryType, value) => {\n * const provider = await evmWalletAdapter.getEip1193Provider();\n * return provider.request({\n * method: \"eth_signTypedData_v4\",\n * params: [walletAddress, JSON.stringify({ domain, types, primaryType, message: value })],\n * });\n * },\n * };\n * ```\n */\nexport interface PolymarketSigner {\n /** EVM address of the connected wallet. */\n address: string;\n /**\n * Polymarket signature type:\n * - `0` = EOA (MetaMask, Coinbase, etc.)\n * - `1` = Magic Link\n * - `2` = Polymarket proxy (Gnosis Safe)\n */\n signatureType: 0 | 1 | 2;\n /**\n * Sign EIP-712 typed data and return the hex signature.\n * The signature is used for L1 authentication with the Polymarket CLOB API.\n *\n * @param domain - EIP-712 domain separator.\n * @param types - Type definitions (without EIP712Domain).\n * @param primaryType - The primary type name (e.g. \"ClobAuth\", \"Order\").\n * @param value - The message/struct values to sign.\n */\n signTypedData: (\n domain: Record<string, unknown>,\n types: Record<string, unknown[]>,\n primaryType: string,\n value: Record<string, unknown>,\n ) => Promise<string>;\n /**\n * Sign a raw EVM transaction and return the signed transaction hex.\n * Required for auto-deposit (native USDC → USDC.e via Uniswap V3).\n * If not provided, auto-deposit will throw when a deposit is needed.\n *\n * @param txParams - Transaction parameters: `{ from, to, data, value, chainId, gas }`.\n * @returns Signed raw transaction hex (0x-prefixed).\n */\n signTransaction?: (txParams: Record<string, string>) => Promise<string>;\n}\n\nexport interface PolymarketContextValue {\n /** In-memory credentials; `null` before the user authenticates. */\n credentials: PolymarketCredentials | null;\n /** `true` while the L1 → L2 credential exchange is in progress. */\n isAuthenticating: boolean;\n /** Error from the last authentication attempt; `null` when clean. */\n authError: Error | null;\n /**\n * Trigger L1 authentication using the provided signer.\n * Derives L2 credentials with `nonce=0`, stores them in memory,\n * and returns them so the caller can use them immediately\n * (without waiting for a re-render).\n */\n authenticate: (signer: PolymarketSigner) => Promise<PolymarketCredentials>;\n /** Clear all in-memory credentials (e.g. on wallet disconnect). */\n clearCredentials: () => void;\n}\n\n/**\n * Context that carries Polymarket L2 credentials (in-memory only).\n *\n * Consumers must be wrapped in `PolymarketProvider`.\n */\nexport const PolymarketContext = createContext<PolymarketContextValue | null>(\n null,\n);\n","import { type PropsWithChildren, useCallback, useRef, useState } from \"react\";\nimport {\n CLOB_AUTH_DOMAIN,\n CLOB_AUTH_TYPES,\n buildClobAuthMessage,\n derivePolymarketApiKey,\n} from \"../utils/polymarket-hmac\";\nimport {\n PolymarketContext,\n type PolymarketCredentials,\n type PolymarketSigner,\n} from \"./PolymarketContext\";\n\nexport type PolymarketProviderProps = PropsWithChildren<{\n /**\n * Polymarket CLOB API base URL.\n * Defaults to `https://clob.polymarket.com`.\n */\n clobApiUrl?: string;\n}>;\n\n/**\n * Provides in-memory Polymarket L2 credentials via React context.\n *\n * The provider is wallet-agnostic. Consumers call `authenticate(signer)` with\n * a `PolymarketSigner` adapter, which handles the L1 EIP-712 signing step.\n *\n * Credentials are derived using `nonce=0` (permanent, deterministic) and are\n * stored only in memory — they are cleared when the page unloads or when\n * `clearCredentials()` is called.\n *\n * @example\n * ```tsx\n * <PolymarketProvider>\n * <App />\n * </PolymarketProvider>\n * ```\n */\nexport function PolymarketProvider({ children }: PolymarketProviderProps) {\n const [credentials, setCredentials] = useState<PolymarketCredentials | null>(\n null,\n );\n const [isAuthenticating, setIsAuthenticating] = useState(false);\n const [authError, setAuthError] = useState<Error | null>(null);\n\n // Track the address we last authenticated for, to avoid re-deriving on\n // hot re-renders when the signer reference changes.\n const lastAuthAddressRef = useRef<string | null>(null);\n\n const authenticate = useCallback(\n async (signer: PolymarketSigner) => {\n if (\n lastAuthAddressRef.current === signer.address &&\n credentials !== null\n ) {\n return credentials;\n }\n\n setIsAuthenticating(true);\n setAuthError(null);\n\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const nonce = 0;\n\n const message = buildClobAuthMessage({\n address: signer.address,\n timestamp,\n nonce,\n });\n\n const signature = await signer.signTypedData(\n CLOB_AUTH_DOMAIN,\n CLOB_AUTH_TYPES as unknown as Record<string, unknown[]>,\n \"ClobAuth\",\n message,\n );\n\n const { apiKey, secret, passphrase } = await derivePolymarketApiKey(\n signer.address,\n signature,\n timestamp,\n nonce,\n );\n\n const newCreds = {\n apiKey,\n secret,\n passphrase,\n address: signer.address,\n };\n lastAuthAddressRef.current = signer.address;\n setCredentials(newCreds);\n return newCreds;\n } catch (err) {\n setAuthError(\n err instanceof Error\n ? err\n : new Error(\"Polymarket authentication failed\"),\n );\n lastAuthAddressRef.current = null;\n throw err;\n } finally {\n setIsAuthenticating(false);\n }\n },\n [credentials],\n );\n\n const clearCredentials = useCallback(() => {\n setCredentials(null);\n lastAuthAddressRef.current = null;\n }, []);\n\n return (\n <PolymarketContext.Provider\n value={{\n credentials,\n isAuthenticating,\n authError,\n authenticate,\n clearCredentials,\n }}\n >\n {children}\n </PolymarketContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport type { PredictClient } from \"../../client\";\nimport { PredictContext } from \"../../providers/PredictContext\";\n\n/**\n * Returns the `PredictClient` instance from context.\n *\n * Must be called inside a component tree wrapped by `PredictProvider`.\n *\n * @throws When used outside of `PredictProvider`.\n */\nexport function usePredictClient(): PredictClient {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictClient must be used within a PredictProvider\");\n }\n return context.client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PredictEvent, ListEventsParams, PredictPage } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n/** Stable TanStack Query key for the events list. */\nexport function eventsQueryKey(params?: ListEventsParams): unknown[] {\n return [\"predict\", \"events\", params ?? {}];\n}\n\n/**\n * Fetch function usable outside React (e.g. in loaders or tests).\n */\nexport async function fetchEvents(\n client: ReturnType<typeof usePredictClient>,\n params?: ListEventsParams,\n): Promise<PredictPage<PredictEvent>> {\n return client.listEvents(params);\n}\n\n/**\n * React Query hook for `GET /api/v1/events` via the prediction-server client.\n *\n * @param params - Optional filter / sort / pagination parameters.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEvents({ status: \"open\", limit: 20 });\n * ```\n */\nexport function useEvents(\n params?: ListEventsParams,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictEvent>,\n Error,\n PredictPage<PredictEvent>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(params),\n queryFn: () => client.listEvents(params),\n ...queryOptions,\n });\n}\n\nexport type { PredictEvent, ListEventsParams, PredictPage };\n","/**\n * Server-safe pure functions for events query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictClient,\n PredictEvent,\n EventSortField,\n EventStatus,\n ListEventsParams,\n PredictPage,\n ProviderSource,\n} from \"../../client\";\n\nexport type { ProviderSource };\n\n/** Default page size for list queries. */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/**\n * Selection emitted by a categories/tag selector widget.\n * Duplicated here to avoid pulling in UI component barrel into server-only bundles.\n */\nexport interface TagSlugSelection {\n categorySlug: string | null;\n tagSlug: string | null;\n}\n\n/**\n * Resolve a `TagSlugSelection` to a single `tag_slug` string for the API.\n */\nexport function resolveTagSlug(\n selection: TagSlugSelection | null | undefined,\n): string | undefined {\n if (!selection) return undefined;\n return selection.tagSlug ?? selection.categorySlug ?? undefined;\n}\n\n/**\n * Input accepted by {@link resolveEventsParams}. All fields optional;\n * defaults match the client-side `useInfiniteEvents` hook's initial state.\n */\nexport interface ResolveEventsParamsInput {\n tagSlugSelection?: TagSlugSelection | null;\n limit?: number;\n status?: EventStatus;\n sort_by?: EventSortField;\n sort_asc?: boolean;\n source?: ProviderSource;\n with_markets?: boolean;\n /**\n * Minimum total volume in USD (numeric string or number).\n * Converted to `min_volume` in the API request.\n */\n minVolume?: string | number;\n /**\n * Minimum liquidity in USD (numeric string or number).\n * Converted to `min_liquidity` in the API request.\n */\n minLiquidity?: string | number;\n /**\n * Time-remaining bucket. Converts to an `end_before` RFC 3339 timestamp.\n * \"1d\" = events closing within 24 h, \"7d\" = 7 days, \"30d\" = 30 days.\n */\n timeRemaining?: string;\n}\n\n/**\n * Convert a time-remaining bucket string to an RFC 3339 `end_before` timestamp.\n * Returns `undefined` when `timeRemaining` is not set.\n */\nfunction resolveEndBefore(\n timeRemaining: string | undefined,\n): string | undefined {\n if (!timeRemaining) return undefined;\n const days = timeRemaining === \"1d\" ? 1 : timeRemaining === \"7d\" ? 7 : 30;\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n\n/**\n * Build a clean `ListEventsParams` from loose user inputs.\n *\n * Server-side `prefetchInfiniteQuery` and client-side `useInfiniteEvents` must\n * both use this function to guarantee identical query keys.\n */\nexport function resolveEventsParams(\n input: ResolveEventsParamsInput = {},\n): ListEventsParams {\n const {\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status = \"open\",\n with_markets = true,\n source,\n sort_by,\n sort_asc,\n minVolume,\n minLiquidity,\n timeRemaining,\n } = input;\n const tag_slug = resolveTagSlug(tagSlugSelection);\n\n const min_volume =\n minVolume !== undefined && minVolume !== \"\" ? Number(minVolume) : undefined;\n const min_liquidity =\n minLiquidity !== undefined && minLiquidity !== \"\"\n ? Number(minLiquidity)\n : undefined;\n const end_before = resolveEndBefore(timeRemaining);\n\n return {\n limit,\n status,\n with_markets,\n ...(source ? { source } : {}),\n ...(tag_slug ? { tag_slug } : {}),\n ...(sort_by ? { sort_by } : {}),\n ...(sort_asc !== undefined ? { sort_asc } : {}),\n ...(min_volume !== undefined && !isNaN(min_volume) ? { min_volume } : {}),\n ...(min_liquidity !== undefined && !isNaN(min_liquidity)\n ? { min_liquidity }\n : {}),\n ...(end_before ? { end_before } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Events infinite query (server-safe)\n// ---------------------------------------------------------------------------\n\n/** Stable TanStack Query key for the events infinite query. */\nexport function infiniteEventsQueryKey(params: ListEventsParams): unknown[] {\n return [\"predict\", \"events-infinite\", params];\n}\n\n/**\n * Fetch a single page of events. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEventsPage(\n client: PredictClient,\n params: ListEventsParams,\n): Promise<PredictPage<PredictEvent>> {\n return client.listEvents(params);\n}\n\n// ---------------------------------------------------------------------------\n// Single event (server-safe)\n// ---------------------------------------------------------------------------\n\n/** Stable TanStack Query key for a single event. */\nexport function eventQueryKey(\n slug: string,\n source?: ProviderSource,\n): unknown[] {\n return [\"predict\", \"event\", slug, source];\n}\n\n/**\n * Fetch a single event. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEvent(\n client: PredictClient,\n slug: string,\n source?: ProviderSource,\n): Promise<PredictEvent> {\n return client.getEvent(slug, source);\n}\n\nexport type { PredictEvent, ListEventsParams, PredictPage };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PredictEvent, ProviderSource } from \"../../client\";\nimport { eventQueryKey, fetchEvent } from \"./events.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { eventQueryKey, fetchEvent } from \"./events.params\";\n\nexport interface UseEventParams {\n /** Canonical event slug (e.g. \"will-trump-win-2024\" or \"KXBTCD-25FEB-T68000\"). */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-event fetch. */\n source?: ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/events/:slug` via the prediction-server client.\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEvent({ slug: \"CONTROLH-2026\", source: \"kalshi\" });\n * ```\n */\nexport function useEvent(\n params: UseEventParams,\n queryOptions: Omit<\n UseQueryOptions<PredictEvent, Error, PredictEvent, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventQueryKey(params.slug, params.source),\n queryFn: () => fetchEvent(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n\nexport type { PredictEvent };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { PredictEvent, ListEventsParams, PredictPage } from \"../../client\";\nimport {\n infiniteEventsQueryKey,\n fetchEventsPage,\n resolveTagSlug,\n resolveEventsParams,\n} from \"./events.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport {\n resolveTagSlug,\n resolveEventsParams,\n infiniteEventsQueryKey,\n fetchEventsPage,\n} from \"./events.params\";\nexport type {\n ResolveEventsParamsInput,\n TagSlugSelection,\n} from \"./events.params\";\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n PredictPage<PredictEvent>,\n Error,\n InfiniteData<PredictPage<PredictEvent>>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/events` with cursor-based\n * pagination via the prediction-server client.\n *\n * @param params - Resolved query parameters (use {@link resolveEventsParams} to build\n * from user inputs). Do NOT include `cursor` — it is managed automatically.\n * @param queryOptions - Additional TanStack Query options.\n *\n * @example\n * ```tsx\n * const params = resolveEventsParams({ status: \"open\", limit: 20 });\n * const { data, hasNextPage, fetchNextPage } = useInfiniteEvents(params);\n * ```\n */\nexport function useInfiniteEvents(\n params: ListEventsParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: infiniteEventsQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchEventsPage(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: PredictPage<PredictEvent>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n ...queryOptions,\n });\n}\n\nexport type { PredictEvent, ListEventsParams, PredictPage };\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type {\n PredictEvent,\n EventSortField,\n EventStatus,\n ListEventsParams,\n PredictPage,\n ProviderSource,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseSearchEventsParams {\n /** Search keyword. */\n keyword: string;\n /** Page size (default: 20). */\n limit?: number;\n /** Event status filter (default: \"open\"). */\n status?: EventStatus;\n /** Filter by upstream provider. */\n source?: ProviderSource;\n /** Include nested markets (default: false for lighter search payloads). */\n with_markets?: boolean;\n /** Field to sort by (e.g. \"volume\" for trending). */\n sort_by?: EventSortField;\n /** When `true`, sort ascending. Defaults to descending. */\n sort_asc?: boolean;\n}\n\nfunction searchEventsQueryKey(params: ListEventsParams): unknown[] {\n return [\"predict\", \"search\", params];\n}\n\n/**\n * Infinite query hook for searching prediction events via the `listEvents`\n * endpoint with a `search` parameter.\n *\n * @example\n * ```tsx\n * const { data, isLoading, hasNextPage, fetchNextPage } =\n * useSearchEvents({ keyword: \"trump\" });\n * ```\n */\nexport function useSearchEvents(\n params: UseSearchEventsParams,\n queryOptions?: { enabled?: boolean },\n) {\n const client = usePredictClient();\n\n const apiParams = useMemo<ListEventsParams>(\n () => ({\n search: params.keyword || undefined,\n limit: params.limit ?? 20,\n status: params.status ?? \"open\",\n source: params.source,\n with_markets: params.with_markets ?? false,\n sort_by: params.sort_by,\n sort_asc: params.sort_asc,\n }),\n [\n params.keyword,\n params.limit,\n params.status,\n params.source,\n params.with_markets,\n params.sort_by,\n params.sort_asc,\n ],\n );\n\n return useInfiniteQuery({\n queryKey: searchEventsQueryKey(apiParams),\n queryFn: ({ pageParam }) =>\n client.listEvents({\n ...apiParams,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: PredictPage<PredictEvent>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n enabled: queryOptions?.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n PredictEvent,\n ProviderSource,\n SimilarEventsParams,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function similarEventsQueryKey(\n slug: string,\n source: ProviderSource,\n params?: SimilarEventsParams,\n): unknown[] {\n return [\"predict\", \"similar-events\", slug, source, params];\n}\n\nexport interface UseSimilarEventsParams {\n slug: string;\n source: ProviderSource;\n limit?: number;\n same_source?: boolean;\n}\n\nexport function useSimilarEvents(\n params: UseSimilarEventsParams,\n queryOptions: Omit<\n UseQueryOptions<PredictEvent[], Error, PredictEvent[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const apiParams: SimilarEventsParams = {\n limit: params.limit,\n same_source: params.same_source,\n };\n return useQuery({\n queryKey: similarEventsQueryKey(params.slug, params.source, apiParams),\n queryFn: () =>\n client.getSimilarEvents(params.slug, params.source, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 5 * 60_000,\n ...queryOptions,\n });\n}\n","/**\n * Server-safe pure functions for market query helpers.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictMarket,\n ProviderSource,\n PredictClient,\n} from \"../../client\";\n\n/** Stable TanStack Query key for a single market. */\nexport function marketQueryKey(\n slug: string,\n source?: ProviderSource,\n): unknown[] {\n return [\"predict\", \"market\", slug, source];\n}\n\n/**\n * Fetch function usable outside React (e.g. in loaders or tests).\n */\nexport async function fetchMarket(\n client: PredictClient,\n slug: string,\n source?: ProviderSource,\n): Promise<PredictMarket> {\n return client.getMarket(slug, source);\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PredictMarket, ProviderSource } from \"../../client\";\nimport { marketQueryKey, fetchMarket } from \"./market.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { marketQueryKey, fetchMarket } from \"./market.params\";\n\nexport interface UseMarketParams {\n /** Canonical market slug. */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-market fetch. */\n source?: ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/markets/:slug` via the prediction-server client.\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useMarket({ slug: \"KXBTCD-25FEB-T68000-yes\", source: \"kalshi\" });\n * ```\n */\nexport function useMarket(\n params: UseMarketParams,\n queryOptions: Omit<\n UseQueryOptions<PredictMarket, Error, PredictMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketQueryKey(params.slug, params.source),\n queryFn: () => fetchMarket(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n PriceHistoryRange,\n PriceHistoryResponse,\n ProviderSource,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function priceHistoryQueryKey(\n slug: string,\n source: ProviderSource,\n range?: PriceHistoryRange,\n): unknown[] {\n return [\"predict\", \"price-history\", slug, source, range];\n}\n\nexport interface UsePriceHistoryParams {\n slug: string;\n source: ProviderSource;\n range?: PriceHistoryRange;\n}\n\nexport function usePriceHistory(\n params: UsePriceHistoryParams,\n queryOptions: Omit<\n UseQueryOptions<\n PriceHistoryResponse,\n Error,\n PriceHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: priceHistoryQueryKey(params.slug, params.source, params.range),\n queryFn: () =>\n client.getPriceHistory(params.slug, params.source, params.range),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { PredictMarket, PriceHistoryRange } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\nimport { priceHistoryQueryKey } from \"./usePriceHistory\";\n\n// ---------------------------------------------------------------------------\n// Chart range constants\n// ---------------------------------------------------------------------------\n\nexport const ChartRange = {\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n ONE_MONTH: \"1m\",\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\nconst RANGE_MAP: Record<ChartRangeType, PriceHistoryRange> = {\n [ChartRange.ONE_DAY]: \"1d\",\n [ChartRange.ONE_WEEK]: \"1w\",\n [ChartRange.ONE_MONTH]: \"1m\",\n [ChartRange.ALL]: \"all\",\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHistoryPoint {\n /** Unix timestamp in milliseconds. */\n timestamp: number;\n /** Implied probability [0, 1]. */\n price: number;\n}\n\nexport interface MarketHistorySeries {\n marketSlug: string;\n label: string;\n /** Chronologically ordered price history. */\n data: MarketHistoryPoint[];\n}\n\nexport interface UseMarketHistoryResult {\n series: MarketHistorySeries[];\n isLoading: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Returns price history series for the provided markets using\n * `GET /api/v1/markets/{slug}/price-history`.\n */\nexport function useMarketHistory(\n markets: PredictMarket[],\n range: ChartRangeType = ChartRange.ALL,\n): UseMarketHistoryResult {\n const client = usePredictClient();\n const apiRange = RANGE_MAP[range];\n\n const queries = useQueries({\n queries: markets.map((market) => ({\n queryKey: priceHistoryQueryKey(market.slug, market.source, apiRange),\n queryFn: () =>\n client.getPriceHistory(market.slug, market.source, apiRange),\n staleTime: 60_000,\n enabled: Boolean(market.slug),\n })),\n });\n\n const isLoading = queries.some((q) => q.isLoading);\n\n const series = useMemo<MarketHistorySeries[]>(() => {\n return markets.map((market, idx) => {\n const result = queries[idx];\n const points = result?.data?.points ?? [];\n\n if (points.length > 0) {\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: points.map((pt) => ({\n timestamp: pt.t * 1000,\n price: pt.p,\n })),\n };\n }\n\n // Fallback: generate a flat line from current outcome price when the API\n // returns no data (not yet indexed, upstream error, mock slugs, etc.)\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const currentPrice = yesOutcome?.price ?? 0.5;\n const now = Date.now();\n const dayMs = 86_400_000;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price: currentPrice },\n { timestamp: now, price: currentPrice },\n ],\n };\n });\n }, [markets, queries]);\n\n return { series, isLoading };\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Orderbook, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderbookQueryKey(\n slug: string,\n source: ProviderSource,\n): unknown[] {\n return [\"predict\", \"orderbook\", slug, source];\n}\n\nexport interface UseOrderbookParams {\n slug: string;\n source: ProviderSource;\n}\n\nexport function useOrderbook(\n params: UseOrderbookParams,\n queryOptions: Omit<\n UseQueryOptions<Orderbook, Error, Orderbook, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderbookQueryKey(params.slug, params.source),\n queryFn: () => client.getOrderbook(params.slug, params.source),\n enabled: Boolean(params.slug),\n refetchInterval: 30_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n ListMarketTradesParams,\n PredictPage,\n ProviderSource,\n PredictTrade,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketTradesQueryKey(\n slug: string,\n params: ListMarketTradesParams,\n): unknown[] {\n return [\"predict\", \"market-trades\", slug, params];\n}\n\nexport interface UseMarketTradesParams {\n slug: string;\n source: ProviderSource;\n limit?: number;\n cursor?: string;\n side?: string;\n}\n\nexport function useMarketTrades(\n params: UseMarketTradesParams,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictTrade>,\n Error,\n PredictPage<PredictTrade>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const apiParams: ListMarketTradesParams = {\n source: params.source,\n limit: params.limit,\n cursor: params.cursor,\n side: params.side,\n };\n return useQuery({\n queryKey: marketTradesQueryKey(params.slug, apiParams),\n queryFn: () => client.listMarketTrades(params.slug, apiParams),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Candlestick, ListCandlesticksParams } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function candlesticksQueryKey(\n slug: string,\n params?: ListCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", slug, params];\n}\n\nexport interface UseCandlesticksParams {\n slug: string;\n interval?: string;\n limit?: number;\n}\n\nexport function useCandlesticks(\n params: UseCandlesticksParams,\n queryOptions: Omit<\n UseQueryOptions<Candlestick[], Error, Candlestick[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const apiParams: ListCandlesticksParams = {\n interval: params.interval,\n limit: params.limit,\n };\n return useQuery({\n queryKey: candlesticksQueryKey(params.slug, apiParams),\n queryFn: () => client.listCandlesticks(params.slug, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PositionsResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function positionsQueryKey(\n user: string,\n source?: ProviderSource,\n): unknown[] {\n return [\"predict\", \"positions\", source ?? \"all\", user];\n}\n\nexport function positionsMultiQueryKey(wallets: {\n kalshi_user?: string;\n polymarket_user?: string;\n}): unknown[] {\n return [\n \"predict\",\n \"positions\",\n \"multi\",\n wallets.kalshi_user ?? \"\",\n wallets.polymarket_user ?? \"\",\n ];\n}\n\n/** Single-source params (backward-compatible). */\nexport interface UsePositionsParams {\n /** Provider source. Omit to aggregate all providers (same address). */\n source?: ProviderSource;\n user: string;\n}\n\n/** Multi-wallet params — each provider gets its own address. */\nexport interface UsePositionsMultiParams {\n kalshi_user?: string;\n polymarket_user?: string;\n}\n\nexport function usePositions(\n params: UsePositionsParams,\n queryOptions: Omit<\n UseQueryOptions<PositionsResponse, Error, PositionsResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: positionsQueryKey(params.user, params.source),\n queryFn: () => client.getPositions(params.user, params.source),\n enabled: Boolean(params.user),\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n\n/**\n * Fetch positions for multiple wallets in a single request.\n * Each provider is queried with its own address.\n */\nexport function usePositionsMulti(\n params: UsePositionsMultiParams,\n queryOptions: Omit<\n UseQueryOptions<PositionsResponse, Error, PositionsResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const hasAnyWallet = Boolean(params.kalshi_user || params.polymarket_user);\n return useQuery({\n queryKey: positionsMultiQueryKey(params),\n queryFn: () => client.getPositions(params),\n enabled: hasAnyWallet,\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { BalanceResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function balanceQueryKey(\n source: ProviderSource,\n user: string,\n): unknown[] {\n return [\"predict\", \"balance\", source, user];\n}\n\nexport interface UseBalanceParams {\n source: ProviderSource;\n user: string;\n}\n\nexport function useBalance(\n params: UseBalanceParams,\n queryOptions: Omit<\n UseQueryOptions<BalanceResponse, Error, BalanceResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: balanceQueryKey(params.source, params.user),\n queryFn: () => client.getBalance(params.source, params.user),\n enabled: Boolean(params.user && params.source),\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ListOrdersParams, PredictPage, PredictOrder } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function ordersQueryKey(params: ListOrdersParams): unknown[] {\n return [\"predict\", \"orders\", params];\n}\n\nexport interface UseOrdersOptions {\n /**\n * Async callback invoked before each request to obtain extra headers.\n * Used by Polymarket orders to attach POLY_* HMAC authentication headers.\n */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\nexport function useOrders(\n params: ListOrdersParams,\n options?: UseOrdersOptions,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictOrder>,\n Error,\n PredictPage<PredictOrder>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: ordersQueryKey(params),\n queryFn: async () => {\n const headers = await options?.getHeaders?.();\n return client.listOrders(params, headers);\n },\n enabled: Boolean(params.wallet_address),\n ...queryOptions,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { ListOrdersParams } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport type UseInfiniteOrdersParams = Omit<ListOrdersParams, \"next_cursor\">;\n\nexport interface UseInfiniteOrdersOptions {\n /**\n * Async callback invoked before each request to obtain extra headers.\n * Used by Polymarket orders to attach POLY_* HMAC authentication headers.\n */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\nexport function infiniteOrdersQueryKey(\n params: UseInfiniteOrdersParams,\n): unknown[] {\n return [\"predict\", \"orders\", \"infinite\", params];\n}\n\nexport function useInfiniteOrders(\n params: UseInfiniteOrdersParams,\n options?: UseInfiniteOrdersOptions,\n) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: infiniteOrdersQueryKey(params),\n queryFn: async ({ pageParam }) => {\n const headers = await options?.getHeaders?.();\n return client.listOrders({ ...params, next_cursor: pageParam }, headers);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage) =>\n lastPage.has_more ? lastPage.next_cursor : undefined,\n enabled: Boolean(params.wallet_address),\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ProviderSource, PredictOrder } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderQueryKey(id: string, source: ProviderSource): unknown[] {\n return [\"predict\", \"order\", id, source];\n}\n\nexport interface UseOrderParams {\n id: string;\n source: ProviderSource;\n}\n\n/**\n * Query a single order by ID. Automatically polls every 1 s while enabled.\n */\nexport function useOrder(\n params: UseOrderParams,\n queryOptions: Omit<\n UseQueryOptions<PredictOrder, Error, PredictOrder, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderQueryKey(params.id, params.source),\n queryFn: () => client.getOrder(params.id, params.source),\n enabled: Boolean(params.id),\n refetchInterval: 1000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { CancelOrderResult, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface CancelOrderVariables {\n id: string;\n source: ProviderSource;\n}\n\nexport function useCancelOrder(\n mutationOptions: Omit<\n UseMutationOptions<CancelOrderResult, Error, CancelOrderVariables>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (vars: CancelOrderVariables) =>\n client.cancelOrder(vars.id, vars.source),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n },\n ...mutationOptions,\n });\n}\n","/**\n * Server-safe pure functions for matches query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictClient,\n MatchesParams,\n MatchGroupPage,\n} from \"../../client\";\n\n/** Query key for match group list queries. */\nexport function matchesQueryKey(params?: MatchesParams): unknown[] {\n return [\"predict\", \"matches\", params];\n}\n\n/** Query key for a single match group. */\nexport function matchQueryKey(id: number): unknown[] {\n return [\"predict\", \"match\", id];\n}\n\n/** Fetch a page of matches (usable in both client and server contexts). */\nexport async function fetchMatchesPage(\n client: PredictClient,\n params: MatchesParams,\n): Promise<MatchGroupPage> {\n return client.listMatches(params);\n}\n","import {\n useQuery,\n useInfiniteQuery,\n type UseQueryOptions,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { MatchGroup, MatchesParams, MatchGroupPage } from \"../../client\";\nimport {\n matchesQueryKey,\n matchQueryKey,\n fetchMatchesPage,\n} from \"./matches.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { matchesQueryKey, matchQueryKey, fetchMatchesPage };\n\nexport type UseInfiniteMatchesParams = Omit<MatchesParams, \"cursor\">;\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n MatchGroupPage,\n Error,\n InfiniteData<MatchGroupPage>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/matches` with\n * cursor-based pagination.\n *\n * Stats are available from the first page: `data.pages[0]?.stats`.\n */\nexport function useInfiniteMatches(\n params: UseInfiniteMatchesParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: matchesQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchMatchesPage(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: MatchGroupPage) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n ...queryOptions,\n });\n}\n\n/**\n * TanStack Query hook for fetching a single match group by ID.\n */\nexport function useMatch(\n id: number,\n queryOptions: Omit<\n UseQueryOptions<MatchGroup, Error, MatchGroup, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: matchQueryKey(id),\n queryFn: () => client.getMatch(id),\n enabled: id > 0,\n staleTime: 2 * 60_000,\n ...queryOptions,\n });\n}\n","/**\n * Server-safe pure functions for match markets query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictClient,\n MatchMarketParams,\n MatchMarketPage,\n} from \"../../client\";\n\n/** Query key for market-level match queries. */\nexport function matchMarketsQueryKey(params?: MatchMarketParams): unknown[] {\n return [\"predict\", \"matchMarkets\", params];\n}\n\n/** Fetch a page of match markets (usable in both client and server contexts). */\nexport async function fetchMatchMarketsPage(\n client: PredictClient,\n params: MatchMarketParams,\n): Promise<MatchMarketPage> {\n return client.listMatchMarkets(params);\n}\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { MatchMarketParams, MatchMarketPage } from \"../../client\";\nimport {\n matchMarketsQueryKey,\n fetchMatchMarketsPage,\n} from \"./matchMarkets.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { matchMarketsQueryKey, fetchMatchMarketsPage };\n\nexport type UseInfiniteMatchMarketsParams = Omit<MatchMarketParams, \"offset\">;\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n MatchMarketPage,\n Error,\n InfiniteData<MatchMarketPage>,\n unknown[],\n number\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/matches/markets`\n * with offset-based pagination.\n */\nexport function useInfiniteMatchMarkets(\n params: UseInfiniteMatchMarketsParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictClient();\n const limit = params.limit ?? 20;\n\n return useInfiniteQuery({\n queryKey: matchMarketsQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchMatchMarketsPage(client, {\n ...params,\n limit,\n offset: pageParam,\n }),\n initialPageParam: 0,\n getNextPageParam: (lastPage: MatchMarketPage) => {\n const nextOffset = lastPage.offset + lastPage.items.length;\n return nextOffset < lastPage.total ? nextOffset : undefined;\n },\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ListTradesParams, PredictPage, PredictTrade } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tradesQueryKey(params: ListTradesParams): unknown[] {\n return [\"predict\", \"trades-by-wallet\", params];\n}\n\nexport function useTrades(\n params: ListTradesParams,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictTrade>,\n Error,\n PredictPage<PredictTrade>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesQueryKey(params),\n queryFn: () => client.listTrades(params),\n enabled: Boolean(params.wallet),\n ...queryOptions,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { ListTradesParams } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport type UseInfiniteTradesParams = Omit<ListTradesParams, \"cursor\">;\n\nexport function infiniteTradesQueryKey(\n params: UseInfiniteTradesParams,\n): unknown[] {\n return [\"predict\", \"trades-by-wallet\", \"infinite\", params];\n}\n\nexport function useInfiniteTrades(params: UseInfiniteTradesParams) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: infiniteTradesQueryKey(params),\n queryFn: ({ pageParam }) =>\n client.listTrades({ ...params, cursor: pageParam }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage) =>\n lastPage.has_more ? lastPage.next_cursor : undefined,\n enabled: Boolean(params.wallet),\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { DFlowQuoteRequest, DFlowQuoteResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function dflowQuoteQueryKey(params: DFlowQuoteRequest): unknown[] {\n return [\"predict\", \"dflow-quote\", params];\n}\n\n/**\n * Fetch a DFlow quote. The query is only enabled when all required\n * fields are present and amount > 0.\n */\nexport function useDFlowQuote(\n params: DFlowQuoteRequest,\n queryOptions: Omit<\n UseQueryOptions<DFlowQuoteResponse, Error, DFlowQuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const paramsValid =\n Boolean(params.inputMint) &&\n Boolean(params.outputMint) &&\n Boolean(params.userPublicKey) &&\n params.amount !== \"0\" &&\n params.amount !== \"\";\n\n return useQuery({\n queryKey: dflowQuoteQueryKey(params),\n queryFn: () => client.createDFlowQuote(params),\n staleTime: 10_000,\n ...queryOptions,\n enabled: paramsValid && (queryOptions.enabled ?? true),\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { DFlowSubmitRequest, DFlowSubmitResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function useDFlowSubmit(\n mutationOptions: Omit<\n UseMutationOptions<DFlowSubmitResponse, Error, DFlowSubmitRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: DFlowSubmitRequest) =>\n client.submitDFlowTransaction(body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { DFlowKYCStatus } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function dflowKYCQueryKey(walletAddress: string): unknown[] {\n return [\"predict\", \"kyc\", \"dflow\", walletAddress];\n}\n\n/**\n * Query hook that checks DFlow KYC verification status for a Solana wallet.\n *\n * @param walletAddress - Solana wallet address to check.\n * @param queryOptions - React Query options (pass `enabled` to control when the query runs).\n */\nexport function useDFlowKYC(\n walletAddress?: string,\n queryOptions: Omit<\n UseQueryOptions<DFlowKYCStatus, Error, DFlowKYCStatus, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: dflowKYCQueryKey(walletAddress ?? \"\"),\n queryFn: () => client.checkDFlowKYC(walletAddress!),\n enabled: !!walletAddress,\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { PolymarketSetupStatus } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function polymarketSetupQueryKey(walletAddress: string): unknown[] {\n return [\"predict\", \"setup\", \"polymarket\", walletAddress];\n}\n\n/**\n * Query hook that checks Polymarket wallet setup status\n * (Safe deployed + USDC.e approved for CTF Exchange).\n */\nexport function usePolymarketSetup(\n walletAddress?: string,\n queryOptions: Omit<\n UseQueryOptions<\n PolymarketSetupStatus,\n Error,\n PolymarketSetupStatus,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: polymarketSetupQueryKey(walletAddress ?? \"\"),\n queryFn: () => client.checkPolymarketSetup(walletAddress!),\n enabled: !!walletAddress,\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n\n/**\n * Mutation hook to run Polymarket wallet setup\n * (deploy Safe + approve USDC.e via Relayer).\n * Automatically invalidates the setup status query on success.\n */\nexport function useRunPolymarketSetup(walletAddress?: string) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (address: string) => client.runPolymarketSetup(address),\n onSuccess: () => {\n if (walletAddress) {\n queryClient.invalidateQueries({\n queryKey: polymarketSetupQueryKey(walletAddress),\n });\n }\n },\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { WithdrawBuildRequest, WithdrawBuildResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function useWithdrawBuildMutation(\n mutationOptions: Omit<\n UseMutationOptions<WithdrawBuildResponse, Error, WithdrawBuildRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n\n return useMutation({\n mutationFn: (body: WithdrawBuildRequest) => client.withdrawBuild(body),\n ...mutationOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n WithdrawSubmitRequest,\n WithdrawSubmitResponse,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function useWithdrawSubmitMutation(\n mutationOptions: Omit<\n UseMutationOptions<WithdrawSubmitResponse, Error, WithdrawSubmitRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: WithdrawSubmitRequest) => client.withdrawSubmit(body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"balance\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawStatusResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function withdrawStatusQueryKey(\n txHash: string,\n source: ProviderSource,\n): unknown[] {\n return [\"predict\", \"withdraw\", \"status\", txHash, source];\n}\n\nexport interface UseWithdrawStatusQueryParams {\n txHash: string | undefined;\n source: ProviderSource;\n}\n\n/**\n * Polls the withdraw transaction status every 3 seconds.\n * Automatically stops polling when status is \"confirmed\" or \"failed\".\n * Only enabled when `txHash` is defined.\n */\nexport function useWithdrawStatusQuery(\n params: UseWithdrawStatusQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n WithdrawStatusResponse,\n Error,\n WithdrawStatusResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const { txHash, source } = params;\n\n return useQuery({\n queryKey: withdrawStatusQueryKey(txHash ?? \"\", source),\n queryFn: () => client.withdrawStatus(txHash!, source),\n enabled: Boolean(txHash && source),\n refetchInterval: (query) => {\n const status = query.state.data?.status;\n if (status === \"confirmed\" || status === \"failed\") return false;\n return 3_000;\n },\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { DepositBuildResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nconst TX_POLL_INTERVAL = 3_000;\nconst TX_POLL_MAX_ATTEMPTS = 60;\n\nexport interface PolymarketDepositVariables {\n from: string;\n safeAddress: string;\n /** Total USDC amount needed (human-readable, e.g. \"50.0\"). */\n amount: string;\n /** Signs a raw EVM transaction and returns the signed hex. */\n signTransaction: (txParams: Record<string, string>) => Promise<string>;\n}\n\nexport interface PolymarketDepositResult {\n /** Whether any deposit transactions were executed. */\n deposited: boolean;\n /** Number of transactions executed (0, 1 for swap-only, or 2 for approve+swap). */\n txCount: number;\n /** Shortfall that was swapped (human-readable). */\n shortfall: string;\n /** Safe balance before deposit. */\n safeBalance: string;\n}\n\n/**\n * Mutation hook for depositing native USDC into a Polymarket Safe wallet as USDC.e.\n *\n * Flow:\n * 1. Calls `/deposit/polymarket/build` to check Safe USDC.e balance and get unsigned txs.\n * 2. If shortfall > 0, signs and submits each tx (approve if needed, then swap).\n * 3. Polls tx status until confirmed.\n * 4. Returns the deposit result.\n */\nexport function usePolymarketDeposit(\n mutationOptions: Omit<\n UseMutationOptions<\n PolymarketDepositResult,\n Error,\n PolymarketDepositVariables\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n from,\n safeAddress,\n amount,\n signTransaction,\n }: PolymarketDepositVariables): Promise<PolymarketDepositResult> => {\n const buildResult: DepositBuildResponse = await client.depositBuild({\n source: \"polymarket\" as ProviderSource,\n from,\n safe_address: safeAddress,\n amount,\n });\n\n if (buildResult.transactions.length === 0) {\n return {\n deposited: false,\n txCount: 0,\n shortfall: buildResult.shortfall,\n safeBalance: buildResult.safe_balance,\n };\n }\n\n for (const unsignedTx of buildResult.transactions) {\n const signedHex = await signTransaction(unsignedTx.params);\n\n const submitResult = await client.depositSubmit({\n source: \"polymarket\" as ProviderSource,\n signed_tx: signedHex,\n });\n\n await pollTxUntilConfirmed(client, submitResult.tx_hash);\n }\n\n return {\n deposited: true,\n txCount: buildResult.transactions.length,\n shortfall: buildResult.shortfall,\n safeBalance: buildResult.safe_balance,\n };\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"balance\"] });\n },\n ...mutationOptions,\n });\n}\n\nasync function pollTxUntilConfirmed(\n client: {\n depositStatus: (\n txHash: string,\n source: ProviderSource,\n ) => Promise<{ status: string }>;\n },\n txHash: string,\n): Promise<void> {\n for (let i = 0; i < TX_POLL_MAX_ATTEMPTS; i++) {\n await sleep(TX_POLL_INTERVAL);\n const result = await client.depositStatus(txHash, \"polymarket\");\n if (result.status === \"confirmed\") return;\n if (result.status === \"failed\") {\n throw new Error(`Deposit transaction failed: ${txHash}`);\n }\n }\n throw new Error(\n `Deposit transaction timed out after ${(TX_POLL_MAX_ATTEMPTS * TX_POLL_INTERVAL) / 1000}s: ${txHash}`,\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { PolymarketDepositAddresses } from \"../../client/types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport const polymarketDepositAddressesQueryKey = (safeAddress: string) =>\n [\"polymarket\", \"deposit-addresses\", safeAddress] as const;\n\n/**\n * Fetch multi-chain deposit addresses for a Polymarket Safe wallet.\n *\n * @param safeAddress - The Safe (proxy) wallet address. When empty/undefined the query is disabled.\n */\nexport function usePolymarketDepositAddresses(safeAddress: string | undefined) {\n const client = usePredictClient();\n return useQuery<PolymarketDepositAddresses>({\n queryKey: polymarketDepositAddressesQueryKey(safeAddress ?? \"\"),\n queryFn: () => client.getPolymarketDepositAddresses(safeAddress!),\n enabled: !!safeAddress,\n staleTime: 5 * 60 * 1000,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport type {\n PolymarketWithdrawRequest,\n PolymarketWithdrawResponse,\n} from \"../../client/types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n/**\n * Mutation hook to execute a gasless USDC.e withdrawal from a Polymarket Safe\n * wallet via the Relayer.\n *\n * @example\n * ```ts\n * const { mutateAsync: withdraw } = usePolymarketWithdraw();\n * await withdraw({\n * wallet_address: \"0xEOA...\",\n * safe_address: \"0xSafe...\",\n * to: \"0xRecipient...\",\n * amount: \"10.5\",\n * });\n * ```\n */\nexport function usePolymarketWithdraw() {\n const client = usePredictClient();\n return useMutation<\n PolymarketWithdrawResponse,\n Error,\n PolymarketWithdrawRequest\n >({\n mutationFn: (req) => client.executePolymarketWithdraw(req),\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { TickSizeResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tickSizeQueryKey(tokenId: string): unknown[] {\n return [\"predict\", \"polymarket\", \"tick-size\", tokenId];\n}\n\n/**\n * Query hook that fetches the minimum tick size for a Polymarket token.\n *\n * @param tokenId - Polymarket CLOB token ID (asset ID).\n * @param queryOptions - React Query options (pass `enabled` to control when the query runs).\n */\nexport function useTickSize(\n tokenId?: string,\n queryOptions: Omit<\n UseQueryOptions<TickSizeResponse, Error, TickSizeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tickSizeQueryKey(tokenId ?? \"\"),\n queryFn: () => client.getPolymarketTickSize(tokenId!),\n enabled: !!tokenId,\n staleTime: 5 * 60_000,\n ...queryOptions,\n });\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport type { WsConnectionStatus } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\nimport { PredictContext } from \"../../providers/PredictContext\";\n\nexport interface UsePredictWsClientResult {\n /** The WebSocket client instance, or `null` if not provided via `PredictProvider`. */\n wsClient: PredictWsClient | null;\n /** Current connection status. Defaults to `\"disconnected\"` when no client. */\n wsStatus: WsConnectionStatus;\n /** Shorthand for `wsStatus === \"connected\"`. */\n isWsConnected: boolean;\n}\n\n/**\n * Access the `PredictWsClient` from context and track its connection status.\n *\n * Must be called inside a `PredictProvider`.\n */\nexport function usePredictWsClient(): UsePredictWsClientResult {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictWsClient must be used within a PredictProvider\");\n }\n\n const { wsClient } = context;\n const [wsStatus, setWsStatus] = useState<WsConnectionStatus>(\n wsClient?.getStatus() ?? \"disconnected\",\n );\n\n useEffect(() => {\n if (!wsClient) {\n setWsStatus(\"disconnected\");\n return;\n }\n setWsStatus(wsClient.getStatus());\n return wsClient.onStatusChange(setWsStatus);\n }, [wsClient]);\n\n return {\n wsClient,\n wsStatus,\n isWsConnected: wsStatus === \"connected\",\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { WsDataMessage, WsPriceEvent } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\n\nexport interface UsePricesSubscriptionParams {\n /** WebSocket client (from `usePredictWsClient`). */\n wsClient: PredictWsClient | null;\n /** Market slugs to subscribe to. */\n slugs: string[];\n /** Enable/disable the subscription. Default: `true`. */\n enabled?: boolean;\n /** Optional callback fired on every price update. */\n onUpdate?: (msg: WsDataMessage<WsPriceEvent>) => void;\n}\n\nexport interface UsePricesSubscriptionResult {\n /** Latest price data keyed by market slug. */\n prices: Map<string, WsPriceEvent>;\n /** Whether the subscription is active. */\n isSubscribed: boolean;\n}\n\n/**\n * Subscribe to real-time price updates via WebSocket.\n *\n * Maintains an internal `Map<slug, WsPriceEvent>` that updates on each push.\n * Does **not** interact with React Query.\n */\nexport function usePricesSubscription({\n wsClient,\n slugs,\n enabled = true,\n onUpdate,\n}: UsePricesSubscriptionParams): UsePricesSubscriptionResult {\n const [prices, setPrices] = useState<Map<string, WsPriceEvent>>(\n () => new Map(),\n );\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const onUpdateRef = useRef(onUpdate);\n onUpdateRef.current = onUpdate;\n\n const slugsKey = slugs.join(\",\");\n\n const handleUpdate = useCallback((msg: WsDataMessage<WsPriceEvent>) => {\n setPrices((prev) => {\n const next = new Map(prev);\n next.set(msg.data.market_slug, msg.data);\n return next;\n });\n onUpdateRef.current?.(msg);\n }, []);\n\n useEffect(() => {\n if (!wsClient || !enabled || slugs.length === 0) {\n setIsSubscribed(false);\n return;\n }\n\n const unsub = wsClient.subscribePrices(slugs, handleUpdate);\n setIsSubscribed(true);\n\n return () => {\n unsub();\n setIsSubscribed(false);\n };\n }, [wsClient, enabled, slugsKey, handleUpdate]);\n\n return { prices, isSubscribed };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { WsDataMessage, WsOrderbookEvent } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\n\nexport interface UseOrderbookSubscriptionParams {\n /** WebSocket client (from `usePredictWsClient`). */\n wsClient: PredictWsClient | null;\n /** Market slug to subscribe to. */\n slug: string;\n /** Enable/disable the subscription. Default: `true`. */\n enabled?: boolean;\n /** Optional callback fired on every orderbook snapshot. */\n onUpdate?: (msg: WsDataMessage<WsOrderbookEvent>) => void;\n}\n\nexport interface UseOrderbookSubscriptionResult {\n /** Latest full orderbook snapshot, or `null` before the first push. */\n orderbook: WsOrderbookEvent | null;\n /** Whether the subscription is active. */\n isSubscribed: boolean;\n}\n\n/**\n * Subscribe to real-time orderbook snapshots via WebSocket.\n *\n * Each incoming message is a **full snapshot** — no delta merging needed.\n * Does **not** interact with React Query.\n */\nexport function useOrderbookSubscription({\n wsClient,\n slug,\n enabled = true,\n onUpdate,\n}: UseOrderbookSubscriptionParams): UseOrderbookSubscriptionResult {\n const [orderbook, setOrderbook] = useState<WsOrderbookEvent | null>(null);\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const onUpdateRef = useRef(onUpdate);\n onUpdateRef.current = onUpdate;\n\n const handleUpdate = useCallback(\n (msg: WsDataMessage<WsOrderbookEvent>) => {\n if (msg.data.market_slug === slug) {\n setOrderbook(msg.data);\n onUpdateRef.current?.(msg);\n }\n },\n [slug],\n );\n\n useEffect(() => {\n if (!wsClient || !enabled || !slug) {\n setIsSubscribed(false);\n return;\n }\n\n setOrderbook(null);\n const unsub = wsClient.subscribeOrderbook([slug], handleUpdate);\n setIsSubscribed(true);\n\n return () => {\n unsub();\n setIsSubscribed(false);\n };\n }, [wsClient, enabled, slug, handleUpdate]);\n\n return { orderbook, isSubscribed };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { WsDataMessage, WsTradeEvent } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\n\nconst DEFAULT_MAX_HISTORY = 100;\n\nexport interface UseTradesSubscriptionParams {\n /** WebSocket client (from `usePredictWsClient`). */\n wsClient: PredictWsClient | null;\n /** Market slug to subscribe to. */\n slug: string;\n /** Enable/disable the subscription. Default: `true`. */\n enabled?: boolean;\n /** Max trades to keep in the buffer. Default: `100`. */\n maxHistory?: number;\n /** Optional callback fired on every new trade. */\n onUpdate?: (msg: WsDataMessage<WsTradeEvent>) => void;\n}\n\nexport interface UseTradesSubscriptionResult {\n /** Buffered trades, newest first. */\n trades: WsTradeEvent[];\n /** Whether the subscription is active. */\n isSubscribed: boolean;\n /** Clear the trade buffer. */\n clearHistory: () => void;\n}\n\n/**\n * Subscribe to real-time trade events via WebSocket.\n *\n * Maintains a bounded buffer of recent trades (newest first).\n * Does **not** interact with React Query.\n */\nexport function useTradesSubscription({\n wsClient,\n slug,\n enabled = true,\n maxHistory = DEFAULT_MAX_HISTORY,\n onUpdate,\n}: UseTradesSubscriptionParams): UseTradesSubscriptionResult {\n const [trades, setTrades] = useState<WsTradeEvent[]>([]);\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const onUpdateRef = useRef(onUpdate);\n onUpdateRef.current = onUpdate;\n\n const maxRef = useRef(maxHistory);\n maxRef.current = maxHistory;\n\n const handleUpdate = useCallback(\n (msg: WsDataMessage<WsTradeEvent>) => {\n if (msg.data.market_slug === slug) {\n setTrades((prev) => {\n const next = [msg.data, ...prev];\n return next.length > maxRef.current\n ? next.slice(0, maxRef.current)\n : next;\n });\n onUpdateRef.current?.(msg);\n }\n },\n [slug],\n );\n\n const clearHistory = useCallback(() => {\n setTrades([]);\n }, []);\n\n useEffect(() => {\n if (!wsClient || !enabled || !slug) {\n setIsSubscribed(false);\n return;\n }\n\n setTrades([]);\n const unsub = wsClient.subscribeTrades([slug], handleUpdate);\n setIsSubscribed(true);\n\n return () => {\n unsub();\n setIsSubscribed(false);\n };\n }, [wsClient, enabled, slug, handleUpdate]);\n\n return { trades, isSubscribed, clearHistory };\n}\n","import { useEffect, useRef } from \"react\";\nimport { useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Orderbook, ProviderSource } from \"../../client/types\";\nimport { useOrderbook, orderbookQueryKey } from \"./useOrderbook\";\nimport {\n useOrderbookSubscription,\n type UseOrderbookSubscriptionParams,\n} from \"./useOrderbookSubscription\";\nimport { usePredictWsClient } from \"./usePredictWsClient\";\n\nexport interface UseRealtimeOrderbookParams {\n slug: string;\n source: ProviderSource;\n}\n\nconst REST_POLL_INTERVAL = 5000;\n\n/**\n * Orderbook with automatic WS → REST fallback.\n *\n * - When the WebSocket is subscribed, the hook writes incoming snapshots\n * directly into the React Query cache via `setQueryData` (no refetch)\n * and disables REST polling.\n * - When the WebSocket is unavailable or disconnected, the hook falls\n * back to REST polling every 5 seconds.\n *\n * The return value is the same `UseQueryResult` as `useOrderbook`, so\n * migrating from `useOrderbook` is a drop-in replacement.\n */\nexport function useRealtimeOrderbook(\n params: UseRealtimeOrderbookParams,\n queryOptions: Omit<\n UseQueryOptions<Orderbook, Error, Orderbook, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { wsClient } = usePredictWsClient();\n const queryClient = useQueryClient();\n\n const subParams: UseOrderbookSubscriptionParams = {\n wsClient,\n slug: params.slug,\n enabled: Boolean(params.slug),\n };\n\n const { isSubscribed } = useOrderbookSubscription(subParams);\n\n const qk = orderbookQueryKey(params.slug, params.source);\n const qkRef = useRef(qk);\n qkRef.current = qk;\n\n // Write WS snapshots into React Query cache\n useEffect(() => {\n if (!wsClient || !params.slug) return;\n\n const unsub = wsClient.subscribeOrderbook([params.slug], (msg) => {\n const ob: Orderbook = {\n market_id: msg.data.market_slug,\n bids: msg.data.bids,\n asks: msg.data.asks,\n spread: msg.data.spread,\n };\n queryClient.setQueryData(qkRef.current, ob);\n });\n\n return unsub;\n }, [wsClient, params.slug, queryClient]);\n\n return useOrderbook(params, {\n refetchInterval: isSubscribed ? false : REST_POLL_INTERVAL,\n ...queryOptions,\n });\n}\n","import type { WsDataMessage, WsPriceEvent } from \"../../client/types\";\nimport { usePredictWsClient } from \"./usePredictWsClient\";\nimport {\n usePricesSubscription,\n type UsePricesSubscriptionResult,\n} from \"./usePricesSubscription\";\n\nexport interface UseRealtimePricesParams {\n /** Market slugs to subscribe to. */\n slugs: string[];\n /** Enable/disable. Default: `true`. */\n enabled?: boolean;\n /** Optional callback on each price update. */\n onUpdate?: (msg: WsDataMessage<WsPriceEvent>) => void;\n}\n\n/**\n * Real-time price updates with graceful degradation.\n *\n * When the WebSocket client is available and connected, this hook\n * subscribes to price updates and returns a `Map<slug, WsPriceEvent>`.\n * When no WebSocket client is provided, `prices` stays empty and\n * `isSubscribed` is `false` — the consumer can fall back to REST data.\n */\nexport function useRealtimePrices({\n slugs,\n enabled = true,\n onUpdate,\n}: UseRealtimePricesParams): UsePricesSubscriptionResult {\n const { wsClient } = usePredictWsClient();\n\n return usePricesSubscription({\n wsClient,\n slugs,\n enabled,\n onUpdate,\n });\n}\n","import { useEffect, useRef } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type {\n PredictPage,\n PredictTrade,\n WsDataMessage,\n WsTradeEvent,\n} from \"../../client/types\";\nimport { marketTradesQueryKey } from \"./useMarketTrades\";\nimport { usePredictWsClient } from \"./usePredictWsClient\";\nimport {\n useTradesSubscription,\n type UseTradesSubscriptionResult,\n} from \"./useTradesSubscription\";\n\nexport interface UseRealtimeTradesParams {\n /** Market slug to subscribe to. */\n slug: string;\n /** Enable/disable. Default: `true`. */\n enabled?: boolean;\n /** Max WS trades to buffer. Default: `100`. */\n maxHistory?: number;\n /** Optional callback on each new trade. */\n onUpdate?: (msg: WsDataMessage<WsTradeEvent>) => void;\n /**\n * When `true`, new WS trades are prepended into matching React Query\n * `marketTrades` cache entries so paginated lists update instantly.\n * Default: `true`.\n */\n syncToQueryCache?: boolean;\n}\n\nexport type UseRealtimeTradesResult = UseTradesSubscriptionResult;\n\n/**\n * Real-time trade stream with optional React Query cache sync.\n *\n * Subscribes to the `trades` WS channel for a single market.\n * When `syncToQueryCache` is enabled (default), each new trade is also\n * prepended into any active React Query cache entry whose key matches\n * `[\"predict\", \"market-trades\", slug, ...]`.\n */\nexport function useRealtimeTrades({\n slug,\n enabled = true,\n maxHistory,\n onUpdate,\n syncToQueryCache = true,\n}: UseRealtimeTradesParams): UseRealtimeTradesResult {\n const { wsClient } = usePredictWsClient();\n const queryClient = useQueryClient();\n\n const slugRef = useRef(slug);\n slugRef.current = slug;\n\n // Optionally push new WS trades into React Query cache\n useEffect(() => {\n if (!wsClient || !slug || !enabled || !syncToQueryCache) return;\n\n const unsub = wsClient.subscribeTrades([slug], (msg) => {\n const trade = msg.data;\n // Update all cache entries whose key starts with the market-trades prefix\n const prefix = [\"predict\", \"market-trades\", slugRef.current];\n queryClient.setQueriesData<PredictPage<PredictTrade>>(\n { queryKey: prefix },\n (old) => {\n if (!old) return old;\n const syntheticTrade: PredictTrade = {\n id: trade.trade_id ?? `ws-${msg.ts}`,\n source: \"kalshi\",\n side: trade.side,\n outcome: trade.outcome ?? \"\",\n outcome_index: 0,\n price: trade.price,\n size: trade.size,\n usd_size: trade.size,\n timestamp: Math.floor(msg.ts / 1000),\n tx_hash: \"\",\n wallet: \"\",\n type: \"TRADE\",\n };\n return {\n ...old,\n items: [syntheticTrade, ...old.items],\n };\n },\n );\n });\n\n return unsub;\n }, [wsClient, slug, enabled, syncToQueryCache, queryClient]);\n\n return useTradesSubscription({\n wsClient,\n slug,\n enabled,\n maxHistory,\n onUpdate,\n });\n}\n","import { useContext } from \"react\";\nimport { PolymarketContext } from \"../../providers/PolymarketContext\";\n\n/**\n * Access Polymarket L2 credentials and authentication actions.\n *\n * Must be called inside a component tree wrapped by `PolymarketProvider`.\n *\n * @throws When used outside of `PolymarketProvider`.\n *\n * @example\n * ```tsx\n * function TradeButton() {\n * const { credentials, authenticate, isAuthenticating } = usePolymarket();\n *\n * const handleClick = async () => {\n * if (!credentials) {\n * await authenticate(myPolymarketSigner);\n * }\n * // proceed to place order\n * };\n *\n * return (\n * <button onClick={handleClick} disabled={isAuthenticating}>\n * Trade\n * </button>\n * );\n * }\n * ```\n */\nexport function usePolymarket() {\n const context = useContext(PolymarketContext);\n if (!context) {\n throw new Error(\"usePolymarket must be used within a PolymarketProvider\");\n }\n return context;\n}\n","/**\n * Polymarket CTF Exchange order construction utilities.\n *\n * Implements EIP-712 signing for `Order` structs on the CTF Exchange and\n * Neg-Risk CTF Exchange contracts (Polygon mainnet).\n *\n * References:\n * https://github.com/Polymarket/clob-client/blob/main/src/order-builder/builder.ts\n * https://github.com/Polymarket/clob-client/blob/main/src/order-builder/helpers.ts\n * https://docs.polymarket.com/#create-order\n */\nimport type { CreateOrderInput } from \"../client/types\";\n\n// ---------------------------------------------------------------------------\n// Contract addresses (Polygon mainnet)\n// ---------------------------------------------------------------------------\n\n/** Polymarket CTF Exchange contract (standard markets). */\nexport const CTF_EXCHANGE_ADDRESS =\n \"0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E\" as const;\n\n/** Polymarket Neg-Risk CTF Exchange contract (neg-risk markets). */\nexport const NEG_RISK_CTF_EXCHANGE_ADDRESS =\n \"0xC5d563A36AE78145C45a50134d48A1215220f80a\" as const;\n\n/** USDC.e (Bridged USDC) on Polygon — the only collateral token on Polymarket. */\nexport const USDC_ADDRESS =\n \"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174\" as const;\n\n/** Chain ID for Polygon mainnet. */\nexport const POLYGON_CHAIN_ID = 137;\n\n// ---------------------------------------------------------------------------\n// EIP-712 domain and types\n// ---------------------------------------------------------------------------\n\n/**\n * Build the EIP-712 domain for the CTF Exchange.\n *\n * @param negRisk - When `true`, use the Neg-Risk exchange address.\n */\nexport function buildCtfExchangeDomain(negRisk = false) {\n return {\n name: \"Polymarket CTF Exchange\",\n version: \"1\",\n chainId: POLYGON_CHAIN_ID,\n verifyingContract: negRisk\n ? NEG_RISK_CTF_EXCHANGE_ADDRESS\n : CTF_EXCHANGE_ADDRESS,\n };\n}\n\n/** EIP-712 type definitions for the Polymarket `Order` struct. */\nexport const CTF_ORDER_TYPES = {\n Order: [\n { name: \"salt\", type: \"uint256\" },\n { name: \"maker\", type: \"address\" },\n { name: \"signer\", type: \"address\" },\n { name: \"taker\", type: \"address\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"makerAmount\", type: \"uint256\" },\n { name: \"takerAmount\", type: \"uint256\" },\n { name: \"expiration\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"feeRateBps\", type: \"uint256\" },\n { name: \"side\", type: \"uint8\" },\n { name: \"signatureType\", type: \"uint8\" },\n ],\n} as const;\n\n// ---------------------------------------------------------------------------\n// Order type constants\n// ---------------------------------------------------------------------------\n\n/** Order type enum matching CTFExchange.sol. */\nexport const ORDER_TYPE = {\n GTC: 0, // Good-Till-Cancelled\n FOK: 1, // Fill-Or-Kill\n GTD: 2, // Good-Till-Date\n FAK: 3, // Fill-And-Kill\n} as const;\n\n/** Side enum matching CTFExchange.sol (0 = BUY, 1 = SELL). */\nexport const SIDE = { BUY: 0, SELL: 1 } as const;\n\n// ---------------------------------------------------------------------------\n// Amount calculation — matches official Polymarket CLOB client rounding\n// ---------------------------------------------------------------------------\n\n/**\n * Rounding configuration per tick size, aligned with the official\n * Polymarket CLOB client (`@polymarket/clob-client`).\n *\n * Key invariant: `amount = size + price` decimal places, which guarantees\n * that `amount / size` (= implied price) has exactly `price` decimal places,\n * i.e. a valid tick-aligned price.\n *\n * @see https://github.com/Polymarket/clob-client/blob/main/src/order-builder/helpers.ts\n */\nconst ROUNDING_CONFIG: Record<\n string,\n { size: number; price: number; amount: number }\n> = {\n \"0.1\": { size: 2, price: 1, amount: 3 },\n \"0.01\": { size: 2, price: 2, amount: 4 },\n \"0.001\": { size: 3, price: 3, amount: 6 },\n \"0.0001\": { size: 4, price: 4, amount: 8 },\n};\n\nconst DEFAULT_ROUNDING = { size: 2, price: 2, amount: 4 };\n\n/**\n * Round a number to `d` decimal places (round-half-away-from-zero via toFixed).\n * Mirrors the official `decimalPlaces()` / `roundNormal()` helpers.\n */\nfunction decimalPlaces(n: number, d: number): number {\n return parseFloat(n.toFixed(d));\n}\n\n/**\n * Convert a human-readable amount to micro-USDC (6 decimals).\n * Polymarket contracts use USDC.e with 6 decimals.\n */\nfunction toMicroUsdc(amount: number): bigint {\n return BigInt(Math.round(amount * 1_000_000));\n}\n\n/**\n * Normalise a token ID to a decimal string.\n * Polymarket's CLOB API requires decimal representation, but market metadata\n * may store token IDs as hex strings (0x-prefixed).\n */\nfunction normalizeTokenId(tokenId: string): string {\n if (tokenId.startsWith(\"0x\") || tokenId.startsWith(\"0X\")) {\n return BigInt(tokenId).toString(10);\n }\n return tokenId;\n}\n\n// ---------------------------------------------------------------------------\n// Order message builder\n// ---------------------------------------------------------------------------\n\nexport interface BuildOrderMessageInput extends CreateOrderInput {\n /** Signer / owner address. */\n signerAddress: string;\n /** Signature type (0 = EOA, 1 = Magic, 2 = Poly Proxy). */\n signatureType: 0 | 1 | 2;\n}\n\nexport interface OrderMessage {\n salt: string;\n maker: string;\n signer: string;\n taker: string;\n tokenId: string;\n makerAmount: string;\n takerAmount: string;\n expiration: string;\n nonce: string;\n feeRateBps: string;\n side: number;\n signatureType: number;\n}\n\n/**\n * Build the EIP-712 typed data value for a Polymarket limit order.\n *\n * All amounts are in micro-USDC (1 USDC = 1 000 000).\n *\n * For a BUY order:\n * - `makerAmount` = USDC spent (cost = size × price)\n * - `takerAmount` = shares received (= size)\n *\n * For a SELL order:\n * - `makerAmount` = shares sold (= size)\n * - `takerAmount` = USDC received (cost = size × price)\n *\n * Amount rounding follows the official Polymarket CLOB client to guarantee\n * that `makerAmount / takerAmount` produces a tick-aligned price.\n * The key invariant: `amountDecimals = sizeDecimals + priceDecimals`, so\n * `round(size × price, amountDecimals) / round(size, sizeDecimals)` has\n * exactly `priceDecimals` decimal places.\n */\nexport function buildOrderMessage(input: BuildOrderMessageInput): OrderMessage {\n const side = input.side === \"BUY\" ? SIDE.BUY : SIDE.SELL;\n const rc = ROUNDING_CONFIG[input.tickSize] ?? DEFAULT_ROUNDING;\n\n const rawPrice = decimalPlaces(input.price, rc.price);\n const rawSize = decimalPlaces(input.size, rc.size);\n const rawAmount = decimalPlaces(rawSize * rawPrice, rc.amount);\n\n const sizeInMicro = toMicroUsdc(rawSize);\n const amountInMicro = toMicroUsdc(rawAmount);\n\n const makerAmount =\n side === SIDE.BUY ? amountInMicro.toString() : sizeInMicro.toString();\n const takerAmount =\n side === SIDE.BUY ? sizeInMicro.toString() : amountInMicro.toString();\n\n const maker = input.funderAddress ?? input.signerAddress;\n\n return {\n salt: Math.floor(Math.random() * 1e15).toString(),\n maker,\n signer: input.signerAddress,\n taker: \"0x0000000000000000000000000000000000000000\",\n tokenId: normalizeTokenId(input.tokenId),\n makerAmount,\n takerAmount,\n expiration: String(input.expiration ?? 0),\n nonce: \"0\",\n feeRateBps: \"0\",\n side,\n signatureType: input.signatureType,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Signed order payload builder\n// ---------------------------------------------------------------------------\n\nexport interface SignedOrder extends OrderMessage {\n signature: string;\n orderType: string;\n}\n\n/**\n * Attach a signature (and optional orderType) to an already-built order message\n * to produce the final payload for the Polymarket CLOB.\n *\n * IMPORTANT: always pass the SAME `OrderMessage` that was used for EIP-712\n * signing. Do NOT rebuild it — `buildOrderMessage` generates a random salt\n * each time, so a second call would produce a different message and the\n * signature would be invalid.\n */\nexport function buildSignedOrder(\n orderMessage: OrderMessage,\n signature: string,\n orderType?: string,\n): SignedOrder {\n return {\n ...orderMessage,\n signature,\n orderType: orderType ?? \"GTC\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// CLOB payload builder (orderToJson equivalent)\n// ---------------------------------------------------------------------------\n\n/**\n * CLOB order payload as expected by Polymarket's `POST /order` endpoint.\n *\n * Key format differences from the EIP-712 `OrderMessage`:\n * - `salt` is a **number** (not a string)\n * - `side` is `\"BUY\"` / `\"SELL\"` (not 0 / 1)\n * - `deferExec` is required (defaults to `false`)\n *\n * @see https://github.com/Polymarket/clob-client/blob/main/src/utilities.ts\n */\nexport interface ClobOrderPayload {\n order: {\n salt: number;\n maker: string;\n signer: string;\n taker: string;\n tokenId: string;\n makerAmount: string;\n takerAmount: string;\n expiration: string;\n nonce: string;\n feeRateBps: string;\n side: \"BUY\" | \"SELL\";\n signatureType: number;\n signature: string;\n };\n owner: string;\n orderType: string;\n deferExec: boolean;\n}\n\n/**\n * Convert a `SignedOrder` into the JSON payload format that Polymarket's\n * CLOB API expects. Mirrors the official `orderToJson()` utility.\n */\nexport function buildClobPayload(\n signedOrder: SignedOrder,\n owner: string,\n): ClobOrderPayload {\n const { orderType: ot, ...order } = signedOrder;\n return {\n order: {\n ...order,\n salt: parseInt(order.salt, 10),\n side: order.side === SIDE.BUY ? \"BUY\" : \"SELL\",\n },\n owner,\n orderType: ot ?? \"GTC\",\n deferExec: false,\n };\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n CreateOrderInput,\n DepositBuildResponse,\n PredictOrder,\n ProviderSource,\n} from \"../../client\";\nimport type { PolymarketSigner } from \"../../providers/PolymarketContext\";\nimport { buildPolymarketL2Headers } from \"../../utils/polymarket-hmac\";\nimport {\n buildCtfExchangeDomain,\n CTF_ORDER_TYPES,\n buildOrderMessage,\n buildSignedOrder,\n buildClobPayload,\n} from \"../../utils/polymarket-order\";\nimport { usePredictClient } from \"../predict/usePredictClient\";\nimport { usePolymarket } from \"./usePolymarket\";\n\nconst TX_POLL_INTERVAL = 3_000;\nconst TX_POLL_MAX_ATTEMPTS = 60;\n\nexport interface CreatePolymarketOrderVariables {\n input: CreateOrderInput;\n /**\n * IoC signer — provided by the consuming app.\n * Used to sign the EIP-712 order struct on the CTF Exchange contract.\n * If `signTransaction` is provided on the signer, auto-deposit is enabled:\n * before placing the order, the hook checks whether the Safe wallet has\n * enough USDC.e and swaps native USDC → USDC.e via Uniswap V3 if needed.\n */\n signer: PolymarketSigner;\n}\n\n/**\n * Mutation hook for creating a Polymarket limit order with auto-deposit.\n *\n * Flow:\n * 1. If no L2 credentials exist, triggers L1 → L2 authentication automatically.\n * 2. **Auto-deposit** (when `signer.signTransaction` is provided):\n * - Calls `/deposit/polymarket/build` to check Safe USDC.e balance.\n * - If shortfall > 0, signs and submits approve + swap transactions.\n * - Polls until the swap is confirmed on-chain.\n * 3. Builds the EIP-712 `Order` typed data and prompts the wallet for a signature.\n * 4. Constructs HMAC L2 auth headers from the stored credentials.\n * 5. Submits the signed order via `POST /api/v1/orders/polymarket`.\n * 6. Invalidates `orders` and `positions` queries on success.\n *\n * @example\n * ```tsx\n * const { mutateAsync: createOrder, isPending } = useCreatePolymarketOrder();\n *\n * await createOrder({\n * signer: {\n * address: walletAddress,\n * signatureType: 2,\n * signTypedData: async (domain, types, value) => { ... },\n * signTransaction: async (txParams) => { ... }, // enables auto-deposit\n * },\n * input: {\n * tokenId: \"123456789\",\n * price: 0.55,\n * size: 10,\n * side: \"BUY\",\n * tickSize: \"0.01\",\n * negRisk: false,\n * funderAddress: safeAddress,\n * },\n * });\n * ```\n */\nexport function useCreatePolymarketOrder(\n mutationOptions: Omit<\n UseMutationOptions<PredictOrder, Error, CreatePolymarketOrderVariables>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const { credentials, authenticate } = usePolymarket();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n input,\n signer,\n }: CreatePolymarketOrderVariables): Promise<PredictOrder> => {\n // Step 1: Ensure L2 credentials exist (authenticate if missing).\n const creds = credentials ?? (await authenticate(signer));\n\n // Step 2: Auto-deposit if signer supports signTransaction.\n if (signer.signTransaction && input.funderAddress) {\n const orderCost = computeOrderCost(input);\n const buildResult: DepositBuildResponse = await client.depositBuild({\n source: \"polymarket\" as ProviderSource,\n from: signer.address,\n safe_address: input.funderAddress,\n amount: orderCost,\n });\n\n if (buildResult.transactions.length > 0) {\n for (const unsignedTx of buildResult.transactions) {\n const signedHex = await signer.signTransaction(unsignedTx.params);\n\n const submitResult = await client.depositSubmit({\n source: \"polymarket\" as ProviderSource,\n signed_tx: signedHex,\n });\n\n await pollTxConfirmed(\n (txHash) => client.depositStatus(txHash, \"polymarket\"),\n submitResult.tx_hash,\n );\n }\n }\n }\n\n // Step 3: Build and sign the EIP-712 order struct.\n const domain = buildCtfExchangeDomain(input.negRisk ?? false);\n const orderMessage = buildOrderMessage({\n ...input,\n signerAddress: signer.address,\n signatureType: signer.signatureType,\n });\n\n const signature = await signer.signTypedData(\n domain,\n CTF_ORDER_TYPES as unknown as Record<string, unknown[]>,\n \"Order\",\n orderMessage as unknown as Record<string, unknown>,\n );\n\n const signedOrder = buildSignedOrder(\n orderMessage,\n signature,\n input.orderType,\n );\n\n // Step 4: Convert to CLOB payload format (numeric salt, string side, deferExec).\n const clobPayload = buildClobPayload(signedOrder, creds.apiKey);\n\n // HMAC must sign against Polymarket's path (/order), not our proxy path.\n const body = JSON.stringify(clobPayload);\n const headers = await buildPolymarketL2Headers(creds.address, {\n apiKey: creds.apiKey,\n secret: creds.secret,\n passphrase: creds.passphrase,\n method: \"POST\",\n requestPath: \"/order\",\n body,\n });\n\n // Step 5: Submit via prediction-server proxy.\n return client.createPolymarketOrder(\n clobPayload as unknown as CreateOrderInput,\n headers as unknown as Record<string, string>,\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"balance\"] });\n },\n ...mutationOptions,\n });\n}\n\n/**\n * Compute the total USDC cost for a BUY order.\n * For SELL orders, the collateral is already in the Safe as outcome tokens,\n * so no deposit is needed — returns \"0\".\n */\nfunction computeOrderCost(input: CreateOrderInput): string {\n if (input.side === \"SELL\") return \"0\";\n return (input.price * input.size).toFixed(6);\n}\n\nasync function pollTxConfirmed(\n fetchStatus: (txHash: string) => Promise<{ status: string }>,\n txHash: string,\n): Promise<void> {\n for (let i = 0; i < TX_POLL_MAX_ATTEMPTS; i++) {\n await new Promise((r) => setTimeout(r, TX_POLL_INTERVAL));\n const result = await fetchStatus(txHash);\n if (result.status === \"confirmed\") return;\n if (result.status === \"failed\") {\n throw new Error(`Deposit transaction failed: ${txHash}`);\n }\n }\n throw new Error(\n `Deposit transaction timed out after ${(TX_POLL_MAX_ATTEMPTS * TX_POLL_INTERVAL) / 1000}s: ${txHash}`,\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/client/client.ts","../src/client/ws.ts","../src/providers/PredictContext.ts","../src/providers/PredictProvider.tsx","../src/utils/polymarket-hmac.ts","../src/providers/PolymarketContext.ts","../src/providers/PolymarketProvider.tsx","../src/hooks/predict/usePredictClient.ts","../src/hooks/predict/useEvents.ts","../src/hooks/predict/events.params.ts","../src/hooks/predict/useEvent.ts","../src/hooks/predict/useInfiniteEvents.ts","../src/hooks/predict/useSearchEvents.ts","../src/hooks/predict/useSimilarEvents.ts","../src/hooks/predict/market.params.ts","../src/hooks/predict/useMarket.ts","../src/hooks/predict/usePriceHistory.ts","../src/hooks/predict/useMarketHistory.ts","../src/hooks/predict/useOrderbook.ts","../src/hooks/predict/useMarketTrades.ts","../src/hooks/predict/useCandlesticks.ts","../src/hooks/predict/usePositions.ts","../src/hooks/predict/useBalance.ts","../src/hooks/predict/useOrders.ts","../src/hooks/predict/useInfiniteOrders.ts","../src/hooks/predict/useOrder.ts","../src/hooks/predict/useCancelOrder.ts","../src/hooks/predict/matches.params.ts","../src/hooks/predict/useMatches.ts","../src/hooks/predict/matchMarkets.params.ts","../src/hooks/predict/useMatchMarkets.ts","../src/hooks/predict/useTrades.ts","../src/hooks/predict/useInfiniteTrades.ts","../src/hooks/predict/useDFlowQuote.ts","../src/hooks/predict/useDFlowSubmit.ts","../src/hooks/predict/useDFlowKYC.ts","../src/hooks/predict/usePolymarketSetup.ts","../src/hooks/predict/useWithdrawBuildMutation.ts","../src/hooks/predict/useWithdrawSubmitMutation.ts","../src/hooks/predict/useWithdrawStatusQuery.ts","../src/hooks/predict/usePolymarketDeposit.ts","../src/hooks/predict/usePolymarketDepositAddresses.ts","../src/hooks/predict/usePolymarketWithdraw.ts","../src/hooks/predict/useTickSize.ts","../src/hooks/predict/usePredictWsClient.ts","../src/hooks/predict/usePricesSubscription.ts","../src/hooks/predict/useOrderbookSubscription.ts","../src/hooks/predict/useTradesSubscription.ts","../src/hooks/predict/useRealtimeOrderbook.ts","../src/hooks/predict/useRealtimePrices.ts","../src/hooks/predict/useRealtimeTrades.ts","../src/hooks/polymarket/usePolymarket.ts","../src/utils/polymarket-order.ts","../src/hooks/polymarket/useCreatePolymarketOrder.ts"],"names":["createContext","jsx","useQuery","useMemo","useInfiniteQuery","useQueryClient","useMutation","useContext","useState","useRef","useCallback","useEffect","TX_POLL_INTERVAL","TX_POLL_MAX_ATTEMPTS"],"mappings":"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","file":"index.mjs","sourcesContent":["import { httpGet, httpPost, httpDelete } from \"@liberfi.io/utils\";\nimport type {\n BalanceResponse,\n CancelOrderResult,\n Candlestick,\n CreateOrderInput,\n DepositBuildRequest,\n DepositBuildResponse,\n DepositSubmitRequest,\n DepositSubmitResponse,\n DepositStatusResponse,\n DFlowKYCStatus,\n DFlowQuoteRequest,\n DFlowQuoteResponse,\n DFlowSubmitRequest,\n DFlowSubmitResponse,\n ListCandlesticksParams,\n ListEventsParams,\n ListMarketTradesParams,\n ListOrdersParams,\n ListTradesParams,\n MatchesParams,\n MatchGroup,\n MatchGroupPage,\n MatchMarketParams,\n MatchMarketPage,\n Orderbook,\n PolymarketDepositAddresses,\n PolymarketSetupStatus,\n PolymarketWithdrawRequest,\n PolymarketWithdrawResponse,\n PredictEvent,\n PredictMarket,\n PredictOrder,\n PredictPage,\n PredictTrade,\n PositionsResponse,\n PriceHistoryRange,\n PriceHistoryResponse,\n ProviderSource,\n SimilarEventsParams,\n WithdrawBuildRequest,\n WithdrawBuildResponse,\n WithdrawSubmitRequest,\n WithdrawSubmitResponse,\n WithdrawStatusResponse,\n TickSizeResponse,\n} from \"./types\";\n\n/**\n * Build a URL query string from a params object.\n * `undefined` and `null` values are omitted.\n * Boolean values are serialised as \"true\" / \"false\" strings.\n */\nfunction buildQuery(params: Record<string, unknown>): string {\n const qs = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n qs.set(key, String(value));\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/**\n * HTTP client for the prediction-server REST API.\n *\n * Covers all prediction, market, order, position, and trading endpoints.\n *\n * @example\n * ```ts\n * const client = new PredictClient(\"https://api.example.com\");\n * const page = await client.listEvents({ status: \"open\", limit: 20 });\n * const event = await client.getEvent(\"will-trump-win-2024\");\n * const market = await client.getMarket(\"will-trump-win-2024-yes\");\n * ```\n */\nexport class PredictClient {\n constructor(private readonly endpoint: string) {}\n\n // -------------------------------------------------------------------------\n // Events\n // -------------------------------------------------------------------------\n\n /**\n * List prediction events with optional filtering, sorting, and pagination.\n *\n * Maps to `GET /api/v1/events`.\n *\n * @param params - Optional query parameters (filter, sort, pagination).\n * @returns A paginated page of events.\n */\n async listEvents(\n params?: ListEventsParams,\n ): Promise<PredictPage<PredictEvent>> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/events${query}`;\n return await httpGet<PredictPage<PredictEvent>>(url);\n }\n\n /**\n * Fetch a single prediction event by its slug.\n *\n * Maps to `GET /api/v1/events/:slug?source=...`.\n *\n * @param slug - Canonical event slug (e.g. \"will-trump-win-2024\" for Polymarket\n * or \"KXBTCD-25FEB-T68000\" for Kalshi).\n * @param source - Upstream provider (`\"kalshi\"` or `\"polymarket\"`).\n * @returns The matching event.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getEvent(slug: string, source?: ProviderSource): Promise<PredictEvent> {\n const query = source ? buildQuery({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}${query}`;\n return await httpGet<PredictEvent>(url);\n }\n\n /**\n * Fetch events similar to the given slug.\n *\n * Maps to `GET /api/v1/events/:slug/similar?source=...`.\n */\n async getSimilarEvents(\n slug: string,\n source: ProviderSource,\n params?: SimilarEventsParams,\n ): Promise<PredictEvent[]> {\n const query = buildQuery({ source, ...params });\n const url = `${this.endpoint}/api/v1/events/${encodeURIComponent(slug)}/similar${query}`;\n return await httpGet<PredictEvent[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Markets\n // -------------------------------------------------------------------------\n\n /**\n * Fetch a single prediction market by its slug.\n *\n * Maps to `GET /api/v1/markets/:slug?source=...`.\n *\n * @param slug - Canonical market slug.\n * @param source - Upstream provider (`\"kalshi\"` or `\"polymarket\"`).\n * @returns The matching market.\n * @throws When the server responds with 404 or any other non-2xx status.\n */\n async getMarket(\n slug: string,\n source?: ProviderSource,\n ): Promise<PredictMarket> {\n const query = source ? buildQuery({ source }) : \"\";\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}${query}`;\n return await httpGet<PredictMarket>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/orderbook?source=...`. */\n async getOrderbook(slug: string, source: ProviderSource): Promise<Orderbook> {\n const query = buildQuery({ source });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/orderbook${query}`;\n return await httpGet<Orderbook>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/trades?source=...`. */\n async listMarketTrades(\n slug: string,\n params: ListMarketTradesParams,\n ): Promise<PredictPage<PredictTrade>> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/trades${query}`;\n return await httpGet<PredictPage<PredictTrade>>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/price-history?source=...&range=...`. */\n async getPriceHistory(\n slug: string,\n source: ProviderSource,\n range?: PriceHistoryRange,\n ): Promise<PriceHistoryResponse> {\n const query = buildQuery({ source, range });\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/price-history${query}`;\n return await httpGet<PriceHistoryResponse>(url);\n }\n\n /** Maps to `GET /api/v1/markets/:slug/candlesticks?interval=...&limit=...`. */\n async listCandlesticks(\n slug: string,\n params?: ListCandlesticksParams,\n ): Promise<Candlestick[]> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/markets/${encodeURIComponent(slug)}/candlesticks${query}`;\n return await httpGet<Candlestick[]>(url);\n }\n\n // -------------------------------------------------------------------------\n // Positions\n // -------------------------------------------------------------------------\n\n /**\n * Maps to `GET /api/v1/positions`.\n *\n * Single-source: `getPositions(\"addr\", \"kalshi\")`.\n * Multi-wallet: `getPositions({ kalshi_user: \"SOLaddr\", polymarket_user: \"EVMaddr\" })`.\n * Legacy agg: `getPositions(\"addr\")` (same address for all providers).\n */\n async getPositions(\n userOrWallets: string | { kalshi_user?: string; polymarket_user?: string },\n source?: ProviderSource,\n ): Promise<PositionsResponse> {\n let query: string;\n if (typeof userOrWallets === \"string\") {\n query = buildQuery({ source, user: userOrWallets });\n } else {\n query = buildQuery(userOrWallets as Record<string, unknown>);\n }\n const url = `${this.endpoint}/api/v1/positions${query}`;\n return await httpGet<PositionsResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Balance\n // -------------------------------------------------------------------------\n\n /**\n * Get the on-chain USDC balance for a wallet.\n *\n * Maps to `GET /api/v1/balance?source=...&user=...`.\n *\n * @param source - Provider source (`\"kalshi\"` for Solana, `\"polymarket\"` for Polygon).\n * @param user - Wallet address.\n */\n async getBalance(\n source: ProviderSource,\n user: string,\n ): Promise<BalanceResponse> {\n const query = buildQuery({ source, user });\n const url = `${this.endpoint}/api/v1/balance${query}`;\n return await httpGet<BalanceResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Orders\n // -------------------------------------------------------------------------\n\n /**\n * Maps to `GET /api/v1/orders?source=...&wallet_address=...`.\n *\n * @param params - Query parameters (source, wallet_address, etc.).\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async listOrders(\n params: ListOrdersParams,\n headers?: Record<string, string>,\n ): Promise<PredictPage<PredictOrder>> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/orders${query}`;\n return await httpGet<PredictPage<PredictOrder>>(\n url,\n headers ? { headers } : undefined,\n );\n }\n\n /**\n * Maps to `GET /api/v1/orders/:id?source=...`.\n *\n * @param id - Order ID.\n * @param source - Provider source.\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async getOrder(\n id: string,\n source: ProviderSource,\n headers?: Record<string, string>,\n ): Promise<PredictOrder> {\n const query = buildQuery({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpGet<PredictOrder>(url, headers ? { headers } : undefined);\n }\n\n /**\n * Maps to `DELETE /api/v1/orders/:id?source=...`.\n *\n * @param id - Order ID.\n * @param source - Provider source.\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async cancelOrder(\n id: string,\n source: ProviderSource,\n headers?: Record<string, string>,\n ): Promise<CancelOrderResult> {\n const query = buildQuery({ source });\n const url = `${this.endpoint}/api/v1/orders/${encodeURIComponent(id)}${query}`;\n return await httpDelete<CancelOrderResult>(\n url,\n headers ? { headers } : undefined,\n );\n }\n\n // -------------------------------------------------------------------------\n // Polymarket trading\n // -------------------------------------------------------------------------\n\n /**\n * Create a Polymarket limit order via the prediction-server proxy.\n *\n * Maps to `POST /api/v1/orders/polymarket`.\n *\n * The caller must attach Polymarket CLOB authentication headers:\n * - `POLY_ADDRESS` — the EVM wallet address.\n * - `POLY_SIGNATURE` — L1 signature or L2 API key.\n * - `POLY_TIMESTAMP` — Unix milliseconds string.\n * - `POLY_NONCE` — credential nonce (use `\"0\"` for in-session derived creds).\n *\n * @param input - Order parameters.\n * @param headers - Polymarket CLOB auth headers (`POLY_*`).\n */\n async createPolymarketOrder(\n input: CreateOrderInput,\n headers: Record<string, string>,\n ): Promise<PredictOrder> {\n const url = `${this.endpoint}/api/v1/orders/polymarket`;\n return await httpPost<PredictOrder>(url, input, { headers });\n }\n\n /** Maps to `GET /api/v1/polymarket/tick-size?token_id=xxx`. */\n async getPolymarketTickSize(tokenId: string): Promise<TickSizeResponse> {\n const url = `${this.endpoint}/api/v1/polymarket/tick-size?token_id=${encodeURIComponent(tokenId)}`;\n return await httpGet<TickSizeResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // DFlow trading\n // -------------------------------------------------------------------------\n\n /** Maps to `POST /api/v1/orders/kalshi/quote`. */\n async createDFlowQuote(body: DFlowQuoteRequest): Promise<DFlowQuoteResponse> {\n const url = `${this.endpoint}/api/v1/orders/kalshi/quote`;\n return await httpPost<DFlowQuoteResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/orders/kalshi/submit`. */\n async submitDFlowTransaction(\n body: DFlowSubmitRequest,\n ): Promise<DFlowSubmitResponse> {\n const url = `${this.endpoint}/api/v1/orders/kalshi/submit`;\n return await httpPost<DFlowSubmitResponse>(url, body);\n }\n\n // -------------------------------------------------------------------------\n // KYC\n // -------------------------------------------------------------------------\n\n /**\n * Check DFlow KYC verification status for a wallet address.\n *\n * Maps to `GET /api/v1/kyc/kalshi?wallet_address=...`.\n */\n async checkDFlowKYC(walletAddress: string): Promise<DFlowKYCStatus> {\n const query = buildQuery({ wallet_address: walletAddress });\n const url = `${this.endpoint}/api/v1/kyc/kalshi${query}`;\n return await httpGet<DFlowKYCStatus>(url);\n }\n\n // -------------------------------------------------------------------------\n // Polymarket wallet setup\n // -------------------------------------------------------------------------\n\n /**\n * Check Polymarket wallet setup status (Safe deployed + USDC.e approved).\n *\n * Maps to `GET /api/v1/setup/polymarket?wallet_address=...`.\n */\n async checkPolymarketSetup(\n walletAddress: string,\n ): Promise<PolymarketSetupStatus> {\n const query = buildQuery({ wallet_address: walletAddress });\n const url = `${this.endpoint}/api/v1/setup/polymarket${query}`;\n return await httpGet<PolymarketSetupStatus>(url);\n }\n\n /**\n * Run Polymarket wallet setup (deploy Safe + approve USDC.e).\n *\n * Maps to `POST /api/v1/setup/polymarket`.\n */\n async runPolymarketSetup(\n walletAddress: string,\n ): Promise<PolymarketSetupStatus> {\n const url = `${this.endpoint}/api/v1/setup/polymarket`;\n return await httpPost<PolymarketSetupStatus>(url, {\n wallet_address: walletAddress,\n });\n }\n\n // -------------------------------------------------------------------------\n // Cross-platform matches\n // -------------------------------------------------------------------------\n\n /**\n * List cross-platform matched event groups with inline aggregate stats.\n *\n * Maps to `GET /api/v1/matches`.\n */\n async listMatches(params?: MatchesParams): Promise<MatchGroupPage> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/matches${query}`;\n return await httpGet<MatchGroupPage>(url);\n }\n\n /**\n * Fetch a single match group by ID.\n *\n * Maps to `GET /api/v1/matches/:id`.\n */\n async getMatch(id: number): Promise<MatchGroup> {\n const url = `${this.endpoint}/api/v1/matches/${id}`;\n return await httpGet<MatchGroup>(url);\n }\n\n /**\n * List flattened market pairs across match groups (market-level granularity).\n *\n * Maps to `GET /api/v1/matches/markets`.\n */\n async listMatchMarkets(params?: MatchMarketParams): Promise<MatchMarketPage> {\n const query = buildQuery((params ?? {}) as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/matches/markets${query}`;\n return await httpGet<MatchMarketPage>(url);\n }\n\n // -------------------------------------------------------------------------\n // Trades by wallet\n // -------------------------------------------------------------------------\n\n /** Maps to `GET /api/v1/trades?source=...&wallet=...`. */\n async listTrades(\n params: ListTradesParams,\n ): Promise<PredictPage<PredictTrade>> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/trades${query}`;\n return await httpGet<PredictPage<PredictTrade>>(url);\n }\n\n // -------------------------------------------------------------------------\n // Withdraw\n // -------------------------------------------------------------------------\n\n /** Maps to `POST /api/v1/withdraw/build`. */\n async withdrawBuild(\n body: WithdrawBuildRequest,\n ): Promise<WithdrawBuildResponse> {\n const url = `${this.endpoint}/api/v1/withdraw/build`;\n return await httpPost<WithdrawBuildResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/withdraw/submit`. */\n async withdrawSubmit(\n body: WithdrawSubmitRequest,\n ): Promise<WithdrawSubmitResponse> {\n const url = `${this.endpoint}/api/v1/withdraw/submit`;\n return await httpPost<WithdrawSubmitResponse>(url, body);\n }\n\n /** Maps to `GET /api/v1/withdraw/status?tx_hash=...&source=...`. */\n async withdrawStatus(\n txHash: string,\n source: ProviderSource,\n ): Promise<WithdrawStatusResponse> {\n const query = buildQuery({ tx_hash: txHash, source });\n const url = `${this.endpoint}/api/v1/withdraw/status${query}`;\n return await httpGet<WithdrawStatusResponse>(url);\n }\n\n // -------------------------------------------------------------------------\n // Deposit (native USDC → USDC.e for Polymarket)\n // -------------------------------------------------------------------------\n\n /**\n * Build unsigned deposit transactions (approve + Uniswap V3 swap).\n *\n * The server checks the Safe's USDC.e balance and returns only\n * the transactions needed to cover the shortfall.\n *\n * Maps to `POST /api/v1/deposit/polymarket/build`.\n */\n async depositBuild(body: DepositBuildRequest): Promise<DepositBuildResponse> {\n const url = `${this.endpoint}/api/v1/deposit/polymarket/build`;\n return await httpPost<DepositBuildResponse>(url, body);\n }\n\n /** Maps to `POST /api/v1/deposit/polymarket/submit`. */\n async depositSubmit(\n body: DepositSubmitRequest,\n ): Promise<DepositSubmitResponse> {\n const url = `${this.endpoint}/api/v1/deposit/polymarket/submit`;\n return await httpPost<DepositSubmitResponse>(url, body);\n }\n\n /** Maps to `GET /api/v1/deposit/polymarket/status?tx_hash=...&source=...`. */\n async depositStatus(\n txHash: string,\n source: ProviderSource,\n ): Promise<DepositStatusResponse> {\n const query = buildQuery({ tx_hash: txHash, source });\n const url = `${this.endpoint}/api/v1/deposit/polymarket/status${query}`;\n return await httpGet<DepositStatusResponse>(url);\n }\n\n /**\n * Get multi-chain deposit addresses for a Polymarket Safe wallet via Bridge API.\n *\n * Maps to `GET /api/v1/deposit/polymarket/addresses?safe_address=...`.\n */\n async getPolymarketDepositAddresses(\n safeAddress: string,\n ): Promise<PolymarketDepositAddresses> {\n const query = buildQuery({ safe_address: safeAddress });\n const url = `${this.endpoint}/api/v1/deposit/polymarket/addresses${query}`;\n return await httpGet<PolymarketDepositAddresses>(url);\n }\n\n // -------------------------------------------------------------------------\n // Polymarket Relayer Withdraw\n // -------------------------------------------------------------------------\n\n /**\n * Execute a gasless USDC.e withdrawal from a Polymarket Safe wallet via Relayer.\n *\n * Maps to `POST /api/v1/withdraw/polymarket/execute`.\n */\n async executePolymarketWithdraw(\n body: PolymarketWithdrawRequest,\n ): Promise<PolymarketWithdrawResponse> {\n const url = `${this.endpoint}/api/v1/withdraw/polymarket/execute`;\n return await httpPost<PolymarketWithdrawResponse>(url, body);\n }\n}\n\n/**\n * Factory function for `PredictClient`.\n *\n * @param endpoint - Base URL of the prediction-server, without a trailing slash.\n */\nexport function createPredictClient(endpoint: string): PredictClient {\n return new PredictClient(endpoint);\n}\n","/**\n * PredictWsClient — WebSocket client for prediction-server real-time data.\n *\n * Connects to `GET /api/v1/ws` (RFC 6455) and supports three channels:\n * `orderbook`, `prices`, and `trades`.\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Application-level ping/pong keepalive\n * - Subscription state tracking with automatic restore after reconnect\n * - Event-emitter pattern for typed message dispatch\n */\nimport type {\n WsChannel,\n WsChannelEvent,\n WsClientMessage,\n WsConnectionStatus,\n WsDataMessage,\n WsErrorCode,\n WsOrderbookEvent,\n WsPriceEvent,\n WsTradeEvent,\n} from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Configuration\n// ---------------------------------------------------------------------------\n\n/** Configuration for `PredictWsClient`. */\nexport interface PredictWsClientConfig {\n /** Full WebSocket URL, e.g. `\"wss://api.example.com/api/v1/ws\"`. */\n wsUrl: string;\n /** Connect immediately on construction. Default: `true`. */\n autoConnect?: boolean;\n /** Reconnect automatically on unexpected close. Default: `true`. */\n autoReconnect?: boolean;\n /** Base delay (ms) for exponential backoff. Default: `1000`. */\n reconnectIntervalBase?: number;\n /** Maximum reconnect delay (ms). Default: `30000`. */\n reconnectMaxInterval?: number;\n /** Interval (ms) between application-level pings. Default: `30000`. */\n pingInterval?: number;\n /**\n * How long (ms) to wait for a pong after sending a ping before\n * considering the connection dead. Default: `10000`.\n * Must be less than `pingInterval`.\n */\n pongTimeout?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Defaults\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_BASE = 1000;\nconst DEFAULT_RECONNECT_MAX = 30000;\nconst DEFAULT_PING_INTERVAL = 20000;\nconst DEFAULT_PONG_TIMEOUT = 10000;\n\n// ---------------------------------------------------------------------------\n// Internal event-emitter types\n// ---------------------------------------------------------------------------\n\ntype EventCallback<T = unknown> = (data: T) => void;\n\ninterface EventListeners {\n connect: EventCallback<void>[];\n disconnect: EventCallback<{ code?: number; reason?: string }>[];\n reconnecting: EventCallback<{ attempt: number; delay: number }>[];\n error: EventCallback<{ code: WsErrorCode; message: string }>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channels: WsChannel[];\n market_slugs: string[];\n }>[];\n orderbook: EventCallback<WsDataMessage<WsOrderbookEvent>>[];\n prices: EventCallback<WsDataMessage<WsPriceEvent>>[];\n trades: EventCallback<WsDataMessage<WsTradeEvent>>[];\n}\n\ntype WsEventType = keyof EventListeners;\n\n// ---------------------------------------------------------------------------\n// Subscription tracking\n// ---------------------------------------------------------------------------\n\ninterface SubscriptionState {\n /** channel → Set<market_slug> */\n channels: Map<WsChannel, Set<string>>;\n}\n\n// ---------------------------------------------------------------------------\n// PredictWsClient\n// ---------------------------------------------------------------------------\n\nexport class PredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectBase: number;\n private readonly reconnectMax: number;\n private readonly pingMs: number;\n private readonly pongTimeoutMs: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private pingTimer: ReturnType<typeof setInterval> | null = null;\n private pongTimer: ReturnType<typeof setTimeout> | null = null;\n private shouldReconnect = true;\n\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n status: [],\n subscribed: [],\n orderbook: [],\n prices: [],\n trades: [],\n };\n\n private subs: SubscriptionState = {\n channels: new Map([\n [\"orderbook\", new Set()],\n [\"prices\", new Set()],\n [\"trades\", new Set()],\n ]),\n };\n\n constructor(config: PredictWsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectBase = config.reconnectIntervalBase ?? DEFAULT_RECONNECT_BASE;\n this.reconnectMax = config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX;\n this.pingMs = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n this.pongTimeoutMs = config.pongTimeout ?? DEFAULT_PONG_TIMEOUT;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // -------------------------------------------------------------------------\n // Connection management\n // -------------------------------------------------------------------------\n\n connect(): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n this.shouldReconnect = true;\n this.setStatus(\"connecting\");\n\n try {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n this.setStatus(\"connected\");\n this.emit(\"connect\", undefined);\n this.restoreSubscriptions();\n this.startPing();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data as string);\n };\n\n this.ws.onerror = () => {\n // The close event fires immediately after, which handles reconnect.\n };\n\n this.ws.onclose = (event) => {\n this.stopPing();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch {\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPing();\n this.clearReconnectTimer();\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n this.setStatus(\"disconnected\");\n }\n\n /** Disconnect and clear all subscription state and listeners. */\n destroy(): void {\n this.disconnect();\n for (const ch of this.subs.channels.values()) ch.clear();\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n // -------------------------------------------------------------------------\n // Subscription — low-level (multi-channel, multi-slug)\n // -------------------------------------------------------------------------\n\n /**\n * Subscribe to one or more channels for the given market slugs.\n * The server acknowledges with a `subscribed` message.\n */\n subscribe(channels: WsChannel[], marketSlugs: string[]): void {\n for (const ch of channels) {\n const set = this.subs.channels.get(ch)!;\n for (const slug of marketSlugs) set.add(slug);\n }\n this.send({ type: \"subscribe\", channels, market_slugs: marketSlugs });\n }\n\n /**\n * Unsubscribe from one or more channels for the given market slugs.\n */\n unsubscribe(channels: WsChannel[], marketSlugs: string[]): void {\n for (const ch of channels) {\n const set = this.subs.channels.get(ch)!;\n for (const slug of marketSlugs) set.delete(slug);\n }\n this.send({ type: \"unsubscribe\", channels, market_slugs: marketSlugs });\n }\n\n // -------------------------------------------------------------------------\n // Subscription — convenience (single channel)\n // -------------------------------------------------------------------------\n\n /**\n * Subscribe to price updates for the given slugs.\n * Returns an unsubscribe function.\n */\n subscribePrices(\n slugs: string[],\n onUpdate: (msg: WsDataMessage<WsPriceEvent>) => void,\n ): () => void {\n this.subscribe([\"prices\"], slugs);\n const off = this.on(\"prices\", onUpdate);\n return () => {\n off();\n this.unsubscribe([\"prices\"], slugs);\n };\n }\n\n /**\n * Subscribe to orderbook snapshots for the given slugs.\n * Returns an unsubscribe function.\n */\n subscribeOrderbook(\n slugs: string[],\n onUpdate: (msg: WsDataMessage<WsOrderbookEvent>) => void,\n ): () => void {\n this.subscribe([\"orderbook\"], slugs);\n const off = this.on(\"orderbook\", onUpdate);\n return () => {\n off();\n this.unsubscribe([\"orderbook\"], slugs);\n };\n }\n\n /**\n * Subscribe to trade events for the given slugs.\n * Returns an unsubscribe function.\n */\n subscribeTrades(\n slugs: string[],\n onUpdate: (msg: WsDataMessage<WsTradeEvent>) => void,\n ): () => void {\n this.subscribe([\"trades\"], slugs);\n const off = this.on(\"trades\", onUpdate);\n return () => {\n off();\n this.unsubscribe([\"trades\"], slugs);\n };\n }\n\n // -------------------------------------------------------------------------\n // Status observation\n // -------------------------------------------------------------------------\n\n /** Register a callback for connection status changes. Returns unsubscribe. */\n onStatusChange(cb: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", cb);\n }\n\n /** Register a callback for server-sent errors. Returns unsubscribe. */\n onError(\n cb: (err: { code: WsErrorCode; message: string }) => void,\n ): () => void {\n return this.on(\"error\", cb);\n }\n\n // -------------------------------------------------------------------------\n // Event emitter\n // -------------------------------------------------------------------------\n\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const list = this.listeners[event] as EventCallback<unknown>[];\n list.push(callback as EventCallback<unknown>);\n return () => this.off(event, callback);\n }\n\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const list = this.listeners[event] as EventCallback<unknown>[];\n const idx = list.indexOf(callback as EventCallback<unknown>);\n if (idx !== -1) list.splice(idx, 1);\n }\n\n // -------------------------------------------------------------------------\n // Private\n // -------------------------------------------------------------------------\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const list = this.listeners[event] as EventCallback<typeof data>[];\n for (const cb of list) {\n try {\n cb(data);\n } catch (e) {\n console.error(`[PredictWsClient] Error in \"${event}\" listener:`, e);\n }\n }\n }\n\n private send(msg: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) return false;\n try {\n this.ws.send(JSON.stringify(msg));\n return true;\n } catch {\n return false;\n }\n }\n\n private setStatus(next: WsConnectionStatus): void {\n if (this.status !== next) {\n this.status = next;\n this.emit(\"status\", next);\n }\n }\n\n private handleMessage(raw: string): void {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return;\n }\n\n // Control messages (have `type`)\n if (msg.type) {\n switch (msg.type) {\n case \"pong\":\n this.clearPongTimer();\n return;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channels: msg.channels as WsChannel[],\n market_slugs: msg.market_slugs as string[],\n });\n return;\n case \"error\":\n this.emit(\"error\", {\n code: msg.code as WsErrorCode,\n message: msg.message as string,\n });\n return;\n }\n }\n\n // Data messages (have `channel` + `data`)\n if (msg.channel && msg.data) {\n const dataMsg = msg as unknown as WsDataMessage<WsChannelEvent>;\n switch (dataMsg.channel) {\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsDataMessage<WsOrderbookEvent>);\n break;\n case \"prices\":\n this.emit(\"prices\", dataMsg as WsDataMessage<WsPriceEvent>);\n break;\n case \"trades\":\n this.emit(\"trades\", dataMsg as WsDataMessage<WsTradeEvent>);\n break;\n }\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n\n const delay = Math.min(\n this.reconnectBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMax,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private restoreSubscriptions(): void {\n for (const [channel, slugs] of this.subs.channels.entries()) {\n if (slugs.size > 0) {\n this.send({\n type: \"subscribe\",\n channels: [channel],\n market_slugs: Array.from(slugs),\n });\n }\n }\n }\n\n private startPing(): void {\n this.stopPing();\n this.pingTimer = setInterval(() => {\n this.send({ type: \"ping\" });\n this.armPongTimeout();\n }, this.pingMs);\n }\n\n private stopPing(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n this.clearPongTimer();\n }\n\n /**\n * Start a timer that fires if the server does not reply with pong\n * within `pongTimeoutMs`. On timeout the socket is closed so\n * the normal reconnect flow kicks in.\n */\n private armPongTimeout(): void {\n this.clearPongTimer();\n this.pongTimer = setTimeout(() => {\n this.pongTimer = null;\n if (this.ws && this.ws.readyState === WebSocket.OPEN) {\n this.ws.close(4000, \"pong timeout\");\n }\n }, this.pongTimeoutMs);\n }\n\n private clearPongTimer(): void {\n if (this.pongTimer) {\n clearTimeout(this.pongTimer);\n this.pongTimer = null;\n }\n }\n}\n\n/**\n * Factory function for `PredictWsClient`.\n *\n * @param config - WebSocket client configuration.\n */\nexport function createPredictWsClient(\n config: PredictWsClientConfig,\n): PredictWsClient {\n return new PredictWsClient(config);\n}\n","import { createContext } from \"react\";\nimport type { PredictClient } from \"../client\";\nimport type { PredictWsClient } from \"../client/ws\";\n\nexport interface PredictContextValue {\n /** The prediction-server HTTP client instance. */\n client: PredictClient;\n /** Optional WebSocket client for real-time data. `null` when not provided. */\n wsClient: PredictWsClient | null;\n}\n\n/**\n * Context that carries the prediction client (prediction-server backend).\n *\n * Consumers must be wrapped in `PredictProvider`.\n */\nexport const PredictContext = createContext<PredictContextValue | null>(null);\n","import { type PropsWithChildren, useMemo } from \"react\";\nimport type { PredictClient } from \"../client\";\nimport type { PredictWsClient } from \"../client/ws\";\nimport { PredictContext } from \"./PredictContext\";\n\nexport type PredictProviderProps = PropsWithChildren<{\n /**\n * A `PredictClient` instance pointed at the prediction-server endpoint.\n *\n * @example\n * ```tsx\n * import { createPredictClient, PredictProvider } from \"@liberfi.io/react-predict\";\n *\n * const client = createPredictClient(\"https://api.example.com\");\n *\n * <PredictProvider client={client}>\n * <App />\n * </PredictProvider>\n * ```\n */\n client: PredictClient;\n /**\n * Optional WebSocket client for real-time market data.\n *\n * When provided, subscription hooks (`usePricesSubscription`, etc.)\n * and high-level realtime hooks (`useRealtimeOrderbook`, etc.) become\n * functional. Without it they gracefully degrade to REST polling.\n *\n * @example\n * ```tsx\n * import { createPredictWsClient } from \"@liberfi.io/react-predict\";\n *\n * const wsClient = createPredictWsClient({\n * wsUrl: \"wss://api.example.com/api/v1/ws\",\n * });\n *\n * <PredictProvider client={client} wsClient={wsClient}>\n * <App />\n * </PredictProvider>\n * ```\n */\n wsClient?: PredictWsClient | null;\n}>;\n\n/**\n * Provides the prediction client via React context.\n *\n * Place this provider at the application root (or any subtree boundary)\n * where prediction hooks are used.\n */\nexport function PredictProvider({\n client,\n wsClient,\n children,\n}: PredictProviderProps) {\n const ws = wsClient ?? null;\n const value = useMemo(() => ({ client, wsClient: ws }), [client, ws]);\n\n return (\n <PredictContext.Provider value={value}>{children}</PredictContext.Provider>\n );\n}\n","/**\n * Polymarket L2 HMAC-SHA256 signing utilities.\n *\n * Uses the Web Crypto API (available in all modern browsers and Node ≥18) to\n * avoid taking a dependency on Node.js `crypto` or any third-party library.\n *\n * References:\n * https://docs.polymarket.com/#authentication\n * https://github.com/Polymarket/clob-client/blob/main/src/headers/index.ts\n */\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Encode a string to a Uint8Array using UTF-8. */\nfunction encode(str: string): Uint8Array {\n return new TextEncoder().encode(str);\n}\n\n/** Decode a Uint8Array as a UTF-8 string. */\nfunction decode(buf: ArrayBuffer): string {\n return new TextDecoder().decode(buf);\n}\n\n/**\n * Convert a base64 or base64url string to a Uint8Array.\n * Normalises base64url (`-`, `_`, no padding) to standard base64 before decoding.\n */\nfunction base64ToBytes(b64: string): Uint8Array {\n let std = b64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (std.length % 4 !== 0) std += \"=\";\n const binary = atob(std);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/** Convert a Uint8Array to a base64 string. */\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\n// ---------------------------------------------------------------------------\n// HMAC-SHA256\n// ---------------------------------------------------------------------------\n\n/**\n * Compute an HMAC-SHA256 signature using the Web Crypto API.\n *\n * @param secretBase64 - The signing secret encoded as base64.\n * @param message - The plaintext message to sign.\n * @returns The signature as a base64 string.\n */\nexport async function hmacSha256Base64(\n secretBase64: string,\n message: string,\n): Promise<string> {\n const keyBytes = base64ToBytes(secretBase64);\n const cryptoKey = await crypto.subtle.importKey(\n \"raw\",\n keyBytes.buffer as ArrayBuffer,\n { name: \"HMAC\", hash: \"SHA-256\" },\n false,\n [\"sign\"],\n );\n const msgBytes = encode(message);\n const signature = await crypto.subtle.sign(\n \"HMAC\",\n cryptoKey,\n msgBytes.buffer as ArrayBuffer,\n );\n const b64 = bytesToBase64(new Uint8Array(signature));\n // Polymarket requires base64url encoding (keep trailing '=')\n return b64.replace(/\\+/g, \"-\").replace(/\\//g, \"_\");\n}\n\n// ---------------------------------------------------------------------------\n// Polymarket L2 auth headers\n// ---------------------------------------------------------------------------\n\n/** HTTP method values accepted by Polymarket CLOB. */\nexport type HttpMethod = \"GET\" | \"DELETE\" | \"POST\" | \"PUT\";\n\nexport interface PolymarketL2HeadersInput {\n /** L2 API key (from credential exchange). */\n apiKey: string;\n /** L2 HMAC secret (base64-encoded). */\n secret: string;\n /** L2 passphrase. */\n passphrase: string;\n /** HTTP method of the request. */\n method: HttpMethod;\n /** Request path without host, e.g. \"/order\". */\n requestPath: string;\n /** Raw JSON request body string; empty string for GET/DELETE. */\n body?: string;\n}\n\nexport interface PolymarketL2Headers {\n POLY_ADDRESS: string;\n POLY_SIGNATURE: string;\n POLY_TIMESTAMP: string;\n POLY_API_KEY: string;\n POLY_PASSPHRASE: string;\n}\n\n/**\n * Build Polymarket L2 HMAC authentication headers for a CLOB API request.\n *\n * The signature is `HMAC-SHA256(secret, timestamp + method + requestPath + body)`.\n *\n * @param address - EVM wallet address (owner of the credentials).\n * @param input - Credential and request details.\n * @returns An object containing all required `POLY_*` headers.\n */\nexport async function buildPolymarketL2Headers(\n address: string,\n input: PolymarketL2HeadersInput,\n): Promise<PolymarketL2Headers> {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const body = input.body ?? \"\";\n const message = `${timestamp}${input.method}${input.requestPath}${body}`;\n\n const signature = await hmacSha256Base64(input.secret, message);\n\n return {\n POLY_ADDRESS: address,\n POLY_SIGNATURE: signature,\n POLY_TIMESTAMP: timestamp,\n POLY_API_KEY: input.apiKey,\n POLY_PASSPHRASE: input.passphrase,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Polymarket L1 auth (credential derivation)\n// ---------------------------------------------------------------------------\n\n/** EIP-712 domain used by Polymarket CLOB for L1 authentication. */\nexport const CLOB_AUTH_DOMAIN = {\n name: \"ClobAuthDomain\",\n version: \"1\",\n chainId: 137,\n} as const;\n\n/** EIP-712 types for the `ClobAuth` struct. */\nexport const CLOB_AUTH_TYPES = {\n ClobAuth: [\n { name: \"address\", type: \"address\" },\n { name: \"timestamp\", type: \"string\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"message\", type: \"string\" },\n ],\n} as const;\n\nexport interface BuildClobAuthMessageInput {\n /** EVM wallet address. */\n address: string;\n /** Unix seconds string. */\n timestamp: string;\n /** Credential nonce. Use `0` for a permanent / deterministic credential. */\n nonce: number;\n}\n\n/**\n * Build the EIP-712 typed data value for a `ClobAuth` message.\n * The resulting object is passed to `eth_signTypedData_v4`.\n */\nexport function buildClobAuthMessage(\n input: BuildClobAuthMessageInput,\n): Record<string, unknown> {\n return {\n address: input.address,\n timestamp: input.timestamp,\n nonce: input.nonce,\n message: \"This message attests that I control the given wallet\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// Credential exchange\n// ---------------------------------------------------------------------------\n\ntype ApiKeyCreds = { apiKey: string; secret: string; passphrase: string };\n\nfunction buildL1Headers(\n address: string,\n signature: string,\n timestamp: string,\n nonce: number,\n): Record<string, string> {\n return {\n POLY_ADDRESS: address,\n POLY_SIGNATURE: signature,\n POLY_TIMESTAMP: timestamp,\n POLY_NONCE: String(nonce),\n };\n}\n\n/**\n * Create or derive Polymarket L2 API credentials from an L1 EIP-712 signature.\n *\n * Polymarket exposes two endpoints:\n * - `POST /auth/api-key` — create new credentials (required for first-time wallets)\n * - `GET /auth/derive-api-key` — derive existing credentials\n *\n * This function tries to derive first; on failure it creates, matching the\n * official `createOrDeriveApiKey()` behaviour from `@polymarket/clob-client`.\n *\n * @returns `{ apiKey, secret, passphrase }`.\n */\nexport async function derivePolymarketApiKey(\n address: string,\n signature: string,\n timestamp: string,\n nonce: number,\n): Promise<ApiKeyCreds> {\n const headers = buildL1Headers(address, signature, timestamp, nonce);\n\n // Try deriving existing credentials first.\n const deriveRes = await fetch(\n `https://clob.polymarket.com/auth/derive-api-key?nonce=${nonce}`,\n { method: \"GET\", headers },\n );\n\n if (deriveRes.ok) {\n return deriveRes.json() as Promise<ApiKeyCreds>;\n }\n\n // Derive failed — wallet likely has no API key yet; create one.\n const createRes = await fetch(\"https://clob.polymarket.com/auth/api-key\", {\n method: \"POST\",\n headers,\n });\n\n if (createRes.ok) {\n return createRes.json() as Promise<ApiKeyCreds>;\n }\n\n const text = await createRes.text().catch(() => createRes.statusText);\n throw new Error(\n `Polymarket credential exchange failed (${createRes.status}): ${text}`,\n );\n}\n","import { createContext } from \"react\";\n\n/**\n * Polymarket L2 API credentials derived from an L1 signature.\n * These are stored in memory (never persisted) and cleared on page unload.\n */\nexport interface PolymarketCredentials {\n /** L2 API key (hex string). */\n apiKey: string;\n /** L2 HMAC secret (hex string). */\n secret: string;\n /** L2 passphrase (hex string). */\n passphrase: string;\n /** EVM wallet address that owns the credentials. */\n address: string;\n}\n\n/**\n * Minimal interface for signing EIP-712 typed data.\n * Implemented by the consuming app (IoC — decouples from any wallet library).\n *\n * @example\n * ```ts\n * const signer: PolymarketSigner = {\n * address: walletAddress,\n * signatureType: 2, // EOA = 0, MAGIC_LINK = 1, POLY_PROXY = 2\n * signTypedData: async (domain, types, primaryType, value) => {\n * const provider = await evmWalletAdapter.getEip1193Provider();\n * return provider.request({\n * method: \"eth_signTypedData_v4\",\n * params: [walletAddress, JSON.stringify({ domain, types, primaryType, message: value })],\n * });\n * },\n * };\n * ```\n */\nexport interface PolymarketSigner {\n /** EVM address of the connected wallet. */\n address: string;\n /**\n * Polymarket signature type:\n * - `0` = EOA (MetaMask, Coinbase, etc.)\n * - `1` = Magic Link\n * - `2` = Polymarket proxy (Gnosis Safe)\n */\n signatureType: 0 | 1 | 2;\n /**\n * Sign EIP-712 typed data and return the hex signature.\n * The signature is used for L1 authentication with the Polymarket CLOB API.\n *\n * @param domain - EIP-712 domain separator.\n * @param types - Type definitions (without EIP712Domain).\n * @param primaryType - The primary type name (e.g. \"ClobAuth\", \"Order\").\n * @param value - The message/struct values to sign.\n */\n signTypedData: (\n domain: Record<string, unknown>,\n types: Record<string, unknown[]>,\n primaryType: string,\n value: Record<string, unknown>,\n ) => Promise<string>;\n /**\n * Sign a raw EVM transaction and return the signed transaction hex.\n * Required for auto-deposit (native USDC → USDC.e via Uniswap V3).\n * If not provided, auto-deposit will throw when a deposit is needed.\n *\n * @param txParams - Transaction parameters: `{ from, to, data, value, chainId, gas }`.\n * @returns Signed raw transaction hex (0x-prefixed).\n */\n signTransaction?: (txParams: Record<string, string>) => Promise<string>;\n}\n\nexport interface PolymarketContextValue {\n /** In-memory credentials; `null` before the user authenticates. */\n credentials: PolymarketCredentials | null;\n /** `true` while the L1 → L2 credential exchange is in progress. */\n isAuthenticating: boolean;\n /** Error from the last authentication attempt; `null` when clean. */\n authError: Error | null;\n /**\n * Trigger L1 authentication using the provided signer.\n * Derives L2 credentials with `nonce=0`, stores them in memory,\n * and returns them so the caller can use them immediately\n * (without waiting for a re-render).\n */\n authenticate: (signer: PolymarketSigner) => Promise<PolymarketCredentials>;\n /** Clear all in-memory credentials (e.g. on wallet disconnect). */\n clearCredentials: () => void;\n}\n\n/**\n * Context that carries Polymarket L2 credentials (in-memory only).\n *\n * Consumers must be wrapped in `PolymarketProvider`.\n */\nexport const PolymarketContext = createContext<PolymarketContextValue | null>(\n null,\n);\n","import { type PropsWithChildren, useCallback, useRef, useState } from \"react\";\nimport {\n CLOB_AUTH_DOMAIN,\n CLOB_AUTH_TYPES,\n buildClobAuthMessage,\n derivePolymarketApiKey,\n} from \"../utils/polymarket-hmac\";\nimport {\n PolymarketContext,\n type PolymarketCredentials,\n type PolymarketSigner,\n} from \"./PolymarketContext\";\n\nexport type PolymarketProviderProps = PropsWithChildren<{\n /**\n * Polymarket CLOB API base URL.\n * Defaults to `https://clob.polymarket.com`.\n */\n clobApiUrl?: string;\n}>;\n\n/**\n * Provides in-memory Polymarket L2 credentials via React context.\n *\n * The provider is wallet-agnostic. Consumers call `authenticate(signer)` with\n * a `PolymarketSigner` adapter, which handles the L1 EIP-712 signing step.\n *\n * Credentials are derived using `nonce=0` (permanent, deterministic) and are\n * stored only in memory — they are cleared when the page unloads or when\n * `clearCredentials()` is called.\n *\n * @example\n * ```tsx\n * <PolymarketProvider>\n * <App />\n * </PolymarketProvider>\n * ```\n */\nexport function PolymarketProvider({ children }: PolymarketProviderProps) {\n const [credentials, setCredentials] = useState<PolymarketCredentials | null>(\n null,\n );\n const [isAuthenticating, setIsAuthenticating] = useState(false);\n const [authError, setAuthError] = useState<Error | null>(null);\n\n // Track the address we last authenticated for, to avoid re-deriving on\n // hot re-renders when the signer reference changes.\n const lastAuthAddressRef = useRef<string | null>(null);\n\n const authenticate = useCallback(\n async (signer: PolymarketSigner) => {\n if (\n lastAuthAddressRef.current === signer.address &&\n credentials !== null\n ) {\n return credentials;\n }\n\n setIsAuthenticating(true);\n setAuthError(null);\n\n try {\n const timestamp = Math.floor(Date.now() / 1000).toString();\n const nonce = 0;\n\n const message = buildClobAuthMessage({\n address: signer.address,\n timestamp,\n nonce,\n });\n\n const signature = await signer.signTypedData(\n CLOB_AUTH_DOMAIN,\n CLOB_AUTH_TYPES as unknown as Record<string, unknown[]>,\n \"ClobAuth\",\n message,\n );\n\n const { apiKey, secret, passphrase } = await derivePolymarketApiKey(\n signer.address,\n signature,\n timestamp,\n nonce,\n );\n\n const newCreds = {\n apiKey,\n secret,\n passphrase,\n address: signer.address,\n };\n lastAuthAddressRef.current = signer.address;\n setCredentials(newCreds);\n return newCreds;\n } catch (err) {\n setAuthError(\n err instanceof Error\n ? err\n : new Error(\"Polymarket authentication failed\"),\n );\n lastAuthAddressRef.current = null;\n throw err;\n } finally {\n setIsAuthenticating(false);\n }\n },\n [credentials],\n );\n\n const clearCredentials = useCallback(() => {\n setCredentials(null);\n lastAuthAddressRef.current = null;\n }, []);\n\n return (\n <PolymarketContext.Provider\n value={{\n credentials,\n isAuthenticating,\n authError,\n authenticate,\n clearCredentials,\n }}\n >\n {children}\n </PolymarketContext.Provider>\n );\n}\n","import { useContext } from \"react\";\nimport type { PredictClient } from \"../../client\";\nimport { PredictContext } from \"../../providers/PredictContext\";\n\n/**\n * Returns the `PredictClient` instance from context.\n *\n * Must be called inside a component tree wrapped by `PredictProvider`.\n *\n * @throws When used outside of `PredictProvider`.\n */\nexport function usePredictClient(): PredictClient {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictClient must be used within a PredictProvider\");\n }\n return context.client;\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PredictEvent, ListEventsParams, PredictPage } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n/** Stable TanStack Query key for the events list. */\nexport function eventsQueryKey(params?: ListEventsParams): unknown[] {\n return [\"predict\", \"events\", params ?? {}];\n}\n\n/**\n * Fetch function usable outside React (e.g. in loaders or tests).\n */\nexport async function fetchEvents(\n client: ReturnType<typeof usePredictClient>,\n params?: ListEventsParams,\n): Promise<PredictPage<PredictEvent>> {\n return client.listEvents(params);\n}\n\n/**\n * React Query hook for `GET /api/v1/events` via the prediction-server client.\n *\n * @param params - Optional filter / sort / pagination parameters.\n * @param queryOptions - Additional TanStack Query options (e.g. `enabled`, `staleTime`).\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEvents({ status: \"open\", limit: 20 });\n * ```\n */\nexport function useEvents(\n params?: ListEventsParams,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictEvent>,\n Error,\n PredictPage<PredictEvent>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventsQueryKey(params),\n queryFn: () => client.listEvents(params),\n ...queryOptions,\n });\n}\n\nexport type { PredictEvent, ListEventsParams, PredictPage };\n","/**\n * Server-safe pure functions for events query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictClient,\n PredictEvent,\n EventSortField,\n EventStatus,\n ListEventsParams,\n PredictPage,\n ProviderSource,\n} from \"../../client\";\n\nexport type { ProviderSource };\n\n/** Default page size for list queries. */\nexport const DEFAULT_PAGE_SIZE = 48;\n\n/**\n * Selection emitted by a categories/tag selector widget.\n * Duplicated here to avoid pulling in UI component barrel into server-only bundles.\n */\nexport interface TagSlugSelection {\n categorySlug: string | null;\n tagSlug: string | null;\n}\n\n/**\n * Resolve a `TagSlugSelection` to a single `tag_slug` string for the API.\n */\nexport function resolveTagSlug(\n selection: TagSlugSelection | null | undefined,\n): string | undefined {\n if (!selection) return undefined;\n return selection.tagSlug ?? selection.categorySlug ?? undefined;\n}\n\n/**\n * Input accepted by {@link resolveEventsParams}. All fields optional;\n * defaults match the client-side `useInfiniteEvents` hook's initial state.\n */\nexport interface ResolveEventsParamsInput {\n tagSlugSelection?: TagSlugSelection | null;\n limit?: number;\n status?: EventStatus;\n sort_by?: EventSortField;\n sort_asc?: boolean;\n source?: ProviderSource;\n with_markets?: boolean;\n /**\n * Minimum total volume in USD (numeric string or number).\n * Converted to `min_volume` in the API request.\n */\n minVolume?: string | number;\n /**\n * Minimum liquidity in USD (numeric string or number).\n * Converted to `min_liquidity` in the API request.\n */\n minLiquidity?: string | number;\n /**\n * Time-remaining bucket. Converts to an `end_before` RFC 3339 timestamp.\n * \"1d\" = events closing within 24 h, \"7d\" = 7 days, \"30d\" = 30 days.\n */\n timeRemaining?: string;\n}\n\n/**\n * Convert a time-remaining bucket string to an RFC 3339 `end_before` timestamp.\n * Returns `undefined` when `timeRemaining` is not set.\n */\nfunction resolveEndBefore(\n timeRemaining: string | undefined,\n): string | undefined {\n if (!timeRemaining) return undefined;\n const days = timeRemaining === \"1d\" ? 1 : timeRemaining === \"7d\" ? 7 : 30;\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000).toISOString();\n}\n\n/**\n * Build a clean `ListEventsParams` from loose user inputs.\n *\n * Server-side `prefetchInfiniteQuery` and client-side `useInfiniteEvents` must\n * both use this function to guarantee identical query keys.\n */\nexport function resolveEventsParams(\n input: ResolveEventsParamsInput = {},\n): ListEventsParams {\n const {\n tagSlugSelection,\n limit = DEFAULT_PAGE_SIZE,\n status = \"open\",\n with_markets = true,\n source,\n sort_by,\n sort_asc,\n minVolume,\n minLiquidity,\n timeRemaining,\n } = input;\n const tag_slug = resolveTagSlug(tagSlugSelection);\n\n const min_volume =\n minVolume !== undefined && minVolume !== \"\" ? Number(minVolume) : undefined;\n const min_liquidity =\n minLiquidity !== undefined && minLiquidity !== \"\"\n ? Number(minLiquidity)\n : undefined;\n const end_before = resolveEndBefore(timeRemaining);\n\n return {\n limit,\n status,\n with_markets,\n ...(source ? { source } : {}),\n ...(tag_slug ? { tag_slug } : {}),\n ...(sort_by ? { sort_by } : {}),\n ...(sort_asc !== undefined ? { sort_asc } : {}),\n ...(min_volume !== undefined && !isNaN(min_volume) ? { min_volume } : {}),\n ...(min_liquidity !== undefined && !isNaN(min_liquidity)\n ? { min_liquidity }\n : {}),\n ...(end_before ? { end_before } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Events infinite query (server-safe)\n// ---------------------------------------------------------------------------\n\n/** Stable TanStack Query key for the events infinite query. */\nexport function infiniteEventsQueryKey(params: ListEventsParams): unknown[] {\n return [\"predict\", \"events-infinite\", params];\n}\n\n/**\n * Fetch a single page of events. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEventsPage(\n client: PredictClient,\n params: ListEventsParams,\n): Promise<PredictPage<PredictEvent>> {\n return client.listEvents(params);\n}\n\n// ---------------------------------------------------------------------------\n// Single event (server-safe)\n// ---------------------------------------------------------------------------\n\n/** Stable TanStack Query key for a single event. */\nexport function eventQueryKey(\n slug: string,\n source?: ProviderSource,\n): unknown[] {\n return [\"predict\", \"event\", slug, source];\n}\n\n/**\n * Fetch a single event. Can be used outside of React\n * (e.g. in Server Components, loaders, or tests).\n */\nexport async function fetchEvent(\n client: PredictClient,\n slug: string,\n source?: ProviderSource,\n): Promise<PredictEvent> {\n return client.getEvent(slug, source);\n}\n\nexport type { PredictEvent, ListEventsParams, PredictPage };\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PredictEvent, ProviderSource } from \"../../client\";\nimport { eventQueryKey, fetchEvent } from \"./events.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { eventQueryKey, fetchEvent } from \"./events.params\";\n\nexport interface UseEventParams {\n /** Canonical event slug (e.g. \"will-trump-win-2024\" or \"KXBTCD-25FEB-T68000\"). */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-event fetch. */\n source?: ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/events/:slug` via the prediction-server client.\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useEvent({ slug: \"CONTROLH-2026\", source: \"kalshi\" });\n * ```\n */\nexport function useEvent(\n params: UseEventParams,\n queryOptions: Omit<\n UseQueryOptions<PredictEvent, Error, PredictEvent, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: eventQueryKey(params.slug, params.source),\n queryFn: () => fetchEvent(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n\nexport type { PredictEvent };\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { PredictEvent, ListEventsParams, PredictPage } from \"../../client\";\nimport {\n infiniteEventsQueryKey,\n fetchEventsPage,\n resolveTagSlug,\n resolveEventsParams,\n} from \"./events.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport {\n resolveTagSlug,\n resolveEventsParams,\n infiniteEventsQueryKey,\n fetchEventsPage,\n} from \"./events.params\";\nexport type {\n ResolveEventsParamsInput,\n TagSlugSelection,\n} from \"./events.params\";\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n PredictPage<PredictEvent>,\n Error,\n InfiniteData<PredictPage<PredictEvent>>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/events` with cursor-based\n * pagination via the prediction-server client.\n *\n * @param params - Resolved query parameters (use {@link resolveEventsParams} to build\n * from user inputs). Do NOT include `cursor` — it is managed automatically.\n * @param queryOptions - Additional TanStack Query options.\n *\n * @example\n * ```tsx\n * const params = resolveEventsParams({ status: \"open\", limit: 20 });\n * const { data, hasNextPage, fetchNextPage } = useInfiniteEvents(params);\n * ```\n */\nexport function useInfiniteEvents(\n params: ListEventsParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: infiniteEventsQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchEventsPage(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: PredictPage<PredictEvent>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n ...queryOptions,\n });\n}\n\nexport type { PredictEvent, ListEventsParams, PredictPage };\n","\"use client\";\n\nimport { useMemo } from \"react\";\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type {\n PredictEvent,\n EventSortField,\n EventStatus,\n ListEventsParams,\n PredictPage,\n ProviderSource,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface UseSearchEventsParams {\n /** Search keyword. */\n keyword: string;\n /** Page size (default: 20). */\n limit?: number;\n /** Event status filter (default: \"open\"). */\n status?: EventStatus;\n /** Filter by upstream provider. */\n source?: ProviderSource;\n /** Include nested markets (default: false for lighter search payloads). */\n with_markets?: boolean;\n /** Field to sort by (e.g. \"volume\" for trending). */\n sort_by?: EventSortField;\n /** When `true`, sort ascending. Defaults to descending. */\n sort_asc?: boolean;\n}\n\nfunction searchEventsQueryKey(params: ListEventsParams): unknown[] {\n return [\"predict\", \"search\", params];\n}\n\n/**\n * Infinite query hook for searching prediction events via the `listEvents`\n * endpoint with a `search` parameter.\n *\n * @example\n * ```tsx\n * const { data, isLoading, hasNextPage, fetchNextPage } =\n * useSearchEvents({ keyword: \"trump\" });\n * ```\n */\nexport function useSearchEvents(\n params: UseSearchEventsParams,\n queryOptions?: { enabled?: boolean },\n) {\n const client = usePredictClient();\n\n const apiParams = useMemo<ListEventsParams>(\n () => ({\n search: params.keyword || undefined,\n limit: params.limit ?? 20,\n status: params.status ?? \"open\",\n source: params.source,\n with_markets: params.with_markets ?? false,\n sort_by: params.sort_by,\n sort_asc: params.sort_asc,\n }),\n [\n params.keyword,\n params.limit,\n params.status,\n params.source,\n params.with_markets,\n params.sort_by,\n params.sort_asc,\n ],\n );\n\n return useInfiniteQuery({\n queryKey: searchEventsQueryKey(apiParams),\n queryFn: ({ pageParam }) =>\n client.listEvents({\n ...apiParams,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: PredictPage<PredictEvent>) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n enabled: queryOptions?.enabled ?? true,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n PredictEvent,\n ProviderSource,\n SimilarEventsParams,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function similarEventsQueryKey(\n slug: string,\n source: ProviderSource,\n params?: SimilarEventsParams,\n): unknown[] {\n return [\"predict\", \"similar-events\", slug, source, params];\n}\n\nexport interface UseSimilarEventsParams {\n slug: string;\n source: ProviderSource;\n limit?: number;\n same_source?: boolean;\n}\n\nexport function useSimilarEvents(\n params: UseSimilarEventsParams,\n queryOptions: Omit<\n UseQueryOptions<PredictEvent[], Error, PredictEvent[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const apiParams: SimilarEventsParams = {\n limit: params.limit,\n same_source: params.same_source,\n };\n return useQuery({\n queryKey: similarEventsQueryKey(params.slug, params.source, apiParams),\n queryFn: () =>\n client.getSimilarEvents(params.slug, params.source, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 5 * 60_000,\n ...queryOptions,\n });\n}\n","/**\n * Server-safe pure functions for market query helpers.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictMarket,\n ProviderSource,\n PredictClient,\n} from \"../../client\";\n\n/** Stable TanStack Query key for a single market. */\nexport function marketQueryKey(\n slug: string,\n source?: ProviderSource,\n): unknown[] {\n return [\"predict\", \"market\", slug, source];\n}\n\n/**\n * Fetch function usable outside React (e.g. in loaders or tests).\n */\nexport async function fetchMarket(\n client: PredictClient,\n slug: string,\n source?: ProviderSource,\n): Promise<PredictMarket> {\n return client.getMarket(slug, source);\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PredictMarket, ProviderSource } from \"../../client\";\nimport { marketQueryKey, fetchMarket } from \"./market.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { marketQueryKey, fetchMarket } from \"./market.params\";\n\nexport interface UseMarketParams {\n /** Canonical market slug. */\n slug: string;\n /** Upstream provider. Required by prediction-server for single-market fetch. */\n source?: ProviderSource;\n}\n\n/**\n * React Query hook for `GET /api/v1/markets/:slug` via the prediction-server client.\n *\n * @example\n * ```tsx\n * const { data, isLoading } = useMarket({ slug: \"KXBTCD-25FEB-T68000-yes\", source: \"kalshi\" });\n * ```\n */\nexport function useMarket(\n params: UseMarketParams,\n queryOptions: Omit<\n UseQueryOptions<PredictMarket, Error, PredictMarket, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: marketQueryKey(params.slug, params.source),\n queryFn: () => fetchMarket(client, params.slug, params.source),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n PriceHistoryRange,\n PriceHistoryResponse,\n ProviderSource,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function priceHistoryQueryKey(\n slug: string,\n source: ProviderSource,\n range?: PriceHistoryRange,\n): unknown[] {\n return [\"predict\", \"price-history\", slug, source, range];\n}\n\nexport interface UsePriceHistoryParams {\n slug: string;\n source: ProviderSource;\n range?: PriceHistoryRange;\n}\n\nexport function usePriceHistory(\n params: UsePriceHistoryParams,\n queryOptions: Omit<\n UseQueryOptions<\n PriceHistoryResponse,\n Error,\n PriceHistoryResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: priceHistoryQueryKey(params.slug, params.source, params.range),\n queryFn: () =>\n client.getPriceHistory(params.slug, params.source, params.range),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useMemo } from \"react\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport type { PredictMarket, PriceHistoryRange } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\nimport { priceHistoryQueryKey } from \"./usePriceHistory\";\n\n// ---------------------------------------------------------------------------\n// Chart range constants\n// ---------------------------------------------------------------------------\n\nexport const ChartRange = {\n ONE_DAY: \"1d\",\n ONE_WEEK: \"1w\",\n ONE_MONTH: \"1m\",\n ALL: \"all\",\n} as const;\n\nexport type ChartRangeType = (typeof ChartRange)[keyof typeof ChartRange];\n\nconst RANGE_MAP: Record<ChartRangeType, PriceHistoryRange> = {\n [ChartRange.ONE_DAY]: \"1d\",\n [ChartRange.ONE_WEEK]: \"1w\",\n [ChartRange.ONE_MONTH]: \"1m\",\n [ChartRange.ALL]: \"all\",\n};\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface MarketHistoryPoint {\n /** Unix timestamp in milliseconds. */\n timestamp: number;\n /** Implied probability [0, 1]. */\n price: number;\n}\n\nexport interface MarketHistorySeries {\n marketSlug: string;\n label: string;\n /** Chronologically ordered price history. */\n data: MarketHistoryPoint[];\n}\n\nexport interface UseMarketHistoryResult {\n series: MarketHistorySeries[];\n isLoading: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * Returns price history series for the provided markets using\n * `GET /api/v1/markets/{slug}/price-history`.\n */\nexport function useMarketHistory(\n markets: PredictMarket[],\n range: ChartRangeType = ChartRange.ALL,\n): UseMarketHistoryResult {\n const client = usePredictClient();\n const apiRange = RANGE_MAP[range];\n\n const queries = useQueries({\n queries: markets.map((market) => ({\n queryKey: priceHistoryQueryKey(market.slug, market.source, apiRange),\n queryFn: () =>\n client.getPriceHistory(market.slug, market.source, apiRange),\n staleTime: 60_000,\n enabled: Boolean(market.slug),\n })),\n });\n\n const isLoading = queries.some((q) => q.isLoading);\n\n const series = useMemo<MarketHistorySeries[]>(() => {\n return markets.map((market, idx) => {\n const result = queries[idx];\n const points = result?.data?.points ?? [];\n\n if (points.length > 0) {\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: points.map((pt) => ({\n timestamp: pt.t * 1000,\n price: pt.p,\n })),\n };\n }\n\n // Fallback: generate a flat line from current outcome price when the API\n // returns no data (not yet indexed, upstream error, mock slugs, etc.)\n const yesOutcome =\n market.outcomes?.find((o) => o.label.toLowerCase() === \"yes\") ??\n market.outcomes?.[0];\n const currentPrice = yesOutcome?.price ?? 0.5;\n const now = Date.now();\n const dayMs = 86_400_000;\n return {\n marketSlug: market.slug,\n label: market.outcomes?.[0]?.label ?? market.question,\n data: [\n { timestamp: now - 7 * dayMs, price: currentPrice },\n { timestamp: now, price: currentPrice },\n ],\n };\n });\n }, [markets, queries]);\n\n return { series, isLoading };\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Orderbook, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderbookQueryKey(\n slug: string,\n source: ProviderSource,\n): unknown[] {\n return [\"predict\", \"orderbook\", slug, source];\n}\n\nexport interface UseOrderbookParams {\n slug: string;\n source: ProviderSource;\n}\n\nexport function useOrderbook(\n params: UseOrderbookParams,\n queryOptions: Omit<\n UseQueryOptions<Orderbook, Error, Orderbook, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderbookQueryKey(params.slug, params.source),\n queryFn: () => client.getOrderbook(params.slug, params.source),\n enabled: Boolean(params.slug),\n refetchInterval: 30_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type {\n ListMarketTradesParams,\n PredictPage,\n ProviderSource,\n PredictTrade,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function marketTradesQueryKey(\n slug: string,\n params: ListMarketTradesParams,\n): unknown[] {\n return [\"predict\", \"market-trades\", slug, params];\n}\n\nexport interface UseMarketTradesParams {\n slug: string;\n source: ProviderSource;\n limit?: number;\n cursor?: string;\n side?: string;\n}\n\nexport function useMarketTrades(\n params: UseMarketTradesParams,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictTrade>,\n Error,\n PredictPage<PredictTrade>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const apiParams: ListMarketTradesParams = {\n source: params.source,\n limit: params.limit,\n cursor: params.cursor,\n side: params.side,\n };\n return useQuery({\n queryKey: marketTradesQueryKey(params.slug, apiParams),\n queryFn: () => client.listMarketTrades(params.slug, apiParams),\n enabled: Boolean(params.slug),\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Candlestick, ListCandlesticksParams } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function candlesticksQueryKey(\n slug: string,\n params?: ListCandlesticksParams,\n): unknown[] {\n return [\"predict\", \"candlesticks\", slug, params];\n}\n\nexport interface UseCandlesticksParams {\n slug: string;\n interval?: string;\n limit?: number;\n}\n\nexport function useCandlesticks(\n params: UseCandlesticksParams,\n queryOptions: Omit<\n UseQueryOptions<Candlestick[], Error, Candlestick[], unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const apiParams: ListCandlesticksParams = {\n interval: params.interval,\n limit: params.limit,\n };\n return useQuery({\n queryKey: candlesticksQueryKey(params.slug, apiParams),\n queryFn: () => client.listCandlesticks(params.slug, apiParams),\n enabled: Boolean(params.slug),\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { PositionsResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function positionsQueryKey(\n user: string,\n source?: ProviderSource,\n): unknown[] {\n return [\"predict\", \"positions\", source ?? \"all\", user];\n}\n\nexport function positionsMultiQueryKey(wallets: {\n kalshi_user?: string;\n polymarket_user?: string;\n}): unknown[] {\n return [\n \"predict\",\n \"positions\",\n \"multi\",\n wallets.kalshi_user ?? \"\",\n wallets.polymarket_user ?? \"\",\n ];\n}\n\n/** Single-source params (backward-compatible). */\nexport interface UsePositionsParams {\n /** Provider source. Omit to aggregate all providers (same address). */\n source?: ProviderSource;\n user: string;\n}\n\n/** Multi-wallet params — each provider gets its own address. */\nexport interface UsePositionsMultiParams {\n kalshi_user?: string;\n polymarket_user?: string;\n}\n\nexport function usePositions(\n params: UsePositionsParams,\n queryOptions: Omit<\n UseQueryOptions<PositionsResponse, Error, PositionsResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: positionsQueryKey(params.user, params.source),\n queryFn: () => client.getPositions(params.user, params.source),\n enabled: Boolean(params.user),\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n\n/**\n * Fetch positions for multiple wallets in a single request.\n * Each provider is queried with its own address.\n */\nexport function usePositionsMulti(\n params: UsePositionsMultiParams,\n queryOptions: Omit<\n UseQueryOptions<PositionsResponse, Error, PositionsResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const hasAnyWallet = Boolean(params.kalshi_user || params.polymarket_user);\n return useQuery({\n queryKey: positionsMultiQueryKey(params),\n queryFn: () => client.getPositions(params),\n enabled: hasAnyWallet,\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { BalanceResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function balanceQueryKey(\n source: ProviderSource,\n user: string,\n): unknown[] {\n return [\"predict\", \"balance\", source, user];\n}\n\nexport interface UseBalanceParams {\n source: ProviderSource;\n user: string;\n}\n\nexport function useBalance(\n params: UseBalanceParams,\n queryOptions: Omit<\n UseQueryOptions<BalanceResponse, Error, BalanceResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: balanceQueryKey(params.source, params.user),\n queryFn: () => client.getBalance(params.source, params.user),\n enabled: Boolean(params.user && params.source),\n staleTime: 10_000,\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ListOrdersParams, PredictPage, PredictOrder } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function ordersQueryKey(params: ListOrdersParams): unknown[] {\n return [\"predict\", \"orders\", params];\n}\n\nexport interface UseOrdersOptions {\n /**\n * Async callback invoked before each request to obtain extra headers.\n * Used by Polymarket orders to attach POLY_* HMAC authentication headers.\n */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\nexport function useOrders(\n params: ListOrdersParams,\n options?: UseOrdersOptions,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictOrder>,\n Error,\n PredictPage<PredictOrder>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: ordersQueryKey(params),\n queryFn: async () => {\n const headers = await options?.getHeaders?.();\n return client.listOrders(params, headers);\n },\n enabled: Boolean(params.wallet_address),\n ...queryOptions,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { ListOrdersParams } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport type UseInfiniteOrdersParams = Omit<ListOrdersParams, \"next_cursor\">;\n\nexport interface UseInfiniteOrdersOptions {\n /**\n * Async callback invoked before each request to obtain extra headers.\n * Used by Polymarket orders to attach POLY_* HMAC authentication headers.\n */\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\nexport function infiniteOrdersQueryKey(\n params: UseInfiniteOrdersParams,\n): unknown[] {\n return [\"predict\", \"orders\", \"infinite\", params];\n}\n\nexport function useInfiniteOrders(\n params: UseInfiniteOrdersParams,\n options?: UseInfiniteOrdersOptions,\n) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: infiniteOrdersQueryKey(params),\n queryFn: async ({ pageParam }) => {\n const headers = await options?.getHeaders?.();\n return client.listOrders({ ...params, next_cursor: pageParam }, headers);\n },\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage) =>\n lastPage.has_more ? lastPage.next_cursor : undefined,\n enabled: Boolean(params.wallet_address),\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ProviderSource, PredictOrder } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function orderQueryKey(id: string, source: ProviderSource): unknown[] {\n return [\"predict\", \"order\", id, source];\n}\n\nexport interface UseOrderParams {\n id: string;\n source: ProviderSource;\n}\n\n/**\n * Query a single order by ID. Automatically polls every 1 s while enabled.\n */\nexport function useOrder(\n params: UseOrderParams,\n queryOptions: Omit<\n UseQueryOptions<PredictOrder, Error, PredictOrder, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: orderQueryKey(params.id, params.source),\n queryFn: () => client.getOrder(params.id, params.source),\n enabled: Boolean(params.id),\n refetchInterval: 1000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { CancelOrderResult, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport interface CancelOrderVariables {\n id: string;\n source: ProviderSource;\n}\n\nexport function useCancelOrder(\n mutationOptions: Omit<\n UseMutationOptions<CancelOrderResult, Error, CancelOrderVariables>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (vars: CancelOrderVariables) =>\n client.cancelOrder(vars.id, vars.source),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n },\n ...mutationOptions,\n });\n}\n","/**\n * Server-safe pure functions for matches query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictClient,\n MatchesParams,\n MatchGroupPage,\n} from \"../../client\";\n\n/** Query key for match group list queries. */\nexport function matchesQueryKey(params?: MatchesParams): unknown[] {\n return [\"predict\", \"matches\", params];\n}\n\n/** Query key for a single match group. */\nexport function matchQueryKey(id: number): unknown[] {\n return [\"predict\", \"match\", id];\n}\n\n/** Fetch a page of matches (usable in both client and server contexts). */\nexport async function fetchMatchesPage(\n client: PredictClient,\n params: MatchesParams,\n): Promise<MatchGroupPage> {\n return client.listMatches(params);\n}\n","import {\n useQuery,\n useInfiniteQuery,\n type UseQueryOptions,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { MatchGroup, MatchesParams, MatchGroupPage } from \"../../client\";\nimport {\n matchesQueryKey,\n matchQueryKey,\n fetchMatchesPage,\n} from \"./matches.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { matchesQueryKey, matchQueryKey, fetchMatchesPage };\n\nexport type UseInfiniteMatchesParams = Omit<MatchesParams, \"cursor\">;\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n MatchGroupPage,\n Error,\n InfiniteData<MatchGroupPage>,\n unknown[],\n string | undefined\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/matches` with\n * cursor-based pagination.\n *\n * Stats are available from the first page: `data.pages[0]?.stats`.\n */\nexport function useInfiniteMatches(\n params: UseInfiniteMatchesParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: matchesQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchMatchesPage(client, {\n ...params,\n ...(pageParam !== undefined ? { cursor: pageParam } : {}),\n }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage: MatchGroupPage) =>\n lastPage.has_more && lastPage.next_cursor\n ? lastPage.next_cursor\n : undefined,\n ...queryOptions,\n });\n}\n\n/**\n * TanStack Query hook for fetching a single match group by ID.\n */\nexport function useMatch(\n id: number,\n queryOptions: Omit<\n UseQueryOptions<MatchGroup, Error, MatchGroup, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: matchQueryKey(id),\n queryFn: () => client.getMatch(id),\n enabled: id > 0,\n staleTime: 2 * 60_000,\n ...queryOptions,\n });\n}\n","/**\n * Server-safe pure functions for match markets query parameters.\n *\n * This module contains NO React imports and can be used in Server Components,\n * route handlers, or any non-browser context.\n */\nimport type {\n PredictClient,\n MatchMarketParams,\n MatchMarketPage,\n} from \"../../client\";\n\n/** Query key for market-level match queries. */\nexport function matchMarketsQueryKey(params?: MatchMarketParams): unknown[] {\n return [\"predict\", \"matchMarkets\", params];\n}\n\n/** Fetch a page of match markets (usable in both client and server contexts). */\nexport async function fetchMatchMarketsPage(\n client: PredictClient,\n params: MatchMarketParams,\n): Promise<MatchMarketPage> {\n return client.listMatchMarkets(params);\n}\n","import {\n useInfiniteQuery,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { MatchMarketParams, MatchMarketPage } from \"../../client\";\nimport {\n matchMarketsQueryKey,\n fetchMatchMarketsPage,\n} from \"./matchMarkets.params\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport { matchMarketsQueryKey, fetchMatchMarketsPage };\n\nexport type UseInfiniteMatchMarketsParams = Omit<MatchMarketParams, \"offset\">;\n\ntype InfiniteQueryOptions = Omit<\n UseInfiniteQueryOptions<\n MatchMarketPage,\n Error,\n InfiniteData<MatchMarketPage>,\n unknown[],\n number\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\" | \"getNextPageParam\"\n>;\n\n/**\n * TanStack Query infinite-query hook for `GET /api/v1/matches/markets`\n * with offset-based pagination.\n */\nexport function useInfiniteMatchMarkets(\n params: UseInfiniteMatchMarketsParams,\n queryOptions: InfiniteQueryOptions = {},\n) {\n const client = usePredictClient();\n const limit = params.limit ?? 20;\n\n return useInfiniteQuery({\n queryKey: matchMarketsQueryKey(params),\n queryFn: ({ pageParam }) =>\n fetchMatchMarketsPage(client, {\n ...params,\n limit,\n offset: pageParam,\n }),\n initialPageParam: 0,\n getNextPageParam: (lastPage: MatchMarketPage) => {\n const nextOffset = lastPage.offset + lastPage.items.length;\n return nextOffset < lastPage.total ? nextOffset : undefined;\n },\n ...queryOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { ListTradesParams, PredictPage, PredictTrade } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tradesQueryKey(params: ListTradesParams): unknown[] {\n return [\"predict\", \"trades-by-wallet\", params];\n}\n\nexport function useTrades(\n params: ListTradesParams,\n queryOptions: Omit<\n UseQueryOptions<\n PredictPage<PredictTrade>,\n Error,\n PredictPage<PredictTrade>,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tradesQueryKey(params),\n queryFn: () => client.listTrades(params),\n enabled: Boolean(params.wallet),\n ...queryOptions,\n });\n}\n","import { useInfiniteQuery } from \"@tanstack/react-query\";\nimport type { ListTradesParams } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport type UseInfiniteTradesParams = Omit<ListTradesParams, \"cursor\">;\n\nexport function infiniteTradesQueryKey(\n params: UseInfiniteTradesParams,\n): unknown[] {\n return [\"predict\", \"trades-by-wallet\", \"infinite\", params];\n}\n\nexport function useInfiniteTrades(params: UseInfiniteTradesParams) {\n const client = usePredictClient();\n return useInfiniteQuery({\n queryKey: infiniteTradesQueryKey(params),\n queryFn: ({ pageParam }) =>\n client.listTrades({ ...params, cursor: pageParam }),\n initialPageParam: undefined as string | undefined,\n getNextPageParam: (lastPage) =>\n lastPage.has_more ? lastPage.next_cursor : undefined,\n enabled: Boolean(params.wallet),\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { DFlowQuoteRequest, DFlowQuoteResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function dflowQuoteQueryKey(params: DFlowQuoteRequest): unknown[] {\n return [\"predict\", \"dflow-quote\", params];\n}\n\n/**\n * Fetch a DFlow quote. The query is only enabled when all required\n * fields are present and amount > 0.\n */\nexport function useDFlowQuote(\n params: DFlowQuoteRequest,\n queryOptions: Omit<\n UseQueryOptions<DFlowQuoteResponse, Error, DFlowQuoteResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const paramsValid =\n Boolean(params.inputMint) &&\n Boolean(params.outputMint) &&\n Boolean(params.userPublicKey) &&\n params.amount !== \"0\" &&\n params.amount !== \"\";\n\n return useQuery({\n queryKey: dflowQuoteQueryKey(params),\n queryFn: () => client.createDFlowQuote(params),\n staleTime: 10_000,\n ...queryOptions,\n enabled: paramsValid && (queryOptions.enabled ?? true),\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { DFlowSubmitRequest, DFlowSubmitResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function useDFlowSubmit(\n mutationOptions: Omit<\n UseMutationOptions<DFlowSubmitResponse, Error, DFlowSubmitRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: DFlowSubmitRequest) =>\n client.submitDFlowTransaction(body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { DFlowKYCStatus } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function dflowKYCQueryKey(walletAddress: string): unknown[] {\n return [\"predict\", \"kyc\", \"dflow\", walletAddress];\n}\n\n/**\n * Query hook that checks DFlow KYC verification status for a Solana wallet.\n *\n * @param walletAddress - Solana wallet address to check.\n * @param queryOptions - React Query options (pass `enabled` to control when the query runs).\n */\nexport function useDFlowKYC(\n walletAddress?: string,\n queryOptions: Omit<\n UseQueryOptions<DFlowKYCStatus, Error, DFlowKYCStatus, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: dflowKYCQueryKey(walletAddress ?? \"\"),\n queryFn: () => client.checkDFlowKYC(walletAddress!),\n enabled: !!walletAddress,\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQuery,\n useQueryClient,\n type UseQueryOptions,\n} from \"@tanstack/react-query\";\nimport type { PolymarketSetupStatus } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function polymarketSetupQueryKey(walletAddress: string): unknown[] {\n return [\"predict\", \"setup\", \"polymarket\", walletAddress];\n}\n\n/**\n * Query hook that checks Polymarket wallet setup status\n * (Safe deployed + USDC.e approved for CTF Exchange).\n */\nexport function usePolymarketSetup(\n walletAddress?: string,\n queryOptions: Omit<\n UseQueryOptions<\n PolymarketSetupStatus,\n Error,\n PolymarketSetupStatus,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: polymarketSetupQueryKey(walletAddress ?? \"\"),\n queryFn: () => client.checkPolymarketSetup(walletAddress!),\n enabled: !!walletAddress,\n staleTime: 60_000,\n ...queryOptions,\n });\n}\n\n/**\n * Mutation hook to run Polymarket wallet setup\n * (deploy Safe + approve USDC.e via Relayer).\n * Automatically invalidates the setup status query on success.\n */\nexport function useRunPolymarketSetup(walletAddress?: string) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (address: string) => client.runPolymarketSetup(address),\n onSuccess: () => {\n if (walletAddress) {\n queryClient.invalidateQueries({\n queryKey: polymarketSetupQueryKey(walletAddress),\n });\n }\n },\n });\n}\n","import { useMutation, type UseMutationOptions } from \"@tanstack/react-query\";\nimport type { WithdrawBuildRequest, WithdrawBuildResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function useWithdrawBuildMutation(\n mutationOptions: Omit<\n UseMutationOptions<WithdrawBuildResponse, Error, WithdrawBuildRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n\n return useMutation({\n mutationFn: (body: WithdrawBuildRequest) => client.withdrawBuild(body),\n ...mutationOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n WithdrawSubmitRequest,\n WithdrawSubmitResponse,\n} from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function useWithdrawSubmitMutation(\n mutationOptions: Omit<\n UseMutationOptions<WithdrawSubmitResponse, Error, WithdrawSubmitRequest>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (body: WithdrawSubmitRequest) => client.withdrawSubmit(body),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"balance\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n },\n ...mutationOptions,\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { WithdrawStatusResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function withdrawStatusQueryKey(\n txHash: string,\n source: ProviderSource,\n): unknown[] {\n return [\"predict\", \"withdraw\", \"status\", txHash, source];\n}\n\nexport interface UseWithdrawStatusQueryParams {\n txHash: string | undefined;\n source: ProviderSource;\n}\n\n/**\n * Polls the withdraw transaction status every 3 seconds.\n * Automatically stops polling when status is \"confirmed\" or \"failed\".\n * Only enabled when `txHash` is defined.\n */\nexport function useWithdrawStatusQuery(\n params: UseWithdrawStatusQueryParams,\n queryOptions: Omit<\n UseQueryOptions<\n WithdrawStatusResponse,\n Error,\n WithdrawStatusResponse,\n unknown[]\n >,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n const { txHash, source } = params;\n\n return useQuery({\n queryKey: withdrawStatusQueryKey(txHash ?? \"\", source),\n queryFn: () => client.withdrawStatus(txHash!, source),\n enabled: Boolean(txHash && source),\n refetchInterval: (query) => {\n const status = query.state.data?.status;\n if (status === \"confirmed\" || status === \"failed\") return false;\n return 3_000;\n },\n ...queryOptions,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type { DepositBuildResponse, ProviderSource } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nconst TX_POLL_INTERVAL = 3_000;\nconst TX_POLL_MAX_ATTEMPTS = 60;\n\nexport interface PolymarketDepositVariables {\n from: string;\n safeAddress: string;\n /** Total USDC amount needed (human-readable, e.g. \"50.0\"). */\n amount: string;\n /** Signs a raw EVM transaction and returns the signed hex. */\n signTransaction: (txParams: Record<string, string>) => Promise<string>;\n}\n\nexport interface PolymarketDepositResult {\n /** Whether any deposit transactions were executed. */\n deposited: boolean;\n /** Number of transactions executed (0, 1 for swap-only, or 2 for approve+swap). */\n txCount: number;\n /** Shortfall that was swapped (human-readable). */\n shortfall: string;\n /** Safe balance before deposit. */\n safeBalance: string;\n}\n\n/**\n * Mutation hook for depositing native USDC into a Polymarket Safe wallet as USDC.e.\n *\n * Flow:\n * 1. Calls `/deposit/polymarket/build` to check Safe USDC.e balance and get unsigned txs.\n * 2. If shortfall > 0, signs and submits each tx (approve if needed, then swap).\n * 3. Polls tx status until confirmed.\n * 4. Returns the deposit result.\n */\nexport function usePolymarketDeposit(\n mutationOptions: Omit<\n UseMutationOptions<\n PolymarketDepositResult,\n Error,\n PolymarketDepositVariables\n >,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n from,\n safeAddress,\n amount,\n signTransaction,\n }: PolymarketDepositVariables): Promise<PolymarketDepositResult> => {\n const buildResult: DepositBuildResponse = await client.depositBuild({\n source: \"polymarket\" as ProviderSource,\n from,\n safe_address: safeAddress,\n amount,\n });\n\n if (buildResult.transactions.length === 0) {\n return {\n deposited: false,\n txCount: 0,\n shortfall: buildResult.shortfall,\n safeBalance: buildResult.safe_balance,\n };\n }\n\n for (const unsignedTx of buildResult.transactions) {\n const signedHex = await signTransaction(unsignedTx.params);\n\n const submitResult = await client.depositSubmit({\n source: \"polymarket\" as ProviderSource,\n signed_tx: signedHex,\n });\n\n await pollTxUntilConfirmed(client, submitResult.tx_hash);\n }\n\n return {\n deposited: true,\n txCount: buildResult.transactions.length,\n shortfall: buildResult.shortfall,\n safeBalance: buildResult.safe_balance,\n };\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"balance\"] });\n },\n ...mutationOptions,\n });\n}\n\nasync function pollTxUntilConfirmed(\n client: {\n depositStatus: (\n txHash: string,\n source: ProviderSource,\n ) => Promise<{ status: string }>;\n },\n txHash: string,\n): Promise<void> {\n for (let i = 0; i < TX_POLL_MAX_ATTEMPTS; i++) {\n await sleep(TX_POLL_INTERVAL);\n const result = await client.depositStatus(txHash, \"polymarket\");\n if (result.status === \"confirmed\") return;\n if (result.status === \"failed\") {\n throw new Error(`Deposit transaction failed: ${txHash}`);\n }\n }\n throw new Error(\n `Deposit transaction timed out after ${(TX_POLL_MAX_ATTEMPTS * TX_POLL_INTERVAL) / 1000}s: ${txHash}`,\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { PolymarketDepositAddresses } from \"../../client/types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport const polymarketDepositAddressesQueryKey = (safeAddress: string) =>\n [\"polymarket\", \"deposit-addresses\", safeAddress] as const;\n\n/**\n * Fetch multi-chain deposit addresses for a Polymarket Safe wallet.\n *\n * @param safeAddress - The Safe (proxy) wallet address. When empty/undefined the query is disabled.\n */\nexport function usePolymarketDepositAddresses(safeAddress: string | undefined) {\n const client = usePredictClient();\n return useQuery<PolymarketDepositAddresses>({\n queryKey: polymarketDepositAddressesQueryKey(safeAddress ?? \"\"),\n queryFn: () => client.getPolymarketDepositAddresses(safeAddress!),\n enabled: !!safeAddress,\n staleTime: 5 * 60 * 1000,\n });\n}\n","import { useMutation } from \"@tanstack/react-query\";\nimport type {\n PolymarketWithdrawRequest,\n PolymarketWithdrawResponse,\n} from \"../../client/types\";\nimport { usePredictClient } from \"./usePredictClient\";\n\n/**\n * Mutation hook to execute a gasless USDC.e withdrawal from a Polymarket Safe\n * wallet via the Relayer.\n *\n * @example\n * ```ts\n * const { mutateAsync: withdraw } = usePolymarketWithdraw();\n * await withdraw({\n * wallet_address: \"0xEOA...\",\n * safe_address: \"0xSafe...\",\n * to: \"0xRecipient...\",\n * amount: \"10.5\",\n * });\n * ```\n */\nexport function usePolymarketWithdraw() {\n const client = usePredictClient();\n return useMutation<\n PolymarketWithdrawResponse,\n Error,\n PolymarketWithdrawRequest\n >({\n mutationFn: (req) => client.executePolymarketWithdraw(req),\n });\n}\n","import { useQuery, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { TickSizeResponse } from \"../../client\";\nimport { usePredictClient } from \"./usePredictClient\";\n\nexport function tickSizeQueryKey(tokenId: string): unknown[] {\n return [\"predict\", \"polymarket\", \"tick-size\", tokenId];\n}\n\n/**\n * Query hook that fetches the minimum tick size for a Polymarket token.\n *\n * @param tokenId - Polymarket CLOB token ID (asset ID).\n * @param queryOptions - React Query options (pass `enabled` to control when the query runs).\n */\nexport function useTickSize(\n tokenId?: string,\n queryOptions: Omit<\n UseQueryOptions<TickSizeResponse, Error, TickSizeResponse, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const client = usePredictClient();\n return useQuery({\n queryKey: tickSizeQueryKey(tokenId ?? \"\"),\n queryFn: () => client.getPolymarketTickSize(tokenId!),\n enabled: !!tokenId,\n staleTime: 5 * 60_000,\n ...queryOptions,\n });\n}\n","import { useContext, useEffect, useState } from \"react\";\nimport type { WsConnectionStatus } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\nimport { PredictContext } from \"../../providers/PredictContext\";\n\nexport interface UsePredictWsClientResult {\n /** The WebSocket client instance, or `null` if not provided via `PredictProvider`. */\n wsClient: PredictWsClient | null;\n /** Current connection status. Defaults to `\"disconnected\"` when no client. */\n wsStatus: WsConnectionStatus;\n /** Shorthand for `wsStatus === \"connected\"`. */\n isWsConnected: boolean;\n}\n\n/**\n * Access the `PredictWsClient` from context and track its connection status.\n *\n * Must be called inside a `PredictProvider`.\n */\nexport function usePredictWsClient(): UsePredictWsClientResult {\n const context = useContext(PredictContext);\n if (!context) {\n throw new Error(\"usePredictWsClient must be used within a PredictProvider\");\n }\n\n const { wsClient } = context;\n const [wsStatus, setWsStatus] = useState<WsConnectionStatus>(\n wsClient?.getStatus() ?? \"disconnected\",\n );\n\n useEffect(() => {\n if (!wsClient) {\n setWsStatus(\"disconnected\");\n return;\n }\n setWsStatus(wsClient.getStatus());\n return wsClient.onStatusChange(setWsStatus);\n }, [wsClient]);\n\n return {\n wsClient,\n wsStatus,\n isWsConnected: wsStatus === \"connected\",\n };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { WsDataMessage, WsPriceEvent } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\n\nexport interface UsePricesSubscriptionParams {\n /** WebSocket client (from `usePredictWsClient`). */\n wsClient: PredictWsClient | null;\n /** Market slugs to subscribe to. */\n slugs: string[];\n /** Enable/disable the subscription. Default: `true`. */\n enabled?: boolean;\n /** Optional callback fired on every price update. */\n onUpdate?: (msg: WsDataMessage<WsPriceEvent>) => void;\n}\n\nexport interface UsePricesSubscriptionResult {\n /** Latest price data keyed by market slug. */\n prices: Map<string, WsPriceEvent>;\n /** Whether the subscription is active. */\n isSubscribed: boolean;\n}\n\n/**\n * Subscribe to real-time price updates via WebSocket.\n *\n * Maintains an internal `Map<slug, WsPriceEvent>` that updates on each push.\n * Does **not** interact with React Query.\n */\nexport function usePricesSubscription({\n wsClient,\n slugs,\n enabled = true,\n onUpdate,\n}: UsePricesSubscriptionParams): UsePricesSubscriptionResult {\n const [prices, setPrices] = useState<Map<string, WsPriceEvent>>(\n () => new Map(),\n );\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const onUpdateRef = useRef(onUpdate);\n onUpdateRef.current = onUpdate;\n\n const slugsKey = slugs.join(\",\");\n\n const handleUpdate = useCallback((msg: WsDataMessage<WsPriceEvent>) => {\n setPrices((prev) => {\n const next = new Map(prev);\n next.set(msg.data.market_slug, msg.data);\n return next;\n });\n onUpdateRef.current?.(msg);\n }, []);\n\n useEffect(() => {\n if (!wsClient || !enabled || slugs.length === 0) {\n setIsSubscribed(false);\n return;\n }\n\n const unsub = wsClient.subscribePrices(slugs, handleUpdate);\n setIsSubscribed(true);\n\n return () => {\n unsub();\n setIsSubscribed(false);\n };\n }, [wsClient, enabled, slugsKey, handleUpdate]);\n\n return { prices, isSubscribed };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { WsDataMessage, WsOrderbookEvent } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\n\nexport interface UseOrderbookSubscriptionParams {\n /** WebSocket client (from `usePredictWsClient`). */\n wsClient: PredictWsClient | null;\n /** Market slug to subscribe to. */\n slug: string;\n /** Enable/disable the subscription. Default: `true`. */\n enabled?: boolean;\n /** Optional callback fired on every orderbook snapshot. */\n onUpdate?: (msg: WsDataMessage<WsOrderbookEvent>) => void;\n}\n\nexport interface UseOrderbookSubscriptionResult {\n /** Latest full orderbook snapshot, or `null` before the first push. */\n orderbook: WsOrderbookEvent | null;\n /** Whether the subscription is active. */\n isSubscribed: boolean;\n}\n\n/**\n * Subscribe to real-time orderbook snapshots via WebSocket.\n *\n * Each incoming message is a **full snapshot** — no delta merging needed.\n * Does **not** interact with React Query.\n */\nexport function useOrderbookSubscription({\n wsClient,\n slug,\n enabled = true,\n onUpdate,\n}: UseOrderbookSubscriptionParams): UseOrderbookSubscriptionResult {\n const [orderbook, setOrderbook] = useState<WsOrderbookEvent | null>(null);\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const onUpdateRef = useRef(onUpdate);\n onUpdateRef.current = onUpdate;\n\n const handleUpdate = useCallback(\n (msg: WsDataMessage<WsOrderbookEvent>) => {\n if (msg.data.market_slug === slug) {\n setOrderbook(msg.data);\n onUpdateRef.current?.(msg);\n }\n },\n [slug],\n );\n\n useEffect(() => {\n if (!wsClient || !enabled || !slug) {\n setIsSubscribed(false);\n return;\n }\n\n setOrderbook(null);\n const unsub = wsClient.subscribeOrderbook([slug], handleUpdate);\n setIsSubscribed(true);\n\n return () => {\n unsub();\n setIsSubscribed(false);\n };\n }, [wsClient, enabled, slug, handleUpdate]);\n\n return { orderbook, isSubscribed };\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { WsDataMessage, WsTradeEvent } from \"../../client/types\";\nimport type { PredictWsClient } from \"../../client/ws\";\n\nconst DEFAULT_MAX_HISTORY = 100;\n\nexport interface UseTradesSubscriptionParams {\n /** WebSocket client (from `usePredictWsClient`). */\n wsClient: PredictWsClient | null;\n /** Market slug to subscribe to. */\n slug: string;\n /** Enable/disable the subscription. Default: `true`. */\n enabled?: boolean;\n /** Max trades to keep in the buffer. Default: `100`. */\n maxHistory?: number;\n /** Optional callback fired on every new trade. */\n onUpdate?: (msg: WsDataMessage<WsTradeEvent>) => void;\n}\n\nexport interface UseTradesSubscriptionResult {\n /** Buffered trades, newest first. */\n trades: WsTradeEvent[];\n /** Whether the subscription is active. */\n isSubscribed: boolean;\n /** Clear the trade buffer. */\n clearHistory: () => void;\n}\n\n/**\n * Subscribe to real-time trade events via WebSocket.\n *\n * Maintains a bounded buffer of recent trades (newest first).\n * Does **not** interact with React Query.\n */\nexport function useTradesSubscription({\n wsClient,\n slug,\n enabled = true,\n maxHistory = DEFAULT_MAX_HISTORY,\n onUpdate,\n}: UseTradesSubscriptionParams): UseTradesSubscriptionResult {\n const [trades, setTrades] = useState<WsTradeEvent[]>([]);\n const [isSubscribed, setIsSubscribed] = useState(false);\n\n const onUpdateRef = useRef(onUpdate);\n onUpdateRef.current = onUpdate;\n\n const maxRef = useRef(maxHistory);\n maxRef.current = maxHistory;\n\n const handleUpdate = useCallback(\n (msg: WsDataMessage<WsTradeEvent>) => {\n if (msg.data.market_slug === slug) {\n setTrades((prev) => {\n const next = [msg.data, ...prev];\n return next.length > maxRef.current\n ? next.slice(0, maxRef.current)\n : next;\n });\n onUpdateRef.current?.(msg);\n }\n },\n [slug],\n );\n\n const clearHistory = useCallback(() => {\n setTrades([]);\n }, []);\n\n useEffect(() => {\n if (!wsClient || !enabled || !slug) {\n setIsSubscribed(false);\n return;\n }\n\n setTrades([]);\n const unsub = wsClient.subscribeTrades([slug], handleUpdate);\n setIsSubscribed(true);\n\n return () => {\n unsub();\n setIsSubscribed(false);\n };\n }, [wsClient, enabled, slug, handleUpdate]);\n\n return { trades, isSubscribed, clearHistory };\n}\n","import { useEffect, useRef } from \"react\";\nimport { useQueryClient, type UseQueryOptions } from \"@tanstack/react-query\";\nimport type { Orderbook, ProviderSource } from \"../../client/types\";\nimport { useOrderbook, orderbookQueryKey } from \"./useOrderbook\";\nimport {\n useOrderbookSubscription,\n type UseOrderbookSubscriptionParams,\n} from \"./useOrderbookSubscription\";\nimport { usePredictWsClient } from \"./usePredictWsClient\";\n\nexport interface UseRealtimeOrderbookParams {\n slug: string;\n source: ProviderSource;\n}\n\nconst REST_POLL_INTERVAL = 5000;\n\n/**\n * Orderbook with automatic WS → REST fallback.\n *\n * - When the WebSocket is subscribed, the hook writes incoming snapshots\n * directly into the React Query cache via `setQueryData` (no refetch)\n * and disables REST polling.\n * - When the WebSocket is unavailable or disconnected, the hook falls\n * back to REST polling every 5 seconds.\n *\n * The return value is the same `UseQueryResult` as `useOrderbook`, so\n * migrating from `useOrderbook` is a drop-in replacement.\n */\nexport function useRealtimeOrderbook(\n params: UseRealtimeOrderbookParams,\n queryOptions: Omit<\n UseQueryOptions<Orderbook, Error, Orderbook, unknown[]>,\n \"queryKey\" | \"queryFn\"\n > = {},\n) {\n const { wsClient } = usePredictWsClient();\n const queryClient = useQueryClient();\n\n const subParams: UseOrderbookSubscriptionParams = {\n wsClient,\n slug: params.slug,\n enabled: Boolean(params.slug),\n };\n\n const { isSubscribed } = useOrderbookSubscription(subParams);\n\n const qk = orderbookQueryKey(params.slug, params.source);\n const qkRef = useRef(qk);\n qkRef.current = qk;\n\n // Write WS snapshots into React Query cache\n useEffect(() => {\n if (!wsClient || !params.slug) return;\n\n const unsub = wsClient.subscribeOrderbook([params.slug], (msg) => {\n const ob: Orderbook = {\n market_id: msg.data.market_slug,\n bids: msg.data.bids,\n asks: msg.data.asks,\n spread: msg.data.spread,\n };\n queryClient.setQueryData(qkRef.current, ob);\n });\n\n return unsub;\n }, [wsClient, params.slug, queryClient]);\n\n return useOrderbook(params, {\n refetchInterval: isSubscribed ? false : REST_POLL_INTERVAL,\n ...queryOptions,\n });\n}\n","import type { WsDataMessage, WsPriceEvent } from \"../../client/types\";\nimport { usePredictWsClient } from \"./usePredictWsClient\";\nimport {\n usePricesSubscription,\n type UsePricesSubscriptionResult,\n} from \"./usePricesSubscription\";\n\nexport interface UseRealtimePricesParams {\n /** Market slugs to subscribe to. */\n slugs: string[];\n /** Enable/disable. Default: `true`. */\n enabled?: boolean;\n /** Optional callback on each price update. */\n onUpdate?: (msg: WsDataMessage<WsPriceEvent>) => void;\n}\n\n/**\n * Real-time price updates with graceful degradation.\n *\n * When the WebSocket client is available and connected, this hook\n * subscribes to price updates and returns a `Map<slug, WsPriceEvent>`.\n * When no WebSocket client is provided, `prices` stays empty and\n * `isSubscribed` is `false` — the consumer can fall back to REST data.\n */\nexport function useRealtimePrices({\n slugs,\n enabled = true,\n onUpdate,\n}: UseRealtimePricesParams): UsePricesSubscriptionResult {\n const { wsClient } = usePredictWsClient();\n\n return usePricesSubscription({\n wsClient,\n slugs,\n enabled,\n onUpdate,\n });\n}\n","import { useEffect, useRef } from \"react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport type {\n PredictPage,\n PredictTrade,\n WsDataMessage,\n WsTradeEvent,\n} from \"../../client/types\";\nimport { marketTradesQueryKey } from \"./useMarketTrades\";\nimport { usePredictWsClient } from \"./usePredictWsClient\";\nimport {\n useTradesSubscription,\n type UseTradesSubscriptionResult,\n} from \"./useTradesSubscription\";\n\nexport interface UseRealtimeTradesParams {\n /** Market slug to subscribe to. */\n slug: string;\n /** Enable/disable. Default: `true`. */\n enabled?: boolean;\n /** Max WS trades to buffer. Default: `100`. */\n maxHistory?: number;\n /** Optional callback on each new trade. */\n onUpdate?: (msg: WsDataMessage<WsTradeEvent>) => void;\n /**\n * When `true`, new WS trades are prepended into matching React Query\n * `marketTrades` cache entries so paginated lists update instantly.\n * Default: `true`.\n */\n syncToQueryCache?: boolean;\n}\n\nexport type UseRealtimeTradesResult = UseTradesSubscriptionResult;\n\n/**\n * Real-time trade stream with optional React Query cache sync.\n *\n * Subscribes to the `trades` WS channel for a single market.\n * When `syncToQueryCache` is enabled (default), each new trade is also\n * prepended into any active React Query cache entry whose key matches\n * `[\"predict\", \"market-trades\", slug, ...]`.\n */\nexport function useRealtimeTrades({\n slug,\n enabled = true,\n maxHistory,\n onUpdate,\n syncToQueryCache = true,\n}: UseRealtimeTradesParams): UseRealtimeTradesResult {\n const { wsClient } = usePredictWsClient();\n const queryClient = useQueryClient();\n\n const slugRef = useRef(slug);\n slugRef.current = slug;\n\n // Optionally push new WS trades into React Query cache\n useEffect(() => {\n if (!wsClient || !slug || !enabled || !syncToQueryCache) return;\n\n const unsub = wsClient.subscribeTrades([slug], (msg) => {\n const trade = msg.data;\n // Update all cache entries whose key starts with the market-trades prefix\n const prefix = [\"predict\", \"market-trades\", slugRef.current];\n queryClient.setQueriesData<PredictPage<PredictTrade>>(\n { queryKey: prefix },\n (old) => {\n if (!old) return old;\n const syntheticTrade: PredictTrade = {\n id: trade.trade_id ?? `ws-${msg.ts}`,\n source: \"kalshi\",\n side: trade.side,\n outcome: trade.outcome ?? \"\",\n outcome_index: 0,\n price: trade.price,\n size: trade.size,\n usd_size: trade.size,\n timestamp: Math.floor(msg.ts / 1000),\n tx_hash: \"\",\n wallet: \"\",\n type: \"TRADE\",\n };\n return {\n ...old,\n items: [syntheticTrade, ...old.items],\n };\n },\n );\n });\n\n return unsub;\n }, [wsClient, slug, enabled, syncToQueryCache, queryClient]);\n\n return useTradesSubscription({\n wsClient,\n slug,\n enabled,\n maxHistory,\n onUpdate,\n });\n}\n","import { useContext } from \"react\";\nimport { PolymarketContext } from \"../../providers/PolymarketContext\";\n\n/**\n * Access Polymarket L2 credentials and authentication actions.\n *\n * Must be called inside a component tree wrapped by `PolymarketProvider`.\n *\n * @throws When used outside of `PolymarketProvider`.\n *\n * @example\n * ```tsx\n * function TradeButton() {\n * const { credentials, authenticate, isAuthenticating } = usePolymarket();\n *\n * const handleClick = async () => {\n * if (!credentials) {\n * await authenticate(myPolymarketSigner);\n * }\n * // proceed to place order\n * };\n *\n * return (\n * <button onClick={handleClick} disabled={isAuthenticating}>\n * Trade\n * </button>\n * );\n * }\n * ```\n */\nexport function usePolymarket() {\n const context = useContext(PolymarketContext);\n if (!context) {\n throw new Error(\"usePolymarket must be used within a PolymarketProvider\");\n }\n return context;\n}\n","/**\n * Polymarket CTF Exchange order construction utilities.\n *\n * Implements EIP-712 signing for `Order` structs on the CTF Exchange and\n * Neg-Risk CTF Exchange contracts (Polygon mainnet).\n *\n * References:\n * https://github.com/Polymarket/clob-client/blob/main/src/order-builder/builder.ts\n * https://github.com/Polymarket/clob-client/blob/main/src/order-builder/helpers.ts\n * https://docs.polymarket.com/#create-order\n */\nimport type { CreateOrderInput } from \"../client/types\";\n\n// ---------------------------------------------------------------------------\n// Contract addresses (Polygon mainnet)\n// ---------------------------------------------------------------------------\n\n/** Polymarket CTF Exchange contract (standard markets). */\nexport const CTF_EXCHANGE_ADDRESS =\n \"0x4bFb41d5B3570DeFd03C39a9A4D8dE6Bd8B8982E\" as const;\n\n/** Polymarket Neg-Risk CTF Exchange contract (neg-risk markets). */\nexport const NEG_RISK_CTF_EXCHANGE_ADDRESS =\n \"0xC5d563A36AE78145C45a50134d48A1215220f80a\" as const;\n\n/** USDC.e (Bridged USDC) on Polygon — the only collateral token on Polymarket. */\nexport const USDC_ADDRESS =\n \"0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174\" as const;\n\n/** Chain ID for Polygon mainnet. */\nexport const POLYGON_CHAIN_ID = 137;\n\n// ---------------------------------------------------------------------------\n// EIP-712 domain and types\n// ---------------------------------------------------------------------------\n\n/**\n * Build the EIP-712 domain for the CTF Exchange.\n *\n * @param negRisk - When `true`, use the Neg-Risk exchange address.\n */\nexport function buildCtfExchangeDomain(negRisk = false) {\n return {\n name: \"Polymarket CTF Exchange\",\n version: \"1\",\n chainId: POLYGON_CHAIN_ID,\n verifyingContract: negRisk\n ? NEG_RISK_CTF_EXCHANGE_ADDRESS\n : CTF_EXCHANGE_ADDRESS,\n };\n}\n\n/** EIP-712 type definitions for the Polymarket `Order` struct. */\nexport const CTF_ORDER_TYPES = {\n Order: [\n { name: \"salt\", type: \"uint256\" },\n { name: \"maker\", type: \"address\" },\n { name: \"signer\", type: \"address\" },\n { name: \"taker\", type: \"address\" },\n { name: \"tokenId\", type: \"uint256\" },\n { name: \"makerAmount\", type: \"uint256\" },\n { name: \"takerAmount\", type: \"uint256\" },\n { name: \"expiration\", type: \"uint256\" },\n { name: \"nonce\", type: \"uint256\" },\n { name: \"feeRateBps\", type: \"uint256\" },\n { name: \"side\", type: \"uint8\" },\n { name: \"signatureType\", type: \"uint8\" },\n ],\n} as const;\n\n// ---------------------------------------------------------------------------\n// Order type constants\n// ---------------------------------------------------------------------------\n\n/** Order type enum matching CTFExchange.sol. */\nexport const ORDER_TYPE = {\n GTC: 0, // Good-Till-Cancelled\n FOK: 1, // Fill-Or-Kill\n GTD: 2, // Good-Till-Date\n FAK: 3, // Fill-And-Kill\n} as const;\n\n/** Side enum matching CTFExchange.sol (0 = BUY, 1 = SELL). */\nexport const SIDE = { BUY: 0, SELL: 1 } as const;\n\n// ---------------------------------------------------------------------------\n// Amount calculation — matches official Polymarket CLOB client rounding\n// ---------------------------------------------------------------------------\n\n/**\n * Rounding configuration per tick size, aligned with the official\n * Polymarket CLOB client (`@polymarket/clob-client`).\n *\n * Key invariant: `amount = size + price` decimal places, which guarantees\n * that `amount / size` (= implied price) has exactly `price` decimal places,\n * i.e. a valid tick-aligned price.\n *\n * @see https://github.com/Polymarket/clob-client/blob/main/src/order-builder/helpers.ts\n */\nconst ROUNDING_CONFIG: Record<\n string,\n { size: number; price: number; amount: number }\n> = {\n \"0.1\": { size: 2, price: 1, amount: 3 },\n \"0.01\": { size: 2, price: 2, amount: 4 },\n \"0.001\": { size: 3, price: 3, amount: 6 },\n \"0.0001\": { size: 4, price: 4, amount: 8 },\n};\n\nconst DEFAULT_ROUNDING = { size: 2, price: 2, amount: 4 };\n\n/**\n * Round a number to `d` decimal places (round-half-away-from-zero via toFixed).\n * Mirrors the official `decimalPlaces()` / `roundNormal()` helpers.\n */\nfunction decimalPlaces(n: number, d: number): number {\n return parseFloat(n.toFixed(d));\n}\n\n/**\n * Convert a human-readable amount to micro-USDC (6 decimals).\n * Polymarket contracts use USDC.e with 6 decimals.\n */\nfunction toMicroUsdc(amount: number): bigint {\n return BigInt(Math.round(amount * 1_000_000));\n}\n\n/**\n * Round a micro-USDC value to the nearest multiple so that only\n * `maxDecimals` human-readable decimal places remain.\n *\n * Polymarket's CLOB API enforces precision limits **on the raw amounts\n * themselves** (independent of tick alignment):\n * - USDC amounts: max 2 decimals → must be multiple of 10 000\n * - Share amounts: max 4 decimals → must be multiple of 100\n *\n * Uses banker's rounding (round-half-up) instead of truncation to keep\n * the result as close to the user's intended amount as possible.\n * Max error: 0.005 USDC or 0.00005 shares — negligible.\n */\nfunction roundMicro(raw: bigint, maxDecimals: number): bigint {\n const factor = BigInt(10 ** (6 - maxDecimals));\n const half = factor / 2n;\n return ((raw + half) / factor) * factor;\n}\n\n/**\n * Normalise a token ID to a decimal string.\n * Polymarket's CLOB API requires decimal representation, but market metadata\n * may store token IDs as hex strings (0x-prefixed).\n */\nfunction normalizeTokenId(tokenId: string): string {\n if (tokenId.startsWith(\"0x\") || tokenId.startsWith(\"0X\")) {\n return BigInt(tokenId).toString(10);\n }\n return tokenId;\n}\n\n// ---------------------------------------------------------------------------\n// Order message builder\n// ---------------------------------------------------------------------------\n\nexport interface BuildOrderMessageInput extends CreateOrderInput {\n /** Signer / owner address. */\n signerAddress: string;\n /** Signature type (0 = EOA, 1 = Magic, 2 = Poly Proxy). */\n signatureType: 0 | 1 | 2;\n}\n\nexport interface OrderMessage {\n salt: string;\n maker: string;\n signer: string;\n taker: string;\n tokenId: string;\n makerAmount: string;\n takerAmount: string;\n expiration: string;\n nonce: string;\n feeRateBps: string;\n side: number;\n signatureType: number;\n}\n\n/**\n * Build the EIP-712 typed data value for a Polymarket limit order.\n *\n * All amounts are in micro-USDC (1 USDC = 1 000 000).\n *\n * For a BUY order:\n * - `makerAmount` = USDC spent (cost = size × price)\n * - `takerAmount` = shares received (= size)\n *\n * For a SELL order:\n * - `makerAmount` = shares sold (= size)\n * - `takerAmount` = USDC received (cost = size × price)\n *\n * Amount rounding follows the official Polymarket CLOB client to guarantee\n * that `makerAmount / takerAmount` produces a tick-aligned price.\n * The key invariant: `amountDecimals = sizeDecimals + priceDecimals`, so\n * `round(size × price, amountDecimals) / round(size, sizeDecimals)` has\n * exactly `priceDecimals` decimal places.\n */\nexport function buildOrderMessage(input: BuildOrderMessageInput): OrderMessage {\n const side = input.side === \"BUY\" ? SIDE.BUY : SIDE.SELL;\n const rc = ROUNDING_CONFIG[input.tickSize] ?? DEFAULT_ROUNDING;\n\n const rawPrice = decimalPlaces(input.price, rc.price);\n const rawSize = decimalPlaces(input.size, rc.size);\n const rawAmount = decimalPlaces(rawSize * rawPrice, rc.amount);\n\n const sizeInMicro = toMicroUsdc(rawSize);\n const amountInMicro = toMicroUsdc(rawAmount);\n\n // Enforce Polymarket CLOB API precision constraints:\n // USDC amounts → max 2 human decimals (multiple of 10 000 in micro)\n // Share amounts → max 4 human decimals (multiple of 100 in micro)\n const usdcMicro = roundMicro(amountInMicro, 2);\n const sharesMicro = roundMicro(sizeInMicro, 4);\n\n const makerAmount =\n side === SIDE.BUY ? usdcMicro.toString() : sharesMicro.toString();\n const takerAmount =\n side === SIDE.BUY ? sharesMicro.toString() : usdcMicro.toString();\n\n const maker = input.funderAddress ?? input.signerAddress;\n\n return {\n salt: Math.floor(Math.random() * 1e15).toString(),\n maker,\n signer: input.signerAddress,\n taker: \"0x0000000000000000000000000000000000000000\",\n tokenId: normalizeTokenId(input.tokenId),\n makerAmount,\n takerAmount,\n expiration: String(input.expiration ?? 0),\n nonce: \"0\",\n feeRateBps: \"0\",\n side,\n signatureType: input.signatureType,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Signed order payload builder\n// ---------------------------------------------------------------------------\n\nexport interface SignedOrder extends OrderMessage {\n signature: string;\n orderType: string;\n}\n\n/**\n * Attach a signature (and optional orderType) to an already-built order message\n * to produce the final payload for the Polymarket CLOB.\n *\n * IMPORTANT: always pass the SAME `OrderMessage` that was used for EIP-712\n * signing. Do NOT rebuild it — `buildOrderMessage` generates a random salt\n * each time, so a second call would produce a different message and the\n * signature would be invalid.\n */\nexport function buildSignedOrder(\n orderMessage: OrderMessage,\n signature: string,\n orderType?: string,\n): SignedOrder {\n return {\n ...orderMessage,\n signature,\n orderType: orderType ?? \"GTC\",\n };\n}\n\n// ---------------------------------------------------------------------------\n// CLOB payload builder (orderToJson equivalent)\n// ---------------------------------------------------------------------------\n\n/**\n * CLOB order payload as expected by Polymarket's `POST /order` endpoint.\n *\n * Key format differences from the EIP-712 `OrderMessage`:\n * - `salt` is a **number** (not a string)\n * - `side` is `\"BUY\"` / `\"SELL\"` (not 0 / 1)\n * - `deferExec` is required (defaults to `false`)\n *\n * @see https://github.com/Polymarket/clob-client/blob/main/src/utilities.ts\n */\nexport interface ClobOrderPayload {\n order: {\n salt: number;\n maker: string;\n signer: string;\n taker: string;\n tokenId: string;\n makerAmount: string;\n takerAmount: string;\n expiration: string;\n nonce: string;\n feeRateBps: string;\n side: \"BUY\" | \"SELL\";\n signatureType: number;\n signature: string;\n };\n owner: string;\n orderType: string;\n deferExec: boolean;\n}\n\n/**\n * Convert a `SignedOrder` into the JSON payload format that Polymarket's\n * CLOB API expects. Mirrors the official `orderToJson()` utility.\n */\nexport function buildClobPayload(\n signedOrder: SignedOrder,\n owner: string,\n): ClobOrderPayload {\n const { orderType: ot, ...order } = signedOrder;\n return {\n order: {\n ...order,\n salt: parseInt(order.salt, 10),\n side: order.side === SIDE.BUY ? \"BUY\" : \"SELL\",\n },\n owner,\n orderType: ot ?? \"GTC\",\n deferExec: false,\n };\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from \"@tanstack/react-query\";\nimport type {\n CreateOrderInput,\n DepositBuildResponse,\n PredictOrder,\n ProviderSource,\n} from \"../../client\";\nimport type { PolymarketSigner } from \"../../providers/PolymarketContext\";\nimport { buildPolymarketL2Headers } from \"../../utils/polymarket-hmac\";\nimport {\n buildCtfExchangeDomain,\n CTF_ORDER_TYPES,\n buildOrderMessage,\n buildSignedOrder,\n buildClobPayload,\n} from \"../../utils/polymarket-order\";\nimport { usePredictClient } from \"../predict/usePredictClient\";\nimport { usePolymarket } from \"./usePolymarket\";\n\nconst TX_POLL_INTERVAL = 3_000;\nconst TX_POLL_MAX_ATTEMPTS = 60;\n\nexport interface CreatePolymarketOrderVariables {\n input: CreateOrderInput;\n /**\n * IoC signer — provided by the consuming app.\n * Used to sign the EIP-712 order struct on the CTF Exchange contract.\n * If `signTransaction` is provided on the signer, auto-deposit is enabled:\n * before placing the order, the hook checks whether the Safe wallet has\n * enough USDC.e and swaps native USDC → USDC.e via Uniswap V3 if needed.\n */\n signer: PolymarketSigner;\n}\n\n/**\n * Mutation hook for creating a Polymarket limit order with auto-deposit.\n *\n * Flow:\n * 1. If no L2 credentials exist, triggers L1 → L2 authentication automatically.\n * 2. **Auto-deposit** (when `signer.signTransaction` is provided):\n * - Calls `/deposit/polymarket/build` to check Safe USDC.e balance.\n * - If shortfall > 0, signs and submits approve + swap transactions.\n * - Polls until the swap is confirmed on-chain.\n * 3. Builds the EIP-712 `Order` typed data and prompts the wallet for a signature.\n * 4. Constructs HMAC L2 auth headers from the stored credentials.\n * 5. Submits the signed order via `POST /api/v1/orders/polymarket`.\n * 6. Invalidates `orders` and `positions` queries on success.\n *\n * @example\n * ```tsx\n * const { mutateAsync: createOrder, isPending } = useCreatePolymarketOrder();\n *\n * await createOrder({\n * signer: {\n * address: walletAddress,\n * signatureType: 2,\n * signTypedData: async (domain, types, value) => { ... },\n * signTransaction: async (txParams) => { ... }, // enables auto-deposit\n * },\n * input: {\n * tokenId: \"123456789\",\n * price: 0.55,\n * size: 10,\n * side: \"BUY\",\n * tickSize: \"0.01\",\n * negRisk: false,\n * funderAddress: safeAddress,\n * },\n * });\n * ```\n */\nexport function useCreatePolymarketOrder(\n mutationOptions: Omit<\n UseMutationOptions<PredictOrder, Error, CreatePolymarketOrderVariables>,\n \"mutationFn\"\n > = {},\n) {\n const client = usePredictClient();\n const { credentials, authenticate } = usePolymarket();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({\n input,\n signer,\n }: CreatePolymarketOrderVariables): Promise<PredictOrder> => {\n // Step 1: Ensure L2 credentials exist (authenticate if missing).\n const creds = credentials ?? (await authenticate(signer));\n\n // Step 2: Auto-deposit if signer supports signTransaction.\n if (signer.signTransaction && input.funderAddress) {\n const orderCost = computeOrderCost(input);\n const buildResult: DepositBuildResponse = await client.depositBuild({\n source: \"polymarket\" as ProviderSource,\n from: signer.address,\n safe_address: input.funderAddress,\n amount: orderCost,\n });\n\n if (buildResult.transactions.length > 0) {\n for (const unsignedTx of buildResult.transactions) {\n const signedHex = await signer.signTransaction(unsignedTx.params);\n\n const submitResult = await client.depositSubmit({\n source: \"polymarket\" as ProviderSource,\n signed_tx: signedHex,\n });\n\n await pollTxConfirmed(\n (txHash) => client.depositStatus(txHash, \"polymarket\"),\n submitResult.tx_hash,\n );\n }\n }\n }\n\n // Step 3: Build and sign the EIP-712 order struct.\n const domain = buildCtfExchangeDomain(input.negRisk ?? false);\n const orderMessage = buildOrderMessage({\n ...input,\n signerAddress: signer.address,\n signatureType: signer.signatureType,\n });\n\n const signature = await signer.signTypedData(\n domain,\n CTF_ORDER_TYPES as unknown as Record<string, unknown[]>,\n \"Order\",\n orderMessage as unknown as Record<string, unknown>,\n );\n\n const signedOrder = buildSignedOrder(\n orderMessage,\n signature,\n input.orderType,\n );\n\n // Step 4: Convert to CLOB payload format (numeric salt, string side, deferExec).\n const clobPayload = buildClobPayload(signedOrder, creds.apiKey);\n\n // HMAC must sign against Polymarket's path (/order), not our proxy path.\n const body = JSON.stringify(clobPayload);\n const headers = await buildPolymarketL2Headers(creds.address, {\n apiKey: creds.apiKey,\n secret: creds.secret,\n passphrase: creds.passphrase,\n method: \"POST\",\n requestPath: \"/order\",\n body,\n });\n\n // Step 5: Submit via prediction-server proxy.\n return client.createPolymarketOrder(\n clobPayload as unknown as CreateOrderInput,\n headers as unknown as Record<string, string>,\n );\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"positions\"] });\n queryClient.invalidateQueries({ queryKey: [\"predict\", \"balance\"] });\n },\n ...mutationOptions,\n });\n}\n\n/**\n * Compute the total USDC cost for a BUY order.\n * For SELL orders, the collateral is already in the Safe as outcome tokens,\n * so no deposit is needed — returns \"0\".\n */\nfunction computeOrderCost(input: CreateOrderInput): string {\n if (input.side === \"SELL\") return \"0\";\n return (input.price * input.size).toFixed(6);\n}\n\nasync function pollTxConfirmed(\n fetchStatus: (txHash: string) => Promise<{ status: string }>,\n txHash: string,\n): Promise<void> {\n for (let i = 0; i < TX_POLL_MAX_ATTEMPTS; i++) {\n await new Promise((r) => setTimeout(r, TX_POLL_INTERVAL));\n const result = await fetchStatus(txHash);\n if (result.status === \"confirmed\") return;\n if (result.status === \"failed\") {\n throw new Error(`Deposit transaction failed: ${txHash}`);\n }\n }\n throw new Error(\n `Deposit transaction timed out after ${(TX_POLL_MAX_ATTEMPTS * TX_POLL_INTERVAL) / 1000}s: ${txHash}`,\n );\n}\n"]}