@liberfi.io/ui-predict 0.1.47 → 0.1.49
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/client/index.d.mts +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +1 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/{index-BcVbsRbS.d.mts → index-B-NMsVEe.d.mts} +122 -1
- package/dist/{index-BcVbsRbS.d.ts → index-B-NMsVEe.d.ts} +122 -1
- package/dist/index.d.mts +67 -4
- package/dist/index.d.ts +67 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/base.ts","../../src/client/dflow.ts","../../src/client/ws.ts"],"names":["buildQuery","params","provider","qs","key","value","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","data","httpPost","parseSide","raw","sort","levels","priceStr","quantity","a","b","normalizeOrderbook","DflowPredictClient","eventId","withNestedMarkets","ticker","seriesTicker","rest","mintAddress","marketId","request","marketTicker","eventTicker","DflowPredictWsClient","config","event","error","options","onUpdate","removeListener","callback","listeners","index","channel","subscription","status","listener","message","type","dataMsg","delay","createDflowPredictWsClient"],"mappings":"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","file":"index.mjs","sourcesContent":["import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// 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<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\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\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/base.ts","../../src/client/dflow.ts","../../src/client/ws.ts"],"names":["buildQuery","params","provider","qs","key","value","str","toRecord","BasePredictClient","endpoint","path","query","url","httpGet","data","httpPost","parseSide","raw","sort","levels","priceStr","quantity","a","b","normalizeOrderbook","DflowPredictClient","eventId","withNestedMarkets","ticker","seriesTicker","rest","mintAddress","marketId","request","marketTicker","walletAddress","eventTicker","DflowPredictWsClient","config","event","error","options","onUpdate","removeListener","callback","listeners","index","channel","subscription","status","listener","message","type","dataMsg","delay","createDflowPredictWsClient"],"mappings":"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","file":"index.mjs","sourcesContent":["import { httpGet, httpPost } from \"@liberfi.io/utils\";\nimport type { ProviderType } from \"../types\";\n\n/**\n * Build a query string from a params object.\n * Skips `undefined` and `null` values.\n */\nexport function buildQuery(\n params: Record<string, unknown>,\n provider?: ProviderType,\n): string {\n const qs = new URLSearchParams();\n\n // Add provider if specified\n if (provider) {\n qs.set(\"provider\", provider);\n }\n\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n if (typeof value === \"object\") {\n qs.set(key, JSON.stringify(value));\n } else {\n qs.set(key, String(value));\n }\n }\n }\n const str = qs.toString();\n return str ? `?${str}` : \"\";\n}\n\n/** Cast typed params to Record for buildQuery */\nexport function toRecord<T extends object>(params: T): Record<string, unknown> {\n return params as unknown as Record<string, unknown>;\n}\n\n/**\n * Base class for prediction market clients.\n * Provides common HTTP request utilities.\n */\nexport abstract class BasePredictClient {\n constructor(\n protected readonly endpoint: string,\n protected readonly provider: ProviderType,\n ) {}\n\n /**\n * Build URL with query parameters\n */\n protected buildUrl(path: string, params?: Record<string, unknown>): string {\n const query = buildQuery(params ?? {}, this.provider);\n return `${this.endpoint}${path}${query}`;\n }\n\n /**\n * Perform a GET request\n */\n protected async fetch<T>(\n path: string,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpGet<T>(url);\n }\n\n /**\n * Perform a POST request\n */\n protected async postRequest<T, P = unknown>(\n path: string,\n data: P,\n params?: Record<string, unknown>,\n ): Promise<T> {\n const url = this.buildUrl(path, params);\n return await httpPost<T, P>(url, data);\n }\n}\n","import type {\n IPredictClient,\n StandardEventsResponse,\n StandardEvent,\n StandardMarketsResponse,\n StandardMarket,\n OrderbookResponse,\n OrderbookLevel,\n MultiTradeResponse,\n MultiOnchainTradeResponse,\n CandlesticksResponse,\n ForecastPercentileHistoryResponse,\n SeriesListResponse,\n SeriesResponse,\n TagsByCategoriesResponse,\n FiltersBySportsResponse,\n SearchResponse,\n OutcomeMintsResponse,\n FilterOutcomeMintsResponse,\n LiveDataResponse,\n QuoteResponse,\n SwapResponse,\n SwapInstructionsResponse,\n OrderResponse,\n OrderStatusResponse,\n IntentQuoteResponse,\n IntentSwapResponse,\n PredictionMarketInitResponse,\n TokenListResponse,\n TokenListWithDecimalsResponse,\n VenueListResponse,\n EventQueryParams,\n MarketQueryParams,\n MarketsBatchRequest,\n TradesQueryParams,\n TradesByMintQueryParams,\n OnchainTradesByWalletQueryParams,\n OnchainTradesByEventQueryParams,\n OnchainTradesByMarketQueryParams,\n CandlesticksQueryParams,\n ForecastPercentileHistoryQueryParams,\n ForecastPercentileHistoryByMintQueryParams,\n SeriesQueryParams,\n SearchQueryParams,\n LiveDataQueryParams,\n LiveDataByEventQueryParams,\n LiveDataByMintQueryParams,\n PositionsByWalletQueryParams,\n WalletPositionsResponse,\n OutcomeMintsQueryParams,\n FilterOutcomeMintsRequest,\n QuoteQueryParams,\n SwapRequestBody,\n OrderQueryParams,\n OrderStatusQueryParams,\n IntentQuoteQueryParams,\n IntentSwapRequestBody,\n PredictionMarketInitQueryParams,\n} from \"../types\";\nimport { BasePredictClient, toRecord } from \"./base\";\n\n// ---------------------------------------------------------------------------\n// DFlow-specific raw orderbook types (internal to this client)\n// ---------------------------------------------------------------------------\n\n/** Raw orderbook side as returned by the DFlow API: price string → quantity */\ntype DflowOrderbookSideRaw = Record<string, number>;\n\n/** Raw orderbook response shape from DFlow API */\ninterface DflowRawOrderbookResponse {\n yes_bids?: DflowOrderbookSideRaw;\n yes_asks?: DflowOrderbookSideRaw;\n no_bids?: DflowOrderbookSideRaw;\n no_asks?: DflowOrderbookSideRaw;\n sequence?: number;\n}\n\n/** Parse a raw orderbook side into sorted OrderbookLevel[] */\nfunction parseSide(\n raw: DflowOrderbookSideRaw | undefined,\n sort: \"asc\" | \"desc\",\n): OrderbookLevel[] {\n if (!raw) return [];\n const levels: OrderbookLevel[] = Object.entries(raw).map(\n ([priceStr, quantity]) => ({\n price: parseFloat(priceStr),\n quantity,\n }),\n );\n levels.sort((a, b) =>\n sort === \"desc\" ? b.price - a.price : a.price - b.price,\n );\n return levels;\n}\n\n/** Normalise DFlow raw orderbook response into public OrderbookResponse */\nfunction normalizeOrderbook(raw: DflowRawOrderbookResponse): OrderbookResponse {\n return {\n yesBids: parseSide(raw.yes_bids, \"desc\"),\n yesAsks: parseSide(raw.yes_asks, \"asc\"),\n noBids: parseSide(raw.no_bids, \"desc\"),\n noAsks: parseSide(raw.no_asks, \"asc\"),\n sequence: raw.sequence,\n };\n}\n\n// ---------------------------------------------------------------------------\n\n/**\n * DFlow Prediction Market Client.\n * Implements IPredictClient interface using the DFlow API.\n */\nexport class DflowPredictClient\n extends BasePredictClient\n implements IPredictClient\n{\n constructor(endpoint: string) {\n super(endpoint, \"dflow\");\n }\n\n // -- Events ----------------------------------------------------------------\n\n async getEvents(params?: EventQueryParams): Promise<StandardEventsResponse> {\n return await this.fetch<StandardEventsResponse>(\n \"/v2/event\",\n toRecord(params ?? {}),\n );\n }\n\n async getEventById(\n eventId: string,\n withNestedMarkets?: boolean,\n ): Promise<StandardEvent> {\n return await this.fetch<StandardEvent>(`/v2/event/${eventId}`, {\n withNestedMarkets,\n });\n }\n\n async getEventCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/event/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getEventForecastPercentileHistory(\n params: ForecastPercentileHistoryQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { seriesTicker, eventId, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/${seriesTicker}/${eventId}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n async getEventForecastPercentileHistoryByMint(\n params: ForecastPercentileHistoryByMintQueryParams,\n ): Promise<ForecastPercentileHistoryResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<ForecastPercentileHistoryResponse>(\n `/v2/event/by-mint/${mintAddress}/forecast_percentile_history`,\n toRecord(rest),\n );\n }\n\n // -- Markets ---------------------------------------------------------------\n\n async getMarkets(\n params?: MarketQueryParams,\n ): Promise<StandardMarketsResponse> {\n return await this.fetch<StandardMarketsResponse>(\n \"/v2/market\",\n toRecord(params ?? {}),\n );\n }\n\n async getMarketById(marketId: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(`/v2/market/${marketId}`);\n }\n\n async getMarketByMint(mintAddress: string): Promise<StandardMarket> {\n return await this.fetch<StandardMarket>(\n `/v2/market/by-mint/${mintAddress}`,\n );\n }\n\n async getMarketsBatch(\n request: MarketsBatchRequest,\n ): Promise<StandardMarketsResponse> {\n return await this.postRequest<StandardMarketsResponse, MarketsBatchRequest>(\n \"/v2/market/batch\",\n request,\n );\n }\n\n async getMarketCandlesticks(\n ticker: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/${ticker}/candlesticks`,\n toRecord(params),\n );\n }\n\n async getMarketCandlesticksByMint(\n mintAddress: string,\n params: CandlesticksQueryParams,\n ): Promise<CandlesticksResponse> {\n return await this.fetch<CandlesticksResponse>(\n `/v2/market/by-mint/${mintAddress}/candlesticks`,\n toRecord(params),\n );\n }\n\n // -- Orderbook -------------------------------------------------------------\n\n async getOrderbook(marketTicker: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/${marketTicker}`,\n );\n return normalizeOrderbook(raw);\n }\n\n async getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse> {\n const raw = await this.fetch<DflowRawOrderbookResponse>(\n `/v2/orderbook/by-mint/${mintAddress}`,\n );\n return normalizeOrderbook(raw);\n }\n\n // -- Trades ----------------------------------------------------------------\n\n async getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse> {\n return await this.fetch<MultiTradeResponse>(\n \"/v2/trades\",\n toRecord(params ?? {}),\n );\n }\n\n async getTradesByMint(\n params: TradesByMintQueryParams,\n ): Promise<MultiTradeResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<MultiTradeResponse>(\n `/v2/trades/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- On-Chain Trades -------------------------------------------------------\n\n async getOnchainTradesByWallet(\n params: OnchainTradesByWalletQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { walletAddress, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-wallet/${walletAddress}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByEvent(\n params: OnchainTradesByEventQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getOnchainTradesByMarket(\n params: OnchainTradesByMarketQueryParams,\n ): Promise<MultiOnchainTradeResponse> {\n const { marketTicker, ...rest } = params;\n return await this.fetch<MultiOnchainTradeResponse>(\n `/v2/trades/onchain/by-market/${marketTicker}`,\n toRecord(rest),\n );\n }\n\n // -- Live Data -------------------------------------------------------------\n\n async getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse> {\n return await this.fetch<LiveDataResponse>(\"/v2/live\", {\n milestoneIds: params.milestoneIds.join(\",\"),\n });\n }\n\n async getLiveDataByEvent(\n params: LiveDataByEventQueryParams,\n ): Promise<LiveDataResponse> {\n const { eventTicker, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/event/${eventTicker}`,\n toRecord(rest),\n );\n }\n\n async getLiveDataByMint(\n params: LiveDataByMintQueryParams,\n ): Promise<LiveDataResponse> {\n const { mintAddress, ...rest } = params;\n return await this.fetch<LiveDataResponse>(\n `/v2/live/by-mint/${mintAddress}`,\n toRecord(rest),\n );\n }\n\n // -- Series ----------------------------------------------------------------\n\n async getSeries(params?: SeriesQueryParams): Promise<SeriesListResponse> {\n return await this.fetch<SeriesListResponse>(\n \"/v2/series\",\n toRecord(params ?? {}),\n );\n }\n\n async getSeriesByTicker(seriesTicker: string): Promise<SeriesResponse> {\n return await this.fetch<SeriesResponse>(`/v2/series/${seriesTicker}`);\n }\n\n // -- Tags & Sports ---------------------------------------------------------\n\n async getTagsByCategories(): Promise<TagsByCategoriesResponse> {\n return await this.fetch<TagsByCategoriesResponse>(\"/v2/tags/by_categories\");\n }\n\n async getFiltersBySports(): Promise<FiltersBySportsResponse> {\n return await this.fetch<FiltersBySportsResponse>(\"/v2/sports/filters\");\n }\n\n // -- Search ----------------------------------------------------------------\n\n async search(params: SearchQueryParams): Promise<SearchResponse> {\n return await this.fetch<SearchResponse>(\"/v2/search\", toRecord(params));\n }\n\n // -- Positions -------------------------------------------------------------\n\n async getPositionsByWallet(\n params: PositionsByWalletQueryParams,\n ): Promise<WalletPositionsResponse> {\n const { walletAddress } = params;\n return await this.fetch<WalletPositionsResponse>(\n `/v2/positions/by-wallet/${walletAddress}`,\n );\n }\n\n // -- Outcome Mints ---------------------------------------------------------\n\n async getOutcomeMints(\n params?: OutcomeMintsQueryParams,\n ): Promise<OutcomeMintsResponse> {\n return await this.fetch<OutcomeMintsResponse>(\n \"/v2/outcome_mints\",\n toRecord(params ?? {}),\n );\n }\n\n async filterOutcomeMints(\n request: FilterOutcomeMintsRequest,\n ): Promise<FilterOutcomeMintsResponse> {\n return await this.postRequest<\n FilterOutcomeMintsResponse,\n FilterOutcomeMintsRequest\n >(\"/v2/filter_outcome_mints\", request);\n }\n\n // -- Quote & Swap (Imperative) ---------------------------------------------\n\n async getQuote(params: QuoteQueryParams): Promise<QuoteResponse> {\n return await this.fetch<QuoteResponse>(\"/v2/swap/quote\", toRecord(params));\n }\n\n async createSwap(request: SwapRequestBody): Promise<SwapResponse> {\n return await this.postRequest<SwapResponse, SwapRequestBody>(\n \"/v2/swap\",\n request,\n );\n }\n\n async createSwapInstructions(\n request: SwapRequestBody,\n ): Promise<SwapInstructionsResponse> {\n return await this.postRequest<SwapInstructionsResponse, SwapRequestBody>(\n \"/v2/swap/instructions\",\n request,\n );\n }\n\n // -- Order API -------------------------------------------------------------\n\n async getOrder(params: OrderQueryParams): Promise<OrderResponse> {\n return await this.fetch<OrderResponse>(\"/v2/order\", toRecord(params));\n }\n\n async getOrderStatus(\n params: OrderStatusQueryParams,\n ): Promise<OrderStatusResponse> {\n return await this.fetch<OrderStatusResponse>(\n \"/v2/order/status\",\n toRecord(params),\n );\n }\n\n // -- Intent (Declarative Swap) ---------------------------------------------\n\n async getIntentQuote(\n params: IntentQuoteQueryParams,\n ): Promise<IntentQuoteResponse> {\n return await this.fetch<IntentQuoteResponse>(\n \"/v2/intent/quote\",\n toRecord(params),\n );\n }\n\n async submitIntentSwap(\n request: IntentSwapRequestBody,\n ): Promise<IntentSwapResponse> {\n return await this.postRequest<IntentSwapResponse, IntentSwapRequestBody>(\n \"/v2/intent/swap\",\n request,\n );\n }\n\n // -- Prediction Market Init ------------------------------------------------\n\n async initPredictionMarket(\n params: PredictionMarketInitQueryParams,\n ): Promise<PredictionMarketInitResponse> {\n return await this.fetch<PredictionMarketInitResponse>(\n \"/v2/prediction-market/init\",\n toRecord(params),\n );\n }\n\n // -- Token & Venue ---------------------------------------------------------\n\n async getTokens(): Promise<TokenListResponse> {\n return await this.fetch<TokenListResponse>(\"/v2/tokens\");\n }\n\n async getTokensWithDecimals(): Promise<TokenListWithDecimalsResponse> {\n return await this.fetch<TokenListWithDecimalsResponse>(\n \"/v2/tokens/decimals\",\n );\n }\n\n async getVenues(): Promise<VenueListResponse> {\n return await this.fetch<VenueListResponse>(\"/v2/venues\");\n }\n}\n","/**\n * DflowPredictWsClient - WebSocket client for real-time prediction market data\n *\n * Features:\n * - Auto-reconnect with exponential backoff\n * - Heartbeat (ping/pong) for connection health\n * - Subscription management for prices, trades, orderbook channels\n * - Event emitter pattern for message handling\n */\nimport type {\n WsConnectionStatus,\n WsSubscribeOptions,\n WsPriceUpdate,\n WsTradeUpdate,\n WsOrderbookUpdate,\n IPredictWsClient,\n} from \"../types\";\n\n// ---------------------------------------------------------------------------\n// Internal WebSocket Protocol Types\n// ---------------------------------------------------------------------------\n\n/** WebSocket channel types */\ntype WsChannel = \"prices\" | \"trades\" | \"orderbook\";\n\n/** Subscribe/Unsubscribe message */\ninterface WsSubscribeMessage {\n type: \"subscribe\" | \"unsubscribe\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n}\n\n/** Ping message */\ninterface WsPingMessage {\n type: \"ping\";\n}\n\n/** Pong response */\ninterface WsPongMessage {\n type: \"pong\";\n timestamp: number;\n}\n\n/** Status request message */\ninterface WsStatusRequestMessage {\n type: \"status\";\n}\n\n/** Status response message */\ninterface WsStatusMessage {\n type: \"status\";\n status: WsConnectionStatus;\n message?: string;\n connected?: boolean;\n clientCount?: number;\n subscriptions?: {\n prices: { all: boolean; tickers: string[] };\n trades: { all: boolean; tickers: string[] };\n orderbook: { all: boolean; tickers: string[] };\n };\n}\n\n/** Subscription confirmation message */\ninterface WsSubscriptionConfirmation {\n type: \"subscribed\" | \"unsubscribed\";\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n success: boolean;\n}\n\n/** Error message from server */\ninterface WsErrorMessage {\n type: \"error\";\n message: string;\n code?: string;\n}\n\n/** Union type for all data messages from server */\ntype WsDataMessage = WsPriceUpdate | WsTradeUpdate | WsOrderbookUpdate;\n\n/** Union type for all server messages */\ntype WsServerMessage =\n | WsDataMessage\n | WsStatusMessage\n | WsSubscriptionConfirmation\n | WsErrorMessage\n | WsPongMessage;\n\n/** Union type for all client messages */\ntype WsClientMessage =\n | WsSubscribeMessage\n | WsPingMessage\n | WsStatusRequestMessage;\n\n/** WebSocket event types for event emitter */\ntype WsEventType =\n | \"connect\"\n | \"disconnect\"\n | \"reconnecting\"\n | \"error\"\n | \"price\"\n | \"trade\"\n | \"orderbook\"\n | \"status\"\n | \"subscribed\"\n | \"unsubscribed\";\n\n/** WebSocket client configuration */\nexport interface WsClientConfig {\n /** WebSocket endpoint URL */\n wsUrl: string;\n /** Auto-connect on instantiation */\n autoConnect?: boolean;\n /** Auto-reconnect on disconnect */\n autoReconnect?: boolean;\n /** Reconnect interval base in ms (default: 1000) */\n reconnectIntervalBase?: number;\n /** Max reconnect interval in ms (default: 30000) */\n reconnectMaxInterval?: number;\n /** Ping interval in ms (default: 30000) */\n pingInterval?: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_RECONNECT_INTERVAL_BASE = 1000; // 1 second\nconst DEFAULT_RECONNECT_MAX_INTERVAL = 30000; // 30 seconds\nconst DEFAULT_PING_INTERVAL = 30000; // 30 seconds\n\n// ---------------------------------------------------------------------------\n// 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<Error>[];\n price: EventCallback<WsPriceUpdate>[];\n trade: EventCallback<WsTradeUpdate>[];\n orderbook: EventCallback<WsOrderbookUpdate>[];\n status: EventCallback<WsConnectionStatus>[];\n subscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n unsubscribed: EventCallback<{\n channel: WsChannel;\n all?: boolean;\n tickers?: string[];\n }>[];\n}\n\n// ---------------------------------------------------------------------------\n// Subscription State\n// ---------------------------------------------------------------------------\n\ninterface ChannelSubscription {\n all: boolean;\n tickers: Set<string>;\n}\n\ninterface SubscriptionState {\n prices: ChannelSubscription;\n trades: ChannelSubscription;\n orderbook: ChannelSubscription;\n}\n\n// ---------------------------------------------------------------------------\n// DflowPredictWsClient Class\n// ---------------------------------------------------------------------------\n\nexport class DflowPredictWsClient implements IPredictWsClient {\n private ws: WebSocket | null = null;\n private readonly wsUrl: string;\n private readonly autoReconnect: boolean;\n private readonly reconnectIntervalBase: number;\n private readonly reconnectMaxInterval: number;\n private readonly pingInterval: number;\n\n private status: WsConnectionStatus = \"disconnected\";\n private reconnectAttempts = 0;\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n private pingIntervalId: ReturnType<typeof setInterval> | null = null;\n private shouldReconnect = true;\n\n // Event listeners\n private listeners: EventListeners = {\n connect: [],\n disconnect: [],\n reconnecting: [],\n error: [],\n price: [],\n trade: [],\n orderbook: [],\n status: [],\n subscribed: [],\n unsubscribed: [],\n };\n\n // Track current subscriptions for reconnection recovery\n private subscriptions: SubscriptionState = {\n prices: { all: false, tickers: new Set() },\n trades: { all: false, tickers: new Set() },\n orderbook: { all: false, tickers: new Set() },\n };\n\n constructor(config: WsClientConfig) {\n this.wsUrl = config.wsUrl;\n this.autoReconnect = config.autoReconnect ?? true;\n this.reconnectIntervalBase =\n config.reconnectIntervalBase ?? DEFAULT_RECONNECT_INTERVAL_BASE;\n this.reconnectMaxInterval =\n config.reconnectMaxInterval ?? DEFAULT_RECONNECT_MAX_INTERVAL;\n this.pingInterval = config.pingInterval ?? DEFAULT_PING_INTERVAL;\n\n if (config.autoConnect !== false) {\n this.connect();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Connection Management\n // ---------------------------------------------------------------------------\n\n /**\n * Connect to the WebSocket server\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\n // Restore subscriptions after reconnection\n this.restoreSubscriptions();\n\n // Start ping interval\n this.startPingInterval();\n };\n\n this.ws.onmessage = (event) => {\n this.handleMessage(event.data);\n };\n\n this.ws.onerror = (event) => {\n const error = new Error(\"WebSocket error\");\n console.error(\"[DflowPredictWsClient] WebSocket error:\", event);\n this.emit(\"error\", error);\n };\n\n this.ws.onclose = (event) => {\n this.stopPingInterval();\n this.setStatus(\"disconnected\");\n this.emit(\"disconnect\", { code: event.code, reason: event.reason });\n\n // Attempt reconnection\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n };\n } catch (error) {\n console.error(\n \"[DflowPredictWsClient] Failed to create WebSocket:\",\n error,\n );\n this.emit(\n \"error\",\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.shouldReconnect && this.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n this.shouldReconnect = false;\n this.stopPingInterval();\n\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n\n this.setStatus(\"disconnected\");\n }\n\n /**\n * Check if connected to the server\n */\n isConnected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /**\n * Get current connection status\n */\n getStatus(): WsConnectionStatus {\n return this.status;\n }\n\n // ---------------------------------------------------------------------------\n // Business Subscription Methods (IPredictWsClient interface)\n // ---------------------------------------------------------------------------\n\n /** Subscribe to price updates, returns unsubscribe function */\n subscribePrices(\n options: WsSubscribeOptions,\n onUpdate: (update: WsPriceUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"prices\", options);\n const removeListener = this.on(\"price\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"prices\", options);\n };\n }\n\n /** Subscribe to trade updates, returns unsubscribe function */\n subscribeTrades(\n options: WsSubscribeOptions,\n onUpdate: (update: WsTradeUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"trades\", options);\n const removeListener = this.on(\"trade\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"trades\", options);\n };\n }\n\n /** Subscribe to orderbook updates, returns unsubscribe function */\n subscribeOrderbook(\n options: WsSubscribeOptions,\n onUpdate: (update: WsOrderbookUpdate) => void,\n ): () => void {\n this.subscribeChannel(\"orderbook\", options);\n const removeListener = this.on(\"orderbook\", onUpdate);\n return () => {\n removeListener();\n this.unsubscribeChannel(\"orderbook\", options);\n };\n }\n\n /** Subscribe to status changes, returns unsubscribe function */\n onStatusChange(callback: (status: WsConnectionStatus) => void): () => void {\n return this.on(\"status\", callback);\n }\n\n // ---------------------------------------------------------------------------\n // Event Emitter\n // ---------------------------------------------------------------------------\n\n /**\n * Add event listener\n */\n on<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): () => void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n listeners.push(callback as EventCallback<unknown>);\n\n // Return unsubscribe function\n return () => {\n this.off(event, callback);\n };\n }\n\n /**\n * Remove event listener\n */\n off<T extends WsEventType>(\n event: T,\n callback: EventListeners[T][number],\n ): void {\n const listeners = this.listeners[event] as EventCallback<unknown>[];\n const index = listeners.indexOf(callback as EventCallback<unknown>);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n }\n\n /**\n * Remove all listeners for an event (or all events)\n */\n removeAllListeners(event?: WsEventType): void {\n if (event) {\n (this.listeners[event] as unknown[]).length = 0;\n } else {\n for (const key of Object.keys(this.listeners)) {\n (this.listeners[key as WsEventType] as unknown[]).length = 0;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Private Methods\n // ---------------------------------------------------------------------------\n\n private subscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = true;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n subscription.all = false;\n for (const ticker of options.tickers) {\n subscription.tickers.add(ticker);\n }\n }\n\n this.sendSubscription(\"subscribe\", channel, options);\n }\n\n private unsubscribeChannel(\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n const subscription = this.subscriptions[channel];\n\n if (options.all) {\n subscription.all = false;\n subscription.tickers.clear();\n } else if (options.tickers && options.tickers.length > 0) {\n for (const ticker of options.tickers) {\n subscription.tickers.delete(ticker);\n }\n }\n\n this.sendSubscription(\"unsubscribe\", channel, options);\n }\n\n private setStatus(status: WsConnectionStatus): void {\n if (this.status !== status) {\n this.status = status;\n this.emit(\"status\", status);\n }\n }\n\n private emit<T extends WsEventType>(\n event: T,\n data: Parameters<EventListeners[T][number]>[0],\n ): void {\n const listeners = this.listeners[event] as EventCallback<typeof data>[];\n for (const listener of listeners) {\n try {\n listener(data);\n } catch (error) {\n console.error(\n `[DflowPredictWsClient] Error in ${event} listener:`,\n error,\n );\n }\n }\n }\n\n private send(message: WsClientMessage): boolean {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n console.warn(\n \"[DflowPredictWsClient] Cannot send message, WebSocket not connected\",\n );\n return false;\n }\n\n try {\n this.ws.send(JSON.stringify(message));\n return true;\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to send message:\", error);\n return false;\n }\n }\n\n private sendSubscription(\n type: \"subscribe\" | \"unsubscribe\",\n channel: WsChannel,\n options: WsSubscribeOptions,\n ): void {\n this.send({\n type,\n channel,\n all: options.all,\n tickers: options.tickers,\n });\n }\n\n private handleMessage(data: string): void {\n try {\n const message = JSON.parse(data) as WsServerMessage;\n\n switch (message.type) {\n case \"ticker\":\n this.emit(\"price\", message as WsPriceUpdate);\n break;\n case \"trade\":\n this.emit(\"trade\", message as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", message as WsOrderbookUpdate);\n break;\n case \"status\":\n // Status message from server (different from connection status)\n break;\n case \"subscribed\":\n this.emit(\"subscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"unsubscribed\":\n this.emit(\"unsubscribed\", {\n channel: message.channel,\n all: message.all,\n tickers: message.tickers,\n });\n break;\n case \"pong\":\n // Pong received, connection is alive\n break;\n case \"error\":\n console.error(\n \"[DflowPredictWsClient] Server error:\",\n message.message,\n );\n this.emit(\"error\", new Error(message.message));\n break;\n default:\n // Handle data messages without explicit type\n if (\"channel\" in message) {\n const dataMsg = message as WsDataMessage;\n switch (dataMsg.channel) {\n case \"prices\":\n this.emit(\"price\", dataMsg as WsPriceUpdate);\n break;\n case \"trades\":\n this.emit(\"trade\", dataMsg as WsTradeUpdate);\n break;\n case \"orderbook\":\n this.emit(\"orderbook\", dataMsg as WsOrderbookUpdate);\n break;\n }\n }\n }\n } catch (error) {\n console.error(\"[DflowPredictWsClient] Failed to parse message:\", error);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimeout) {\n return;\n }\n\n const delay = Math.min(\n this.reconnectIntervalBase * Math.pow(2, this.reconnectAttempts),\n this.reconnectMaxInterval,\n );\n\n this.setStatus(\"reconnecting\");\n this.emit(\"reconnecting\", { attempt: this.reconnectAttempts + 1, delay });\n\n this.reconnectTimeout = setTimeout(() => {\n this.reconnectTimeout = null;\n this.reconnectAttempts++;\n this.connect();\n }, delay);\n }\n\n private restoreSubscriptions(): void {\n for (const channel of [\"prices\", \"trades\", \"orderbook\"] as WsChannel[]) {\n const subscription = this.subscriptions[channel];\n\n if (subscription.all) {\n this.sendSubscription(\"subscribe\", channel, { all: true });\n } else if (subscription.tickers.size > 0) {\n this.sendSubscription(\"subscribe\", channel, {\n tickers: Array.from(subscription.tickers),\n });\n }\n }\n }\n\n private startPingInterval(): void {\n this.stopPingInterval();\n\n this.pingIntervalId = setInterval(() => {\n this.send({ type: \"ping\" });\n }, this.pingInterval);\n }\n\n private stopPingInterval(): void {\n if (this.pingIntervalId) {\n clearInterval(this.pingIntervalId);\n this.pingIntervalId = null;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory function\n// ---------------------------------------------------------------------------\n\n/**\n * Create a new DflowPredictWsClient instance\n */\nexport function createDflowPredictWsClient(\n config: WsClientConfig,\n): DflowPredictWsClient {\n return new DflowPredictWsClient(config);\n}\n"]}
|
|
@@ -184,6 +184,88 @@ interface MultiTradeResponse {
|
|
|
184
184
|
/** List of trades */
|
|
185
185
|
trades: SingleTradeResponse[];
|
|
186
186
|
}
|
|
187
|
+
/** Single on-chain trade */
|
|
188
|
+
interface OnchainTrade {
|
|
189
|
+
/** Unique trade ID */
|
|
190
|
+
id: number;
|
|
191
|
+
/** Unix timestamp when trade was created */
|
|
192
|
+
createdAt: number;
|
|
193
|
+
/** Event type (e.g. "fill") */
|
|
194
|
+
eventType: string;
|
|
195
|
+
/** Order Solana account address */
|
|
196
|
+
orderAccount: string;
|
|
197
|
+
/** Input token mint address */
|
|
198
|
+
inputMint: string;
|
|
199
|
+
/** Output token mint address */
|
|
200
|
+
outputMint: string;
|
|
201
|
+
/** Input amount in raw token units */
|
|
202
|
+
inputAmount: number;
|
|
203
|
+
/** Output amount in raw token units */
|
|
204
|
+
outputAmount: number;
|
|
205
|
+
/** Fee token mint address */
|
|
206
|
+
feeMint: string;
|
|
207
|
+
/** Fee amount in raw token units */
|
|
208
|
+
feeAmount: number;
|
|
209
|
+
/** Solana transaction signature */
|
|
210
|
+
transactionSignature: string;
|
|
211
|
+
/** User wallet address */
|
|
212
|
+
wallet: string;
|
|
213
|
+
/** Fill recipient address */
|
|
214
|
+
fillRecipient: string;
|
|
215
|
+
/** Refund recipient address */
|
|
216
|
+
refundRecipient: string;
|
|
217
|
+
/** Number of contracts (raw amount / 10^6) */
|
|
218
|
+
contracts?: number | null;
|
|
219
|
+
/** Market ticker */
|
|
220
|
+
marketTicker?: string | null;
|
|
221
|
+
/** Trade side ("yes" | "no") */
|
|
222
|
+
side?: string | null;
|
|
223
|
+
/** USD price per outcome contract */
|
|
224
|
+
usdPricePerContract?: number | null;
|
|
225
|
+
}
|
|
226
|
+
/** On-chain trades paginated response */
|
|
227
|
+
interface MultiOnchainTradeResponse {
|
|
228
|
+
/** Pagination cursor for next page */
|
|
229
|
+
cursor?: string | null;
|
|
230
|
+
/** List of on-chain trades */
|
|
231
|
+
trades: OnchainTrade[];
|
|
232
|
+
}
|
|
233
|
+
/** Sort field for on-chain trades */
|
|
234
|
+
type OnchainTradeSortBy = "createdAt" | "inputAmount" | "outputAmount";
|
|
235
|
+
/** Base query parameters shared by all on-chain trade endpoints */
|
|
236
|
+
interface OnchainTradesBaseQueryParams {
|
|
237
|
+
/** Maximum number of trades to return (1-250, default 100) */
|
|
238
|
+
limit?: number;
|
|
239
|
+
/** Pagination cursor (trade ID) */
|
|
240
|
+
cursor?: string;
|
|
241
|
+
/** Sort field */
|
|
242
|
+
sortBy?: OnchainTradeSortBy;
|
|
243
|
+
/** Sort order */
|
|
244
|
+
sortOrder?: SortOrder;
|
|
245
|
+
/** Minimum amount filter (raw 6-decimal precision) */
|
|
246
|
+
minAmount?: number;
|
|
247
|
+
/** Maximum amount filter (raw 6-decimal precision) */
|
|
248
|
+
maxAmount?: number;
|
|
249
|
+
}
|
|
250
|
+
/** Query parameters for on-chain trades by wallet */
|
|
251
|
+
interface OnchainTradesByWalletQueryParams extends OnchainTradesBaseQueryParams {
|
|
252
|
+
/** Wallet address */
|
|
253
|
+
walletAddress: string;
|
|
254
|
+
}
|
|
255
|
+
/** Query parameters for on-chain trades by event */
|
|
256
|
+
interface OnchainTradesByEventQueryParams extends OnchainTradesBaseQueryParams {
|
|
257
|
+
/** Event ticker */
|
|
258
|
+
eventTicker: string;
|
|
259
|
+
/** Optional wallet address filter */
|
|
260
|
+
wallet?: string;
|
|
261
|
+
}
|
|
262
|
+
/** Query parameters for on-chain trades by market */
|
|
263
|
+
interface OnchainTradesByMarketQueryParams extends OnchainTradesBaseQueryParams {
|
|
264
|
+
/** Market ticker */
|
|
265
|
+
marketTicker: string;
|
|
266
|
+
/** Optional wallet address filter */
|
|
267
|
+
wallet?: string;
|
|
268
|
+
}
|
|
187
269
|
/** Candlestick OHLC prices */
|
|
188
270
|
interface CandlestickOHLC {
|
|
189
271
|
/** Open price */
|
|
@@ -547,6 +629,28 @@ type TokenListResponse = string[];
|
|
|
547
629
|
type TokenListWithDecimalsResponse = TokenWithDecimals[];
|
|
548
630
|
/** Venue list response */
|
|
549
631
|
type VenueListResponse = string[];
|
|
632
|
+
/** Single wallet position item */
|
|
633
|
+
interface WalletPositionItem {
|
|
634
|
+
/** Token mint address */
|
|
635
|
+
mint: string;
|
|
636
|
+
/** Token balance (UI amount) */
|
|
637
|
+
balance: number;
|
|
638
|
+
/** Token decimals */
|
|
639
|
+
decimals: number;
|
|
640
|
+
/** Position side: YES, NO, or UNKNOWN */
|
|
641
|
+
position: "YES" | "NO" | "UNKNOWN";
|
|
642
|
+
/** Associated market details */
|
|
643
|
+
market?: StandardMarket | null;
|
|
644
|
+
}
|
|
645
|
+
/** Wallet positions response */
|
|
646
|
+
interface WalletPositionsResponse {
|
|
647
|
+
/** Wallet address */
|
|
648
|
+
wallet: string;
|
|
649
|
+
/** USDC balance (UI amount) */
|
|
650
|
+
usdcBalance: number;
|
|
651
|
+
/** List of positions */
|
|
652
|
+
positions: WalletPositionItem[];
|
|
653
|
+
}
|
|
550
654
|
/** Outcome mints response */
|
|
551
655
|
interface OutcomeMintsResponse {
|
|
552
656
|
/** List of all yes_mint and no_mint pubkeys from supported markets */
|
|
@@ -941,6 +1045,11 @@ interface IntentSwapRequestBody {
|
|
|
941
1045
|
/** Base64-encoded intent opening transaction, signed by the user */
|
|
942
1046
|
signedOpenTransaction: string;
|
|
943
1047
|
}
|
|
1048
|
+
/** Positions by wallet query parameters */
|
|
1049
|
+
interface PositionsByWalletQueryParams {
|
|
1050
|
+
/** Solana wallet address */
|
|
1051
|
+
walletAddress: string;
|
|
1052
|
+
}
|
|
944
1053
|
/** Prediction market init query parameters */
|
|
945
1054
|
interface PredictionMarketInitQueryParams {
|
|
946
1055
|
/** Base58-encoded address of the payer */
|
|
@@ -983,6 +1092,12 @@ interface IPredictClient {
|
|
|
983
1092
|
getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse>;
|
|
984
1093
|
/** Get trades by mint address */
|
|
985
1094
|
getTradesByMint(params: TradesByMintQueryParams): Promise<MultiTradeResponse>;
|
|
1095
|
+
/** Get on-chain trades by wallet address */
|
|
1096
|
+
getOnchainTradesByWallet(params: OnchainTradesByWalletQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1097
|
+
/** Get on-chain trades by event ticker */
|
|
1098
|
+
getOnchainTradesByEvent(params: OnchainTradesByEventQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1099
|
+
/** Get on-chain trades by market ticker */
|
|
1100
|
+
getOnchainTradesByMarket(params: OnchainTradesByMarketQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
986
1101
|
/** Get live data */
|
|
987
1102
|
getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse>;
|
|
988
1103
|
/** Get live data by event ticker */
|
|
@@ -999,6 +1114,8 @@ interface IPredictClient {
|
|
|
999
1114
|
getFiltersBySports(): Promise<FiltersBySportsResponse>;
|
|
1000
1115
|
/** Search events */
|
|
1001
1116
|
search(params: SearchQueryParams): Promise<SearchResponse>;
|
|
1117
|
+
/** Get prediction market positions by wallet address */
|
|
1118
|
+
getPositionsByWallet(params: PositionsByWalletQueryParams): Promise<WalletPositionsResponse>;
|
|
1002
1119
|
/** Get outcome mints */
|
|
1003
1120
|
getOutcomeMints(params?: OutcomeMintsQueryParams): Promise<OutcomeMintsResponse>;
|
|
1004
1121
|
/** Filter outcome mints */
|
|
@@ -1147,6 +1264,9 @@ declare class DflowPredictClient extends BasePredictClient implements IPredictCl
|
|
|
1147
1264
|
getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse>;
|
|
1148
1265
|
getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse>;
|
|
1149
1266
|
getTradesByMint(params: TradesByMintQueryParams): Promise<MultiTradeResponse>;
|
|
1267
|
+
getOnchainTradesByWallet(params: OnchainTradesByWalletQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1268
|
+
getOnchainTradesByEvent(params: OnchainTradesByEventQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1269
|
+
getOnchainTradesByMarket(params: OnchainTradesByMarketQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1150
1270
|
getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse>;
|
|
1151
1271
|
getLiveDataByEvent(params: LiveDataByEventQueryParams): Promise<LiveDataResponse>;
|
|
1152
1272
|
getLiveDataByMint(params: LiveDataByMintQueryParams): Promise<LiveDataResponse>;
|
|
@@ -1155,6 +1275,7 @@ declare class DflowPredictClient extends BasePredictClient implements IPredictCl
|
|
|
1155
1275
|
getTagsByCategories(): Promise<TagsByCategoriesResponse>;
|
|
1156
1276
|
getFiltersBySports(): Promise<FiltersBySportsResponse>;
|
|
1157
1277
|
search(params: SearchQueryParams): Promise<SearchResponse>;
|
|
1278
|
+
getPositionsByWallet(params: PositionsByWalletQueryParams): Promise<WalletPositionsResponse>;
|
|
1158
1279
|
getOutcomeMints(params?: OutcomeMintsQueryParams): Promise<OutcomeMintsResponse>;
|
|
1159
1280
|
filterOutcomeMints(request: FilterOutcomeMintsRequest): Promise<FilterOutcomeMintsResponse>;
|
|
1160
1281
|
getQuote(params: QuoteQueryParams): Promise<QuoteResponse>;
|
|
@@ -1294,4 +1415,4 @@ declare class DflowPredictWsClient implements IPredictWsClient {
|
|
|
1294
1415
|
*/
|
|
1295
1416
|
declare function createDflowPredictWsClient(config: WsClientConfig): DflowPredictWsClient;
|
|
1296
1417
|
|
|
1297
|
-
export { type
|
|
1418
|
+
export { type IntentSwapRequestBody as $, type SearchResponse as A, type WalletPositionsResponse as B, type CandlesticksResponse as C, type OutcomeMintsQueryParams as D, type EventQueryParams as E, type ForecastPercentileHistoryQueryParams as F, type OutcomeMintsResponse as G, type FilterOutcomeMintsRequest as H, type IPredictClient as I, type FilterOutcomeMintsResponse as J, type QuoteResponse as K, type LiveDataQueryParams as L, type MarketQueryParams as M, type SwapRequestBody as N, type OrderResponse as O, type PositionsByWalletQueryParams as P, type QuoteQueryParams as Q, type SwapResponse as R, type StandardEvent as S, type TradesQueryParams as T, type SwapInstructionsResponse as U, type OrderQueryParams as V, type WalletPositionItem as W, type OrderStatusQueryParams as X, type OrderStatusResponse as Y, type IntentQuoteQueryParams as Z, type IntentQuoteResponse as _, type StandardMarket as a, type IntentSwapResponse as a0, type PredictionMarketInitQueryParams as a1, type PredictionMarketInitResponse as a2, type TokenListResponse as a3, type TokenListWithDecimalsResponse as a4, type VenueListResponse as a5, type WsConnectionStatus as a6, type WsPriceUpdate as a7, type WsTradeUpdate as a8, type WsOrderbookUpdate as a9, type OrderRevert as aA, type IntentExpiry as aB, type TokenWithDecimals as aC, type OrderbookQueryParams as aD, type PrioritizationFeeLamports as aE, type DestinationTokenAccountParam as aF, type CreateFeeAccountParams as aG, type PositiveSlippageParams as aH, type WsSubscribeOptions as aI, BasePredictClient as aJ, buildQuery as aK, toRecord as aL, DflowPredictClient as aM, DflowPredictWsClient as aN, createDflowPredictWsClient as aO, type WsClientConfig as aP, type ProviderType as aa, type MarketStatus as ab, type SortField as ac, type SortOrder as ad, type OrderStatus as ae, type PlatformFeeMode as af, type SlippageTolerance as ag, type PriorityLevel as ah, type ExecutionMode as ai, type SettlementSource as aj, type MarketAccountInfo as ak, type OnchainTrade as al, type OnchainTradeSortBy as am, type OnchainTradesBaseQueryParams as an, type CandlestickOHLC as ao, type CandlestickDataPoint as ap, type ForecastPercentileDataPoint as aq, type SeriesSettlementSource as ar, type RoutePlanLeg as as, type PlatformFee as at, type ComputeBudgetInfo as au, type PrioritizationType as av, type AccountMetaResponse as aw, type InstructionResponse as ax, type BlockhashWithMetadata as ay, type OrderFill as az, type SeriesResponse as b, type OrderbookLevel as c, type SingleTradeResponse as d, type IPredictWsClient as e, type StandardEventsResponse as f, type StandardMarketsResponse as g, type MarketsBatchRequest as h, type OrderbookResponse as i, type MultiTradeResponse as j, type TradesByMintQueryParams as k, type OnchainTradesByWalletQueryParams as l, type MultiOnchainTradeResponse as m, type OnchainTradesByEventQueryParams as n, type OnchainTradesByMarketQueryParams as o, type CandlesticksQueryParams as p, type ForecastPercentileHistoryResponse as q, type ForecastPercentileHistoryByMintQueryParams as r, type LiveDataResponse as s, type LiveDataByEventQueryParams as t, type LiveDataByMintQueryParams as u, type SeriesQueryParams as v, type SeriesListResponse as w, type TagsByCategoriesResponse as x, type FiltersBySportsResponse as y, type SearchQueryParams as z };
|
|
@@ -184,6 +184,88 @@ interface MultiTradeResponse {
|
|
|
184
184
|
/** List of trades */
|
|
185
185
|
trades: SingleTradeResponse[];
|
|
186
186
|
}
|
|
187
|
+
/** Single on-chain trade */
|
|
188
|
+
interface OnchainTrade {
|
|
189
|
+
/** Unique trade ID */
|
|
190
|
+
id: number;
|
|
191
|
+
/** Unix timestamp when trade was created */
|
|
192
|
+
createdAt: number;
|
|
193
|
+
/** Event type (e.g. "fill") */
|
|
194
|
+
eventType: string;
|
|
195
|
+
/** Order Solana account address */
|
|
196
|
+
orderAccount: string;
|
|
197
|
+
/** Input token mint address */
|
|
198
|
+
inputMint: string;
|
|
199
|
+
/** Output token mint address */
|
|
200
|
+
outputMint: string;
|
|
201
|
+
/** Input amount in raw token units */
|
|
202
|
+
inputAmount: number;
|
|
203
|
+
/** Output amount in raw token units */
|
|
204
|
+
outputAmount: number;
|
|
205
|
+
/** Fee token mint address */
|
|
206
|
+
feeMint: string;
|
|
207
|
+
/** Fee amount in raw token units */
|
|
208
|
+
feeAmount: number;
|
|
209
|
+
/** Solana transaction signature */
|
|
210
|
+
transactionSignature: string;
|
|
211
|
+
/** User wallet address */
|
|
212
|
+
wallet: string;
|
|
213
|
+
/** Fill recipient address */
|
|
214
|
+
fillRecipient: string;
|
|
215
|
+
/** Refund recipient address */
|
|
216
|
+
refundRecipient: string;
|
|
217
|
+
/** Number of contracts (raw amount / 10^6) */
|
|
218
|
+
contracts?: number | null;
|
|
219
|
+
/** Market ticker */
|
|
220
|
+
marketTicker?: string | null;
|
|
221
|
+
/** Trade side ("yes" | "no") */
|
|
222
|
+
side?: string | null;
|
|
223
|
+
/** USD price per outcome contract */
|
|
224
|
+
usdPricePerContract?: number | null;
|
|
225
|
+
}
|
|
226
|
+
/** On-chain trades paginated response */
|
|
227
|
+
interface MultiOnchainTradeResponse {
|
|
228
|
+
/** Pagination cursor for next page */
|
|
229
|
+
cursor?: string | null;
|
|
230
|
+
/** List of on-chain trades */
|
|
231
|
+
trades: OnchainTrade[];
|
|
232
|
+
}
|
|
233
|
+
/** Sort field for on-chain trades */
|
|
234
|
+
type OnchainTradeSortBy = "createdAt" | "inputAmount" | "outputAmount";
|
|
235
|
+
/** Base query parameters shared by all on-chain trade endpoints */
|
|
236
|
+
interface OnchainTradesBaseQueryParams {
|
|
237
|
+
/** Maximum number of trades to return (1-250, default 100) */
|
|
238
|
+
limit?: number;
|
|
239
|
+
/** Pagination cursor (trade ID) */
|
|
240
|
+
cursor?: string;
|
|
241
|
+
/** Sort field */
|
|
242
|
+
sortBy?: OnchainTradeSortBy;
|
|
243
|
+
/** Sort order */
|
|
244
|
+
sortOrder?: SortOrder;
|
|
245
|
+
/** Minimum amount filter (raw 6-decimal precision) */
|
|
246
|
+
minAmount?: number;
|
|
247
|
+
/** Maximum amount filter (raw 6-decimal precision) */
|
|
248
|
+
maxAmount?: number;
|
|
249
|
+
}
|
|
250
|
+
/** Query parameters for on-chain trades by wallet */
|
|
251
|
+
interface OnchainTradesByWalletQueryParams extends OnchainTradesBaseQueryParams {
|
|
252
|
+
/** Wallet address */
|
|
253
|
+
walletAddress: string;
|
|
254
|
+
}
|
|
255
|
+
/** Query parameters for on-chain trades by event */
|
|
256
|
+
interface OnchainTradesByEventQueryParams extends OnchainTradesBaseQueryParams {
|
|
257
|
+
/** Event ticker */
|
|
258
|
+
eventTicker: string;
|
|
259
|
+
/** Optional wallet address filter */
|
|
260
|
+
wallet?: string;
|
|
261
|
+
}
|
|
262
|
+
/** Query parameters for on-chain trades by market */
|
|
263
|
+
interface OnchainTradesByMarketQueryParams extends OnchainTradesBaseQueryParams {
|
|
264
|
+
/** Market ticker */
|
|
265
|
+
marketTicker: string;
|
|
266
|
+
/** Optional wallet address filter */
|
|
267
|
+
wallet?: string;
|
|
268
|
+
}
|
|
187
269
|
/** Candlestick OHLC prices */
|
|
188
270
|
interface CandlestickOHLC {
|
|
189
271
|
/** Open price */
|
|
@@ -547,6 +629,28 @@ type TokenListResponse = string[];
|
|
|
547
629
|
type TokenListWithDecimalsResponse = TokenWithDecimals[];
|
|
548
630
|
/** Venue list response */
|
|
549
631
|
type VenueListResponse = string[];
|
|
632
|
+
/** Single wallet position item */
|
|
633
|
+
interface WalletPositionItem {
|
|
634
|
+
/** Token mint address */
|
|
635
|
+
mint: string;
|
|
636
|
+
/** Token balance (UI amount) */
|
|
637
|
+
balance: number;
|
|
638
|
+
/** Token decimals */
|
|
639
|
+
decimals: number;
|
|
640
|
+
/** Position side: YES, NO, or UNKNOWN */
|
|
641
|
+
position: "YES" | "NO" | "UNKNOWN";
|
|
642
|
+
/** Associated market details */
|
|
643
|
+
market?: StandardMarket | null;
|
|
644
|
+
}
|
|
645
|
+
/** Wallet positions response */
|
|
646
|
+
interface WalletPositionsResponse {
|
|
647
|
+
/** Wallet address */
|
|
648
|
+
wallet: string;
|
|
649
|
+
/** USDC balance (UI amount) */
|
|
650
|
+
usdcBalance: number;
|
|
651
|
+
/** List of positions */
|
|
652
|
+
positions: WalletPositionItem[];
|
|
653
|
+
}
|
|
550
654
|
/** Outcome mints response */
|
|
551
655
|
interface OutcomeMintsResponse {
|
|
552
656
|
/** List of all yes_mint and no_mint pubkeys from supported markets */
|
|
@@ -941,6 +1045,11 @@ interface IntentSwapRequestBody {
|
|
|
941
1045
|
/** Base64-encoded intent opening transaction, signed by the user */
|
|
942
1046
|
signedOpenTransaction: string;
|
|
943
1047
|
}
|
|
1048
|
+
/** Positions by wallet query parameters */
|
|
1049
|
+
interface PositionsByWalletQueryParams {
|
|
1050
|
+
/** Solana wallet address */
|
|
1051
|
+
walletAddress: string;
|
|
1052
|
+
}
|
|
944
1053
|
/** Prediction market init query parameters */
|
|
945
1054
|
interface PredictionMarketInitQueryParams {
|
|
946
1055
|
/** Base58-encoded address of the payer */
|
|
@@ -983,6 +1092,12 @@ interface IPredictClient {
|
|
|
983
1092
|
getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse>;
|
|
984
1093
|
/** Get trades by mint address */
|
|
985
1094
|
getTradesByMint(params: TradesByMintQueryParams): Promise<MultiTradeResponse>;
|
|
1095
|
+
/** Get on-chain trades by wallet address */
|
|
1096
|
+
getOnchainTradesByWallet(params: OnchainTradesByWalletQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1097
|
+
/** Get on-chain trades by event ticker */
|
|
1098
|
+
getOnchainTradesByEvent(params: OnchainTradesByEventQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1099
|
+
/** Get on-chain trades by market ticker */
|
|
1100
|
+
getOnchainTradesByMarket(params: OnchainTradesByMarketQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
986
1101
|
/** Get live data */
|
|
987
1102
|
getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse>;
|
|
988
1103
|
/** Get live data by event ticker */
|
|
@@ -999,6 +1114,8 @@ interface IPredictClient {
|
|
|
999
1114
|
getFiltersBySports(): Promise<FiltersBySportsResponse>;
|
|
1000
1115
|
/** Search events */
|
|
1001
1116
|
search(params: SearchQueryParams): Promise<SearchResponse>;
|
|
1117
|
+
/** Get prediction market positions by wallet address */
|
|
1118
|
+
getPositionsByWallet(params: PositionsByWalletQueryParams): Promise<WalletPositionsResponse>;
|
|
1002
1119
|
/** Get outcome mints */
|
|
1003
1120
|
getOutcomeMints(params?: OutcomeMintsQueryParams): Promise<OutcomeMintsResponse>;
|
|
1004
1121
|
/** Filter outcome mints */
|
|
@@ -1147,6 +1264,9 @@ declare class DflowPredictClient extends BasePredictClient implements IPredictCl
|
|
|
1147
1264
|
getOrderbookByMint(mintAddress: string): Promise<OrderbookResponse>;
|
|
1148
1265
|
getTrades(params?: TradesQueryParams): Promise<MultiTradeResponse>;
|
|
1149
1266
|
getTradesByMint(params: TradesByMintQueryParams): Promise<MultiTradeResponse>;
|
|
1267
|
+
getOnchainTradesByWallet(params: OnchainTradesByWalletQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1268
|
+
getOnchainTradesByEvent(params: OnchainTradesByEventQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1269
|
+
getOnchainTradesByMarket(params: OnchainTradesByMarketQueryParams): Promise<MultiOnchainTradeResponse>;
|
|
1150
1270
|
getLiveData(params: LiveDataQueryParams): Promise<LiveDataResponse>;
|
|
1151
1271
|
getLiveDataByEvent(params: LiveDataByEventQueryParams): Promise<LiveDataResponse>;
|
|
1152
1272
|
getLiveDataByMint(params: LiveDataByMintQueryParams): Promise<LiveDataResponse>;
|
|
@@ -1155,6 +1275,7 @@ declare class DflowPredictClient extends BasePredictClient implements IPredictCl
|
|
|
1155
1275
|
getTagsByCategories(): Promise<TagsByCategoriesResponse>;
|
|
1156
1276
|
getFiltersBySports(): Promise<FiltersBySportsResponse>;
|
|
1157
1277
|
search(params: SearchQueryParams): Promise<SearchResponse>;
|
|
1278
|
+
getPositionsByWallet(params: PositionsByWalletQueryParams): Promise<WalletPositionsResponse>;
|
|
1158
1279
|
getOutcomeMints(params?: OutcomeMintsQueryParams): Promise<OutcomeMintsResponse>;
|
|
1159
1280
|
filterOutcomeMints(request: FilterOutcomeMintsRequest): Promise<FilterOutcomeMintsResponse>;
|
|
1160
1281
|
getQuote(params: QuoteQueryParams): Promise<QuoteResponse>;
|
|
@@ -1294,4 +1415,4 @@ declare class DflowPredictWsClient implements IPredictWsClient {
|
|
|
1294
1415
|
*/
|
|
1295
1416
|
declare function createDflowPredictWsClient(config: WsClientConfig): DflowPredictWsClient;
|
|
1296
1417
|
|
|
1297
|
-
export { type
|
|
1418
|
+
export { type IntentSwapRequestBody as $, type SearchResponse as A, type WalletPositionsResponse as B, type CandlesticksResponse as C, type OutcomeMintsQueryParams as D, type EventQueryParams as E, type ForecastPercentileHistoryQueryParams as F, type OutcomeMintsResponse as G, type FilterOutcomeMintsRequest as H, type IPredictClient as I, type FilterOutcomeMintsResponse as J, type QuoteResponse as K, type LiveDataQueryParams as L, type MarketQueryParams as M, type SwapRequestBody as N, type OrderResponse as O, type PositionsByWalletQueryParams as P, type QuoteQueryParams as Q, type SwapResponse as R, type StandardEvent as S, type TradesQueryParams as T, type SwapInstructionsResponse as U, type OrderQueryParams as V, type WalletPositionItem as W, type OrderStatusQueryParams as X, type OrderStatusResponse as Y, type IntentQuoteQueryParams as Z, type IntentQuoteResponse as _, type StandardMarket as a, type IntentSwapResponse as a0, type PredictionMarketInitQueryParams as a1, type PredictionMarketInitResponse as a2, type TokenListResponse as a3, type TokenListWithDecimalsResponse as a4, type VenueListResponse as a5, type WsConnectionStatus as a6, type WsPriceUpdate as a7, type WsTradeUpdate as a8, type WsOrderbookUpdate as a9, type OrderRevert as aA, type IntentExpiry as aB, type TokenWithDecimals as aC, type OrderbookQueryParams as aD, type PrioritizationFeeLamports as aE, type DestinationTokenAccountParam as aF, type CreateFeeAccountParams as aG, type PositiveSlippageParams as aH, type WsSubscribeOptions as aI, BasePredictClient as aJ, buildQuery as aK, toRecord as aL, DflowPredictClient as aM, DflowPredictWsClient as aN, createDflowPredictWsClient as aO, type WsClientConfig as aP, type ProviderType as aa, type MarketStatus as ab, type SortField as ac, type SortOrder as ad, type OrderStatus as ae, type PlatformFeeMode as af, type SlippageTolerance as ag, type PriorityLevel as ah, type ExecutionMode as ai, type SettlementSource as aj, type MarketAccountInfo as ak, type OnchainTrade as al, type OnchainTradeSortBy as am, type OnchainTradesBaseQueryParams as an, type CandlestickOHLC as ao, type CandlestickDataPoint as ap, type ForecastPercentileDataPoint as aq, type SeriesSettlementSource as ar, type RoutePlanLeg as as, type PlatformFee as at, type ComputeBudgetInfo as au, type PrioritizationType as av, type AccountMetaResponse as aw, type InstructionResponse as ax, type BlockhashWithMetadata as ay, type OrderFill as az, type SeriesResponse as b, type OrderbookLevel as c, type SingleTradeResponse as d, type IPredictWsClient as e, type StandardEventsResponse as f, type StandardMarketsResponse as g, type MarketsBatchRequest as h, type OrderbookResponse as i, type MultiTradeResponse as j, type TradesByMintQueryParams as k, type OnchainTradesByWalletQueryParams as l, type MultiOnchainTradeResponse as m, type OnchainTradesByEventQueryParams as n, type OnchainTradesByMarketQueryParams as o, type CandlesticksQueryParams as p, type ForecastPercentileHistoryResponse as q, type ForecastPercentileHistoryByMintQueryParams as r, type LiveDataResponse as s, type LiveDataByEventQueryParams as t, type LiveDataByMintQueryParams as u, type SeriesQueryParams as v, type SeriesListResponse as w, type TagsByCategoriesResponse as x, type FiltersBySportsResponse as y, type SearchQueryParams as z };
|