@provable-games/ekubo-sdk 0.1.0 → 0.1.9

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/errors/index.ts","../src/utils/retry.ts","../src/utils/bigint.ts","../src/utils/hex.ts","../src/chains/constants.ts","../src/api/quote.ts","../src/api/price.ts","../src/api/tokens.ts","../src/api/stats.ts","../src/calls/encoder.ts","../src/calls/generator.ts","../src/tokens/mainnet.ts","../src/tokens/registry.ts","../src/tokens/resolver.ts","../src/polling/poller.ts","../src/client.ts","../src/react/context.tsx","../src/react/useEkuboSwap.ts","../src/react/useEkuboPrices.ts","../src/react/useEkuboTokens.ts","../src/react/useEkuboStats.ts","../src/react/useEkuboPriceHistory.ts","../src/react/useEkuboQuotes.ts"],"names":["createContext","useMemo","useContext","useState","useRef","useCallback","useEffect","defaultClientInstance","getDefaultClient","fetchTokens","fetchTvl","fetchVolume","fetchTopPairs"],"mappings":"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","file":"react.cjs","sourcesContent":["/**\n * Base error class for all Ekubo SDK errors\n */\nexport class EkuboError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly cause?: unknown\n ) {\n super(message);\n this.name = \"EkuboError\";\n Object.setPrototypeOf(this, EkuboError.prototype);\n }\n}\n\n/**\n * Error thrown when there is insufficient liquidity for a swap\n * This error should NOT be retried\n */\nexport class InsufficientLiquidityError extends EkuboError {\n constructor(message = \"Insufficient liquidity for swap\") {\n super(message, \"INSUFFICIENT_LIQUIDITY\");\n this.name = \"InsufficientLiquidityError\";\n Object.setPrototypeOf(this, InsufficientLiquidityError.prototype);\n }\n}\n\n/**\n * Error thrown when an API request fails after all retries\n */\nexport class ApiError extends EkuboError {\n constructor(\n message: string,\n public readonly statusCode?: number,\n cause?: unknown\n ) {\n super(message, \"API_ERROR\", cause);\n this.name = \"ApiError\";\n Object.setPrototypeOf(this, ApiError.prototype);\n }\n}\n\n/**\n * Error thrown when rate limited by the API\n */\nexport class RateLimitError extends EkuboError {\n constructor(\n message = \"Rate limited by API\",\n public readonly retryAfter?: number\n ) {\n super(message, \"RATE_LIMIT\");\n this.name = \"RateLimitError\";\n Object.setPrototypeOf(this, RateLimitError.prototype);\n }\n}\n\n/**\n * Error thrown when a request times out\n */\nexport class TimeoutError extends EkuboError {\n constructor(message = \"Request timed out\", public readonly timeout: number) {\n super(message, \"TIMEOUT\");\n this.name = \"TimeoutError\";\n Object.setPrototypeOf(this, TimeoutError.prototype);\n }\n}\n\n/**\n * Error thrown when a request is aborted\n */\nexport class AbortError extends EkuboError {\n constructor(message = \"Request aborted\") {\n super(message, \"ABORTED\");\n this.name = \"AbortError\";\n Object.setPrototypeOf(this, AbortError.prototype);\n }\n}\n\n/**\n * Error thrown when token resolution fails\n */\nexport class TokenNotFoundError extends EkuboError {\n constructor(\n public readonly tokenIdentifier: string,\n message = `Token not found: ${tokenIdentifier}`\n ) {\n super(message, \"TOKEN_NOT_FOUND\");\n this.name = \"TokenNotFoundError\";\n Object.setPrototypeOf(this, TokenNotFoundError.prototype);\n }\n}\n\n/**\n * Error thrown when chain configuration is invalid or missing\n */\nexport class InvalidChainError extends EkuboError {\n constructor(\n public readonly chainId: string,\n message = `Invalid or unsupported chain: ${chainId}`\n ) {\n super(message, \"INVALID_CHAIN\");\n this.name = \"InvalidChainError\";\n Object.setPrototypeOf(this, InvalidChainError.prototype);\n }\n}\n\n/**\n * Check if an error should not be retried\n */\nexport function isNonRetryableError(error: unknown): boolean {\n if (error instanceof InsufficientLiquidityError) return true;\n if (error instanceof AbortError) return true;\n if (error instanceof TokenNotFoundError) return true;\n if (error instanceof InvalidChainError) return true;\n return false;\n}\n","import type { FetchConfig } from \"../types/config.js\";\nimport { isNonRetryableError } from \"../errors/index.js\";\n\n/**\n * Default fetch configuration\n */\nexport const DEFAULT_FETCH_CONFIG: Required<FetchConfig> = {\n timeout: 10000,\n maxRetries: 3,\n baseBackoff: 1000,\n maxBackoff: 5000,\n fetch: globalThis.fetch,\n};\n\n/**\n * Parse Retry-After header (supports both seconds and HTTP-date formats)\n */\nexport function parseRetryAfter(retryAfter: string | null): number | null {\n if (!retryAfter) return null;\n\n const trimmed = retryAfter.trim();\n if (!trimmed) return null;\n\n // Try parsing as seconds\n const seconds = parseInt(trimmed, 10);\n if (!isNaN(seconds) && seconds >= 0) {\n return seconds * 1000; // Convert to milliseconds\n }\n\n // Try parsing as HTTP date\n try {\n const date = new Date(trimmed);\n const delay = date.getTime() - Date.now();\n return delay > 0 ? delay : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Calculate exponential backoff delay with jitter\n */\nexport function calculateBackoff(\n attempt: number,\n baseBackoff: number,\n maxBackoff: number,\n retryAfter?: string | null\n): number {\n // If Retry-After header exists and is valid, use it\n if (retryAfter) {\n const retryAfterDelay = parseRetryAfter(retryAfter);\n if (retryAfterDelay !== null && retryAfterDelay > 0) {\n return retryAfterDelay;\n }\n }\n\n // Calculate exponential backoff\n let delay = baseBackoff * Math.pow(2, attempt);\n if (delay > maxBackoff) {\n delay = maxBackoff;\n }\n\n // Add jitter (random value between delay/2 and delay)\n const minDelay = delay / 2;\n const jitter = Math.random() * (delay - minDelay);\n return minDelay + jitter;\n}\n\n/**\n * Sleep for a specified duration\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Options for withRetry function\n */\nexport interface RetryOptions {\n maxRetries: number;\n baseBackoff: number;\n maxBackoff: number;\n signal?: AbortSignal;\n onRetry?: (attempt: number, error: Error, delay: number) => void;\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n options: RetryOptions\n): Promise<T> {\n const { maxRetries, baseBackoff, maxBackoff, signal, onRetry } = options;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n // Check if aborted before making request\n if (signal?.aborted) {\n throw new Error(\"Request aborted\");\n }\n\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on abort\n if (error instanceof Error && error.name === \"AbortError\") {\n throw error;\n }\n\n // Don't retry on non-retryable errors\n if (isNonRetryableError(error)) {\n throw error;\n }\n\n // Don't retry on last attempt\n if (attempt === maxRetries - 1) {\n break;\n }\n\n // Calculate delay and wait\n const delay = calculateBackoff(attempt, baseBackoff, maxBackoff);\n onRetry?.(attempt, lastError, delay);\n await sleep(delay);\n }\n }\n\n throw lastError || new Error(\"Unknown error after retries\");\n}\n","/**\n * Parse total_calculated from API response (handles string or number)\n * Returns absolute value since negative is just API convention for swap direction\n */\nexport function parseTotalCalculated(totalCalculated: string | number): bigint {\n let value: bigint;\n if (typeof totalCalculated === \"string\") {\n value = BigInt(totalCalculated);\n } else {\n // For numbers, convert to string first to avoid precision loss\n value = BigInt(Math.floor(totalCalculated));\n }\n // Return absolute value - negative is just Ekubo's convention\n return value < 0n ? -value : value;\n}\n\n/**\n * Return absolute value of a bigint\n */\nexport function abs(value: bigint): bigint {\n return value < 0n ? -value : value;\n}\n\n/**\n * Apply slippage to an amount\n * @param amount - Base amount\n * @param slippagePercent - Slippage as percentage (e.g., 5n = 5%)\n * @returns Amount with slippage buffer added\n */\nexport function addSlippage(amount: bigint, slippagePercent: bigint): bigint {\n return amount + (amount * slippagePercent) / 100n;\n}\n\n/**\n * Calculate minimum received after slippage\n * @param amount - Expected amount\n * @param slippagePercent - Slippage as percentage (e.g., 5n = 5%)\n * @returns Minimum acceptable amount\n */\nexport function subtractSlippage(\n amount: bigint,\n slippagePercent: bigint\n): bigint {\n return amount - (amount * slippagePercent) / 100n;\n}\n","/**\n * Convert a value to hex string (without leading zeros normalization)\n */\nexport function toHex(value: bigint | number | string): string {\n if (typeof value === \"string\") {\n // If already a hex string, normalize it\n if (value.startsWith(\"0x\") || value.startsWith(\"0X\")) {\n return \"0x\" + BigInt(value).toString(16);\n }\n // Otherwise treat as decimal\n return \"0x\" + BigInt(value).toString(16);\n }\n return \"0x\" + BigInt(value).toString(16);\n}\n\n/**\n * Normalize an address to lowercase hex format\n */\nexport function normalizeAddress(address: string): string {\n // Remove 0x prefix, convert to bigint to remove leading zeros, then back to hex\n const normalized = toHex(address);\n return normalized.toLowerCase();\n}\n\n/**\n * Check if a string looks like an address (hex format)\n */\nexport function isAddress(value: string): boolean {\n return /^0x[0-9a-fA-F]+$/.test(value);\n}\n\n/**\n * Split a u256 value into low and high parts for calldata\n */\nexport function splitU256(value: bigint): { low: string; high: string } {\n const low = value % 2n ** 128n;\n const high = value >> 128n;\n return {\n low: toHex(low),\n high: toHex(high),\n };\n}\n","/**\n * Ekubo chain IDs (decimal string format used by API)\n */\nexport const CHAIN_IDS = {\n MAINNET: \"23448594291968334\",\n SEPOLIA: \"393402133025997798000961\",\n} as const;\n\n/**\n * Starknet.js chain ID constants (hex format)\n */\nexport const STARKNET_CHAIN_IDS = {\n SN_MAIN: \"0x534e5f4d41494e\",\n SN_SEPOLIA: \"0x534e5f5345504f4c4941\",\n} as const;\n\n/**\n * Ekubo Router contract addresses by chain\n */\nexport const ROUTER_ADDRESSES = {\n [CHAIN_IDS.MAINNET]:\n \"0x0199741822c2dc722f6f605204f35e56dbc23bceed54818168c4c49e4fb8737e\",\n [CHAIN_IDS.SEPOLIA]:\n \"0x0045f933adf0607292468ad1c1dedaa74d5ad166392590e72676a34d01d7b763\",\n} as const;\n\n/**\n * USDC contract addresses by chain (for price quotes)\n */\nexport const USDC_ADDRESSES = {\n [CHAIN_IDS.MAINNET]:\n \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\",\n [CHAIN_IDS.SEPOLIA]:\n \"0x053b40a647cedfca6ca84f542a0fe36736031905a9639a7f19a3c1e66bfd5080\",\n} as const;\n\n/**\n * API base URLs\n */\nexport const API_URLS = {\n /** Quoter API for swap quotes */\n QUOTER: \"https://prod-api-quoter.ekubo.org\",\n /** Main API for tokens, prices, stats, etc. */\n API: \"https://prod-api.ekubo.org\",\n} as const;\n\n/**\n * Chain configuration preset\n */\nexport interface ChainConfig {\n chainId: string;\n quoterApiUrl: string;\n apiUrl: string;\n routerAddress: string;\n usdcAddress: string;\n}\n\n/**\n * Pre-configured chain configurations\n */\nexport const CHAIN_CONFIGS: Record<\"mainnet\" | \"sepolia\", ChainConfig> = {\n mainnet: {\n chainId: CHAIN_IDS.MAINNET,\n quoterApiUrl: API_URLS.QUOTER,\n apiUrl: API_URLS.API,\n routerAddress: ROUTER_ADDRESSES[CHAIN_IDS.MAINNET],\n usdcAddress: USDC_ADDRESSES[CHAIN_IDS.MAINNET],\n },\n sepolia: {\n chainId: CHAIN_IDS.SEPOLIA,\n quoterApiUrl: API_URLS.QUOTER,\n apiUrl: API_URLS.API,\n routerAddress: ROUTER_ADDRESSES[CHAIN_IDS.SEPOLIA],\n usdcAddress: USDC_ADDRESSES[CHAIN_IDS.SEPOLIA],\n },\n};\n\n/**\n * Map starknet.js chain IDs to Ekubo chain IDs\n */\nexport const STARKNET_TO_EKUBO_CHAIN: Record<string, string> = {\n [STARKNET_CHAIN_IDS.SN_MAIN]: CHAIN_IDS.MAINNET,\n [STARKNET_CHAIN_IDS.SN_SEPOLIA]: CHAIN_IDS.SEPOLIA,\n};\n\n/**\n * Get Ekubo chain ID from starknet.js chain ID\n */\nexport function getEkuboChainId(starknetChainId: string): string | undefined {\n return STARKNET_TO_EKUBO_CHAIN[starknetChainId];\n}\n\n/**\n * Get chain config by chain name or ID\n */\nexport function getChainConfig(\n chainOrId: \"mainnet\" | \"sepolia\" | string\n): ChainConfig | undefined {\n if (chainOrId === \"mainnet\" || chainOrId === \"sepolia\") {\n return CHAIN_CONFIGS[chainOrId];\n }\n\n // Try to find by chain ID\n if (chainOrId === CHAIN_IDS.MAINNET) {\n return CHAIN_CONFIGS.mainnet;\n }\n if (chainOrId === CHAIN_IDS.SEPOLIA) {\n return CHAIN_CONFIGS.sepolia;\n }\n\n // Try starknet.js chain ID format\n const ekuboChainId = getEkuboChainId(chainOrId);\n if (ekuboChainId === CHAIN_IDS.MAINNET) {\n return CHAIN_CONFIGS.mainnet;\n }\n if (ekuboChainId === CHAIN_IDS.SEPOLIA) {\n return CHAIN_CONFIGS.sepolia;\n }\n\n return undefined;\n}\n","import type {\n SwapQuote,\n SwapQuoteApiResponse,\n SwapQuoteErrorResponse,\n FetchConfig,\n} from \"../types/index.js\";\nimport {\n InsufficientLiquidityError,\n ApiError,\n RateLimitError,\n AbortError,\n} from \"../errors/index.js\";\nimport {\n DEFAULT_FETCH_CONFIG,\n calculateBackoff,\n sleep,\n parseTotalCalculated,\n normalizeAddress,\n} from \"../utils/index.js\";\nimport { CHAIN_IDS, API_URLS, USDC_ADDRESSES } from \"../chains/constants.js\";\n\n/**\n * Parameters for fetchSwapQuote\n */\nexport interface FetchSwapQuoteParams {\n /** Amount to receive (will be negated internally) */\n amount: bigint;\n /** Token to sell (address) */\n tokenFrom: string;\n /** Token to buy (address) */\n tokenTo: string;\n /** Chain ID (Ekubo format) */\n chainId?: string;\n /** Abort signal for cancellation */\n signal?: AbortSignal;\n /** Fetch configuration */\n fetchConfig?: FetchConfig;\n}\n\n/**\n * Fetch a swap quote from Ekubo API with retry logic\n */\nexport async function fetchSwapQuote(\n params: FetchSwapQuoteParams\n): Promise<SwapQuote> {\n const {\n amount,\n tokenFrom,\n tokenTo,\n chainId = CHAIN_IDS.MAINNET,\n signal,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n // Negative amount to specify exact amount received\n const receivedAmount = `-${amount.toString()}`;\n\n // Normalize addresses\n const normalizedTokenFrom = normalizeAddress(tokenFrom);\n const normalizedTokenTo = normalizeAddress(tokenTo);\n\n const url = `${API_URLS.QUOTER}/${chainId}/${receivedAmount}/${normalizedTokenFrom}/${normalizedTokenTo}`;\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < config.maxRetries; attempt++) {\n // Check if aborted before making request\n if (signal?.aborted) {\n throw new AbortError(\"Request aborted\");\n }\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), config.timeout);\n\n // Combine user signal with timeout signal\n const combinedSignal = signal\n ? anySignal([signal, controller.signal])\n : controller.signal;\n\n const response = await fetchFn(url, {\n method: \"GET\",\n signal: combinedSignal,\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n clearTimeout(timeoutId);\n\n // Success case\n if (response.ok) {\n const data = (await response.json()) as\n | SwapQuoteApiResponse\n | SwapQuoteErrorResponse;\n\n // Check for error response (e.g., insufficient liquidity)\n if (\"error\" in data) {\n if (data.error.includes(\"Insufficient liquidity\")) {\n throw new InsufficientLiquidityError(data.error);\n }\n throw new ApiError(data.error);\n }\n\n return {\n impact: data.price_impact,\n total: parseTotalCalculated(data.total_calculated),\n splits: data.splits,\n };\n }\n\n // Check 404 responses for insufficient liquidity errors\n if (response.status === 404) {\n try {\n const data = (await response.json()) as SwapQuoteErrorResponse;\n if (data.error?.includes(\"Insufficient liquidity\")) {\n throw new InsufficientLiquidityError(data.error);\n }\n } catch (e) {\n if (e instanceof InsufficientLiquidityError) {\n throw e;\n }\n }\n throw new ApiError(`Failed to fetch swap quote: 404 Not Found`, 404);\n }\n\n // Rate limited - retry with backoff\n if (response.status === 429) {\n if (attempt === config.maxRetries - 1) {\n throw new RateLimitError(\"Rate limited (429) - max retries exceeded\");\n }\n\n const retryAfter = response.headers.get(\"Retry-After\");\n const delay = calculateBackoff(\n attempt,\n config.baseBackoff,\n config.maxBackoff,\n retryAfter\n );\n\n await sleep(delay);\n continue;\n }\n\n // Other error status codes\n throw new ApiError(\n `Failed to fetch swap quote: ${response.status}`,\n response.status\n );\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry on abort\n if (\n error instanceof Error &&\n (error.name === \"AbortError\" || error instanceof AbortError)\n ) {\n throw new AbortError(\"Request aborted\");\n }\n\n // Don't retry on insufficient liquidity\n if (error instanceof InsufficientLiquidityError) {\n throw error;\n }\n\n // Don't retry on last attempt\n if (attempt === config.maxRetries - 1) {\n break;\n }\n\n // For network errors, use exponential backoff\n const delay = calculateBackoff(\n attempt,\n config.baseBackoff,\n config.maxBackoff\n );\n await sleep(delay);\n }\n }\n\n throw lastError || new ApiError(\"Failed to fetch swap quote: unknown error\");\n}\n\n/**\n * Fetch token price in USDC\n */\nexport async function fetchSwapQuoteInUsdc(\n params: Omit<FetchSwapQuoteParams, \"tokenTo\">\n): Promise<bigint> {\n const { chainId = CHAIN_IDS.MAINNET, ...rest } = params;\n\n const usdcAddress =\n USDC_ADDRESSES[chainId as keyof typeof USDC_ADDRESSES] ??\n USDC_ADDRESSES[CHAIN_IDS.MAINNET];\n\n const quote = await fetchSwapQuote({\n ...rest,\n tokenTo: usdcAddress,\n chainId,\n });\n\n return quote.total;\n}\n\n/**\n * Helper to combine multiple abort signals\n */\nfunction anySignal(signals: AbortSignal[]): AbortSignal {\n const controller = new AbortController();\n\n for (const signal of signals) {\n if (signal.aborted) {\n controller.abort();\n return controller.signal;\n }\n signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n\n return controller.signal;\n}\n","import type { FetchConfig } from \"../types/index.js\";\nimport { ApiError } from \"../errors/index.js\";\nimport { DEFAULT_FETCH_CONFIG, normalizeAddress } from \"../utils/index.js\";\nimport { CHAIN_IDS, API_URLS } from \"../chains/constants.js\";\n\n/**\n * Price history data point\n */\nexport interface PriceDataPoint {\n timestamp: number;\n price: number;\n}\n\n/**\n * Price history response\n */\nexport interface PriceHistoryResponse {\n data: PriceDataPoint[];\n}\n\n/**\n * Parameters for getPriceHistory\n */\nexport interface GetPriceHistoryParams {\n /** Token to get price for */\n token: string;\n /** Quote token (e.g., USDC) */\n otherToken: string;\n /** Chain ID (Ekubo format) */\n chainId?: string;\n /** Time interval in seconds */\n interval?: number;\n /** API base URL */\n apiUrl?: string;\n /** Fetch configuration */\n fetchConfig?: FetchConfig;\n}\n\n/**\n * Fetch price history from Ekubo API\n */\nexport async function getPriceHistory(\n params: GetPriceHistoryParams\n): Promise<PriceHistoryResponse> {\n const {\n token,\n otherToken,\n chainId = CHAIN_IDS.MAINNET,\n interval = 7000,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const normalizedToken = normalizeAddress(token);\n const normalizedOtherToken = normalizeAddress(otherToken);\n\n const url = `${apiUrl}/price/${chainId}/${normalizedToken}/${normalizedOtherToken}/history?interval=${interval}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch price history: ${response.status}`,\n response.status\n );\n }\n\n const data = await response.json();\n\n return {\n data: data?.data || [],\n };\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n throw new ApiError(\n `Failed to fetch price history: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n","import type { FetchConfig } from \"../types/index.js\";\nimport { ApiError } from \"../errors/index.js\";\nimport { DEFAULT_FETCH_CONFIG } from \"../utils/index.js\";\nimport { CHAIN_IDS, API_URLS } from \"../chains/constants.js\";\n\n/**\n * Token metadata from Ekubo API\n */\nexport interface ApiTokenInfo {\n /** Token contract address */\n address: string;\n /** Token name */\n name: string;\n /** Token symbol */\n symbol: string;\n /** Token decimals */\n decimals: number;\n /** Logo URI (optional) */\n logo_uri?: string;\n /** Whether token is verified/trusted */\n verified?: boolean;\n}\n\n/**\n * Parameters for fetching tokens\n */\nexport interface FetchTokensParams {\n /** Chain ID (Ekubo format) */\n chainId?: string;\n /** API base URL */\n apiUrl?: string;\n /** Fetch configuration */\n fetchConfig?: FetchConfig;\n}\n\n/**\n * Parameters for fetching a single token\n */\nexport interface FetchTokenParams extends FetchTokensParams {\n /** Token contract address */\n tokenAddress: string;\n}\n\n/**\n * Parameters for batch fetching tokens\n */\nexport interface FetchTokensBatchParams extends FetchTokensParams {\n /** Token contract addresses */\n tokenAddresses: string[];\n}\n\n/**\n * Fetch list of all tokens for a chain\n */\nexport async function fetchTokens(\n params: FetchTokensParams = {}\n): Promise<ApiTokenInfo[]> {\n const {\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const url = `${apiUrl}/tokens?chainId=${chainId}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch tokens: ${response.status}`,\n response.status\n );\n }\n\n const data = await response.json();\n return data as ApiTokenInfo[];\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n throw new ApiError(\n `Failed to fetch tokens: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch metadata for a single token\n */\nexport async function fetchToken(\n params: FetchTokenParams\n): Promise<ApiTokenInfo | null> {\n const {\n tokenAddress,\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const url = `${apiUrl}/tokens/${chainId}/${tokenAddress}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch token: ${response.status}`,\n response.status\n );\n }\n\n const data = await response.json();\n return data as ApiTokenInfo;\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n throw new ApiError(\n `Failed to fetch token: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch metadata for multiple tokens at once\n */\nexport async function fetchTokensBatch(\n params: FetchTokensBatchParams\n): Promise<ApiTokenInfo[]> {\n const {\n tokenAddresses,\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n if (tokenAddresses.length === 0) {\n return [];\n }\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n // Build query string with multiple addresses\n const addressParams = tokenAddresses\n .map((addr) => `addresses=${encodeURIComponent(addr)}`)\n .join(\"&\");\n\n const url = `${apiUrl}/tokens/batch?chainId=${chainId}&${addressParams}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch tokens batch: ${response.status}`,\n response.status\n );\n }\n\n const data = await response.json();\n return data as ApiTokenInfo[];\n } catch (error) {\n if (error instanceof ApiError) {\n throw error;\n }\n throw new ApiError(\n `Failed to fetch tokens batch: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n","import type { FetchConfig } from \"../types/index.js\";\nimport { ApiError } from \"../errors/index.js\";\nimport { DEFAULT_FETCH_CONFIG, normalizeAddress } from \"../utils/index.js\";\nimport { CHAIN_IDS, API_URLS } from \"../chains/constants.js\";\n\n/**\n * Trading pair statistics\n */\nexport interface PairStats {\n token0: string;\n token1: string;\n tvl_usd: number;\n volume_24h_usd: number;\n fees_24h_usd: number;\n price: number;\n price_change_24h: number;\n}\n\n/**\n * Overview statistics response\n */\nexport interface OverviewStats {\n tvl_usd: number;\n volume_24h_usd: number;\n fees_24h_usd: number;\n}\n\n/**\n * Pool information\n */\nexport interface PoolInfo {\n key_hash: string;\n token0: string;\n token1: string;\n fee: string;\n tick_spacing: number;\n extension: string;\n tvl_usd: number;\n volume_24h_usd: number;\n}\n\n/**\n * TVL data point\n */\nexport interface TvlDataPoint {\n timestamp: number;\n tvl_usd: number;\n}\n\n/**\n * Volume data point\n */\nexport interface VolumeDataPoint {\n timestamp: number;\n volume_usd: number;\n}\n\n/**\n * Base parameters for stats API calls\n */\nexport interface StatsBaseParams {\n /** Chain ID (Ekubo format) */\n chainId?: string;\n /** API base URL */\n apiUrl?: string;\n /** Fetch configuration */\n fetchConfig?: FetchConfig;\n}\n\n/**\n * Parameters for pair-specific queries\n */\nexport interface PairStatsParams extends StatsBaseParams {\n /** First token address */\n tokenA: string;\n /** Second token address */\n tokenB: string;\n}\n\n/**\n * Fetch overview of top trading pairs\n */\nexport async function fetchTopPairs(\n params: StatsBaseParams = {}\n): Promise<PairStats[]> {\n const {\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const url = `${apiUrl}/overview/pairs?chainId=${chainId}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch top pairs: ${response.status}`,\n response.status\n );\n }\n\n return (await response.json()) as PairStats[];\n } catch (error) {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\n `Failed to fetch top pairs: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch protocol TVL overview\n */\nexport async function fetchTvl(\n params: StatsBaseParams = {}\n): Promise<OverviewStats> {\n const {\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const url = `${apiUrl}/overview/tvl?chainId=${chainId}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch TVL: ${response.status}`,\n response.status\n );\n }\n\n return (await response.json()) as OverviewStats;\n } catch (error) {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\n `Failed to fetch TVL: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch protocol volume overview\n */\nexport async function fetchVolume(\n params: StatsBaseParams = {}\n): Promise<OverviewStats> {\n const {\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const url = `${apiUrl}/overview/volume?chainId=${chainId}`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch volume: ${response.status}`,\n response.status\n );\n }\n\n return (await response.json()) as OverviewStats;\n } catch (error) {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\n `Failed to fetch volume: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch TVL for a specific trading pair\n */\nexport async function fetchPairTvl(\n params: PairStatsParams\n): Promise<TvlDataPoint[]> {\n const {\n tokenA,\n tokenB,\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const normalizedA = normalizeAddress(tokenA);\n const normalizedB = normalizeAddress(tokenB);\n\n const url = `${apiUrl}/pair/${chainId}/${normalizedA}/${normalizedB}/tvl`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch pair TVL: ${response.status}`,\n response.status\n );\n }\n\n return (await response.json()) as TvlDataPoint[];\n } catch (error) {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\n `Failed to fetch pair TVL: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch volume for a specific trading pair\n */\nexport async function fetchPairVolume(\n params: PairStatsParams\n): Promise<VolumeDataPoint[]> {\n const {\n tokenA,\n tokenB,\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const normalizedA = normalizeAddress(tokenA);\n const normalizedB = normalizeAddress(tokenB);\n\n const url = `${apiUrl}/pair/${chainId}/${normalizedA}/${normalizedB}/volume`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch pair volume: ${response.status}`,\n response.status\n );\n }\n\n return (await response.json()) as VolumeDataPoint[];\n } catch (error) {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\n `Failed to fetch pair volume: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n\n/**\n * Fetch pools for a specific trading pair\n */\nexport async function fetchPairPools(\n params: PairStatsParams\n): Promise<PoolInfo[]> {\n const {\n tokenA,\n tokenB,\n chainId = CHAIN_IDS.MAINNET,\n apiUrl = API_URLS.API,\n fetchConfig = {},\n } = params;\n\n const config = { ...DEFAULT_FETCH_CONFIG, ...fetchConfig };\n const fetchFn = config.fetch;\n\n const normalizedA = normalizeAddress(tokenA);\n const normalizedB = normalizeAddress(tokenB);\n\n const url = `${apiUrl}/pair/${chainId}/${normalizedA}/${normalizedB}/pools`;\n\n try {\n const response = await fetchFn(url, {\n method: \"GET\",\n mode: \"cors\",\n credentials: \"omit\",\n });\n\n if (!response.ok) {\n throw new ApiError(\n `Failed to fetch pair pools: ${response.status}`,\n response.status\n );\n }\n\n return (await response.json()) as PoolInfo[];\n } catch (error) {\n if (error instanceof ApiError) throw error;\n throw new ApiError(\n `Failed to fetch pair pools: ${error instanceof Error ? error.message : \"unknown error\"}`\n );\n }\n}\n","import type { RouteNode } from \"../types/quote.js\";\nimport { toHex } from \"../utils/hex.js\";\n\n/**\n * Result of encoding a route\n */\nexport interface EncodedRoute {\n token: string;\n encoded: string[];\n}\n\n/**\n * Encode a single route node into calldata format\n */\nexport function encodeRouteNode(\n routeNode: RouteNode,\n currentToken: string\n): { nextToken: string; calldata: string[] } {\n const isToken1 =\n BigInt(currentToken) === BigInt(routeNode.pool_key.token1);\n const nextToken = isToken1\n ? routeNode.pool_key.token0\n : routeNode.pool_key.token1;\n\n const sqrtRatioLimit = BigInt(routeNode.sqrt_ratio_limit);\n\n const calldata = [\n routeNode.pool_key.token0,\n routeNode.pool_key.token1,\n routeNode.pool_key.fee,\n toHex(routeNode.pool_key.tick_spacing),\n routeNode.pool_key.extension,\n toHex(sqrtRatioLimit % 2n ** 128n), // low\n toHex(sqrtRatioLimit >> 128n), // high\n toHex(routeNode.skip_ahead),\n ];\n\n return { nextToken, calldata };\n}\n\n/**\n * Encode a full route (array of route nodes) into calldata format\n */\nexport function encodeRoute(\n route: RouteNode[],\n targetToken: string\n): EncodedRoute {\n return route.reduce<EncodedRoute>(\n (memo, routeNode) => {\n const { nextToken, calldata } = encodeRouteNode(routeNode, memo.token);\n return {\n token: nextToken,\n encoded: memo.encoded.concat(calldata),\n };\n },\n {\n token: targetToken,\n encoded: [],\n }\n );\n}\n","import type { SwapQuote, SwapSplit } from \"../types/quote.js\";\nimport type { SwapCall, SwapCallsResult } from \"../types/calls.js\";\nimport { encodeRoute } from \"./encoder.js\";\nimport { toHex, normalizeAddress } from \"../utils/hex.js\";\nimport { abs, addSlippage } from \"../utils/bigint.js\";\nimport { ROUTER_ADDRESSES, CHAIN_IDS } from \"../chains/constants.js\";\nimport { InvalidChainError } from \"../errors/index.js\";\n\n/**\n * Default slippage percentage (5%)\n */\nconst DEFAULT_SLIPPAGE_PERCENT = 5n;\n\n/**\n * Parameters for generating swap calls\n */\nexport interface GenerateSwapCallsParams {\n /** Token being sold (address) */\n sellToken: string;\n /** Token being bought (address) */\n buyToken: string;\n /** Minimum amount of buyToken to receive */\n minimumReceived: bigint;\n /** Quote from Ekubo API */\n quote: SwapQuote;\n /** Chain ID (Ekubo format) */\n chainId?: string;\n /** Router contract address (overrides chainId lookup) */\n routerAddress?: string;\n /** Slippage percentage for transfer amount (default: 5n = 5%) */\n slippagePercent?: bigint;\n}\n\n/**\n * Generate swap calls for Ekubo router\n *\n * This generates the calls needed to execute a swap:\n * 1. Transfer tokens to router\n * 2. Execute multihop_swap or multi_multihop_swap\n * 3. Clear minimum profits\n * 4. Clear remaining tokens\n */\nexport function generateSwapCalls(\n params: GenerateSwapCallsParams\n): SwapCallsResult {\n const {\n sellToken,\n buyToken,\n minimumReceived,\n quote,\n chainId = CHAIN_IDS.MAINNET,\n routerAddress: customRouterAddress,\n slippagePercent = DEFAULT_SLIPPAGE_PERCENT,\n } = params;\n\n // Get router address\n const routerAddress =\n customRouterAddress ??\n ROUTER_ADDRESSES[chainId as keyof typeof ROUTER_ADDRESSES];\n\n if (!routerAddress) {\n throw new InvalidChainError(\n chainId,\n `Router address not found for chain ID: ${chainId}`\n );\n }\n\n // Normalize addresses\n const normalizedSellToken = normalizeAddress(sellToken);\n const normalizedBuyToken = normalizeAddress(buyToken);\n\n // Add slippage buffer to transfer amount\n const totalWithSlippage = addSlippage(quote.total, slippagePercent);\n\n // Transfer tokens to router\n const transferCall: SwapCall = {\n contractAddress: normalizedSellToken,\n entrypoint: \"transfer\",\n calldata: [routerAddress, toHex(totalWithSlippage), \"0x0\"],\n };\n\n // Clear remaining tokens after swap\n const clearCall: SwapCall = {\n contractAddress: routerAddress,\n entrypoint: \"clear\",\n calldata: [normalizedSellToken],\n };\n\n // Return early if no valid quote\n if (!quote || quote.splits.length === 0) {\n return {\n transferCall,\n swapCalls: [],\n clearCall,\n allCalls: [transferCall, clearCall],\n };\n }\n\n const { splits } = quote;\n\n // Clear minimum profits call\n const clearMinimumCall: SwapCall = {\n contractAddress: routerAddress,\n entrypoint: \"clear_minimum\",\n calldata: [normalizedBuyToken, toHex(minimumReceived), \"0x0\"],\n };\n\n let swapCalls: SwapCall[];\n\n if (splits.length === 1) {\n // Single route swap\n swapCalls = generateSingleRouteSwap(\n splits[0]!,\n normalizedBuyToken,\n routerAddress\n );\n } else {\n // Multiple routes swap\n swapCalls = generateMultiRouteSwap(\n splits,\n normalizedBuyToken,\n routerAddress\n );\n }\n\n // Add clear_minimum after swap\n swapCalls.push(clearMinimumCall);\n\n return {\n transferCall,\n swapCalls,\n clearCall,\n allCalls: [transferCall, ...swapCalls, clearCall],\n };\n}\n\n/**\n * Generate calls for a single-route swap (multihop_swap)\n */\nfunction generateSingleRouteSwap(\n split: SwapSplit,\n targetToken: string,\n routerAddress: string\n): SwapCall[] {\n const routeCalldata = encodeRoute(split.route, targetToken);\n\n const amountSpecified = BigInt(split.amount_specified);\n const absAmount = abs(amountSpecified);\n\n return [\n {\n contractAddress: routerAddress,\n entrypoint: \"multihop_swap\",\n calldata: [\n toHex(split.route.length),\n ...routeCalldata.encoded,\n targetToken,\n toHex(absAmount),\n \"0x1\", // is_exact_amount_received flag\n ],\n },\n ];\n}\n\n/**\n * Generate calls for a multi-route swap (multi_multihop_swap)\n */\nfunction generateMultiRouteSwap(\n splits: SwapSplit[],\n targetToken: string,\n routerAddress: string\n): SwapCall[] {\n const multiRouteCalldata = splits.reduce<string[]>((memo, split) => {\n const routeCalldata = encodeRoute(split.route, targetToken);\n\n const amountSpecified = BigInt(split.amount_specified);\n const absAmount = abs(amountSpecified);\n\n return memo.concat([\n toHex(split.route.length),\n ...routeCalldata.encoded,\n targetToken,\n toHex(absAmount),\n \"0x1\", // is_exact_amount_received flag\n ]);\n }, []);\n\n return [\n {\n contractAddress: routerAddress,\n entrypoint: \"multi_multihop_swap\",\n calldata: [toHex(splits.length), ...multiRouteCalldata],\n },\n ];\n}\n\n/**\n * Prepare swap calls with approval included\n * This is a convenience wrapper that adds the ERC20 approve call\n */\nexport function prepareSwapCalls(\n params: GenerateSwapCallsParams\n): SwapCallsResult & { approveCall: SwapCall } {\n const result = generateSwapCalls(params);\n\n const {\n sellToken,\n quote,\n chainId = CHAIN_IDS.MAINNET,\n routerAddress: customRouterAddress,\n slippagePercent = DEFAULT_SLIPPAGE_PERCENT,\n } = params;\n\n const routerAddress =\n customRouterAddress ??\n ROUTER_ADDRESSES[chainId as keyof typeof ROUTER_ADDRESSES];\n\n if (!routerAddress) {\n throw new InvalidChainError(\n chainId,\n `Router address not found for chain ID: ${chainId}`\n );\n }\n\n const normalizedSellToken = normalizeAddress(sellToken);\n const totalWithSlippage = addSlippage(quote.total, slippagePercent);\n\n // Generate approve call\n const approveCall: SwapCall = {\n contractAddress: normalizedSellToken,\n entrypoint: \"approve\",\n calldata: [routerAddress, toHex(totalWithSlippage), \"0x0\"],\n };\n\n return {\n ...result,\n approveCall,\n allCalls: [approveCall, ...result.allCalls],\n };\n}\n","import type { TokenInfo } from \"../types/token.js\";\n\n/**\n * Well-known mainnet tokens\n */\nexport const MAINNET_TOKENS: TokenInfo[] = [\n {\n symbol: \"ETH\",\n name: \"Ether\",\n address: \"0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7\",\n decimals: 18,\n },\n {\n symbol: \"STRK\",\n name: \"Starknet Token\",\n address: \"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d\",\n decimals: 18,\n },\n {\n symbol: \"USDC\",\n name: \"USD Coin\",\n address: \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\",\n decimals: 6,\n },\n {\n symbol: \"USDC.e\",\n name: \"Bridged USDC\",\n address: \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\n decimals: 6,\n },\n {\n symbol: \"USDT\",\n name: \"Tether USD\",\n address: \"0x068f5c6a61780768455de69077e07e89787839bf8166decfbf92b645209c0fb8\",\n decimals: 6,\n },\n {\n symbol: \"DAI\",\n name: \"Dai Stablecoin\",\n address: \"0x00da114221cb83fa859dbdb4c44beeaa0bb37c7537ad5ae66fe5e0efd20e6eb3\",\n decimals: 18,\n },\n {\n symbol: \"WBTC\",\n name: \"Wrapped Bitcoin\",\n address: \"0x03fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac\",\n decimals: 8,\n },\n {\n symbol: \"LORDS\",\n name: \"Lords Token\",\n address: \"0x0124aeb495b947201f5fac96fd1138e326ad86195b98df6dec9009158a533b49\",\n decimals: 18,\n },\n {\n symbol: \"wstETH\",\n name: \"Wrapped stETH\",\n address: \"0x042b8f0484674ca266ac5d08e4ac6a3fe65bd3129795def2dca5c34ecc5f96d2\",\n decimals: 18,\n },\n {\n symbol: \"EKUBO\",\n name: \"Ekubo Protocol\",\n address: \"0x075afe6402ad5a5c20dd25e10ec3b3986acaa647b77e4ae24b0cbc9a54a27a87\",\n decimals: 18,\n },\n {\n symbol: \"ZEND\",\n name: \"zkLend\",\n address: \"0x00585c32b625999e6e5e78645ff8df7a9001cf5cf3eb6b80ccdd16cb64bd3a34\",\n decimals: 18,\n },\n {\n symbol: \"NSTR\",\n name: \"Nostra\",\n address: \"0x04619e9ce4109590219c5263787050726be63382148538f3f936c22aa87d2fc2\",\n decimals: 18,\n },\n];\n\n/**\n * Get mainnet tokens as a map by symbol (uppercase)\n */\nexport function getMainnetTokensMap(): Map<string, TokenInfo> {\n const map = new Map<string, TokenInfo>();\n for (const token of MAINNET_TOKENS) {\n map.set(token.symbol.toUpperCase(), token);\n }\n return map;\n}\n","import type { TokenInfo } from \"../types/token.js\";\nimport { normalizeAddress } from \"../utils/hex.js\";\nimport { MAINNET_TOKENS } from \"./mainnet.js\";\n\n/**\n * Token registry for managing token information and symbol-to-address resolution\n */\nexport class TokenRegistry {\n private symbolMap: Map<string, TokenInfo> = new Map();\n private addressMap: Map<string, TokenInfo> = new Map();\n\n constructor(tokens: TokenInfo[] = []) {\n // Register mainnet tokens by default\n for (const token of MAINNET_TOKENS) {\n this.register(token);\n }\n\n // Register custom tokens\n for (const token of tokens) {\n this.register(token);\n }\n }\n\n /**\n * Register a token\n */\n register(token: TokenInfo): void {\n const upperSymbol = token.symbol.toUpperCase();\n const normalizedAddress = normalizeAddress(token.address);\n\n const normalizedToken: TokenInfo = {\n ...token,\n address: normalizedAddress,\n };\n\n this.symbolMap.set(upperSymbol, normalizedToken);\n this.addressMap.set(normalizedAddress, normalizedToken);\n }\n\n /**\n * Get token by symbol (case-insensitive)\n */\n getBySymbol(symbol: string): TokenInfo | undefined {\n return this.symbolMap.get(symbol.toUpperCase());\n }\n\n /**\n * Get token by address (normalized)\n */\n getByAddress(address: string): TokenInfo | undefined {\n return this.addressMap.get(normalizeAddress(address));\n }\n\n /**\n * Check if a token exists by symbol\n */\n hasSymbol(symbol: string): boolean {\n return this.symbolMap.has(symbol.toUpperCase());\n }\n\n /**\n * Check if a token exists by address\n */\n hasAddress(address: string): boolean {\n return this.addressMap.has(normalizeAddress(address));\n }\n\n /**\n * Get all registered tokens\n */\n getAll(): TokenInfo[] {\n return Array.from(this.symbolMap.values());\n }\n\n /**\n * Get all registered symbols\n */\n getSymbols(): string[] {\n return Array.from(this.symbolMap.keys());\n }\n}\n\n/**\n * Default registry instance with mainnet tokens\n */\nlet defaultRegistry: TokenRegistry | null = null;\n\n/**\n * Get the default token registry (singleton)\n */\nexport function getDefaultRegistry(): TokenRegistry {\n if (!defaultRegistry) {\n defaultRegistry = new TokenRegistry();\n }\n return defaultRegistry;\n}\n\n/**\n * Create a new token registry with custom tokens\n */\nexport function createTokenRegistry(customTokens: TokenInfo[] = []): TokenRegistry {\n return new TokenRegistry(customTokens);\n}\n","import type { TokenInfo } from \"../types/token.js\";\nimport { isAddress, normalizeAddress } from \"../utils/hex.js\";\nimport { TokenNotFoundError } from \"../errors/index.js\";\nimport { TokenRegistry, getDefaultRegistry } from \"./registry.js\";\n\n/**\n * Resolve a token identifier (symbol or address) to a normalized address\n *\n * @param tokenIdentifier - Token symbol (e.g., \"ETH\") or address\n * @param registry - Optional token registry (defaults to mainnet tokens)\n * @returns Normalized address\n * @throws TokenNotFoundError if symbol is not found in registry\n */\nexport function resolveToken(\n tokenIdentifier: string,\n registry?: TokenRegistry\n): string {\n const reg = registry ?? getDefaultRegistry();\n\n // If it's already an address, normalize and return\n if (isAddress(tokenIdentifier)) {\n return normalizeAddress(tokenIdentifier);\n }\n\n // Try to resolve as symbol\n const token = reg.getBySymbol(tokenIdentifier);\n if (token) {\n return token.address;\n }\n\n throw new TokenNotFoundError(tokenIdentifier);\n}\n\n/**\n * Resolve a token identifier to full token info\n *\n * @param tokenIdentifier - Token symbol or address\n * @param registry - Optional token registry\n * @returns TokenInfo or undefined if not found\n */\nexport function resolveTokenInfo(\n tokenIdentifier: string,\n registry?: TokenRegistry\n): TokenInfo | undefined {\n const reg = registry ?? getDefaultRegistry();\n\n // If it's an address, try to find in registry\n if (isAddress(tokenIdentifier)) {\n return reg.getByAddress(tokenIdentifier);\n }\n\n // Try to resolve as symbol\n return reg.getBySymbol(tokenIdentifier);\n}\n\n/**\n * Check if a token identifier can be resolved\n */\nexport function canResolveToken(\n tokenIdentifier: string,\n registry?: TokenRegistry\n): boolean {\n // Addresses can always be resolved\n if (isAddress(tokenIdentifier)) {\n return true;\n }\n\n // Check if symbol exists in registry\n const reg = registry ?? getDefaultRegistry();\n return reg.hasSymbol(tokenIdentifier);\n}\n","import type { SwapQuote, PollingConfig, FetchConfig } from \"../types/index.js\";\nimport { fetchSwapQuote } from \"../api/quote.js\";\n\n/**\n * Default polling configuration\n */\nexport const DEFAULT_POLLING_CONFIG: Required<PollingConfig> = {\n interval: 5000,\n maxConsecutiveErrors: 3,\n};\n\n/**\n * Quote poller callbacks\n */\nexport interface QuotePollerCallbacks {\n /** Called when a new quote is received */\n onQuote: (quote: SwapQuote) => void;\n /** Called when an error occurs */\n onError?: (error: Error) => void;\n /** Called when polling stops (due to errors or manually) */\n onStop?: (reason: \"manual\" | \"errors\") => void;\n}\n\n/**\n * Parameters for quote polling\n */\nexport interface QuotePollerParams {\n /** Amount to swap */\n amount: bigint;\n /** Token to sell (address) */\n tokenFrom: string;\n /** Token to buy (address) */\n tokenTo: string;\n /** Chain ID (Ekubo format) */\n chainId?: string;\n}\n\n/**\n * QuotePoller class for real-time quote updates\n */\nexport class QuotePoller {\n private intervalId: ReturnType<typeof setInterval> | null = null;\n private abortController: AbortController | null = null;\n private consecutiveErrors = 0;\n private isRunning = false;\n\n private readonly params: QuotePollerParams;\n private readonly callbacks: QuotePollerCallbacks;\n private readonly config: Required<PollingConfig>;\n private readonly fetchConfig?: FetchConfig;\n\n constructor(\n params: QuotePollerParams,\n callbacks: QuotePollerCallbacks,\n config: PollingConfig = {},\n fetchConfig?: FetchConfig\n ) {\n this.params = params;\n this.callbacks = callbacks;\n this.config = { ...DEFAULT_POLLING_CONFIG, ...config };\n this.fetchConfig = fetchConfig;\n }\n\n /**\n * Start polling for quotes\n */\n start(): void {\n if (this.isRunning) {\n return;\n }\n\n this.isRunning = true;\n this.consecutiveErrors = 0;\n this.abortController = new AbortController();\n\n // Fetch immediately\n void this.fetchQuote();\n\n // Set up interval\n this.intervalId = setInterval(() => {\n void this.fetchQuote();\n }, this.config.interval);\n }\n\n /**\n * Stop polling\n */\n stop(): void {\n if (!this.isRunning) {\n return;\n }\n\n this.isRunning = false;\n\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n\n this.callbacks.onStop?.(\"manual\");\n }\n\n /**\n * Check if currently polling\n */\n get running(): boolean {\n return this.isRunning;\n }\n\n /**\n * Update polling parameters (requires restart)\n */\n updateParams(params: Partial<QuotePollerParams>): void {\n Object.assign(this.params, params);\n\n // If running, restart to apply new params\n if (this.isRunning) {\n this.stop();\n this.start();\n }\n }\n\n /**\n * Fetch a quote\n */\n private async fetchQuote(): Promise<void> {\n if (!this.isRunning || !this.abortController) {\n return;\n }\n\n try {\n const quote = await fetchSwapQuote({\n amount: this.params.amount,\n tokenFrom: this.params.tokenFrom,\n tokenTo: this.params.tokenTo,\n chainId: this.params.chainId,\n signal: this.abortController.signal,\n fetchConfig: this.fetchConfig,\n });\n\n // Reset consecutive errors on success\n this.consecutiveErrors = 0;\n\n this.callbacks.onQuote(quote);\n } catch (error) {\n // Ignore abort errors when stopping\n if (error instanceof Error && error.name === \"AbortError\") {\n return;\n }\n\n this.consecutiveErrors++;\n this.callbacks.onError?.(error as Error);\n\n // Stop if too many consecutive errors\n if (this.consecutiveErrors >= this.config.maxConsecutiveErrors) {\n this.stopDueToErrors();\n }\n }\n }\n\n /**\n * Stop due to consecutive errors\n */\n private stopDueToErrors(): void {\n this.isRunning = false;\n\n if (this.intervalId) {\n clearInterval(this.intervalId);\n this.intervalId = null;\n }\n\n if (this.abortController) {\n this.abortController.abort();\n this.abortController = null;\n }\n\n this.callbacks.onStop?.(\"errors\");\n }\n}\n\n/**\n * Create a quote poller instance\n */\nexport function createQuotePoller(\n params: QuotePollerParams,\n callbacks: QuotePollerCallbacks,\n config?: PollingConfig,\n fetchConfig?: FetchConfig\n): QuotePoller {\n return new QuotePoller(params, callbacks, config, fetchConfig);\n}\n","import type {\n EkuboClientConfig,\n ResolvedConfig,\n SwapQuote,\n SwapCallsResult,\n SwapCall,\n FetchQuoteParams,\n TokenInfo,\n PollingConfig,\n} from \"./types/index.js\";\nimport { fetchSwapQuote, fetchSwapQuoteInUsdc } from \"./api/quote.js\";\nimport { getPriceHistory, type PriceHistoryResponse } from \"./api/price.js\";\nimport {\n fetchTokens,\n fetchToken,\n fetchTokensBatch,\n type ApiTokenInfo,\n} from \"./api/tokens.js\";\nimport {\n fetchTopPairs,\n fetchTvl,\n fetchVolume,\n fetchPairTvl,\n fetchPairVolume,\n fetchPairPools,\n type PairStats,\n type OverviewStats,\n type PoolInfo,\n type TvlDataPoint,\n type VolumeDataPoint,\n} from \"./api/stats.js\";\nimport {\n generateSwapCalls,\n prepareSwapCalls,\n type GenerateSwapCallsParams,\n} from \"./calls/generator.js\";\nimport { TokenRegistry, resolveToken } from \"./tokens/index.js\";\nimport {\n QuotePoller,\n type QuotePollerCallbacks,\n DEFAULT_POLLING_CONFIG,\n} from \"./polling/poller.js\";\nimport { getChainConfig, CHAIN_IDS } from \"./chains/constants.js\";\nimport { DEFAULT_FETCH_CONFIG } from \"./utils/retry.js\";\nimport { InvalidChainError } from \"./errors/index.js\";\n\n/**\n * Default client configuration\n */\nconst DEFAULT_CONFIG = {\n chain: \"mainnet\" as const,\n defaultSlippagePercent: 5n,\n};\n\n/**\n * Main Ekubo SDK client\n *\n * Provides a high-level interface for:\n * - Fetching swap quotes\n * - Generating swap calls\n * - Token symbol resolution\n * - Quote polling\n * - Protocol statistics (TVL, volume, pairs)\n * - Dynamic token list fetching\n */\nexport class EkuboClient {\n private readonly config: ResolvedConfig;\n private readonly tokenRegistry: TokenRegistry;\n\n constructor(config: EkuboClientConfig = {}) {\n this.config = this.resolveConfig(config);\n this.tokenRegistry = new TokenRegistry(config.customTokens);\n }\n\n /**\n * Resolve configuration with defaults\n */\n private resolveConfig(config: EkuboClientConfig): ResolvedConfig {\n const chain = config.chain ?? DEFAULT_CONFIG.chain;\n const chainConfig = config.chainId\n ? getChainConfig(config.chainId)\n : getChainConfig(chain);\n\n if (!chainConfig && !config.chainId) {\n throw new InvalidChainError(chain);\n }\n\n return {\n chainId: config.chainId ?? chainConfig?.chainId ?? CHAIN_IDS.MAINNET,\n quoterApiUrl:\n config.quoterApiUrl ??\n chainConfig?.quoterApiUrl ??\n \"https://prod-api-quoter.ekubo.org\",\n apiUrl:\n config.apiUrl ?? chainConfig?.apiUrl ?? \"https://prod-api.ekubo.org\",\n routerAddress: config.routerAddress ?? chainConfig?.routerAddress ?? \"\",\n defaultSlippagePercent:\n config.defaultSlippagePercent ?? DEFAULT_CONFIG.defaultSlippagePercent,\n fetch: { ...DEFAULT_FETCH_CONFIG, ...config.fetch },\n polling: { ...DEFAULT_POLLING_CONFIG, ...config.polling },\n };\n }\n\n /**\n * Get the current chain ID\n */\n get chainId(): string {\n return this.config.chainId;\n }\n\n /**\n * Get the router contract address\n */\n get routerAddress(): string {\n return this.config.routerAddress;\n }\n\n /**\n * Get the token registry\n */\n get tokens(): TokenRegistry {\n return this.tokenRegistry;\n }\n\n /**\n * Resolve a token identifier (symbol or address) to an address\n */\n resolveToken(tokenIdentifier: string): string {\n return resolveToken(tokenIdentifier, this.tokenRegistry);\n }\n\n // ==========================================================================\n // Swap Quotes\n // ==========================================================================\n\n /**\n * Fetch a swap quote\n *\n * @param params - Quote parameters (supports symbols or addresses)\n * @returns Swap quote\n */\n async getQuote(params: FetchQuoteParams): Promise<SwapQuote> {\n const tokenFrom = this.resolveToken(params.tokenFrom);\n const tokenTo = this.resolveToken(params.tokenTo);\n\n return fetchSwapQuote({\n amount: params.amount,\n tokenFrom,\n tokenTo,\n chainId: this.config.chainId,\n signal: params.signal,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch a token price in USDC\n *\n * @param tokenIdentifier - Token symbol or address\n * @param amount - Amount of token\n * @param signal - Optional abort signal\n * @returns Price in USDC (as bigint)\n */\n async getUsdcPrice(\n tokenIdentifier: string,\n amount: bigint,\n signal?: AbortSignal\n ): Promise<bigint> {\n const tokenFrom = this.resolveToken(tokenIdentifier);\n\n return fetchSwapQuoteInUsdc({\n amount,\n tokenFrom,\n chainId: this.config.chainId,\n signal,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch price history\n *\n * @param token - Token symbol or address\n * @param otherToken - Quote token symbol or address\n * @param interval - Time interval in seconds (default: 7000)\n * @returns Price history data\n */\n async getPriceHistory(\n token: string,\n otherToken: string,\n interval?: number\n ): Promise<PriceHistoryResponse> {\n const resolvedToken = this.resolveToken(token);\n const resolvedOtherToken = this.resolveToken(otherToken);\n\n return getPriceHistory({\n token: resolvedToken,\n otherToken: resolvedOtherToken,\n chainId: this.config.chainId,\n interval,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n // ==========================================================================\n // Swap Call Generation\n // ==========================================================================\n\n /**\n * Generate swap calls from a quote\n *\n * @param params - Call generation parameters (supports symbols or addresses)\n * @returns Swap calls result\n */\n generateSwapCalls(\n params: Omit<GenerateSwapCallsParams, \"chainId\" | \"routerAddress\">\n ): SwapCallsResult {\n const sellToken = this.resolveToken(params.sellToken);\n const buyToken = this.resolveToken(params.buyToken);\n\n return generateSwapCalls({\n ...params,\n sellToken,\n buyToken,\n chainId: this.config.chainId,\n routerAddress: this.config.routerAddress,\n slippagePercent:\n params.slippagePercent ?? this.config.defaultSlippagePercent,\n });\n }\n\n /**\n * Prepare swap calls with approval included\n *\n * @param params - Call generation parameters (supports symbols or addresses)\n * @returns Swap calls result with approve call\n */\n prepareSwapCalls(\n params: Omit<GenerateSwapCallsParams, \"chainId\" | \"routerAddress\">\n ): SwapCallsResult & { approveCall: SwapCall } {\n const sellToken = this.resolveToken(params.sellToken);\n const buyToken = this.resolveToken(params.buyToken);\n\n return prepareSwapCalls({\n ...params,\n sellToken,\n buyToken,\n chainId: this.config.chainId,\n routerAddress: this.config.routerAddress,\n slippagePercent:\n params.slippagePercent ?? this.config.defaultSlippagePercent,\n });\n }\n\n // ==========================================================================\n // Quote Polling\n // ==========================================================================\n\n /**\n * Create a quote poller for real-time updates\n *\n * @param params - Quote parameters (supports symbols or addresses)\n * @param callbacks - Poller callbacks\n * @param config - Optional polling configuration\n * @returns QuotePoller instance\n */\n createQuotePoller(\n params: Omit<FetchQuoteParams, \"signal\">,\n callbacks: QuotePollerCallbacks,\n config?: PollingConfig\n ): QuotePoller {\n const tokenFrom = this.resolveToken(params.tokenFrom);\n const tokenTo = this.resolveToken(params.tokenTo);\n\n return new QuotePoller(\n {\n amount: params.amount,\n tokenFrom,\n tokenTo,\n chainId: this.config.chainId,\n },\n callbacks,\n { ...this.config.polling, ...config },\n this.config.fetch\n );\n }\n\n // ==========================================================================\n // Token Management\n // ==========================================================================\n\n /**\n * Register a custom token in the local registry\n */\n registerToken(token: TokenInfo): void {\n this.tokenRegistry.register(token);\n }\n\n /**\n * Fetch all tokens from the Ekubo API\n *\n * @returns Array of token metadata from the API\n */\n async fetchTokens(): Promise<ApiTokenInfo[]> {\n return fetchTokens({\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch metadata for a single token from the API\n *\n * @param tokenAddress - Token contract address\n * @returns Token metadata or null if not found\n */\n async fetchToken(tokenAddress: string): Promise<ApiTokenInfo | null> {\n const resolved = this.resolveToken(tokenAddress);\n return fetchToken({\n tokenAddress: resolved,\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch metadata for multiple tokens at once\n *\n * @param tokenAddresses - Array of token addresses\n * @returns Array of token metadata\n */\n async fetchTokensBatch(tokenAddresses: string[]): Promise<ApiTokenInfo[]> {\n const resolved = tokenAddresses.map((addr) => this.resolveToken(addr));\n return fetchTokensBatch({\n tokenAddresses: resolved,\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch tokens from API and register them in the local registry\n *\n * @returns Number of tokens registered\n */\n async syncTokensFromApi(): Promise<number> {\n const apiTokens = await this.fetchTokens();\n\n for (const token of apiTokens) {\n this.tokenRegistry.register({\n symbol: token.symbol,\n address: token.address,\n decimals: token.decimals,\n name: token.name,\n });\n }\n\n return apiTokens.length;\n }\n\n // ==========================================================================\n // Protocol Statistics\n // ==========================================================================\n\n /**\n * Fetch top trading pairs by volume\n *\n * @returns Array of pair statistics\n */\n async getTopPairs(): Promise<PairStats[]> {\n return fetchTopPairs({\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch protocol TVL overview\n *\n * @returns TVL statistics\n */\n async getTvl(): Promise<OverviewStats> {\n return fetchTvl({\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch protocol volume overview\n *\n * @returns Volume statistics\n */\n async getVolume(): Promise<OverviewStats> {\n return fetchVolume({\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch TVL history for a trading pair\n *\n * @param tokenA - First token (symbol or address)\n * @param tokenB - Second token (symbol or address)\n * @returns TVL data points\n */\n async getPairTvl(tokenA: string, tokenB: string): Promise<TvlDataPoint[]> {\n const resolvedA = this.resolveToken(tokenA);\n const resolvedB = this.resolveToken(tokenB);\n\n return fetchPairTvl({\n tokenA: resolvedA,\n tokenB: resolvedB,\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch volume history for a trading pair\n *\n * @param tokenA - First token (symbol or address)\n * @param tokenB - Second token (symbol or address)\n * @returns Volume data points\n */\n async getPairVolume(\n tokenA: string,\n tokenB: string\n ): Promise<VolumeDataPoint[]> {\n const resolvedA = this.resolveToken(tokenA);\n const resolvedB = this.resolveToken(tokenB);\n\n return fetchPairVolume({\n tokenA: resolvedA,\n tokenB: resolvedB,\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n\n /**\n * Fetch pools for a trading pair\n *\n * @param tokenA - First token (symbol or address)\n * @param tokenB - Second token (symbol or address)\n * @returns Pool information\n */\n async getPairPools(tokenA: string, tokenB: string): Promise<PoolInfo[]> {\n const resolvedA = this.resolveToken(tokenA);\n const resolvedB = this.resolveToken(tokenB);\n\n return fetchPairPools({\n tokenA: resolvedA,\n tokenB: resolvedB,\n chainId: this.config.chainId,\n apiUrl: this.config.apiUrl,\n fetchConfig: this.config.fetch,\n });\n }\n}\n\n/**\n * Create an EkuboClient instance\n */\nexport function createEkuboClient(config?: EkuboClientConfig): EkuboClient {\n return new EkuboClient(config);\n}\n","import {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport type { EkuboClientConfig } from \"../types/index.js\";\n\n/**\n * Context for sharing EkuboClient instance across components\n */\nconst EkuboContext = createContext<EkuboClient | null>(null);\n\nexport interface EkuboProviderProps {\n children: ReactNode;\n /** Client configuration */\n config?: EkuboClientConfig;\n /** Pre-created client instance (alternative to config) */\n client?: EkuboClient;\n}\n\n/**\n * Provider component for EkuboClient\n *\n * @example\n * ```tsx\n * import { EkuboProvider } from '@provable-games/ekubo-sdk/react';\n *\n * function App() {\n * return (\n * <EkuboProvider config={{ chain: 'mainnet' }}>\n * <YourApp />\n * </EkuboProvider>\n * );\n * }\n * ```\n */\nexport function EkuboProvider({\n children,\n config,\n client: providedClient,\n}: EkuboProviderProps) {\n const client = useMemo(() => {\n if (providedClient) {\n return providedClient;\n }\n return createEkuboClient(config);\n }, [providedClient, config]);\n\n return (\n <EkuboContext.Provider value={client}>{children}</EkuboContext.Provider>\n );\n}\n\n/**\n * Hook to access the EkuboClient from context\n *\n * @throws Error if used outside of EkuboProvider\n */\nexport function useEkuboClient(): EkuboClient {\n const client = useContext(EkuboContext);\n if (!client) {\n throw new Error(\"useEkuboClient must be used within an EkuboProvider\");\n }\n return client;\n}\n\n/**\n * Hook to optionally access the EkuboClient from context\n * Returns null if used outside of EkuboProvider\n */\nexport function useOptionalEkuboClient(): EkuboClient | null {\n return useContext(EkuboContext);\n}\n","import { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport type { SwapQuote, SwapCallsResult, EkuboClientConfig } from \"../types/index.js\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport { InsufficientLiquidityError } from \"../errors/index.js\";\nimport { normalizeAddress } from \"../utils/index.js\";\nimport { useOptionalEkuboClient } from \"./context.js\";\n\nexport interface UseEkuboSwapState {\n /** Current swap quote */\n quote: SwapQuote | null;\n /** Whether a quote is being fetched */\n loading: boolean;\n /** Error from the last quote fetch */\n error: Error | null;\n /** Price impact percentage */\n priceImpact: number | null;\n /** Whether there's insufficient liquidity for this swap */\n insufficientLiquidity: boolean;\n}\n\nexport interface UseEkuboSwapResult {\n /** Current state */\n state: UseEkuboSwapState;\n /** Generate swap calls from the current quote */\n generateCalls: (slippagePercent?: bigint, minimumReceived?: bigint) => SwapCallsResult | null;\n /** Manually trigger a quote refetch */\n refetch: () => void;\n}\n\nexport interface UseEkuboSwapProps {\n /** Token being sold (address or symbol) */\n sellToken: string | null;\n /** Token being bought (address or symbol) */\n buyToken: string | null;\n /** Amount to swap (positive for exact input, negative for exact output) */\n amount: bigint;\n /** Whether to enable quote polling (default: true when tokens are valid) */\n enabled?: boolean;\n /** Polling interval in ms (default: 5000) */\n pollingInterval?: number;\n /** Default slippage percent (default: 5n = 5%) */\n defaultSlippagePercent?: bigint;\n /** Client config (optional if using EkuboProvider) */\n config?: EkuboClientConfig;\n}\n\n// Module-level singleton for when not using provider\nlet defaultClientInstance: EkuboClient | null = null;\n\nfunction getDefaultClient(config?: EkuboClientConfig): EkuboClient {\n if (!defaultClientInstance) {\n defaultClientInstance = createEkuboClient(config);\n }\n return defaultClientInstance;\n}\n\n/**\n * Hook for fetching swap quotes with automatic polling\n *\n * Uses EkuboProvider client if available, otherwise creates a singleton client.\n *\n * @example\n * ```tsx\n * import { useEkuboSwap } from '@provable-games/ekubo-sdk/react';\n *\n * function SwapForm() {\n * const { state, generateCalls, refetch } = useEkuboSwap({\n * sellToken: 'ETH',\n * buyToken: 'USDC',\n * amount: 1000000000000000000n, // 1 ETH\n * });\n *\n * if (state.loading) return <div>Loading quote...</div>;\n * if (state.error) return <div>Error: {state.error.message}</div>;\n * if (state.insufficientLiquidity) return <div>Insufficient liquidity</div>;\n *\n * const handleSwap = () => {\n * const calls = generateCalls(5n); // 5% slippage\n * if (calls) {\n * // Execute calls with your wallet\n * }\n * };\n *\n * return (\n * <div>\n * <p>You will receive: {state.quote?.total}</p>\n * <button onClick={handleSwap}>Swap</button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useEkuboSwap({\n sellToken,\n buyToken,\n amount,\n enabled = true,\n pollingInterval = 5000,\n defaultSlippagePercent = 5n,\n config,\n}: UseEkuboSwapProps): UseEkuboSwapResult {\n const contextClient = useOptionalEkuboClient();\n const client = contextClient ?? getDefaultClient(config);\n\n const [state, setState] = useState<UseEkuboSwapState>({\n quote: null,\n loading: false,\n error: null,\n priceImpact: null,\n insufficientLiquidity: false,\n });\n\n const pollerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n const latestQuoteRef = useRef<SwapQuote | null>(null);\n\n // Normalize and compare addresses\n const isSameToken = useMemo(() => {\n if (!sellToken || !buyToken) return true;\n try {\n return (\n normalizeAddress(sellToken).toLowerCase() ===\n normalizeAddress(buyToken).toLowerCase()\n );\n } catch {\n return false;\n }\n }, [sellToken, buyToken]);\n\n // Whether we have valid params to fetch a quote\n const canFetch = useMemo(() => {\n return (\n !isSameToken &&\n sellToken !== null &&\n buyToken !== null &&\n amount !== 0n\n );\n }, [isSameToken, sellToken, buyToken, amount]);\n\n // Whether auto-polling should be active\n const shouldPoll = enabled && canFetch;\n\n const fetchQuote = useCallback(async () => {\n if (!canFetch || !sellToken || !buyToken) return;\n\n // Cancel any pending request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n setState((prev) => ({ ...prev, loading: true, error: null }));\n\n try {\n const quote = await client.getQuote({\n amount,\n tokenFrom: sellToken,\n tokenTo: buyToken,\n signal: abortControllerRef.current.signal,\n });\n\n latestQuoteRef.current = quote;\n\n setState({\n quote,\n loading: false,\n error: null,\n priceImpact: quote.impact,\n insufficientLiquidity: false,\n });\n } catch (err) {\n // Ignore abort errors\n if (err instanceof Error && err.name === \"AbortError\") {\n return;\n }\n\n const isInsufficient = err instanceof InsufficientLiquidityError;\n\n setState((prev) => ({\n ...prev,\n quote: null,\n loading: false,\n error: err instanceof Error ? err : new Error(\"Unknown error\"),\n priceImpact: null,\n insufficientLiquidity: isInsufficient,\n }));\n }\n }, [canFetch, sellToken, buyToken, amount, client]);\n\n // Set up polling (only when enabled)\n useEffect(() => {\n // Clean up previous poller\n if (pollerRef.current) {\n clearInterval(pollerRef.current);\n pollerRef.current = null;\n }\n\n if (!shouldPoll) {\n // Only reset state if we can't fetch at all (not just disabled polling)\n if (!canFetch) {\n setState({\n quote: null,\n loading: false,\n error: null,\n priceImpact: null,\n insufficientLiquidity: false,\n });\n }\n return;\n }\n\n // Fetch immediately\n fetchQuote();\n\n // Set up polling interval\n pollerRef.current = setInterval(fetchQuote, pollingInterval);\n\n return () => {\n if (pollerRef.current) {\n clearInterval(pollerRef.current);\n pollerRef.current = null;\n }\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n }\n };\n }, [shouldPoll, canFetch, fetchQuote, pollingInterval]);\n\n // Generate swap calls from the current quote\n const generateCalls = useCallback(\n (slippagePercent?: bigint, minimumReceived?: bigint): SwapCallsResult | null => {\n const quote = latestQuoteRef.current;\n if (!quote || !sellToken || !buyToken) return null;\n\n try {\n // Use provided minimumReceived, or calculate from amount (for exact output, amount is what we expect to receive)\n const minReceived = minimumReceived ?? (amount > 0n ? quote.total : amount);\n\n return client.prepareSwapCalls({\n sellToken,\n buyToken,\n quote,\n minimumReceived: minReceived < 0n ? -minReceived : minReceived,\n slippagePercent: slippagePercent ?? defaultSlippagePercent,\n });\n } catch (err) {\n console.error(\"Error generating swap calls:\", err);\n return null;\n }\n },\n [sellToken, buyToken, amount, defaultSlippagePercent, client]\n );\n\n const refetch = useCallback(() => {\n fetchQuote();\n }, [fetchQuote]);\n\n return useMemo(\n () => ({\n state,\n generateCalls,\n refetch,\n }),\n [state, generateCalls, refetch]\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { EkuboClientConfig } from \"../types/index.js\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport { useOptionalEkuboClient } from \"./context.js\";\n\nexport interface TokenPrices {\n [address: string]: number | undefined;\n}\n\ninterface TokenLoadingStates {\n [address: string]: boolean;\n}\n\ninterface TokenErrorStates {\n [address: string]: boolean;\n}\n\nexport interface UseEkuboPricesResult {\n /** Map of token addresses to USD prices */\n prices: TokenPrices;\n /** Whether any prices are still loading */\n isLoading: boolean;\n /** Check if a specific token is still loading */\n isTokenLoading: (tokenAddress: string) => boolean;\n /** Check if a specific token had an error */\n hasTokenError: (tokenAddress: string) => boolean;\n /** Check if a token has a valid price (loaded, no error) */\n isTokenAvailable: (tokenAddress: string) => boolean;\n /** Get a token's price (returns undefined if not available) */\n getPrice: (tokenAddress: string) => number | undefined;\n /** Manually refetch all prices */\n refetch: () => void;\n}\n\nexport interface UseEkuboPricesProps {\n /** Array of token addresses to fetch prices for */\n tokens: string[];\n /** Timeout for each price fetch in ms (default: 10000) */\n timeoutMs?: number;\n /** Client config (optional if using EkuboProvider) */\n config?: EkuboClientConfig;\n /** Whether to enable price fetching (default: true) */\n enabled?: boolean;\n /** Standard amount for price calculation (default: 1e18 - 1 token with 18 decimals) */\n standardAmount?: bigint;\n}\n\n// Module-level singleton for when not using provider\nlet defaultClientInstance: EkuboClient | null = null;\n\nfunction getDefaultClient(config?: EkuboClientConfig): EkuboClient {\n if (!defaultClientInstance) {\n defaultClientInstance = createEkuboClient(config);\n }\n return defaultClientInstance;\n}\n\n/**\n * Hook for fetching USD prices for multiple tokens\n *\n * Uses EkuboProvider client if available, otherwise creates a singleton client.\n *\n * @example\n * ```tsx\n * import { useEkuboPrices } from '@provable-games/ekubo-sdk/react';\n *\n * function TokenPrices() {\n * const {\n * prices,\n * isLoading,\n * getPrice,\n * isTokenAvailable\n * } = useEkuboPrices({\n * tokens: [ETH_ADDRESS, STRK_ADDRESS]\n * });\n *\n * if (isLoading) return <div>Loading prices...</div>;\n *\n * return (\n * <div>\n * <p>ETH: ${isTokenAvailable(ETH_ADDRESS) ? getPrice(ETH_ADDRESS) : 'N/A'}</p>\n * <p>STRK: ${isTokenAvailable(STRK_ADDRESS) ? getPrice(STRK_ADDRESS) : 'N/A'}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport function useEkuboPrices({\n tokens,\n timeoutMs = 10000,\n config,\n enabled = true,\n standardAmount = 1000000000000000000n, // 1e18\n}: UseEkuboPricesProps): UseEkuboPricesResult {\n const contextClient = useOptionalEkuboClient();\n const client = contextClient ?? getDefaultClient(config);\n\n const [prices, setPrices] = useState<TokenPrices>({});\n const [isLoading, setIsLoading] = useState(true);\n const [tokenLoadingStates, setTokenLoadingStates] = useState<TokenLoadingStates>({});\n const [tokenErrorStates, setTokenErrorStates] = useState<TokenErrorStates>({});\n const [fetchKey, setFetchKey] = useState(0);\n\n // Sort token addresses to ensure consistent key regardless of order\n const tokensKey = useMemo(() => JSON.stringify([...tokens].sort()), [tokens]);\n\n const isTokenAvailable = useCallback(\n (tokenAddress: string): boolean => {\n if (!tokens.includes(tokenAddress)) return false;\n if (tokenLoadingStates[tokenAddress] === true) return false;\n if (tokenErrorStates[tokenAddress] === true) return false;\n if (prices[tokenAddress] === undefined) return false;\n return true;\n },\n [tokens, tokenLoadingStates, tokenErrorStates, prices]\n );\n\n const isTokenLoading = useCallback(\n (tokenAddress: string): boolean => {\n if (!tokens.includes(tokenAddress)) return true;\n return tokenLoadingStates[tokenAddress] === true;\n },\n [tokens, tokenLoadingStates]\n );\n\n const hasTokenError = useCallback(\n (tokenAddress: string): boolean => {\n if (!tokens.includes(tokenAddress)) return false;\n return tokenErrorStates[tokenAddress] === true;\n },\n [tokens, tokenErrorStates]\n );\n\n const getPrice = useCallback(\n (tokenAddress: string): number | undefined => {\n if (!isTokenAvailable(tokenAddress)) {\n return undefined;\n }\n return prices[tokenAddress];\n },\n [isTokenAvailable, prices]\n );\n\n const refetch = useCallback(() => {\n setFetchKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n if (!enabled || !tokens || tokens.length === 0) {\n setIsLoading(false);\n setPrices({});\n setTokenLoadingStates({});\n setTokenErrorStates({});\n return;\n }\n\n // Reset all states when tokens change\n setIsLoading(true);\n setTokenLoadingStates(\n tokens.reduce((acc, address) => ({ ...acc, [address]: true }), {})\n );\n setTokenErrorStates(\n tokens.reduce((acc, address) => ({ ...acc, [address]: false }), {})\n );\n\n let cancelled = false;\n\n const fetchPrices = async () => {\n const pricePromises = tokens.map(async (tokenAddress) => {\n // Create a timeout promise\n const timeoutPromise = new Promise<{\n tokenAddress: string;\n price: number | undefined;\n error: boolean;\n }>((resolve) => {\n setTimeout(() => {\n resolve({\n tokenAddress,\n price: undefined,\n error: true,\n });\n }, timeoutMs);\n });\n\n // Create the fetch promise\n const fetchPromise = (async () => {\n try {\n const usdcAmount = await client.getUsdcPrice(tokenAddress, standardAmount);\n // USDC has 6 decimals, so divide by 10^6 to get the dollar price\n const price = Number(usdcAmount) / 1e6;\n return { tokenAddress, price, error: false };\n } catch (error) {\n console.error(`Error fetching ${tokenAddress} price:`, error);\n return { tokenAddress, price: undefined, error: true };\n }\n })();\n\n // Race between the timeout and the fetch\n return Promise.race([fetchPromise, timeoutPromise]);\n });\n\n const results = await Promise.all(pricePromises);\n\n if (cancelled) return;\n\n const newPrices: TokenPrices = {};\n const newLoadingStates: TokenLoadingStates = {};\n const newErrorStates: TokenErrorStates = {};\n\n results.forEach(({ tokenAddress, price, error }) => {\n newPrices[tokenAddress] = price;\n newLoadingStates[tokenAddress] = false;\n newErrorStates[tokenAddress] = error;\n });\n\n setPrices(newPrices);\n setTokenLoadingStates(newLoadingStates);\n setTokenErrorStates(newErrorStates);\n setIsLoading(false);\n };\n\n fetchPrices();\n\n return () => {\n cancelled = true;\n };\n }, [tokensKey, enabled, timeoutMs, client, standardAmount, fetchKey]);\n\n return useMemo(\n () => ({\n prices,\n isLoading,\n isTokenLoading,\n hasTokenError,\n isTokenAvailable,\n getPrice,\n refetch,\n }),\n [prices, isLoading, isTokenLoading, hasTokenError, isTokenAvailable, getPrice, refetch]\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { EkuboClientConfig } from \"../types/index.js\";\nimport type { ApiTokenInfo } from \"../api/tokens.js\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport { useOptionalEkuboClient } from \"./context.js\";\n\nexport interface UseEkuboTokensResult {\n /** Array of tokens from the API */\n tokens: ApiTokenInfo[];\n /** Whether tokens are loading */\n isLoading: boolean;\n /** Error from fetching tokens */\n error: Error | null;\n /** Manually refetch tokens */\n refetch: () => void;\n /** Get a token by address */\n getToken: (address: string) => ApiTokenInfo | undefined;\n /** Get a token by symbol */\n getTokenBySymbol: (symbol: string) => ApiTokenInfo | undefined;\n}\n\nexport interface UseEkuboTokensProps {\n /** Client config (optional if using EkuboProvider) */\n config?: EkuboClientConfig;\n /** Whether to enable token fetching (default: true) */\n enabled?: boolean;\n}\n\n// Module-level singleton for when not using provider\nlet defaultClientInstance: EkuboClient | null = null;\n\nfunction getDefaultClient(config?: EkuboClientConfig): EkuboClient {\n if (!defaultClientInstance) {\n defaultClientInstance = createEkuboClient(config);\n }\n return defaultClientInstance;\n}\n\n/**\n * Hook for fetching the list of available tokens from Ekubo API\n *\n * @example\n * ```tsx\n * import { useEkuboTokens } from '@provable-games/ekubo-sdk/react';\n *\n * function TokenList() {\n * const { tokens, isLoading, getTokenBySymbol } = useEkuboTokens();\n *\n * if (isLoading) return <div>Loading tokens...</div>;\n *\n * const eth = getTokenBySymbol('ETH');\n *\n * return (\n * <ul>\n * {tokens.map(token => (\n * <li key={token.address}>{token.symbol}: {token.name}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useEkuboTokens({\n config,\n enabled = true,\n}: UseEkuboTokensProps = {}): UseEkuboTokensResult {\n const contextClient = useOptionalEkuboClient();\n const client = contextClient ?? getDefaultClient(config);\n\n const [tokens, setTokens] = useState<ApiTokenInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [fetchKey, setFetchKey] = useState(0);\n\n const refetch = useCallback(() => {\n setFetchKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n setIsLoading(false);\n setTokens([]);\n setError(null);\n return;\n }\n\n let cancelled = false;\n\n const fetchTokens = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.fetchTokens();\n if (!cancelled) {\n setTokens(result);\n setIsLoading(false);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch tokens\"));\n setIsLoading(false);\n }\n }\n };\n\n fetchTokens();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, client, fetchKey]);\n\n // Create lookup maps for efficient token access\n const tokensByAddress = useMemo(() => {\n const map = new Map<string, ApiTokenInfo>();\n for (const token of tokens) {\n map.set(token.address.toLowerCase(), token);\n }\n return map;\n }, [tokens]);\n\n const tokensBySymbol = useMemo(() => {\n const map = new Map<string, ApiTokenInfo>();\n for (const token of tokens) {\n map.set(token.symbol.toUpperCase(), token);\n }\n return map;\n }, [tokens]);\n\n const getToken = useCallback(\n (address: string): ApiTokenInfo | undefined => {\n return tokensByAddress.get(address.toLowerCase());\n },\n [tokensByAddress]\n );\n\n const getTokenBySymbol = useCallback(\n (symbol: string): ApiTokenInfo | undefined => {\n return tokensBySymbol.get(symbol.toUpperCase());\n },\n [tokensBySymbol]\n );\n\n return useMemo(\n () => ({\n tokens,\n isLoading,\n error,\n refetch,\n getToken,\n getTokenBySymbol,\n }),\n [tokens, isLoading, error, refetch, getToken, getTokenBySymbol]\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { EkuboClientConfig } from \"../types/index.js\";\nimport type { OverviewStats, PairStats } from \"../api/stats.js\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport { useOptionalEkuboClient } from \"./context.js\";\n\nexport interface UseEkuboStatsResult {\n /** Protocol TVL statistics */\n tvl: OverviewStats | null;\n /** Protocol volume statistics */\n volume: OverviewStats | null;\n /** Top trading pairs */\n topPairs: PairStats[];\n /** Whether stats are loading */\n isLoading: boolean;\n /** Error from fetching stats */\n error: Error | null;\n /** Manually refetch stats */\n refetch: () => void;\n}\n\nexport interface UseEkuboStatsProps {\n /** Client config (optional if using EkuboProvider) */\n config?: EkuboClientConfig;\n /** Whether to enable stats fetching (default: true) */\n enabled?: boolean;\n /** Whether to fetch TVL (default: true) */\n fetchTvl?: boolean;\n /** Whether to fetch volume (default: true) */\n fetchVolume?: boolean;\n /** Whether to fetch top pairs (default: true) */\n fetchTopPairs?: boolean;\n}\n\n// Module-level singleton for when not using provider\nlet defaultClientInstance: EkuboClient | null = null;\n\nfunction getDefaultClient(config?: EkuboClientConfig): EkuboClient {\n if (!defaultClientInstance) {\n defaultClientInstance = createEkuboClient(config);\n }\n return defaultClientInstance;\n}\n\n/**\n * Hook for fetching Ekubo protocol statistics (TVL, volume, top pairs)\n *\n * @example\n * ```tsx\n * import { useEkuboStats } from '@provable-games/ekubo-sdk/react';\n *\n * function ProtocolStats() {\n * const { tvl, volume, topPairs, isLoading } = useEkuboStats();\n *\n * if (isLoading) return <div>Loading stats...</div>;\n *\n * return (\n * <div>\n * <h2>Protocol Statistics</h2>\n * {tvl && <p>TVL: ${tvl.total.toLocaleString()}</p>}\n * {volume && <p>24h Volume: ${volume.total.toLocaleString()}</p>}\n * <h3>Top Pairs</h3>\n * <ul>\n * {topPairs.slice(0, 5).map((pair, i) => (\n * <li key={i}>{pair.token0Symbol}/{pair.token1Symbol}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useEkuboStats({\n config,\n enabled = true,\n fetchTvl = true,\n fetchVolume = true,\n fetchTopPairs = true,\n}: UseEkuboStatsProps = {}): UseEkuboStatsResult {\n const contextClient = useOptionalEkuboClient();\n const client = contextClient ?? getDefaultClient(config);\n\n const [tvl, setTvl] = useState<OverviewStats | null>(null);\n const [volume, setVolume] = useState<OverviewStats | null>(null);\n const [topPairs, setTopPairs] = useState<PairStats[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [fetchKey, setFetchKey] = useState(0);\n\n const refetch = useCallback(() => {\n setFetchKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n if (!enabled) {\n setIsLoading(false);\n setTvl(null);\n setVolume(null);\n setTopPairs([]);\n setError(null);\n return;\n }\n\n let cancelled = false;\n\n const fetchStats = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const promises: Promise<void>[] = [];\n\n if (fetchTvl) {\n promises.push(\n client.getTvl().then((result) => {\n if (!cancelled) setTvl(result);\n })\n );\n }\n\n if (fetchVolume) {\n promises.push(\n client.getVolume().then((result) => {\n if (!cancelled) setVolume(result);\n })\n );\n }\n\n if (fetchTopPairs) {\n promises.push(\n client.getTopPairs().then((result) => {\n if (!cancelled) setTopPairs(result);\n })\n );\n }\n\n await Promise.all(promises);\n\n if (!cancelled) {\n setIsLoading(false);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch stats\"));\n setIsLoading(false);\n }\n }\n };\n\n fetchStats();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, client, fetchKey, fetchTvl, fetchVolume, fetchTopPairs]);\n\n return useMemo(\n () => ({\n tvl,\n volume,\n topPairs,\n isLoading,\n error,\n refetch,\n }),\n [tvl, volume, topPairs, isLoading, error, refetch]\n );\n}\n","import { useState, useEffect, useCallback, useMemo } from \"react\";\nimport type { EkuboClientConfig } from \"../types/index.js\";\nimport type { PriceDataPoint } from \"../api/price.js\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport { useOptionalEkuboClient } from \"./context.js\";\n\nexport interface UseEkuboPriceHistoryResult {\n /** Array of price data points */\n data: PriceDataPoint[];\n /** Whether price history is loading */\n isLoading: boolean;\n /** Error from fetching price history */\n error: Error | null;\n /** Manually refetch price history */\n refetch: () => void;\n}\n\nexport interface UseEkuboPriceHistoryProps {\n /** Token to get price for (address or symbol) */\n token: string;\n /** Quote token (address or symbol, e.g., 'USDC') */\n quoteToken: string;\n /** Time interval in seconds (default: 7000) */\n interval?: number;\n /** Client config (optional if using EkuboProvider) */\n config?: EkuboClientConfig;\n /** Whether to enable price history fetching (default: true) */\n enabled?: boolean;\n}\n\n// Module-level singleton for when not using provider\nlet defaultClientInstance: EkuboClient | null = null;\n\nfunction getDefaultClient(config?: EkuboClientConfig): EkuboClient {\n if (!defaultClientInstance) {\n defaultClientInstance = createEkuboClient(config);\n }\n return defaultClientInstance;\n}\n\n/**\n * Hook for fetching historical price data for a token pair\n *\n * @example\n * ```tsx\n * import { useEkuboPriceHistory } from '@provable-games/ekubo-sdk/react';\n *\n * function PriceChart() {\n * const { data, isLoading } = useEkuboPriceHistory({\n * token: 'ETH',\n * quoteToken: 'USDC',\n * interval: 3600, // 1 hour intervals\n * });\n *\n * if (isLoading) return <div>Loading price history...</div>;\n *\n * return (\n * <div>\n * {data.map((point) => (\n * <div key={point.timestamp}>\n * {new Date(point.timestamp * 1000).toLocaleDateString()}: ${point.price}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport function useEkuboPriceHistory({\n token,\n quoteToken,\n interval = 7000,\n config,\n enabled = true,\n}: UseEkuboPriceHistoryProps): UseEkuboPriceHistoryResult {\n const contextClient = useOptionalEkuboClient();\n const client = contextClient ?? getDefaultClient(config);\n\n const [data, setData] = useState<PriceDataPoint[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n const [fetchKey, setFetchKey] = useState(0);\n\n const refetch = useCallback(() => {\n setFetchKey((prev) => prev + 1);\n }, []);\n\n useEffect(() => {\n if (!enabled || !token || !quoteToken) {\n setIsLoading(false);\n setData([]);\n setError(null);\n return;\n }\n\n let cancelled = false;\n\n const fetchPriceHistory = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await client.getPriceHistory(token, quoteToken, interval);\n if (!cancelled) {\n setData(result.data);\n setIsLoading(false);\n }\n } catch (err) {\n if (!cancelled) {\n setError(err instanceof Error ? err : new Error(\"Failed to fetch price history\"));\n setIsLoading(false);\n }\n }\n };\n\n fetchPriceHistory();\n\n return () => {\n cancelled = true;\n };\n }, [enabled, token, quoteToken, interval, client, fetchKey]);\n\n return useMemo(\n () => ({\n data,\n isLoading,\n error,\n refetch,\n }),\n [data, isLoading, error, refetch]\n );\n}\n","import { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport type { SwapQuote, EkuboClientConfig } from \"../types/index.js\";\nimport { EkuboClient, createEkuboClient } from \"../client.js\";\nimport { InsufficientLiquidityError } from \"../errors/index.js\";\nimport { useOptionalEkuboClient } from \"./context.js\";\n\nexport interface QuoteResult {\n /** The swap quote */\n quote: SwapQuote | null;\n /** Whether this quote is loading */\n loading: boolean;\n /** Error from fetching this quote */\n error: Error | null;\n /** Whether there's insufficient liquidity */\n insufficientLiquidity: boolean;\n}\n\nexport interface QuotesMap {\n [sellToken: string]: QuoteResult;\n}\n\nexport interface UseEkuboQuotesResult {\n /** Map of sellToken address to quote result */\n quotes: QuotesMap;\n /** Whether any quotes are still loading */\n isLoading: boolean;\n /** Get quote for a specific sell token */\n getQuote: (sellToken: string) => QuoteResult | undefined;\n /** Manually refetch all quotes */\n refetch: () => void;\n}\n\nexport interface UseEkuboQuotesProps {\n /** Array of tokens that can be sold (addresses or symbols) */\n sellTokens: string[];\n /** Token being bought (address or symbol) */\n buyToken: string | null;\n /** Amount to swap (positive for exact input, negative for exact output) */\n amount: bigint;\n /** Whether to enable quote fetching (default: true) */\n enabled?: boolean;\n /** Polling interval in ms (default: 30000 - 30 seconds) */\n pollingInterval?: number;\n /** Client config (optional if using EkuboProvider) */\n config?: EkuboClientConfig;\n}\n\n// Module-level singleton for when not using provider\nlet defaultClientInstance: EkuboClient | null = null;\n\nfunction getDefaultClient(config?: EkuboClientConfig): EkuboClient {\n if (!defaultClientInstance) {\n defaultClientInstance = createEkuboClient(config);\n }\n return defaultClientInstance;\n}\n\n/**\n * Hook for fetching swap quotes for multiple sell tokens at once.\n *\n * Useful when you want to show users multiple payment options with\n * their costs upfront, allowing instant switching between options.\n *\n * @example\n * ```tsx\n * import { useEkuboQuotes } from '@provable-games/ekubo-sdk/react';\n *\n * function PaymentSelector() {\n * const { quotes, isLoading, getQuote } = useEkuboQuotes({\n * sellTokens: [ETH_ADDRESS, STRK_ADDRESS, USDC_ADDRESS],\n * buyToken: ENTRY_TOKEN,\n * amount: entryFeeAmount,\n * });\n *\n * return (\n * <div>\n * {sellTokens.map(token => {\n * const result = getQuote(token);\n * return (\n * <button key={token} onClick={() => setSelectedToken(token)}>\n * Pay with {token}: {result?.quote?.total ?? 'Loading...'}\n * </button>\n * );\n * })}\n * </div>\n * );\n * }\n * ```\n */\nexport function useEkuboQuotes({\n sellTokens,\n buyToken,\n amount,\n enabled = true,\n pollingInterval = 30000,\n config,\n}: UseEkuboQuotesProps): UseEkuboQuotesResult {\n const contextClient = useOptionalEkuboClient();\n const client = contextClient ?? getDefaultClient(config);\n\n const [quotes, setQuotes] = useState<QuotesMap>({});\n const pollerRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const abortControllersRef = useRef<Map<string, AbortController>>(new Map());\n\n // Stable key for sellTokens\n const sellTokensKey = useMemo(\n () => JSON.stringify([...sellTokens].sort()),\n [sellTokens]\n );\n\n const canFetch = useMemo(() => {\n return (\n buyToken !== null &&\n amount !== 0n &&\n sellTokens.length > 0\n );\n }, [buyToken, amount, sellTokens.length]);\n\n const shouldPoll = enabled && canFetch;\n\n const fetchAllQuotes = useCallback(async () => {\n if (!canFetch || !buyToken) return;\n\n // Cancel any pending requests\n abortControllersRef.current.forEach((controller) => controller.abort());\n abortControllersRef.current.clear();\n\n // Initialize loading state for all tokens\n setQuotes((prev) => {\n const updated = { ...prev };\n for (const sellToken of sellTokens) {\n if (sellToken.toLowerCase() === buyToken.toLowerCase()) continue;\n updated[sellToken] = {\n quote: prev[sellToken]?.quote ?? null,\n loading: true,\n error: null,\n insufficientLiquidity: false,\n };\n }\n return updated;\n });\n\n // Fetch quotes in parallel\n const fetchPromises = sellTokens\n .filter((sellToken) => sellToken.toLowerCase() !== buyToken.toLowerCase())\n .map(async (sellToken) => {\n const abortController = new AbortController();\n abortControllersRef.current.set(sellToken, abortController);\n\n try {\n const quote = await client.getQuote({\n amount,\n tokenFrom: sellToken,\n tokenTo: buyToken,\n signal: abortController.signal,\n });\n\n return {\n sellToken,\n result: {\n quote,\n loading: false,\n error: null,\n insufficientLiquidity: false,\n } as QuoteResult,\n };\n } catch (err) {\n if (err instanceof Error && err.name === \"AbortError\") {\n return null;\n }\n\n const isInsufficient = err instanceof InsufficientLiquidityError;\n\n return {\n sellToken,\n result: {\n quote: null,\n loading: false,\n error: err instanceof Error ? err : new Error(\"Unknown error\"),\n insufficientLiquidity: isInsufficient,\n } as QuoteResult,\n };\n }\n });\n\n const results = await Promise.all(fetchPromises);\n\n // Update state with all results\n setQuotes((prev) => {\n const updated = { ...prev };\n for (const result of results) {\n if (result) {\n updated[result.sellToken] = result.result;\n }\n }\n return updated;\n });\n }, [canFetch, buyToken, sellTokens, amount, client]);\n\n // Set up polling\n useEffect(() => {\n if (pollerRef.current) {\n clearInterval(pollerRef.current);\n pollerRef.current = null;\n }\n\n if (!shouldPoll) {\n return;\n }\n\n // Fetch immediately\n fetchAllQuotes();\n\n // Set up polling interval\n pollerRef.current = setInterval(fetchAllQuotes, pollingInterval);\n\n return () => {\n if (pollerRef.current) {\n clearInterval(pollerRef.current);\n pollerRef.current = null;\n }\n abortControllersRef.current.forEach((controller) => controller.abort());\n abortControllersRef.current.clear();\n };\n }, [shouldPoll, fetchAllQuotes, pollingInterval, sellTokensKey]);\n\n const isLoading = useMemo(() => {\n return Object.values(quotes).some((q) => q.loading);\n }, [quotes]);\n\n const getQuote = useCallback(\n (sellToken: string): QuoteResult | undefined => {\n return quotes[sellToken];\n },\n [quotes]\n );\n\n const refetch = useCallback(() => {\n fetchAllQuotes();\n }, [fetchAllQuotes]);\n\n return useMemo(\n () => ({\n quotes,\n isLoading,\n getQuote,\n refetch,\n }),\n [quotes, isLoading, getQuote, refetch]\n );\n}\n"]}