@liberfi.io/react-predict 0.1.50 → 0.1.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +32 -4
- package/dist/index.d.ts +32 -4
- package/dist/index.js +54 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +53 -5
- package/dist/index.mjs.map +1 -1
- package/dist/{server-CaB0XJAa.d.mts → server-eKqIns8z.d.mts} +27 -2
- package/dist/{server-CaB0XJAa.d.ts → server-eKqIns8z.d.ts} +27 -2
- package/dist/server.d.mts +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.js +16 -0
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +16 -0
- package/dist/server.mjs.map +1 -1
- package/package.json +3 -3
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/predict/events.params.ts","../src/hooks/predict/market.params.ts","../src/hooks/predict/matches.params.ts","../src/hooks/predict/matchMarkets.params.ts","../src/client/client.ts","../src/client/ws.ts","../src/utils/polymarket-hmac.ts","../src/utils/polymarket-order.ts"],"names":["httpGet","httpDelete","httpPost"],"mappings":"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","file":"server.js","sourcesContent":["/**\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 = 24;\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 * Max number of markets per event (sorted by volume DESC).\n * Defaults to `3` in `resolveEventsParams`.\n */\n markets_limit?: number;\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 markets_limit = 3,\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 ...(markets_limit ? { markets_limit } : {}),\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","/**\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","/**\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","/**\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 { httpGet, httpPost, httpDelete } from \"@liberfi.io/utils\";\nimport type {\n AvailableSharesResponse,\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 EventStats,\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 aggregate statistics for all open events.\n *\n * Maps to `GET /api/v1/events/stats`.\n */\n async getEventStats(): Promise<EventStats> {\n const url = `${this.endpoint}/api/v1/events/stats`;\n return await httpGet<EventStats>(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 // Available shares (for sell flow)\n // -------------------------------------------------------------------------\n\n /**\n * Get the number of shares available for selling, accounting for active orders.\n *\n * Maps to `GET /api/v1/available-shares?source=...&user=...&market=...&side=...`.\n *\n * @param source - Provider source.\n * @param user - Wallet address.\n * @param market - Market slug.\n * @param side - Position side (\"yes\" or \"no\").\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async getAvailableShares(\n source: ProviderSource,\n user: string,\n market: string,\n side: string,\n headers?: Record<string, string>,\n ): Promise<AvailableSharesResponse> {\n const query = buildQuery({ source, user, market, side });\n const url = `${this.endpoint}/api/v1/available-shares${query}`;\n return await httpGet<AvailableSharesResponse>(\n url,\n headers ? { headers } : undefined,\n );\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","/**\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","/**\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 * Floor a number to `d` decimal places (never rounds up).\n * Used for SELL size to prevent exceeding actual holdings.\n */\nfunction floorDecimalPlaces(n: number, d: number): number {\n const factor = 10 ** d;\n return Math.floor(n * factor) / factor;\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\n const rawSize =\n side === SIDE.SELL\n ? floorDecimalPlaces(input.size, rc.size)\n : decimalPlaces(input.size, rc.size);\n const sizeInMicro = toMicroUsdc(rawSize);\n const rawAmount = decimalPlaces(rawSize * rawPrice, rc.amount);\n const amountInMicro = toMicroUsdc(rawAmount);\n\n // Use amounts directly — no ceilMicro/floorMicro. ROUNDING_CONFIG's\n // invariant (amount = size + price decimals) already guarantees that\n // makerAmount/takerAmount produces a tick-aligned price.\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/predict/events.params.ts","../src/hooks/predict/market.params.ts","../src/hooks/predict/matches.params.ts","../src/hooks/predict/matchMarkets.params.ts","../src/client/client.ts","../src/client/ws.ts","../src/utils/polymarket-hmac.ts","../src/utils/polymarket-order.ts"],"names":["httpGet","httpDelete","httpPost"],"mappings":"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","file":"server.js","sourcesContent":["/**\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 = 24;\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 * Max number of markets per event (sorted by volume DESC).\n * Defaults to `3` in `resolveEventsParams`.\n */\n markets_limit?: number;\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 markets_limit = 3,\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 ...(markets_limit ? { markets_limit } : {}),\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","/**\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","/**\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","/**\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 { httpGet, httpPost, httpDelete } from \"@liberfi.io/utils\";\nimport type {\n AvailableSharesResponse,\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 EventStats,\n ListCandlesticksParams,\n ListEventsParams,\n ListMarketTradesParams,\n ListOrdersParams,\n ListOrdersMultiParams,\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 PredictOrdersResponse,\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 aggregate statistics for all open events.\n *\n * Maps to `GET /api/v1/events/stats`.\n */\n async getEventStats(): Promise<EventStats> {\n const url = `${this.endpoint}/api/v1/events/stats`;\n return await httpGet<EventStats>(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 // Available shares (for sell flow)\n // -------------------------------------------------------------------------\n\n /**\n * Get the number of shares available for selling, accounting for active orders.\n *\n * Maps to `GET /api/v1/available-shares?source=...&user=...&market=...&side=...`.\n *\n * @param source - Provider source.\n * @param user - Wallet address.\n * @param market - Market slug.\n * @param side - Position side (\"yes\" or \"no\").\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async getAvailableShares(\n source: ProviderSource,\n user: string,\n market: string,\n side: string,\n headers?: Record<string, string>,\n ): Promise<AvailableSharesResponse> {\n const query = buildQuery({ source, user, market, side });\n const url = `${this.endpoint}/api/v1/available-shares${query}`;\n return await httpGet<AvailableSharesResponse>(\n url,\n headers ? { headers } : undefined,\n );\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 * Multi-wallet order listing with enriched market/event context.\n *\n * Maps to `GET /api/v1/orders?kalshi_user=...&polymarket_user=...`.\n *\n * @param params - Per-provider wallet addresses.\n * @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).\n */\n async listOrdersMulti(\n params: ListOrdersMultiParams,\n headers?: Record<string, string>,\n ): Promise<PredictOrdersResponse> {\n const query = buildQuery(params as unknown as Record<string, unknown>);\n const url = `${this.endpoint}/api/v1/orders${query}`;\n return await httpGet<PredictOrdersResponse>(\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","/**\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","/**\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 * Floor a number to `d` decimal places (never rounds up).\n * Used for SELL size to prevent exceeding actual holdings.\n */\nfunction floorDecimalPlaces(n: number, d: number): number {\n const factor = 10 ** d;\n return Math.floor(n * factor) / factor;\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\n const rawSize =\n side === SIDE.SELL\n ? floorDecimalPlaces(input.size, rc.size)\n : decimalPlaces(input.size, rc.size);\n const sizeInMicro = toMicroUsdc(rawSize);\n const rawAmount = decimalPlaces(rawSize * rawPrice, rc.amount);\n const amountInMicro = toMicroUsdc(rawAmount);\n\n // Use amounts directly — no ceilMicro/floorMicro. ROUNDING_CONFIG's\n // invariant (amount = size + price decimals) already guarantees that\n // makerAmount/takerAmount produces a tick-aligned price.\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"]}
|
package/dist/server.mjs
CHANGED
|
@@ -264,6 +264,22 @@ var PredictClient = class {
|
|
|
264
264
|
headers ? { headers } : void 0
|
|
265
265
|
);
|
|
266
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* Multi-wallet order listing with enriched market/event context.
|
|
269
|
+
*
|
|
270
|
+
* Maps to `GET /api/v1/orders?kalshi_user=...&polymarket_user=...`.
|
|
271
|
+
*
|
|
272
|
+
* @param params - Per-provider wallet addresses.
|
|
273
|
+
* @param headers - Optional extra headers (e.g. Polymarket POLY_* HMAC headers).
|
|
274
|
+
*/
|
|
275
|
+
async listOrdersMulti(params, headers) {
|
|
276
|
+
const query = buildQuery(params);
|
|
277
|
+
const url = `${this.endpoint}/api/v1/orders${query}`;
|
|
278
|
+
return await httpGet(
|
|
279
|
+
url,
|
|
280
|
+
headers ? { headers } : void 0
|
|
281
|
+
);
|
|
282
|
+
}
|
|
267
283
|
/**
|
|
268
284
|
* Maps to `GET /api/v1/orders/:id?source=...`.
|
|
269
285
|
*
|