@alango/dr-manhattan 0.1.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/order.ts","../src/types/market.ts","../src/types/position.ts","../src/types/orderbook.ts","../src/types/crypto-hourly.ts","../src/errors/index.ts","../src/core/exchange.ts","../src/core/websocket.ts","../src/core/strategy.ts","../src/exchanges/limitless/index.ts","../src/exchanges/opinion/index.ts","../src/exchanges/polymarket/polymarket.ts","../src/exchanges/polymarket/polymarket-ws.ts","../src/exchanges/index.ts","../src/utils/logger.ts","../src/utils/price.ts"],"names":["EventEmitter","BASE_URL","CHAIN_ID","Wallet"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Order-related types for prediction market trading.\n */\n\n/** Order side - buy or sell */\nexport const OrderSide = {\n BUY: 'buy',\n SELL: 'sell',\n} as const;\nexport type OrderSide = (typeof OrderSide)[keyof typeof OrderSide];\n\n/** Order status */\nexport const OrderStatus = {\n PENDING: 'pending',\n OPEN: 'open',\n FILLED: 'filled',\n PARTIALLY_FILLED: 'partially_filled',\n CANCELLED: 'cancelled',\n REJECTED: 'rejected',\n} as const;\nexport type OrderStatus = (typeof OrderStatus)[keyof typeof OrderStatus];\n\n/** Order representation */\nexport interface Order {\n /** Unique order identifier */\n id: string;\n /** Market identifier */\n marketId: string;\n /** Outcome being traded */\n outcome: string;\n /** Buy or sell */\n side: OrderSide;\n /** Price per share (0-1) */\n price: number;\n /** Total order size */\n size: number;\n /** Amount filled */\n filled: number;\n /** Current status */\n status: OrderStatus;\n /** Creation timestamp */\n createdAt: Date;\n /** Last update timestamp */\n updatedAt?: Date;\n}\n\n/** Helper functions for Order */\nexport const OrderUtils = {\n /** Get remaining unfilled amount */\n remaining(order: Order): number {\n return order.size - order.filled;\n },\n\n /** Check if order is still active */\n isActive(order: Order): boolean {\n return order.status === OrderStatus.OPEN || order.status === OrderStatus.PARTIALLY_FILLED;\n },\n\n /** Check if order is completely filled */\n isFilled(order: Order): boolean {\n return order.status === OrderStatus.FILLED || order.filled >= order.size;\n },\n\n /** Get fill percentage (0-1) */\n fillPercentage(order: Order): number {\n if (order.size === 0) return 0;\n return order.filled / order.size;\n },\n} as const;\n\n/** Parameters for creating a new order */\nexport interface CreateOrderParams {\n marketId: string;\n outcome: string;\n side: OrderSide;\n price: number;\n size: number;\n /** Token ID (required for some exchanges) */\n tokenId?: string;\n /** Additional exchange-specific parameters */\n params?: Record<string, unknown>;\n}\n","/**\n * Market-related types for prediction markets.\n */\n\n/** Represents a tradeable outcome with its token ID */\nexport interface OutcomeToken {\n /** Outcome name (e.g., \"Yes\", \"No\") */\n outcome: string;\n /** Token ID for trading */\n tokenId: string;\n}\n\n/** Represents a prediction market */\nexport interface Market {\n /** Unique market identifier */\n id: string;\n /** Market question */\n question: string;\n /** List of possible outcomes */\n outcomes: string[];\n /** Market close/resolution time */\n closeTime?: Date;\n /** Total trading volume */\n volume: number;\n /** Available liquidity */\n liquidity: number;\n /** Current prices for each outcome (0-1) */\n prices: Record<string, number>;\n /** Minimum price increment */\n tickSize: number;\n /** Resolution criteria description */\n description: string;\n /** Additional exchange-specific metadata */\n metadata: Record<string, unknown>;\n}\n\n/** Helper functions for Market */\nexport const MarketUtils = {\n /** Check if market is binary (Yes/No) */\n isBinary(market: Market): boolean {\n return market.outcomes.length === 2;\n },\n\n /** Check if market is still open for trading */\n isOpen(market: Market): boolean {\n if ('closed' in market.metadata && market.metadata.closed) {\n return false;\n }\n if (!market.closeTime) return true;\n return new Date() < market.closeTime;\n },\n\n /** Get bid-ask spread for binary markets */\n spread(market: Market): number | null {\n if (!MarketUtils.isBinary(market) || market.outcomes.length !== 2) {\n return null;\n }\n const prices = Object.values(market.prices);\n if (prices.length !== 2) return null;\n return Math.abs(1.0 - prices.reduce((a, b) => a + b, 0));\n },\n\n /** Get token IDs from market metadata */\n getTokenIds(market: Market): string[] {\n const tokenIds = market.metadata.clobTokenIds;\n if (!tokenIds) return [];\n if (typeof tokenIds === 'string') {\n try {\n return JSON.parse(tokenIds) as string[];\n } catch {\n return [];\n }\n }\n if (Array.isArray(tokenIds)) {\n return tokenIds.map(String);\n }\n return [];\n },\n\n /** Create OutcomeToken array from market */\n getOutcomeTokens(market: Market): OutcomeToken[] {\n const tokenIds = MarketUtils.getTokenIds(market);\n return market.outcomes.map((outcome, i) => ({\n outcome,\n tokenId: tokenIds[i] ?? '',\n }));\n },\n} as const;\n\n/** Parameters for fetching markets */\nexport interface FetchMarketsParams {\n /** Maximum number of markets to return */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n /** Only return active markets */\n active?: boolean;\n /** Include closed markets */\n closed?: boolean;\n /** Additional exchange-specific filters */\n [key: string]: unknown;\n}\n","/**\n * Position-related types for tracking holdings.\n */\n\n/** Represents a position in a prediction market */\nexport interface Position {\n /** Market identifier */\n marketId: string;\n /** Outcome held */\n outcome: string;\n /** Position size (number of shares) */\n size: number;\n /** Average entry price */\n averagePrice: number;\n /** Current market price */\n currentPrice: number;\n}\n\n/** Helper functions for Position */\nexport const PositionUtils = {\n /** Get total cost basis */\n costBasis(position: Position): number {\n return position.size * position.averagePrice;\n },\n\n /** Get current market value */\n currentValue(position: Position): number {\n return position.size * position.currentPrice;\n },\n\n /** Get unrealized profit/loss */\n unrealizedPnl(position: Position): number {\n return PositionUtils.currentValue(position) - PositionUtils.costBasis(position);\n },\n\n /** Get unrealized P&L as percentage */\n unrealizedPnlPercent(position: Position): number {\n const costBasis = PositionUtils.costBasis(position);\n if (costBasis === 0) return 0;\n return (PositionUtils.unrealizedPnl(position) / costBasis) * 100;\n },\n} as const;\n\n/** Aggregated position info for delta calculations */\nexport interface DeltaInfo {\n /** Net delta (positive = long bias) */\n delta: number;\n /** Outcome with maximum position */\n maxOutcome: string | null;\n /** Maximum position size */\n maxPosition: number;\n}\n\n/** Calculate delta from positions map */\nexport function calculateDelta(positions: Record<string, number>): DeltaInfo {\n const entries = Object.entries(positions);\n if (entries.length === 0) {\n return { delta: 0, maxOutcome: null, maxPosition: 0 };\n }\n\n let maxOutcome: string | null = null;\n let maxPosition = 0;\n\n for (const [outcome, size] of entries) {\n if (size > maxPosition) {\n maxPosition = size;\n maxOutcome = outcome;\n }\n }\n\n if (entries.length === 2) {\n const [first, second] = entries;\n if (first && second) {\n const delta = Math.abs(first[1] - second[1]);\n return { delta, maxOutcome, maxPosition };\n }\n }\n\n return { delta: maxPosition, maxOutcome, maxPosition };\n}\n","/**\n * Orderbook-related types for market data.\n */\n\n/** Price level: [price, size] */\nexport type PriceLevel = [price: number, size: number];\n\n/** Normalized orderbook data structure */\nexport interface Orderbook {\n /** Bids sorted descending by price */\n bids: PriceLevel[];\n /** Asks sorted ascending by price */\n asks: PriceLevel[];\n /** Timestamp (ms since epoch) */\n timestamp: number;\n /** Asset/token ID */\n assetId: string;\n /** Market ID */\n marketId: string;\n}\n\n/** Helper functions for Orderbook */\nexport const OrderbookUtils = {\n /** Get best bid price */\n bestBid(orderbook: Orderbook): number | null {\n return orderbook.bids[0]?.[0] ?? null;\n },\n\n /** Get best ask price */\n bestAsk(orderbook: Orderbook): number | null {\n return orderbook.asks[0]?.[0] ?? null;\n },\n\n /** Get mid price */\n midPrice(orderbook: Orderbook): number | null {\n const bid = OrderbookUtils.bestBid(orderbook);\n const ask = OrderbookUtils.bestAsk(orderbook);\n if (bid === null || ask === null) return null;\n return (bid + ask) / 2;\n },\n\n /** Get bid-ask spread */\n spread(orderbook: Orderbook): number | null {\n const bid = OrderbookUtils.bestBid(orderbook);\n const ask = OrderbookUtils.bestAsk(orderbook);\n if (bid === null || ask === null) return null;\n return ask - bid;\n },\n\n /** Create orderbook from REST API response */\n fromRestResponse(\n data: {\n bids?: Array<{ price: string; size: string }>;\n asks?: Array<{ price: string; size: string }>;\n },\n tokenId = ''\n ): Orderbook {\n const bids: PriceLevel[] = [];\n const asks: PriceLevel[] = [];\n\n for (const bid of data.bids ?? []) {\n const price = Number.parseFloat(bid.price);\n const size = Number.parseFloat(bid.size);\n if (price > 0 && size > 0) {\n bids.push([price, size]);\n }\n }\n\n for (const ask of data.asks ?? []) {\n const price = Number.parseFloat(ask.price);\n const size = Number.parseFloat(ask.size);\n if (price > 0 && size > 0) {\n asks.push([price, size]);\n }\n }\n\n bids.sort((a, b) => b[0] - a[0]);\n asks.sort((a, b) => a[0] - b[0]);\n\n return {\n bids,\n asks,\n timestamp: Date.now(),\n assetId: tokenId,\n marketId: '',\n };\n },\n} as const;\n\n/** Manages multiple orderbooks efficiently */\nexport class OrderbookManager {\n private orderbooks = new Map<string, Orderbook>();\n\n /** Update orderbook for a token */\n update(tokenId: string, orderbook: Orderbook): void {\n this.orderbooks.set(tokenId, orderbook);\n }\n\n /** Get orderbook for a token */\n get(tokenId: string): Orderbook | undefined {\n return this.orderbooks.get(tokenId);\n }\n\n /** Get best bid and ask for a token */\n getBestBidAsk(tokenId: string): [bid: number | null, ask: number | null] {\n const orderbook = this.get(tokenId);\n if (!orderbook) return [null, null];\n return [OrderbookUtils.bestBid(orderbook), OrderbookUtils.bestAsk(orderbook)];\n }\n\n /** Check if we have data for a token */\n hasData(tokenId: string): boolean {\n const orderbook = this.get(tokenId);\n if (!orderbook) return false;\n return orderbook.bids.length > 0 && orderbook.asks.length > 0;\n }\n\n /** Check if we have data for all tokens */\n hasAllData(tokenIds: string[]): boolean {\n return tokenIds.every((id) => this.hasData(id));\n }\n\n /** Clear all orderbooks */\n clear(): void {\n this.orderbooks.clear();\n }\n}\n","export type MarketDirection = 'up' | 'down';\nexport type CryptoMarketType = 'up_down' | 'strike_price';\n\nexport interface CryptoHourlyMarket {\n tokenSymbol: string;\n expiryTime: Date;\n strikePrice: number | null;\n direction?: MarketDirection;\n marketType?: CryptoMarketType;\n}\n\nexport const TOKEN_ALIASES: Record<string, string> = {\n BITCOIN: 'BTC',\n ETHEREUM: 'ETH',\n SOLANA: 'SOL',\n};\n\nexport function normalizeTokenSymbol(token: string): string {\n const upper = token.toUpperCase();\n return TOKEN_ALIASES[upper] ?? upper;\n}\n","export class DrManhattanError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'DrManhattanError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class ExchangeError extends DrManhattanError {\n constructor(message: string) {\n super(message);\n this.name = 'ExchangeError';\n }\n}\n\nexport class NetworkError extends DrManhattanError {\n constructor(message: string) {\n super(message);\n this.name = 'NetworkError';\n }\n}\n\nexport class RateLimitError extends DrManhattanError {\n retryAfter: number | undefined;\n\n constructor(message: string, retryAfter?: number) {\n super(message);\n this.name = 'RateLimitError';\n this.retryAfter = retryAfter;\n }\n}\n\nexport class AuthenticationError extends DrManhattanError {\n constructor(message: string) {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class InsufficientFunds extends DrManhattanError {\n constructor(message: string) {\n super(message);\n this.name = 'InsufficientFunds';\n }\n}\n\nexport class InvalidOrder extends DrManhattanError {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidOrder';\n }\n}\n\nexport class MarketNotFound extends DrManhattanError {\n constructor(message: string) {\n super(message);\n this.name = 'MarketNotFound';\n }\n}\n","import { NetworkError, RateLimitError } from '../errors/index.js';\nimport {\n type CreateOrderParams,\n type FetchMarketsParams,\n type Market,\n MarketUtils,\n type Order,\n type Position,\n} from '../types/index.js';\n\nexport interface ExchangeConfig {\n apiKey?: string;\n apiSecret?: string;\n privateKey?: string;\n funder?: string;\n timeout?: number;\n verbose?: boolean;\n rateLimit?: number;\n maxRetries?: number;\n retryDelay?: number;\n retryBackoff?: number;\n}\n\nexport interface ExchangeCapabilities {\n fetchMarkets: boolean;\n fetchMarket: boolean;\n createOrder: boolean;\n cancelOrder: boolean;\n fetchOrder: boolean;\n fetchOpenOrders: boolean;\n fetchPositions: boolean;\n fetchBalance: boolean;\n websocket: boolean;\n}\n\nexport abstract class Exchange {\n protected config: ExchangeConfig;\n protected requestTimes: number[] = [];\n protected lastRequestTime = 0;\n\n abstract readonly id: string;\n abstract readonly name: string;\n\n constructor(config: ExchangeConfig = {}) {\n this.config = {\n timeout: 30000,\n verbose: false,\n rateLimit: 10,\n maxRetries: 3,\n retryDelay: 1000,\n retryBackoff: 2,\n ...config,\n };\n }\n\n get verbose(): boolean {\n return this.config.verbose ?? false;\n }\n\n get timeout(): number {\n return this.config.timeout ?? 30000;\n }\n\n abstract fetchMarkets(params?: FetchMarketsParams): Promise<Market[]>;\n abstract fetchMarket(marketId: string): Promise<Market>;\n abstract createOrder(params: CreateOrderParams): Promise<Order>;\n abstract cancelOrder(orderId: string, marketId?: string): Promise<Order>;\n abstract fetchOrder(orderId: string, marketId?: string): Promise<Order>;\n abstract fetchOpenOrders(marketId?: string): Promise<Order[]>;\n abstract fetchPositions(marketId?: string): Promise<Position[]>;\n abstract fetchBalance(): Promise<Record<string, number>>;\n\n describe(): { id: string; name: string; has: ExchangeCapabilities } {\n return {\n id: this.id,\n name: this.name,\n has: {\n fetchMarkets: true,\n fetchMarket: true,\n createOrder: true,\n cancelOrder: true,\n fetchOrder: true,\n fetchOpenOrders: true,\n fetchPositions: true,\n fetchBalance: true,\n websocket: false,\n },\n };\n }\n\n protected checkRateLimit(): void {\n const currentTime = Date.now();\n const rateLimit = this.config.rateLimit ?? 10;\n\n this.requestTimes = this.requestTimes.filter((t) => currentTime - t < 1000);\n\n if (this.requestTimes.length >= rateLimit) {\n const oldestRequest = this.requestTimes[0];\n if (oldestRequest) {\n const sleepTime = 1000 - (currentTime - oldestRequest);\n if (sleepTime > 0) {\n throw new RateLimitError(`Rate limit reached, wait ${sleepTime}ms`, sleepTime);\n }\n }\n }\n\n this.requestTimes.push(currentTime);\n }\n\n protected async withRetry<T>(fn: () => Promise<T>): Promise<T> {\n const maxRetries = this.config.maxRetries ?? 3;\n const retryDelay = this.config.retryDelay ?? 1000;\n const retryBackoff = this.config.retryBackoff ?? 2;\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n this.checkRateLimit();\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof NetworkError || error instanceof RateLimitError) {\n if (attempt < maxRetries) {\n const delay = retryDelay * retryBackoff ** attempt + Math.random() * 1000;\n if (this.verbose) {\n console.log(\n `Attempt ${attempt + 1} failed, retrying in ${delay.toFixed(0)}ms: ${error.message}`\n );\n }\n await this.sleep(delay);\n continue;\n }\n }\n\n throw error;\n }\n }\n\n throw lastError;\n }\n\n protected sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n protected parseDateTime(timestamp: unknown): Date | undefined {\n if (!timestamp) return undefined;\n if (timestamp instanceof Date) return timestamp;\n if (typeof timestamp === 'number') return new Date(timestamp);\n if (typeof timestamp === 'string') {\n const parsed = new Date(timestamp);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n return undefined;\n }\n\n async findTradeableMarket(\n options: {\n binary?: boolean;\n limit?: number;\n minLiquidity?: number;\n } = {}\n ): Promise<Market | null> {\n const { binary = true, limit = 100, minLiquidity = 0 } = options;\n\n const markets = await this.fetchMarkets({ limit });\n\n const suitable: Market[] = [];\n for (const market of markets) {\n if (binary && !MarketUtils.isBinary(market)) continue;\n if (!MarketUtils.isOpen(market)) continue;\n if (market.liquidity < minLiquidity) continue;\n\n const tokenIds = MarketUtils.getTokenIds(market);\n if (tokenIds.length === 0) continue;\n\n suitable.push(market);\n }\n\n if (suitable.length === 0) return null;\n\n const randomIndex = Math.floor(Math.random() * suitable.length);\n return suitable[randomIndex] ?? null;\n }\n\n calculateSpread(market: Market): number | null {\n return MarketUtils.spread(market);\n }\n\n calculateImpliedProbability(price: number): number {\n return Math.max(0, Math.min(1, price));\n }\n\n calculateExpectedValue(market: Market, outcome: string, price: number): number {\n if (!MarketUtils.isBinary(market)) return 0;\n\n const probability = this.calculateImpliedProbability(price);\n const payoff = outcome === market.outcomes[0] ? 1.0 : 0.0;\n const cost = price;\n\n return probability * payoff - cost;\n }\n\n getOptimalOrderSize(market: Market, maxPositionSize: number): number {\n const liquidityBasedSize = market.liquidity * 0.1;\n return Math.min(maxPositionSize, liquidityBasedSize);\n }\n}\n","import { EventEmitter } from 'node:events';\nimport WebSocket from 'ws';\n\nexport const WebSocketState = {\n DISCONNECTED: 'disconnected',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n RECONNECTING: 'reconnecting',\n CLOSED: 'closed',\n} as const;\nexport type WebSocketState = (typeof WebSocketState)[keyof typeof WebSocketState];\n\nexport interface WebSocketConfig {\n verbose?: boolean;\n autoReconnect?: boolean;\n maxReconnectAttempts?: number;\n reconnectDelay?: number;\n pingInterval?: number;\n pingTimeout?: number;\n}\n\nexport interface OrderbookUpdate {\n marketId: string;\n bids: [number, number][];\n asks: [number, number][];\n timestamp: number;\n}\n\nexport type OrderbookCallback = (\n marketId: string,\n orderbook: OrderbookUpdate\n) => void | Promise<void>;\n\nexport abstract class OrderBookWebSocket extends EventEmitter {\n protected config: WebSocketConfig;\n protected ws: WebSocket | null = null;\n protected state: WebSocketState = WebSocketState.DISCONNECTED;\n protected reconnectAttempts = 0;\n protected subscriptions = new Map<string, OrderbookCallback>();\n protected pingTimer: ReturnType<typeof setInterval> | null = null;\n protected lastMessageTime = 0;\n\n abstract readonly wsUrl: string;\n\n constructor(config: WebSocketConfig = {}) {\n super();\n this.config = {\n verbose: false,\n autoReconnect: true,\n maxReconnectAttempts: 999,\n reconnectDelay: 3000,\n pingInterval: 20000,\n pingTimeout: 10000,\n ...config,\n };\n }\n\n get isConnected(): boolean {\n return this.state === WebSocketState.CONNECTED;\n }\n\n protected abstract authenticate(): Promise<void>;\n protected abstract subscribeOrderbook(marketId: string): Promise<void>;\n protected abstract unsubscribeOrderbook(marketId: string): Promise<void>;\n protected abstract parseOrderbookMessage(\n message: Record<string, unknown>\n ): OrderbookUpdate | null;\n\n async connect(): Promise<void> {\n if (this.state === WebSocketState.CONNECTED) return;\n\n this.state = WebSocketState.CONNECTING;\n\n return new Promise((resolve, reject) => {\n this.ws = new WebSocket(this.wsUrl);\n\n this.ws.on('open', async () => {\n this.state = WebSocketState.CONNECTED;\n this.reconnectAttempts = 0;\n this.lastMessageTime = Date.now();\n\n if (this.config.verbose) {\n console.log(`WebSocket connected to ${this.wsUrl}`);\n }\n\n try {\n await this.authenticate();\n for (const marketId of this.subscriptions.keys()) {\n await this.subscribeOrderbook(marketId);\n }\n this.startPingTimer();\n resolve();\n } catch (error) {\n reject(error);\n }\n });\n\n this.ws.on('message', (data) => this.handleMessage(data));\n this.ws.on('error', (error) => this.handleError(error));\n this.ws.on('close', () => this.handleClose());\n });\n }\n\n async disconnect(): Promise<void> {\n this.state = WebSocketState.CLOSED;\n this.config.autoReconnect = false;\n this.stopPingTimer();\n\n if (this.ws) {\n this.ws.close();\n this.ws = null;\n }\n }\n\n async watchOrderbook(marketId: string, callback: OrderbookCallback): Promise<void> {\n this.subscriptions.set(marketId, callback);\n\n if (this.state !== WebSocketState.CONNECTED) {\n await this.connect();\n }\n\n await this.subscribeOrderbook(marketId);\n }\n\n async unwatchOrderbook(marketId: string): Promise<void> {\n if (!this.subscriptions.has(marketId)) return;\n\n this.subscriptions.delete(marketId);\n\n if (this.state === WebSocketState.CONNECTED) {\n await this.unsubscribeOrderbook(marketId);\n }\n }\n\n protected handleMessage(data: WebSocket.RawData): void {\n this.lastMessageTime = Date.now();\n\n try {\n const message = data.toString();\n if (message === 'PONG' || message === 'PING' || message === '') return;\n\n const parsed = JSON.parse(message) as Record<string, unknown>;\n const orderbook = this.parseOrderbookMessage(parsed);\n\n if (orderbook) {\n const callback = this.subscriptions.get(orderbook.marketId);\n if (callback) {\n Promise.resolve(callback(orderbook.marketId, orderbook)).catch((error) => {\n if (this.config.verbose) {\n console.error('Orderbook callback error:', error);\n }\n });\n }\n }\n } catch (error) {\n if (this.config.verbose) {\n console.error('Failed to parse WebSocket message:', error);\n }\n }\n }\n\n protected handleError(error: Error): void {\n if (this.config.verbose) {\n console.error('WebSocket error:', error);\n }\n this.emit('error', error);\n }\n\n protected handleClose(): void {\n this.stopPingTimer();\n\n if (this.config.verbose) {\n console.log('WebSocket connection closed');\n }\n\n if (this.config.autoReconnect && this.state !== WebSocketState.CLOSED) {\n this.reconnect();\n }\n }\n\n protected async reconnect(): Promise<void> {\n const maxAttempts = this.config.maxReconnectAttempts ?? 999;\n if (this.reconnectAttempts >= maxAttempts) {\n this.state = WebSocketState.CLOSED;\n return;\n }\n\n this.state = WebSocketState.RECONNECTING;\n this.reconnectAttempts++;\n\n const delay = Math.min(\n 60000,\n (this.config.reconnectDelay ?? 3000) * 1.5 ** (this.reconnectAttempts - 1)\n );\n\n if (this.config.verbose) {\n console.log(`Reconnecting in ${delay.toFixed(0)}ms (attempt ${this.reconnectAttempts})`);\n }\n\n await this.sleep(delay);\n\n try {\n await this.connect();\n } catch {\n const currentState = this.state as WebSocketState;\n if (this.config.autoReconnect && currentState !== WebSocketState.CLOSED) {\n this.reconnect();\n }\n }\n }\n\n protected startPingTimer(): void {\n this.stopPingTimer();\n const interval = this.config.pingInterval ?? 20000;\n\n this.pingTimer = setInterval(() => {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.ping();\n }\n }, interval);\n }\n\n protected stopPingTimer(): void {\n if (this.pingTimer) {\n clearInterval(this.pingTimer);\n this.pingTimer = null;\n }\n }\n\n protected sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n protected send(data: unknown): void {\n if (this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(data));\n }\n }\n}\n","import { EventEmitter } from 'node:events';\nimport type { Market, Order, Position } from '../types/index.js';\nimport type { OrderSide } from '../types/index.js';\nimport type { Exchange } from './exchange.js';\n\nexport const StrategyState = {\n STOPPED: 'stopped',\n RUNNING: 'running',\n PAUSED: 'paused',\n} as const;\nexport type StrategyState = (typeof StrategyState)[keyof typeof StrategyState];\n\nexport interface StrategyConfig {\n tickInterval?: number;\n maxPositionSize?: number;\n spreadBps?: number;\n verbose?: boolean;\n}\n\nexport abstract class Strategy extends EventEmitter {\n protected exchange: Exchange;\n protected marketId: string;\n protected market: Market | null = null;\n protected state: StrategyState = StrategyState.STOPPED;\n protected config: StrategyConfig;\n protected tickTimer: ReturnType<typeof setInterval> | null = null;\n protected positions: Position[] = [];\n protected openOrders: Order[] = [];\n\n constructor(exchange: Exchange, marketId: string, config: StrategyConfig = {}) {\n super();\n this.exchange = exchange;\n this.marketId = marketId;\n this.config = {\n tickInterval: 1000,\n maxPositionSize: 100,\n spreadBps: 100,\n verbose: false,\n ...config,\n };\n }\n\n abstract onTick(): Promise<void>;\n\n async start(): Promise<void> {\n if (this.state === StrategyState.RUNNING) return;\n\n this.market = await this.exchange.fetchMarket(this.marketId);\n this.state = StrategyState.RUNNING;\n\n this.tickTimer = setInterval(async () => {\n if (this.state !== StrategyState.RUNNING) return;\n\n try {\n await this.refreshState();\n await this.onTick();\n } catch (error) {\n this.emit('error', error);\n if (this.config.verbose) {\n console.error('Strategy tick error:', error);\n }\n }\n }, this.config.tickInterval);\n\n this.emit('started');\n }\n\n async stop(): Promise<void> {\n if (this.state === StrategyState.STOPPED) return;\n\n this.state = StrategyState.STOPPED;\n\n if (this.tickTimer) {\n clearInterval(this.tickTimer);\n this.tickTimer = null;\n }\n\n await this.cancelAllOrders();\n this.emit('stopped');\n }\n\n pause(): void {\n if (this.state === StrategyState.RUNNING) {\n this.state = StrategyState.PAUSED;\n this.emit('paused');\n }\n }\n\n resume(): void {\n if (this.state === StrategyState.PAUSED) {\n this.state = StrategyState.RUNNING;\n this.emit('resumed');\n }\n }\n\n protected async refreshState(): Promise<void> {\n const [positions, orders] = await Promise.all([\n this.exchange.fetchPositions(this.marketId),\n this.exchange.fetchOpenOrders(this.marketId),\n ]);\n this.positions = positions;\n this.openOrders = orders;\n }\n\n protected async cancelAllOrders(): Promise<void> {\n for (const order of this.openOrders) {\n try {\n await this.exchange.cancelOrder(order.id, this.marketId);\n } catch {\n void 0;\n }\n }\n this.openOrders = [];\n }\n\n protected getPosition(outcome: string): Position | undefined {\n return this.positions.find((p) => p.outcome === outcome);\n }\n\n protected getNetPosition(): number {\n if (!this.market || this.market.outcomes.length !== 2) return 0;\n const outcome1 = this.market.outcomes[0];\n const outcome2 = this.market.outcomes[1];\n if (!outcome1 || !outcome2) return 0;\n const pos1 = this.getPosition(outcome1)?.size ?? 0;\n const pos2 = this.getPosition(outcome2)?.size ?? 0;\n return pos1 - pos2;\n }\n\n protected async placeOrder(\n outcome: string,\n side: OrderSide,\n price: number,\n size: number,\n tokenId?: string\n ): Promise<Order | null> {\n try {\n const order = await this.exchange.createOrder({\n marketId: this.marketId,\n outcome,\n side,\n price,\n size,\n tokenId,\n });\n this.openOrders.push(order);\n this.emit('order', order);\n return order;\n } catch (error) {\n this.emit('error', error);\n return null;\n }\n }\n\n protected log(message: string): void {\n if (this.config.verbose) {\n console.log(`[${this.exchange.id}:${this.marketId}] ${message}`);\n }\n }\n\n get isRunning(): boolean {\n return this.state === StrategyState.RUNNING;\n }\n\n get currentState(): StrategyState {\n return this.state;\n }\n}\n","import { Wallet } from 'ethers';\nimport { Exchange, type ExchangeConfig } from '../../core/exchange.js';\nimport {\n AuthenticationError,\n ExchangeError,\n InvalidOrder,\n MarketNotFound,\n NetworkError,\n} from '../../errors/index.js';\nimport {\n type CreateOrderParams,\n type FetchMarketsParams,\n type Market,\n type Order,\n OrderSide,\n OrderStatus,\n type Position,\n} from '../../types/index.js';\n\nconst BASE_URL = 'https://api.limitless.exchange';\nconst CHAIN_ID = 8453;\n\ninterface LimitlessConfig extends ExchangeConfig {\n host?: string;\n chainId?: number;\n}\n\ninterface RawMarket {\n slug?: string;\n address?: string;\n title?: string;\n question?: string;\n description?: string;\n tokens?: { yes?: string; no?: string };\n yesPrice?: number;\n noPrice?: number;\n prices?: number[] | { yes?: number; no?: number };\n deadline?: string | number;\n closeDate?: string | number;\n expirationDate?: string | number;\n volume?: number;\n volumeFormatted?: number;\n liquidity?: number;\n liquidityFormatted?: number;\n status?: string;\n venue?: { exchange?: string };\n category?: string;\n}\n\ninterface RawOrder {\n id?: string;\n orderId?: string;\n marketSlug?: string;\n market_id?: string;\n side?: number | string;\n status?: string;\n price?: number;\n size?: number;\n amount?: number;\n makerAmount?: number;\n takerAmount?: number;\n filled?: number;\n matchedAmount?: number;\n outcome?: string;\n token?: string;\n tokenId?: string;\n createdAt?: string | number;\n updatedAt?: string | number;\n}\n\ninterface RawPosition {\n market?: { slug?: string };\n marketSlug?: string;\n market_id?: string;\n tokensBalance?: { yes?: string | number; no?: string | number };\n positions?: {\n yes?: { fillPrice?: number };\n no?: { fillPrice?: number };\n };\n latestTrade?: {\n latestYesPrice?: number;\n latestNoPrice?: number;\n };\n}\n\ninterface RawOrderbookLevel {\n price?: number | string;\n size?: number | string;\n side?: string;\n}\n\nexport class Limitless extends Exchange {\n readonly id = 'limitless';\n readonly name = 'Limitless';\n\n private readonly host: string;\n private readonly chainId: number;\n private wallet: Wallet | null = null;\n private address: string | null = null;\n private authenticated = false;\n private ownerId: string | null = null;\n private sessionCookie: string | null = null;\n\n private tokenToSlug: Map<string, string> = new Map();\n private noTokens: Set<string> = new Set();\n\n constructor(config: LimitlessConfig = {}) {\n super(config);\n this.host = config.host ?? BASE_URL;\n this.chainId = config.chainId ?? CHAIN_ID;\n\n if (config.privateKey) {\n this.wallet = new Wallet(config.privateKey);\n this.address = this.wallet.address;\n }\n }\n\n private async authenticate(): Promise<void> {\n if (!this.wallet || !this.address) {\n throw new AuthenticationError('Private key required for authentication');\n }\n\n const msgResponse = await fetch(`${this.host}/auth/signing-message`, {\n method: 'GET',\n headers: { 'Content-Type': 'application/json' },\n });\n\n if (!msgResponse.ok) {\n throw new AuthenticationError('Failed to get signing message');\n }\n\n const message = await msgResponse.text();\n if (!message) {\n throw new AuthenticationError('Empty signing message');\n }\n\n const signature = await this.wallet.signMessage(message);\n const messageHex = `0x${Buffer.from(message, 'utf-8').toString('hex')}`;\n\n const loginResponse = await fetch(`${this.host}/auth/login`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-account': this.address,\n 'x-signing-message': messageHex,\n 'x-signature': signature,\n },\n body: JSON.stringify({ client: 'eoa' }),\n });\n\n if (!loginResponse.ok) {\n throw new AuthenticationError('Login failed');\n }\n\n const setCookie = loginResponse.headers.get('set-cookie');\n if (setCookie) {\n const match = /limitless_session=([^;]+)/.exec(setCookie);\n if (match?.[1]) {\n this.sessionCookie = match[1];\n }\n }\n\n const loginData = (await loginResponse.json()) as { user?: { id?: string }; id?: string };\n const userData = loginData.user ?? loginData;\n this.ownerId = userData.id ?? null;\n this.authenticated = true;\n }\n\n private async ensureAuth(): Promise<void> {\n if (!this.authenticated) {\n if (!this.wallet) {\n throw new AuthenticationError('Private key required for this operation');\n }\n await this.authenticate();\n }\n }\n\n private async request<T>(\n method: string,\n endpoint: string,\n params?: Record<string, unknown>,\n requireAuth = false\n ): Promise<T> {\n if (requireAuth) {\n await this.ensureAuth();\n }\n\n const url = new URL(`${this.host}${endpoint}`);\n\n if (method === 'GET' && params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.sessionCookie) {\n headers.Cookie = `limitless_session=${this.sessionCookie}`;\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n if (method !== 'GET' && method !== 'DELETE' && params) {\n fetchOptions.body = JSON.stringify(params);\n }\n\n const response = await fetch(url.toString(), fetchOptions);\n\n if (!response.ok) {\n if (response.status === 429) {\n throw new NetworkError('Rate limited');\n }\n if (response.status === 401 || response.status === 403) {\n this.authenticated = false;\n throw new AuthenticationError('Authentication failed');\n }\n if (response.status === 404) {\n throw new ExchangeError(`Resource not found: ${endpoint}`);\n }\n throw new NetworkError(`HTTP ${response.status}`);\n }\n\n return response.json() as Promise<T>;\n }\n\n private parseMarket(data: RawMarket): Market {\n const slug = data.slug ?? data.address ?? '';\n const question = data.title ?? data.question ?? '';\n\n const tokens = data.tokens ?? {};\n const yesTokenId = String(tokens.yes ?? '');\n const noTokenId = String(tokens.no ?? '');\n\n const outcomes = ['Yes', 'No'];\n const tokenIds = yesTokenId && noTokenId ? [yesTokenId, noTokenId] : [];\n\n const prices: Record<string, number> = {};\n if (data.yesPrice !== undefined) {\n const yesPrice = data.yesPrice ?? 0;\n const noPrice = data.noPrice ?? 0;\n prices.Yes = yesPrice > 1 ? yesPrice / 100 : yesPrice;\n prices.No = noPrice > 1 ? noPrice / 100 : noPrice;\n } else if (data.prices) {\n if (Array.isArray(data.prices)) {\n const yesPrice = data.prices[0] ?? 0;\n const noPrice = data.prices[1] ?? 0;\n prices.Yes = yesPrice > 1 ? yesPrice / 100 : yesPrice;\n prices.No = noPrice > 1 ? noPrice / 100 : noPrice;\n } else {\n const yesPrice = data.prices.yes ?? 0;\n const noPrice = data.prices.no ?? 0;\n prices.Yes = yesPrice > 1 ? yesPrice / 100 : yesPrice;\n prices.No = noPrice > 1 ? noPrice / 100 : noPrice;\n }\n }\n\n let closeTime: Date | undefined;\n const deadline = data.deadline ?? data.closeDate ?? data.expirationDate;\n if (deadline) {\n closeTime = this.parseDateTime(deadline);\n }\n\n const volume = data.volumeFormatted ?? data.volume ?? 0;\n const liquidity = data.liquidityFormatted ?? data.liquidity ?? 0;\n const tickSize = 0.001;\n\n for (const tokenId of tokenIds) {\n if (tokenId) {\n this.tokenToSlug.set(tokenId, slug);\n }\n }\n if (noTokenId) {\n this.noTokens.add(noTokenId);\n }\n\n const status = data.status ?? '';\n const closed = status.toLowerCase() === 'resolved' || status.toLowerCase() === 'closed';\n\n const metadata: Record<string, unknown> = {\n ...data,\n slug,\n clobTokenIds: tokenIds,\n token_ids: tokenIds,\n tokens: { Yes: yesTokenId, No: noTokenId },\n minimum_tick_size: tickSize,\n closed,\n };\n\n return {\n id: slug,\n question,\n outcomes,\n closeTime,\n volume,\n liquidity,\n prices,\n tickSize,\n description: data.description ?? '',\n metadata,\n };\n }\n\n private parseOrder(data: RawOrder, tokenToOutcome?: Map<string, string>): Order {\n const orderId = String(data.id ?? data.orderId ?? '');\n const marketId = data.marketSlug ?? data.market_id ?? '';\n\n let side: OrderSide;\n if (typeof data.side === 'number') {\n side = data.side === 0 ? OrderSide.BUY : OrderSide.SELL;\n } else {\n side = String(data.side).toLowerCase() === 'buy' ? OrderSide.BUY : OrderSide.SELL;\n }\n\n const status = this.parseOrderStatus(data.status);\n const price = data.price ?? 0;\n\n let size = data.size ?? data.amount ?? 0;\n if (!size) {\n const makerAmount = data.makerAmount ?? 0;\n const takerAmount = data.takerAmount ?? 0;\n if (makerAmount || takerAmount) {\n size = side === OrderSide.BUY ? takerAmount / 1_000_000 : makerAmount / 1_000_000;\n }\n }\n\n const filled = data.filled ?? data.matchedAmount ?? 0;\n\n let createdAt = new Date();\n if (data.createdAt) {\n const parsed = this.parseDateTime(data.createdAt);\n if (parsed) createdAt = parsed;\n }\n\n let outcome = data.outcome ?? '';\n if (!outcome && tokenToOutcome) {\n const tokenId = String(data.token ?? data.tokenId ?? '');\n outcome = tokenToOutcome.get(tokenId) ?? '';\n }\n\n return {\n id: orderId,\n marketId,\n outcome,\n side,\n price,\n size,\n filled,\n status,\n createdAt,\n };\n }\n\n private parseOrderStatus(status: unknown): OrderStatus {\n if (!status) return OrderStatus.OPEN;\n\n const statusStr = String(status).toLowerCase();\n const statusMap: Record<string, OrderStatus> = {\n pending: OrderStatus.PENDING,\n open: OrderStatus.OPEN,\n live: OrderStatus.OPEN,\n active: OrderStatus.OPEN,\n filled: OrderStatus.FILLED,\n matched: OrderStatus.FILLED,\n partially_filled: OrderStatus.PARTIALLY_FILLED,\n partial: OrderStatus.PARTIALLY_FILLED,\n cancelled: OrderStatus.CANCELLED,\n canceled: OrderStatus.CANCELLED,\n };\n return statusMap[statusStr] ?? OrderStatus.OPEN;\n }\n\n private parsePortfolioPositions(data: RawPosition): Position[] {\n const positions: Position[] = [];\n\n const marketData = data.market ?? {};\n const marketId = marketData.slug ?? data.marketSlug ?? '';\n\n const tokensBalance = data.tokensBalance ?? {};\n const positionDetails = data.positions ?? {};\n const latestTrade = data.latestTrade ?? {};\n\n const yesBalance = Number(tokensBalance.yes ?? 0);\n if (yesBalance > 0) {\n const yesDetails = positionDetails.yes ?? {};\n const fillPrice = yesDetails.fillPrice ?? 0;\n const avgPrice = fillPrice > 1 ? fillPrice / 1_000_000 : fillPrice;\n const currentPrice = latestTrade.latestYesPrice ?? 0;\n const size = yesBalance / 1_000_000;\n\n positions.push({\n marketId,\n outcome: 'Yes',\n size,\n averagePrice: avgPrice,\n currentPrice,\n });\n }\n\n const noBalance = Number(tokensBalance.no ?? 0);\n if (noBalance > 0) {\n const noDetails = positionDetails.no ?? {};\n const fillPrice = noDetails.fillPrice ?? 0;\n const avgPrice = fillPrice > 1 ? fillPrice / 1_000_000 : fillPrice;\n const currentPrice = latestTrade.latestNoPrice ?? 0;\n const size = noBalance / 1_000_000;\n\n positions.push({\n marketId,\n outcome: 'No',\n size,\n averagePrice: avgPrice,\n currentPrice,\n });\n }\n\n return positions;\n }\n\n async fetchMarkets(params?: FetchMarketsParams): Promise<Market[]> {\n return this.withRetry(async () => {\n const queryParams: Record<string, unknown> = {\n page: params?.offset ? Math.floor(params.offset / 25) + 1 : 1,\n limit: Math.min(params?.limit ?? 25, 25),\n };\n\n const response = await this.request<{ data?: RawMarket[] } | RawMarket[]>(\n 'GET',\n '/markets/active',\n queryParams\n );\n\n const marketsData = Array.isArray(response) ? response : (response.data ?? []);\n\n let markets = marketsData.map((m) => this.parseMarket(m));\n\n if (params?.active !== false) {\n markets = markets.filter((m) => !m.metadata?.closed);\n }\n\n if (params?.limit) {\n return markets.slice(0, params.limit);\n }\n return markets;\n });\n }\n\n async fetchMarket(marketId: string): Promise<Market> {\n return this.withRetry(async () => {\n try {\n const data = await this.request<RawMarket>('GET', `/markets/${marketId}`);\n return this.parseMarket(data);\n } catch (error) {\n if (error instanceof ExchangeError && error.message.includes('not found')) {\n throw new MarketNotFound(`Market ${marketId} not found`);\n }\n throw error;\n }\n });\n }\n\n async getOrderbook(marketSlugOrTokenId: string): Promise<{\n bids: Array<{ price: string; size: string }>;\n asks: Array<{ price: string; size: string }>;\n }> {\n const isNoToken = this.noTokens.has(marketSlugOrTokenId);\n const slug = this.tokenToSlug.get(marketSlugOrTokenId) ?? marketSlugOrTokenId;\n\n return this.withRetry(async () => {\n const response = await this.request<{\n orders?: RawOrderbookLevel[];\n data?: RawOrderbookLevel[];\n bids?: RawOrderbookLevel[];\n asks?: RawOrderbookLevel[];\n }>('GET', `/markets/${slug}/orderbook`);\n\n const bids: Array<{ price: string; size: string }> = [];\n const asks: Array<{ price: string; size: string }> = [];\n\n const orders = response.orders ?? response.data ?? [];\n for (const order of orders) {\n const side = String(order.side ?? '').toLowerCase();\n const price = Number(order.price ?? 0);\n const size = Number(order.size ?? 0);\n\n if (price > 0 && size > 0) {\n const entry = { price: String(price), size: String(size) };\n if (side === 'buy') {\n bids.push(entry);\n } else {\n asks.push(entry);\n }\n }\n }\n\n if (response.bids) {\n for (const bid of response.bids) {\n bids.push({\n price: String(bid.price ?? 0),\n size: String(bid.size ?? 0),\n });\n }\n }\n if (response.asks) {\n for (const ask of response.asks) {\n asks.push({\n price: String(ask.price ?? 0),\n size: String(ask.size ?? 0),\n });\n }\n }\n\n bids.sort((a, b) => Number(b.price) - Number(a.price));\n asks.sort((a, b) => Number(a.price) - Number(b.price));\n\n if (isNoToken) {\n const invertedBids = asks.map((a) => ({\n price: String(Math.round((1 - Number(a.price)) * 1000) / 1000),\n size: a.size,\n }));\n const invertedAsks = bids.map((b) => ({\n price: String(Math.round((1 - Number(b.price)) * 1000) / 1000),\n size: b.size,\n }));\n invertedBids.sort((a, b) => Number(b.price) - Number(a.price));\n invertedAsks.sort((a, b) => Number(a.price) - Number(b.price));\n return { bids: invertedBids, asks: invertedAsks };\n }\n\n return { bids, asks };\n });\n }\n\n async createOrder(params: CreateOrderParams): Promise<Order> {\n await this.ensureAuth();\n\n if (!this.wallet || !this.address) {\n throw new AuthenticationError('Wallet not initialized');\n }\n\n const market = await this.fetchMarket(params.marketId);\n const tokens = (market.metadata?.tokens ?? {}) as Record<string, string>;\n const tokenId = params.tokenId ?? tokens[params.outcome];\n\n if (!tokenId) {\n throw new InvalidOrder(`Could not find token_id for outcome '${params.outcome}'`);\n }\n\n if (params.price <= 0 || params.price >= 1) {\n throw new InvalidOrder(`Price must be between 0 and 1, got: ${params.price}`);\n }\n\n const venue = market.metadata?.venue as { exchange?: string } | undefined;\n const exchangeAddress = venue?.exchange;\n if (!exchangeAddress) {\n throw new InvalidOrder('Market does not have venue.exchange address');\n }\n\n const orderType = (params.params?.order_type as string)?.toUpperCase() ?? 'GTC';\n const feeRateBps = 300;\n\n const signedOrder = await this.buildSignedOrder(\n tokenId,\n params.price,\n params.size,\n params.side,\n orderType,\n exchangeAddress,\n feeRateBps\n );\n\n const payload: Record<string, unknown> = {\n order: signedOrder,\n orderType,\n marketSlug: params.marketId,\n };\n\n if (this.ownerId) {\n payload.ownerId = this.ownerId;\n }\n\n return this.withRetry(async () => {\n const result = await this.request<{ order?: RawOrder } | RawOrder>(\n 'POST',\n '/orders',\n payload,\n true\n );\n\n const orderData = (result as { order?: RawOrder }).order ?? (result as RawOrder);\n const orderId = orderData.id ?? orderData.orderId ?? '';\n const statusStr = orderData.status ?? 'LIVE';\n\n return {\n id: String(orderId),\n marketId: params.marketId,\n outcome: params.outcome,\n side: params.side,\n price: params.price,\n size: params.size,\n filled: Number(orderData.filled ?? 0),\n status: this.parseOrderStatus(statusStr),\n createdAt: new Date(),\n };\n });\n }\n\n private async buildSignedOrder(\n tokenId: string,\n price: number,\n size: number,\n side: OrderSide,\n orderType: string,\n exchangeAddress: string,\n feeRateBps: number\n ): Promise<Record<string, unknown>> {\n if (!this.wallet || !this.address) {\n throw new AuthenticationError('Wallet not initialized');\n }\n\n const timestampMs = Date.now();\n const nanoOffset = Math.floor(Math.random() * 1_000_000);\n const oneDayMs = 1000 * 60 * 60 * 24;\n const salt = timestampMs * 1000 + nanoOffset + oneDayMs;\n\n const sharesScale = 1_000_000;\n const collateralScale = 1_000_000;\n const priceScale = 1_000_000;\n const priceTick = 0.001;\n\n let shares = Math.floor(size * sharesScale);\n const priceInt = Math.floor(price * priceScale);\n const tickInt = Math.floor(priceTick * priceScale);\n\n const sharesStep = Math.floor(priceScale / tickInt);\n if (shares % sharesStep !== 0) {\n shares = Math.floor(shares / sharesStep) * sharesStep;\n }\n\n const numerator = shares * priceInt * collateralScale;\n const denominator = sharesScale * priceScale;\n\n const sideInt = side === OrderSide.BUY ? 0 : 1;\n\n let makerAmount: number;\n let takerAmount: number;\n\n if (side === OrderSide.BUY) {\n const collateral = Math.ceil(numerator / denominator);\n makerAmount = collateral;\n takerAmount = shares;\n } else {\n const collateral = Math.floor(numerator / denominator);\n makerAmount = shares;\n takerAmount = collateral;\n }\n\n const orderForSigning = {\n salt,\n maker: this.address,\n signer: this.address,\n taker: '0x0000000000000000000000000000000000000000',\n tokenId: Number.parseInt(tokenId, 10),\n makerAmount,\n takerAmount,\n expiration: 0,\n nonce: 0,\n feeRateBps,\n side: sideInt,\n signatureType: 0,\n };\n\n const signature = await this.signOrderEip712(orderForSigning, exchangeAddress);\n\n const order: Record<string, unknown> = {\n salt,\n maker: this.address,\n signer: this.address,\n taker: '0x0000000000000000000000000000000000000000',\n tokenId,\n makerAmount,\n takerAmount,\n expiration: '0',\n nonce: 0,\n feeRateBps,\n side: sideInt,\n signatureType: 0,\n signature,\n };\n\n if (orderType === 'GTC') {\n order.price = Math.round(price * 1000) / 1000;\n }\n\n return order;\n }\n\n private async signOrderEip712(\n order: Record<string, unknown>,\n exchangeAddress: string\n ): Promise<string> {\n if (!this.wallet) {\n throw new AuthenticationError('Wallet not initialized');\n }\n\n const domain = {\n name: 'Limitless CTF Exchange',\n version: '1',\n chainId: this.chainId,\n verifyingContract: exchangeAddress,\n };\n\n const 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 };\n\n const value = {\n salt: order.salt,\n maker: order.maker,\n signer: order.signer,\n taker: order.taker,\n tokenId: order.tokenId,\n makerAmount: order.makerAmount,\n takerAmount: order.takerAmount,\n expiration: order.expiration,\n nonce: order.nonce,\n feeRateBps: order.feeRateBps,\n side: order.side,\n signatureType: order.signatureType,\n };\n\n const signature = await (\n this.wallet as Wallet & {\n _signTypedData: (domain: unknown, types: unknown, value: unknown) => Promise<string>;\n }\n )._signTypedData(domain, types, value);\n return signature;\n }\n\n async cancelOrder(orderId: string, marketId?: string): Promise<Order> {\n await this.ensureAuth();\n\n return this.withRetry(async () => {\n await this.request('DELETE', `/orders/${orderId}`, undefined, true);\n\n return {\n id: orderId,\n marketId: marketId ?? '',\n outcome: '',\n side: OrderSide.BUY,\n price: 0,\n size: 0,\n filled: 0,\n status: OrderStatus.CANCELLED,\n createdAt: new Date(),\n };\n });\n }\n\n async fetchOrder(orderId: string, _marketId?: string): Promise<Order> {\n await this.ensureAuth();\n\n return this.withRetry(async () => {\n const data = await this.request<RawOrder>('GET', `/orders/${orderId}`, undefined, true);\n return this.parseOrder(data);\n });\n }\n\n async fetchOpenOrders(marketId?: string): Promise<Order[]> {\n await this.ensureAuth();\n\n const queryParams: Record<string, unknown> = { statuses: 'LIVE' };\n let endpoint: string;\n\n if (marketId) {\n endpoint = `/markets/${marketId}/user-orders`;\n } else {\n endpoint = '/orders';\n }\n\n let tokenToOutcome: Map<string, string> | undefined;\n if (marketId) {\n try {\n const market = await this.fetchMarket(marketId);\n const tokens = (market.metadata?.tokens ?? {}) as Record<string, string>;\n tokenToOutcome = new Map();\n for (const [outcome, tokenId] of Object.entries(tokens)) {\n if (tokenId) {\n tokenToOutcome.set(tokenId, outcome);\n }\n }\n } catch {\n tokenToOutcome = undefined;\n }\n }\n\n return this.withRetry(async () => {\n const response = await this.request<{ data?: RawOrder[] } | RawOrder[]>(\n 'GET',\n endpoint,\n queryParams,\n true\n );\n\n const ordersData = Array.isArray(response) ? response : (response.data ?? []);\n\n return ordersData.map((o) => this.parseOrder(o, tokenToOutcome));\n });\n }\n\n async fetchPositions(marketId?: string): Promise<Position[]> {\n await this.ensureAuth();\n\n return this.withRetry(async () => {\n const response = await this.request<{ clob?: RawPosition[] }>(\n 'GET',\n '/portfolio/positions',\n undefined,\n true\n );\n\n const clobPositions = response.clob ?? [];\n const positions: Position[] = [];\n\n for (const posData of clobPositions) {\n const parsed = this.parsePortfolioPositions(posData);\n for (const pos of parsed) {\n if (marketId && pos.marketId !== marketId) {\n continue;\n }\n positions.push(pos);\n }\n }\n\n return positions;\n });\n }\n\n async fetchBalance(): Promise<Record<string, number>> {\n await this.ensureAuth();\n\n if (!this.address) {\n throw new AuthenticationError('Wallet address not available');\n }\n\n const usdcAddress = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';\n const baseRpc = 'https://mainnet.base.org';\n\n try {\n const data = `0x70a08231000000000000000000000000${this.address.slice(2).toLowerCase()}`;\n\n const response = await fetch(baseRpc, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n jsonrpc: '2.0',\n method: 'eth_call',\n params: [{ to: usdcAddress, data }, 'latest'],\n id: 1,\n }),\n });\n\n const result = (await response.json()) as { result?: string };\n const balanceHex = result.result ?? '0x0';\n const balanceWei = Number.parseInt(balanceHex, 16);\n const usdcBalance = balanceWei / 10 ** 6;\n\n return { USDC: usdcBalance };\n } catch {\n try {\n const response = await this.request<{ balance?: number; allowance?: number }>(\n 'GET',\n '/portfolio/trading/allowance',\n { type: 'clob' },\n true\n );\n const balance = response.balance ?? response.allowance ?? 0;\n return { USDC: balance };\n } catch {\n return { USDC: 0 };\n }\n }\n }\n\n override describe() {\n return {\n id: this.id,\n name: this.name,\n has: {\n fetchMarkets: true,\n fetchMarket: true,\n createOrder: true,\n cancelOrder: true,\n fetchOrder: true,\n fetchOpenOrders: true,\n fetchPositions: true,\n fetchBalance: true,\n websocket: true,\n },\n };\n }\n}\n\nexport {\n LimitlessWebSocket,\n LimitlessUserWebSocket,\n type LimitlessWsConfig,\n type LimitlessOrderbookUpdate,\n type LimitlessPriceUpdate,\n type LimitlessPositionUpdate,\n type LimitlessTrade,\n} from './limitless-ws.js';\n","import { Wallet } from 'ethers';\nimport { Exchange, type ExchangeConfig } from '../../core/exchange.js';\nimport {\n AuthenticationError,\n ExchangeError,\n InvalidOrder,\n MarketNotFound,\n NetworkError,\n} from '../../errors/index.js';\nimport {\n type CreateOrderParams,\n type FetchMarketsParams,\n type Market,\n type Order,\n OrderSide,\n OrderStatus,\n type Position,\n} from '../../types/index.js';\n\nconst BASE_URL = 'https://proxy.opinion.trade:8443';\nconst CHAIN_ID = 56;\n\ninterface OpinionConfig extends ExchangeConfig {\n apiKey?: string;\n multiSigAddr?: string;\n chainId?: number;\n host?: string;\n}\n\ninterface ApiResponse<T = unknown> {\n errno: number;\n errmsg?: string;\n result?: {\n data?: T;\n list?: T[];\n };\n}\n\ninterface RawMarket {\n market_id?: number;\n topic_id?: number;\n id?: number;\n market_title?: string;\n title?: string;\n question?: string;\n yes_token_id?: string;\n no_token_id?: string;\n yes_label?: string;\n no_label?: string;\n volume?: string | number;\n liquidity?: number;\n cutoff_at?: number;\n cutoff_time?: number;\n status?: string;\n condition_id?: string;\n child_markets?: RawMarket[];\n description?: string;\n rules?: string;\n category?: string;\n image_url?: string;\n}\n\ninterface RawOrder {\n order_id?: string;\n id?: string;\n orderID?: string;\n topic_id?: string;\n market_id?: string;\n side?: number | string;\n side_enum?: string;\n price?: number;\n order_shares?: number;\n maker_amount?: number;\n size?: number;\n filled_shares?: number;\n matched_amount?: number;\n filled?: number;\n status?: number | string;\n outcome?: string;\n created_at?: number | string;\n updated_at?: number | string;\n}\n\ninterface RawPosition {\n topic_id?: string;\n market_id?: string;\n outcome?: string;\n token_name?: string;\n shares_owned?: number;\n size?: number;\n balance?: number;\n avg_entry_price?: number;\n average_price?: number;\n current_price?: number;\n price?: number;\n}\n\ninterface RawOrderbookLevel {\n price?: number | string;\n size?: number | string;\n}\n\nexport class Opinion extends Exchange {\n readonly id = 'opinion';\n readonly name = 'Opinion';\n\n private readonly apiKey: string;\n private readonly multiSigAddr: string;\n private readonly chainId: number;\n private readonly host: string;\n private wallet: Wallet | null = null;\n\n constructor(config: OpinionConfig = {}) {\n super(config);\n this.apiKey = config.apiKey ?? '';\n this.multiSigAddr = config.multiSigAddr ?? '';\n this.chainId = config.chainId ?? CHAIN_ID;\n this.host = config.host ?? BASE_URL;\n\n if (config.privateKey) {\n this.wallet = new Wallet(config.privateKey);\n }\n }\n\n private async request<T>(\n method: string,\n endpoint: string,\n params?: Record<string, unknown>\n ): Promise<ApiResponse<T>> {\n const url = new URL(`${this.host}${endpoint}`);\n\n if (method === 'GET' && params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined && value !== null) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n if (this.apiKey) {\n headers.Authorization = `Bearer ${this.apiKey}`;\n headers['X-API-Key'] = this.apiKey;\n }\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n };\n\n if (method !== 'GET' && params) {\n fetchOptions.body = JSON.stringify(params);\n }\n\n const response = await fetch(url.toString(), fetchOptions);\n\n if (!response.ok) {\n if (response.status === 429) {\n throw new NetworkError('Rate limited');\n }\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError('Authentication failed');\n }\n throw new NetworkError(`HTTP ${response.status}`);\n }\n\n return response.json() as Promise<ApiResponse<T>>;\n }\n\n private ensureAuth(): void {\n if (!this.apiKey || !this.wallet || !this.multiSigAddr) {\n throw new AuthenticationError('API key, private key, and multiSigAddr required');\n }\n }\n\n private parseMarket(data: RawMarket, _fetchPrices = false): Market {\n const marketId = String(data.market_id ?? data.topic_id ?? data.id ?? '');\n const question = data.market_title ?? data.title ?? data.question ?? '';\n\n let outcomes: string[] = [];\n const tokenIds: string[] = [];\n const prices: Record<string, number> = {};\n\n const yesTokenId = String(data.yes_token_id ?? '');\n const noTokenId = String(data.no_token_id ?? '');\n const yesLabel = data.yes_label ?? 'Yes';\n const noLabel = data.no_label ?? 'No';\n\n const childMarkets = data.child_markets ?? [];\n\n if (yesTokenId && noTokenId) {\n outcomes = [yesLabel, noLabel];\n tokenIds.push(yesTokenId, noTokenId);\n } else if (childMarkets.length > 0) {\n for (const child of childMarkets) {\n const childTitle = child.market_title ?? '';\n const childYesToken = String(child.yes_token_id ?? '');\n if (childTitle && childYesToken) {\n outcomes.push(childTitle);\n tokenIds.push(childYesToken);\n }\n }\n }\n\n if (outcomes.length === 0) {\n outcomes = ['Yes', 'No'];\n }\n\n let closeTime: Date | undefined;\n const cutoffTime = data.cutoff_at ?? data.cutoff_time;\n if (cutoffTime && typeof cutoffTime === 'number' && cutoffTime > 0) {\n closeTime = new Date(cutoffTime * 1000);\n }\n\n const volume =\n typeof data.volume === 'string' ? Number.parseFloat(data.volume) : (data.volume ?? 0);\n const liquidity = data.liquidity ?? 0;\n const tickSize = 0.001;\n\n const metadata: Record<string, unknown> = {\n topic_id: marketId,\n market_id: marketId,\n condition_id: data.condition_id ?? '',\n status: data.status ?? '',\n chain_id: this.chainId,\n clobTokenIds: tokenIds,\n token_ids: tokenIds,\n tokens: Object.fromEntries(outcomes.map((o, i) => [o, tokenIds[i] ?? ''])),\n description: data.description ?? data.rules ?? '',\n category: data.category ?? '',\n image_url: data.image_url ?? '',\n minimum_tick_size: tickSize,\n closed: data.status === 'RESOLVED',\n };\n\n return {\n id: marketId,\n question,\n outcomes,\n closeTime,\n volume,\n liquidity,\n prices,\n tickSize,\n description: String(metadata.description ?? ''),\n metadata,\n };\n }\n\n private parseOrder(data: RawOrder): Order {\n const orderId = String(data.order_id ?? data.id ?? data.orderID ?? '');\n const marketId = String(data.topic_id ?? data.market_id ?? '');\n\n let side: OrderSide;\n if (data.side_enum) {\n side = data.side_enum.toLowerCase() === 'buy' ? OrderSide.BUY : OrderSide.SELL;\n } else if (typeof data.side === 'string') {\n side = data.side.toLowerCase() === 'buy' ? OrderSide.BUY : OrderSide.SELL;\n } else {\n side = data.side === 1 ? OrderSide.BUY : OrderSide.SELL;\n }\n\n const statusVal = data.status;\n let status: OrderStatus;\n if (typeof statusVal === 'number') {\n const statusMap: Record<number, OrderStatus> = {\n 0: OrderStatus.PENDING,\n 1: OrderStatus.OPEN,\n 2: OrderStatus.FILLED,\n 3: OrderStatus.PARTIALLY_FILLED,\n 4: OrderStatus.CANCELLED,\n };\n status = statusMap[statusVal] ?? OrderStatus.OPEN;\n } else {\n const strStatus = String(statusVal).toLowerCase();\n if (strStatus === 'filled' || strStatus === 'matched') {\n status = OrderStatus.FILLED;\n } else if (strStatus === 'cancelled' || strStatus === 'canceled') {\n status = OrderStatus.CANCELLED;\n } else if (strStatus === 'partially_filled') {\n status = OrderStatus.PARTIALLY_FILLED;\n } else if (strStatus === 'pending') {\n status = OrderStatus.PENDING;\n } else {\n status = OrderStatus.OPEN;\n }\n }\n\n const price = data.price ?? 0;\n const size = data.order_shares ?? data.maker_amount ?? data.size ?? 0;\n const filled = data.filled_shares ?? data.matched_amount ?? data.filled ?? 0;\n\n let createdAt = new Date();\n if (data.created_at) {\n createdAt =\n typeof data.created_at === 'number'\n ? new Date(data.created_at * 1000)\n : new Date(data.created_at);\n }\n\n return {\n id: orderId,\n marketId,\n outcome: data.outcome ?? '',\n side,\n price,\n size,\n filled,\n status,\n createdAt,\n };\n }\n\n private parsePosition(data: RawPosition): Position {\n return {\n marketId: String(data.topic_id ?? data.market_id ?? ''),\n outcome: data.outcome ?? data.token_name ?? '',\n size: data.shares_owned ?? data.size ?? data.balance ?? 0,\n averagePrice: data.avg_entry_price ?? data.average_price ?? 0,\n currentPrice: data.current_price ?? data.price ?? 0,\n };\n }\n\n async fetchMarkets(params?: FetchMarketsParams): Promise<Market[]> {\n return this.withRetry(async () => {\n const queryParams: Record<string, unknown> = {\n topic_type: 'ALL',\n status: params?.active === false ? 'ALL' : 'ACTIVATED',\n page: params?.offset ? Math.floor(params.offset / 20) + 1 : 1,\n limit: Math.min(params?.limit ?? 20, 20),\n };\n\n const response = await this.request<RawMarket>('GET', '/api/v1/markets', queryParams);\n\n if (response.errno !== 0) {\n throw new ExchangeError(`Failed to fetch markets: ${response.errmsg}`);\n }\n\n const marketsList = response.result?.list ?? [];\n const markets = marketsList.map((m) => this.parseMarket(m));\n\n if (params?.limit) {\n return markets.slice(0, params.limit);\n }\n return markets;\n });\n }\n\n async fetchMarket(marketId: string): Promise<Market> {\n return this.withRetry(async () => {\n const response = await this.request<RawMarket>('GET', `/api/v1/markets/${marketId}`);\n\n if (response.errno !== 0 || !response.result?.data) {\n throw new MarketNotFound(`Market ${marketId} not found`);\n }\n\n return this.parseMarket(response.result.data, true);\n });\n }\n\n async getOrderbook(tokenId: string): Promise<{\n bids: Array<{ price: string; size: string }>;\n asks: Array<{ price: string; size: string }>;\n }> {\n return this.withRetry(async () => {\n const response = await this.request<{\n bids?: RawOrderbookLevel[];\n asks?: RawOrderbookLevel[];\n }>('GET', '/api/v1/orderbook', { token_id: tokenId });\n\n const bids: Array<{ price: string; size: string }> = [];\n const asks: Array<{ price: string; size: string }> = [];\n\n if (response.errno === 0 && response.result) {\n const result = response.result as unknown as {\n bids?: RawOrderbookLevel[];\n asks?: RawOrderbookLevel[];\n };\n\n for (const bid of result.bids ?? []) {\n const price = Number(bid.price);\n const size = Number(bid.size);\n if (price > 0 && size > 0) {\n bids.push({ price: String(price), size: String(size) });\n }\n }\n\n for (const ask of result.asks ?? []) {\n const price = Number(ask.price);\n const size = Number(ask.size);\n if (price > 0 && size > 0) {\n asks.push({ price: String(price), size: String(size) });\n }\n }\n\n bids.sort((a, b) => Number(b.price) - Number(a.price));\n asks.sort((a, b) => Number(a.price) - Number(b.price));\n }\n\n return { bids, asks };\n });\n }\n\n async createOrder(params: CreateOrderParams): Promise<Order> {\n this.ensureAuth();\n\n const tokenId = params.tokenId ?? (params.params?.token_id as string | undefined);\n if (!tokenId) {\n throw new InvalidOrder('token_id required in params');\n }\n\n if (params.price <= 0 || params.price >= 1) {\n throw new InvalidOrder('Price must be between 0 and 1');\n }\n\n return this.withRetry(async () => {\n const orderData = {\n market_id: Number(params.marketId),\n token_id: tokenId,\n side: params.side === OrderSide.BUY ? 1 : 2,\n price: String(params.price),\n size: String(params.size),\n order_type: 'LIMIT',\n };\n\n const response = await this.request<{ order_id?: string }>(\n 'POST',\n '/api/v1/orders',\n orderData\n );\n\n if (response.errno !== 0) {\n throw new InvalidOrder(`Order failed: ${response.errmsg}`);\n }\n\n const orderId = response.result?.data?.order_id ?? '';\n\n return {\n id: orderId,\n marketId: params.marketId,\n outcome: params.outcome,\n side: params.side,\n price: params.price,\n size: params.size,\n filled: 0,\n status: OrderStatus.OPEN,\n createdAt: new Date(),\n };\n });\n }\n\n async cancelOrder(orderId: string, marketId?: string): Promise<Order> {\n this.ensureAuth();\n\n return this.withRetry(async () => {\n const response = await this.request('POST', `/api/v1/orders/${orderId}/cancel`);\n\n if (response.errno !== 0) {\n throw new ExchangeError(`Failed to cancel order: ${response.errmsg}`);\n }\n\n return {\n id: orderId,\n marketId: marketId ?? '',\n outcome: '',\n side: OrderSide.BUY,\n price: 0,\n size: 0,\n filled: 0,\n status: OrderStatus.CANCELLED,\n createdAt: new Date(),\n };\n });\n }\n\n async fetchOrder(orderId: string, _marketId?: string): Promise<Order> {\n this.ensureAuth();\n\n return this.withRetry(async () => {\n const response = await this.request<RawOrder>('GET', `/api/v1/orders/${orderId}`);\n\n if (response.errno !== 0 || !response.result?.data) {\n throw new ExchangeError(`Order ${orderId} not found`);\n }\n\n return this.parseOrder(response.result.data);\n });\n }\n\n async fetchOpenOrders(marketId?: string): Promise<Order[]> {\n this.ensureAuth();\n\n return this.withRetry(async () => {\n const params: Record<string, unknown> = {\n status: '1',\n page: 1,\n limit: 100,\n };\n\n if (marketId) {\n params.market_id = Number(marketId);\n }\n\n const response = await this.request<RawOrder>('GET', '/api/v1/orders', params);\n\n if (response.errno !== 0) {\n return [];\n }\n\n const ordersList = response.result?.list ?? [];\n return ordersList.map((o) => this.parseOrder(o));\n });\n }\n\n async fetchPositions(marketId?: string): Promise<Position[]> {\n this.ensureAuth();\n\n return this.withRetry(async () => {\n const params: Record<string, unknown> = {\n page: 1,\n limit: 100,\n };\n\n if (marketId) {\n params.market_id = Number(marketId);\n }\n\n const response = await this.request<RawPosition>('GET', '/api/v1/positions', params);\n\n if (response.errno !== 0) {\n return [];\n }\n\n const positionsList = response.result?.list ?? [];\n return positionsList.map((p) => this.parsePosition(p));\n });\n }\n\n async fetchBalance(): Promise<Record<string, number>> {\n this.ensureAuth();\n\n return this.withRetry(async () => {\n const response = await this.request<{ balances?: Array<{ available_balance?: number }> }>(\n 'GET',\n '/api/v1/balances'\n );\n\n if (response.errno !== 0) {\n throw new ExchangeError(`Failed to fetch balance: ${response.errmsg}`);\n }\n\n const result = response.result as unknown as {\n balances?: Array<{ available_balance?: number }>;\n };\n const balances = result?.balances ?? [];\n\n if (balances.length > 0) {\n const balance = balances[0]?.available_balance ?? 0;\n return { USDC: balance };\n }\n\n return { USDC: 0 };\n });\n }\n\n override describe() {\n return {\n id: this.id,\n name: this.name,\n has: {\n fetchMarkets: true,\n fetchMarket: true,\n createOrder: true,\n cancelOrder: true,\n fetchOrder: true,\n fetchOpenOrders: true,\n fetchPositions: true,\n fetchBalance: true,\n websocket: false,\n },\n };\n }\n}\n","import { AssetType, ClobClient, Side } from '@polymarket/clob-client';\nimport { Wallet } from 'ethers';\nimport { Exchange, type ExchangeConfig } from '../../core/exchange.js';\nimport {\n AuthenticationError,\n ExchangeError,\n InvalidOrder,\n MarketNotFound,\n NetworkError,\n} from '../../errors/index.js';\nimport {\n type CreateOrderParams,\n type CryptoHourlyMarket,\n type FetchMarketsParams,\n type Market,\n MarketUtils,\n type Order,\n OrderSide,\n OrderStatus,\n type Position,\n type PriceHistoryInterval,\n type PricePoint,\n type PublicTrade,\n type Tag,\n normalizeTokenSymbol,\n} from '../../types/index.js';\n\nconst BASE_URL = 'https://gamma-api.polymarket.com';\nconst CLOB_URL = 'https://clob.polymarket.com';\n\ninterface PolymarketConfig extends ExchangeConfig {\n chainId?: number;\n signatureType?: number;\n}\n\nexport class Polymarket extends Exchange {\n readonly id = 'polymarket';\n readonly name = 'Polymarket';\n\n private clobClient: ClobClient | null = null;\n private wallet: Wallet | null = null;\n private address: string | null = null;\n\n constructor(config: PolymarketConfig = {}) {\n super(config);\n\n if (config.privateKey) {\n this.initializeClobClient(config);\n }\n }\n\n override describe() {\n const base = super.describe();\n return { ...base, has: { ...base.has, websocket: true } };\n }\n\n private initializeClobClient(config: PolymarketConfig): void {\n try {\n const chainId = config.chainId ?? 137;\n const signatureType = config.signatureType ?? 2;\n\n if (!config.privateKey) {\n return;\n }\n this.wallet = new Wallet(config.privateKey);\n this.clobClient = new ClobClient(\n CLOB_URL,\n chainId,\n this.wallet,\n undefined,\n signatureType,\n config.funder\n );\n\n this.address = this.wallet.address;\n } catch (error) {\n throw new AuthenticationError(`Failed to initialize CLOB client: ${error}`);\n }\n }\n\n async fetchMarkets(params?: FetchMarketsParams): Promise<Market[]> {\n return this.withRetry(async () => {\n const response = await fetch(`${CLOB_URL}/sampling-markets`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to fetch markets: ${response.status}`);\n }\n\n const result = (await response.json()) as { data?: unknown[] };\n const marketsData = result.data ?? (Array.isArray(result) ? result : []);\n\n let markets = marketsData\n .map((item) => this.parseSamplingMarket(item as Record<string, unknown>))\n .filter((m): m is Market => m !== null);\n\n if (params?.active || !params?.closed) {\n markets = markets.filter((m) => this.isMarketOpen(m));\n }\n\n if (params?.limit) {\n markets = markets.slice(0, params.limit);\n }\n\n return markets;\n });\n }\n\n async fetchMarket(marketId: string): Promise<Market> {\n return this.withRetry(async () => {\n const response = await fetch(`${BASE_URL}/markets/${marketId}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (response.status === 404) {\n throw new MarketNotFound(`Market ${marketId} not found`);\n }\n\n if (!response.ok) {\n throw new NetworkError(`Failed to fetch market: ${response.status}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n return this.parseGammaMarket(data);\n });\n }\n\n async fetchMarketsBySlug(slugOrUrl: string): Promise<Market[]> {\n const slug = this.parseMarketIdentifier(slugOrUrl);\n if (!slug) throw new Error('Empty slug provided');\n\n return this.withRetry(async () => {\n const response = await fetch(`${BASE_URL}/events?slug=${slug}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (response.status === 404) {\n throw new MarketNotFound(`Event not found: ${slug}`);\n }\n\n if (!response.ok) {\n throw new ExchangeError(`Failed to fetch event: ${response.status}`);\n }\n\n const eventData = (await response.json()) as Array<{ markets?: unknown[] }>;\n if (!eventData.length) {\n throw new MarketNotFound(`Event not found: ${slug}`);\n }\n\n const event = eventData[0];\n const marketsData = event?.markets ?? [];\n\n return marketsData.map((m) => this.parseGammaMarket(m as Record<string, unknown>));\n });\n }\n\n async createOrder(params: CreateOrderParams): Promise<Order> {\n const client = this.clobClient;\n if (!client) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n const tokenId = params.tokenId ?? params.params?.token_id;\n if (!tokenId) {\n throw new InvalidOrder('token_id required in params');\n }\n\n return this.withRetry(async () => {\n const signedOrder = await client.createOrder({\n tokenID: tokenId as string,\n price: params.price,\n size: params.size,\n side: params.side === OrderSide.BUY ? Side.BUY : Side.SELL,\n });\n\n const result = (await client.postOrder(signedOrder)) as Record<string, unknown>;\n const orderId = (result.orderID as string) ?? '';\n const statusStr = (result.status as string) ?? 'LIVE';\n\n return {\n id: orderId,\n marketId: params.marketId,\n outcome: params.outcome,\n side: params.side,\n price: params.price,\n size: params.size,\n filled: 0,\n status: this.parseOrderStatus(statusStr),\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n });\n }\n\n async cancelOrder(orderId: string, marketId?: string): Promise<Order> {\n const client = this.clobClient;\n if (!client) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n return this.withRetry(async () => {\n await client.cancelOrder({ orderID: orderId });\n\n return {\n id: orderId,\n marketId: marketId ?? '',\n outcome: '',\n side: OrderSide.BUY,\n price: 0,\n size: 0,\n filled: 0,\n status: OrderStatus.CANCELLED,\n createdAt: new Date(),\n updatedAt: new Date(),\n };\n });\n }\n\n async fetchOrder(orderId: string, _marketId?: string): Promise<Order> {\n const client = this.clobClient;\n if (!client) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n return this.withRetry(async () => {\n const data = await client.getOrder(orderId);\n return this.parseOrder(data as unknown as Record<string, unknown>);\n });\n }\n\n async fetchOpenOrders(marketId?: string): Promise<Order[]> {\n const client = this.clobClient;\n if (!client) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n return this.withRetry(async () => {\n const response = await client.getOpenOrders();\n\n let orders = response as unknown as Array<Record<string, unknown>>;\n\n if (marketId) {\n orders = orders.filter((o) => o.market === marketId);\n }\n\n return orders.map((o) => this.parseOrder(o));\n });\n }\n\n async fetchPositions(_marketId?: string): Promise<Position[]> {\n if (!this.clobClient) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n return [];\n }\n\n async fetchBalance(): Promise<Record<string, number>> {\n const client = this.clobClient;\n if (!client) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n return this.withRetry(async () => {\n const balanceData = (await client.getBalanceAllowance({\n asset_type: AssetType.COLLATERAL,\n })) as { balance?: string };\n\n const balance = balanceData.balance ? Number.parseFloat(balanceData.balance) / 1e6 : 0;\n\n return { USDC: balance };\n });\n }\n\n async getOrderbook(tokenId: string): Promise<{\n bids: Array<{ price: string; size: string }>;\n asks: Array<{ price: string; size: string }>;\n }> {\n return this.withRetry(async () => {\n const response = await fetch(`${CLOB_URL}/book?token_id=${tokenId}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n return { bids: [], asks: [] };\n }\n\n return response.json() as Promise<{\n bids: Array<{ price: string; size: string }>;\n asks: Array<{ price: string; size: string }>;\n }>;\n });\n }\n\n private parseMarketIdentifier(identifier: string): string {\n if (!identifier) return '';\n\n if (identifier.startsWith('http')) {\n const url = identifier.split('?')[0] ?? '';\n const parts = url.replace(/\\/$/, '').split('/');\n const eventIndex = parts.indexOf('event');\n if (eventIndex !== -1 && eventIndex + 1 < parts.length) {\n return parts[eventIndex + 1] ?? '';\n }\n return parts[parts.length - 1] ?? '';\n }\n\n return identifier;\n }\n\n private parseSamplingMarket(data: Record<string, unknown>): Market | null {\n const conditionId = data.condition_id as string | undefined;\n if (!conditionId) return null;\n\n const tokens = (data.tokens as Array<Record<string, unknown>>) ?? [];\n const tokenIds: string[] = [];\n const outcomes: string[] = [];\n const prices: Record<string, number> = {};\n\n for (const token of tokens) {\n if (token.token_id) tokenIds.push(String(token.token_id));\n if (token.outcome) outcomes.push(String(token.outcome));\n if (token.outcome && token.price != null) {\n prices[String(token.outcome)] = Number(token.price);\n }\n }\n\n const tickSize = (data.minimum_tick_size as number) ?? 0.01;\n\n return {\n id: conditionId,\n question: (data.question as string) ?? '',\n outcomes: outcomes.length ? outcomes : ['Yes', 'No'],\n closeTime: undefined,\n volume: 0,\n liquidity: 0,\n prices,\n tickSize,\n description: (data.description as string) ?? '',\n metadata: {\n ...data,\n clobTokenIds: tokenIds,\n conditionId,\n minimumTickSize: tickSize,\n },\n };\n }\n\n private parseGammaMarket(data: Record<string, unknown>): Market {\n let outcomes = (data.outcomes as string[]) ?? [];\n if (typeof data.outcomes === 'string') {\n try {\n outcomes = JSON.parse(data.outcomes) as string[];\n } catch {\n outcomes = [];\n }\n }\n\n let pricesList: unknown[] = [];\n if (data.outcomePrices != null) {\n if (typeof data.outcomePrices === 'string') {\n try {\n pricesList = JSON.parse(data.outcomePrices) as unknown[];\n } catch {\n pricesList = [];\n }\n } else if (Array.isArray(data.outcomePrices)) {\n pricesList = data.outcomePrices;\n }\n }\n\n const prices: Record<string, number> = {};\n for (let i = 0; i < outcomes.length && i < pricesList.length; i++) {\n const outcome = outcomes[i];\n const price = pricesList[i];\n if (outcome && price != null) {\n const priceVal = Number(price);\n if (priceVal > 0) {\n prices[outcome] = priceVal;\n }\n }\n }\n\n const closeTime = this.parseDateTime(data.endDate);\n const volume = Number(data.volumeNum ?? data.volume ?? 0);\n const liquidity = Number(data.liquidityNum ?? data.liquidity ?? 0);\n const tickSize = (data.minimum_tick_size as number) ?? 0.01;\n\n let clobTokenIds = data.clobTokenIds as string[] | string | undefined;\n if (typeof clobTokenIds === 'string') {\n try {\n clobTokenIds = JSON.parse(clobTokenIds) as string[];\n } catch {\n clobTokenIds = undefined;\n }\n }\n\n return {\n id: (data.id as string) ?? '',\n question: (data.question as string) ?? '',\n outcomes,\n closeTime,\n volume,\n liquidity,\n prices,\n tickSize,\n description: (data.description as string) ?? '',\n metadata: {\n ...data,\n clobTokenIds,\n minimumTickSize: tickSize,\n },\n };\n }\n\n private parseOrder(data: Record<string, unknown>): Order {\n const orderId = (data.id as string) ?? (data.orderID as string) ?? '';\n const size = Number(data.size ?? data.original_size ?? data.amount ?? 0);\n const filled = Number(data.filled ?? data.matched ?? 0);\n\n return {\n id: orderId,\n marketId: (data.market_id as string) ?? (data.market as string) ?? '',\n outcome: (data.outcome as string) ?? '',\n side:\n ((data.side as string) ?? 'buy').toLowerCase() === 'buy' ? OrderSide.BUY : OrderSide.SELL,\n price: Number(data.price ?? 0),\n size,\n filled,\n status: this.parseOrderStatus(data.status as string),\n createdAt: this.parseDateTime(data.created_at) ?? new Date(),\n updatedAt: this.parseDateTime(data.updated_at),\n };\n }\n\n private parseOrderStatus(status: string | undefined): OrderStatus {\n const statusMap: Record<string, OrderStatus> = {\n pending: OrderStatus.PENDING,\n open: OrderStatus.OPEN,\n live: OrderStatus.OPEN,\n filled: OrderStatus.FILLED,\n matched: OrderStatus.FILLED,\n partially_filled: OrderStatus.PARTIALLY_FILLED,\n cancelled: OrderStatus.CANCELLED,\n canceled: OrderStatus.CANCELLED,\n rejected: OrderStatus.REJECTED,\n };\n\n return statusMap[(status ?? '').toLowerCase()] ?? OrderStatus.OPEN;\n }\n\n private isMarketOpen(market: Market): boolean {\n if (market.metadata.closed) return false;\n if (!market.closeTime) return true;\n return new Date() < market.closeTime;\n }\n\n get walletAddress(): string | null {\n return this.address;\n }\n\n async fetchTokenIds(conditionId: string): Promise<string[]> {\n return this.withRetry(async () => {\n const response = await fetch(`${CLOB_URL}/simplified-markets`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new ExchangeError(`Failed to fetch markets: ${response.status}`);\n }\n\n const result = (await response.json()) as { data?: Array<Record<string, unknown>> };\n const markets = result.data ?? [];\n\n for (const market of markets) {\n const marketId = (market.condition_id as string) ?? (market.id as string);\n if (marketId === conditionId) {\n const tokens = (market.tokens as Array<{ token_id?: string }>) ?? [];\n return tokens.map((t) => String(t.token_id ?? '')).filter(Boolean);\n }\n }\n\n throw new ExchangeError(`Token IDs not found for market ${conditionId}`);\n });\n }\n\n async fetchPositionsForMarket(market: Market): Promise<Position[]> {\n const client = this.clobClient;\n if (!client) {\n throw new AuthenticationError('CLOB client not initialized. Private key required.');\n }\n\n const positions: Position[] = [];\n const tokenIds = MarketUtils.getTokenIds(market);\n\n if (tokenIds.length < 2) return positions;\n\n for (let i = 0; i < tokenIds.length; i++) {\n const tokenId = tokenIds[i];\n if (!tokenId) continue;\n\n try {\n const balanceData = (await client.getBalanceAllowance({\n asset_type: AssetType.CONDITIONAL,\n token_id: tokenId,\n })) as { balance?: string };\n\n const balance = balanceData.balance ? Number.parseFloat(balanceData.balance) / 1e6 : 0;\n\n if (balance > 0) {\n const outcome = market.outcomes[i] ?? (i === 0 ? 'Yes' : 'No');\n const currentPrice = market.prices[outcome] ?? 0;\n\n positions.push({\n marketId: market.id,\n outcome,\n size: balance,\n averagePrice: 0,\n currentPrice,\n });\n }\n } catch {}\n }\n\n return positions;\n }\n\n async fetchPriceHistory(\n marketOrId: Market | string,\n options: {\n outcome?: number | string;\n interval?: PriceHistoryInterval;\n fidelity?: number;\n } = {}\n ): Promise<PricePoint[]> {\n const { outcome = 0, interval = '1m', fidelity = 10 } = options;\n\n const market = typeof marketOrId === 'string' ? await this.fetchMarket(marketOrId) : marketOrId;\n const tokenIds = MarketUtils.getTokenIds(market);\n\n let outcomeIndex: number;\n if (typeof outcome === 'number') {\n outcomeIndex = outcome;\n } else {\n outcomeIndex = market.outcomes.indexOf(outcome);\n if (outcomeIndex === -1) outcomeIndex = 0;\n }\n\n const tokenId = tokenIds[outcomeIndex];\n if (!tokenId) {\n throw new ExchangeError('Cannot fetch price history without token ID');\n }\n\n return this.withRetry(async () => {\n const url = `${CLOB_URL}/prices-history?market=${tokenId}&interval=${interval}&fidelity=${fidelity}`;\n const response = await fetch(url, { signal: AbortSignal.timeout(this.timeout) });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to fetch price history: ${response.status}`);\n }\n\n const data = (await response.json()) as { history?: Array<{ t?: number; p?: number }> };\n const history = data.history ?? [];\n\n return history\n .filter((h) => h.t != null && h.p != null)\n .map((h) => ({\n timestamp: new Date((h.t ?? 0) * 1000),\n price: h.p ?? 0,\n raw: h as Record<string, unknown>,\n }))\n .sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());\n });\n }\n\n async searchMarkets(\n options: {\n limit?: number;\n offset?: number;\n order?: string;\n ascending?: boolean;\n closed?: boolean;\n tagId?: string;\n query?: string;\n binary?: boolean;\n minLiquidity?: number;\n } = {}\n ): Promise<Market[]> {\n const {\n limit = 200,\n offset = 0,\n order = 'volume',\n ascending = false,\n closed = false,\n tagId,\n query,\n binary,\n minLiquidity = 0,\n } = options;\n\n return this.withRetry(async () => {\n const params = new URLSearchParams({\n limit: String(limit),\n offset: String(offset),\n order,\n ascending: String(ascending),\n closed: String(closed),\n });\n\n if (tagId) params.set('tag_id', tagId);\n\n const response = await fetch(`${BASE_URL}/markets?${params}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to search markets: ${response.status}`);\n }\n\n const data = (await response.json()) as Array<Record<string, unknown>>;\n let markets = data.map((m) => this.parseGammaMarket(m));\n\n if (binary !== undefined) {\n markets = markets.filter((m) => MarketUtils.isBinary(m) === binary);\n }\n\n if (minLiquidity > 0) {\n markets = markets.filter((m) => m.liquidity >= minLiquidity);\n }\n\n if (query) {\n const q = query.toLowerCase();\n markets = markets.filter(\n (m) => m.question.toLowerCase().includes(q) || m.description.toLowerCase().includes(q)\n );\n }\n\n return markets;\n });\n }\n\n async fetchPublicTrades(\n options: {\n market?: Market | string;\n limit?: number;\n offset?: number;\n side?: 'BUY' | 'SELL';\n user?: string;\n } = {}\n ): Promise<PublicTrade[]> {\n const { limit = 100, offset = 0, side, user } = options;\n\n let conditionId: string | undefined;\n if (options.market) {\n conditionId =\n typeof options.market === 'string'\n ? options.market\n : ((options.market.metadata.conditionId as string) ?? options.market.id);\n }\n\n return this.withRetry(async () => {\n const params = new URLSearchParams({\n limit: String(limit),\n offset: String(offset),\n takerOnly: 'true',\n });\n\n if (conditionId) params.set('market', conditionId);\n if (side) params.set('side', side);\n if (user) params.set('user', user);\n\n const response = await fetch(`https://data-api.polymarket.com/trades?${params}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new NetworkError(`Failed to fetch trades: ${response.status}`);\n }\n\n const data = (await response.json()) as Array<Record<string, unknown>>;\n\n return data.map((row) => {\n const ts = row.timestamp;\n let timestamp: Date;\n if (typeof ts === 'number') {\n timestamp = new Date(ts * 1000);\n } else if (typeof ts === 'string' && /^\\d+$/.test(ts)) {\n timestamp = new Date(Number.parseInt(ts, 10) * 1000);\n } else {\n timestamp = new Date(0);\n }\n\n return {\n proxyWallet: String(row.proxyWallet ?? ''),\n side: String(row.side ?? ''),\n asset: String(row.asset ?? ''),\n conditionId: String(row.conditionId ?? ''),\n size: Number(row.size ?? 0),\n price: Number(row.price ?? 0),\n timestamp,\n title: row.title as string | undefined,\n slug: row.slug as string | undefined,\n icon: row.icon as string | undefined,\n eventSlug: row.eventSlug as string | undefined,\n outcome: row.outcome as string | undefined,\n outcomeIndex: row.outcomeIndex as number | undefined,\n name: row.name as string | undefined,\n pseudonym: row.pseudonym as string | undefined,\n bio: row.bio as string | undefined,\n profileImage: row.profileImage as string | undefined,\n profileImageOptimized: row.profileImageOptimized as string | undefined,\n transactionHash: row.transactionHash as string | undefined,\n };\n });\n });\n }\n\n async getTagBySlug(slug: string): Promise<Tag> {\n if (!slug) throw new Error('slug must be a non-empty string');\n\n return this.withRetry(async () => {\n const response = await fetch(`${BASE_URL}/tags/slug/${slug}`, {\n signal: AbortSignal.timeout(this.timeout),\n });\n\n if (!response.ok) {\n throw new ExchangeError(`Failed to fetch tag: ${response.status}`);\n }\n\n const data = (await response.json()) as Record<string, unknown>;\n\n return {\n id: String(data.id ?? ''),\n label: data.label as string | undefined,\n slug: data.slug as string | undefined,\n forceShow: data.forceShow as boolean | undefined,\n forceHide: data.forceHide as boolean | undefined,\n isCarousel: data.isCarousel as boolean | undefined,\n publishedAt: data.publishedAt as string | undefined,\n createdAt: data.createdAt as string | undefined,\n updatedAt: (data.UpdatedAt ?? data.updatedAt) as string | undefined,\n raw: data,\n };\n });\n }\n\n async findCryptoHourlyMarket(\n options: {\n tokenSymbol?: string;\n minLiquidity?: number;\n limit?: number;\n isActive?: boolean;\n isExpired?: boolean;\n } = {}\n ): Promise<{ market: Market; crypto: CryptoHourlyMarket } | null> {\n const {\n tokenSymbol,\n minLiquidity = 0,\n limit = 100,\n isActive = true,\n isExpired = false,\n } = options;\n\n const TAG_1H = '102175';\n\n const markets = await this.searchMarkets({\n limit,\n tagId: TAG_1H,\n closed: false,\n minLiquidity,\n });\n\n const upDownPattern = /(?<token>Bitcoin|Ethereum|Solana|BTC|ETH|SOL)\\s+Up or Down/i;\n const strikePattern =\n /(?:(?<token1>BTC|ETH|SOL|BITCOIN|ETHEREUM|SOLANA)\\s+.*?(?<direction>above|below|over|under|reach)\\s+[\\$]?(?<price1>[\\d,]+(?:\\.\\d+)?))|(?:[\\$]?(?<price2>[\\d,]+(?:\\.\\d+)?)\\s+.*?(?<token2>BTC|ETH|SOL|BITCOIN|ETHEREUM|SOLANA))/i;\n\n for (const market of markets) {\n if (!MarketUtils.isBinary(market) || !MarketUtils.isOpen(market)) continue;\n\n if (market.closeTime) {\n const now = new Date();\n const timeUntilExpiry = market.closeTime.getTime() - now.getTime();\n\n if (isExpired && timeUntilExpiry > 0) continue;\n if (!isExpired && timeUntilExpiry <= 0) continue;\n if (isActive && !isExpired && timeUntilExpiry > 3600000) continue;\n }\n\n const upDownMatch = upDownPattern.exec(market.question);\n if (upDownMatch?.groups) {\n const parsedToken = normalizeTokenSymbol(upDownMatch.groups.token ?? '');\n if (tokenSymbol && parsedToken !== normalizeTokenSymbol(tokenSymbol)) continue;\n\n return {\n market,\n crypto: {\n tokenSymbol: parsedToken,\n expiryTime: market.closeTime ?? new Date(Date.now() + 3600000),\n strikePrice: null,\n marketType: 'up_down',\n },\n };\n }\n\n const strikeMatch = strikePattern.exec(market.question);\n if (strikeMatch?.groups) {\n const parsedToken = normalizeTokenSymbol(\n strikeMatch.groups.token1 ?? strikeMatch.groups.token2 ?? ''\n );\n const priceStr = strikeMatch.groups.price1 ?? strikeMatch.groups.price2 ?? '0';\n const parsedPrice = Number.parseFloat(priceStr.replace(/,/g, ''));\n\n if (tokenSymbol && parsedToken !== normalizeTokenSymbol(tokenSymbol)) continue;\n\n return {\n market,\n crypto: {\n tokenSymbol: parsedToken,\n expiryTime: market.closeTime ?? new Date(Date.now() + 3600000),\n strikePrice: parsedPrice,\n marketType: 'strike_price',\n },\n };\n }\n }\n\n return null;\n }\n}\n","import {\n OrderBookWebSocket,\n type OrderbookUpdate,\n type WebSocketConfig,\n} from '../../core/websocket.js';\n\nconst WS_URL = 'wss://ws-subscriptions-clob.polymarket.com/ws/market';\n\ninterface PolymarketWsConfig extends WebSocketConfig {\n apiKey?: string;\n}\n\nexport class PolymarketWebSocket extends OrderBookWebSocket {\n readonly wsUrl = WS_URL;\n private apiKey?: string;\n private assetSubscriptions = new Map<string, string>();\n\n constructor(config: PolymarketWsConfig = {}) {\n super(config);\n this.apiKey = config.apiKey;\n }\n\n protected async authenticate(): Promise<void> {\n if (this.apiKey) {\n this.send({\n type: 'auth',\n apiKey: this.apiKey,\n });\n }\n }\n\n protected async subscribeOrderbook(marketId: string): Promise<void> {\n const assetIds = this.assetSubscriptions.get(marketId);\n if (!assetIds) return;\n\n this.send({\n type: 'subscribe',\n channel: 'book',\n assets_id: assetIds,\n });\n }\n\n protected async unsubscribeOrderbook(marketId: string): Promise<void> {\n const assetIds = this.assetSubscriptions.get(marketId);\n if (!assetIds) return;\n\n this.send({\n type: 'unsubscribe',\n channel: 'book',\n assets_id: assetIds,\n });\n }\n\n protected parseOrderbookMessage(message: Record<string, unknown>): OrderbookUpdate | null {\n if (message.event_type !== 'book') return null;\n\n const assetId = message.asset_id as string;\n if (!assetId) return null;\n\n const marketId = this.findMarketIdByAsset(assetId);\n if (!marketId) return null;\n\n const bids: [number, number][] = [];\n const asks: [number, number][] = [];\n\n const rawBids = message.bids as Array<{ price: string; size: string }> | undefined;\n const rawAsks = message.asks as Array<{ price: string; size: string }> | undefined;\n\n if (rawBids) {\n for (const bid of rawBids) {\n const price = Number.parseFloat(bid.price);\n const size = Number.parseFloat(bid.size);\n if (price > 0 && size > 0) {\n bids.push([price, size]);\n }\n }\n }\n\n if (rawAsks) {\n for (const ask of rawAsks) {\n const price = Number.parseFloat(ask.price);\n const size = Number.parseFloat(ask.size);\n if (price > 0 && size > 0) {\n asks.push([price, size]);\n }\n }\n }\n\n bids.sort((a, b) => b[0] - a[0]);\n asks.sort((a, b) => a[0] - b[0]);\n\n return {\n marketId,\n bids,\n asks,\n timestamp: Date.now(),\n };\n }\n\n async watchOrderbookWithAsset(\n marketId: string,\n assetId: string,\n callback: (marketId: string, orderbook: OrderbookUpdate) => void | Promise<void>\n ): Promise<void> {\n this.assetSubscriptions.set(marketId, assetId);\n await this.watchOrderbook(marketId, callback);\n }\n\n private findMarketIdByAsset(assetId: string): string | undefined {\n for (const [marketId, asset] of this.assetSubscriptions) {\n if (asset === assetId) {\n return marketId;\n }\n }\n return undefined;\n }\n}\n","import type { Exchange, ExchangeConfig } from '../core/exchange.js';\nimport { Limitless } from './limitless/index.js';\nimport { Opinion } from './opinion/index.js';\nimport { Polymarket } from './polymarket/index.js';\n\nexport { Polymarket, PolymarketWebSocket } from './polymarket/index.js';\nexport { Opinion } from './opinion/index.js';\nexport { Limitless } from './limitless/index.js';\n\ntype ExchangeClass = new (config?: ExchangeConfig) => Exchange;\n\nconst exchanges: Record<string, ExchangeClass> = {\n polymarket: Polymarket,\n opinion: Opinion,\n limitless: Limitless,\n};\n\nexport function listExchanges(): string[] {\n return Object.keys(exchanges);\n}\n\nexport function createExchange(exchangeId: string, config?: ExchangeConfig): Exchange {\n const ExchangeClass = exchanges[exchangeId.toLowerCase()];\n if (!ExchangeClass) {\n throw new Error(`Exchange '${exchangeId}' not found. Available: ${listExchanges().join(', ')}`);\n }\n return new ExchangeClass(config);\n}\n","import pino from 'pino';\n\nexport const logger = pino({\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n translateTime: 'HH:MM:ss',\n ignore: 'pid,hostname',\n },\n },\n});\n\nexport function createLogger(name: string) {\n return logger.child({ name });\n}\n\nexport const Colors = {\n bold: (text: string) => `\\x1b[1m${text}\\x1b[0m`,\n red: (text: string) => `\\x1b[31m${text}\\x1b[0m`,\n green: (text: string) => `\\x1b[32m${text}\\x1b[0m`,\n yellow: (text: string) => `\\x1b[33m${text}\\x1b[0m`,\n blue: (text: string) => `\\x1b[34m${text}\\x1b[0m`,\n magenta: (text: string) => `\\x1b[35m${text}\\x1b[0m`,\n cyan: (text: string) => `\\x1b[36m${text}\\x1b[0m`,\n gray: (text: string) => `\\x1b[90m${text}\\x1b[0m`,\n} as const;\n","export function roundToTickSize(price: number, tickSize: number): number {\n return Math.round(price / tickSize) * tickSize;\n}\n\nexport function clampPrice(price: number, min = 0, max = 1): number {\n return Math.max(min, Math.min(max, price));\n}\n\nexport function formatPrice(price: number, decimals = 4): string {\n return price.toFixed(decimals);\n}\n\nexport function formatUsd(amount: number): string {\n return `$${amount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}`;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@alango/dr-manhattan",
3
+ "version": "0.1.0",
4
+ "description": "CCXT-style unified API for prediction markets",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/index.js",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "files": ["dist"],
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "dev": "tsup --watch",
19
+ "test": "vitest",
20
+ "test:run": "vitest run",
21
+ "lint": "biome check .",
22
+ "lint:fix": "biome check --write .",
23
+ "format": "biome format --write .",
24
+ "typecheck": "tsc --noEmit",
25
+ "prepublishOnly": "pnpm run build"
26
+ },
27
+ "keywords": [
28
+ "prediction-markets",
29
+ "polymarket",
30
+ "opinion",
31
+ "limitless",
32
+ "trading",
33
+ "api",
34
+ "ccxt"
35
+ ],
36
+ "author": "gtg7784",
37
+ "license": "MIT",
38
+ "repository": {
39
+ "type": "git",
40
+ "url": "git+https://github.com/gtg7784/dr-manhattan-ts.git"
41
+ },
42
+ "bugs": {
43
+ "url": "https://github.com/gtg7784/dr-manhattan-ts/issues"
44
+ },
45
+ "homepage": "https://github.com/gtg7784/dr-manhattan-ts#readme",
46
+ "engines": {
47
+ "node": ">=20.0.0"
48
+ },
49
+ "dependencies": {
50
+ "@polymarket/clob-client": "^5.1.2",
51
+ "@polymarket/order-utils": "^3.0.1",
52
+ "ethers": "^5.7.2",
53
+ "pino": "^9.5.0",
54
+ "pino-pretty": "^13.0.0",
55
+ "socket.io-client": "^4.8.1",
56
+ "ws": "^8.18.0"
57
+ },
58
+ "devDependencies": {
59
+ "@biomejs/biome": "^1.9.4",
60
+ "@types/node": "^22.10.2",
61
+ "@types/ws": "^8.5.13",
62
+ "tsup": "^8.3.5",
63
+ "typescript": "^5.7.2",
64
+ "vitest": "^2.1.8"
65
+ }
66
+ }