@chainstream-io/sdk 2.0.5 → 2.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/chainstream.ts","../src/openapi-client/chainstreamApiClient.ts","../src/stream/stream.ts","../src/stream/stream.fields.ts","../src/stream/stream.model.ts","../src/openapi-client/generated/blockchain/blockchain.ts","../src/openapi-client/generated/dex/dex.ts","../src/openapi-client/generated/dex-pool/dex-pool.ts","../src/openapi-client/generated/ipfs/ipfs.ts","../src/openapi-client/generated/job/job.ts","../src/openapi-client/generated/kyt/kyt.ts","../src/openapi-client/generated/ranking/ranking.ts","../src/openapi-client/generated/red-packet/red-packet.ts","../src/openapi-client/generated/token/token.ts","../src/openapi-client/generated/trade/trade.ts","../src/openapi-client/generated/transaction/transaction.ts","../src/openapi-client/generated/wallet/wallet.ts","../src/openapi-client/generated/watchlist/watchlist.ts","../src/openapi-client/generated/webhook/webhook.ts","../src/openapi-client/generated/chainStreamAPI.schemas.ts"],"sourcesContent":["import { EventSourcePolyfill } from \"event-source-polyfill\";\nimport { configure } from \"./openapi-client/chainstreamApiClient.js\";\nimport { StreamApi } from \"./stream/index.js\";\n\n// Import all API modules\nimport * as blockchainApi from \"./openapi-client/generated/blockchain/blockchain.js\";\nimport * as dexApi from \"./openapi-client/generated/dex/dex.js\";\nimport * as dexPoolApi from \"./openapi-client/generated/dex-pool/dex-pool.js\";\nimport * as ipfsApi from \"./openapi-client/generated/ipfs/ipfs.js\";\nimport * as jobApi from \"./openapi-client/generated/job/job.js\";\nimport * as kytApi from \"./openapi-client/generated/kyt/kyt.js\";\nimport * as rankingApi from \"./openapi-client/generated/ranking/ranking.js\";\nimport * as redPacketApi from \"./openapi-client/generated/red-packet/red-packet.js\";\nimport * as tokenApi from \"./openapi-client/generated/token/token.js\";\nimport * as tradeApi from \"./openapi-client/generated/trade/trade.js\";\nimport * as transactionApi from \"./openapi-client/generated/transaction/transaction.js\";\nimport * as walletApi from \"./openapi-client/generated/wallet/wallet.js\";\nimport * as watchlistApi from \"./openapi-client/generated/watchlist/watchlist.js\";\nimport * as webhookApi from \"./openapi-client/generated/webhook/webhook.js\";\n\nexport interface TokenProvider {\n getToken(): Promise<string> | string;\n}\n\nexport interface ChainStreamRequestContext {\n baseUrl: string;\n streamUrl: string;\n accessToken: string | TokenProvider;\n}\n\nexport interface ChainStreamClientOptions {\n debug?: boolean;\n serverUrl?: string;\n streamUrl?: string;\n /**\n * Whether to automatically connect to WebSocket on initialization.\n * Default: false\n *\n * If set to true, WebSocket will connect automatically.\n * If false or not set, you need to manually call `client.stream.connect()` when needed.\n */\n autoConnectWebSocket?: boolean;\n}\n\nexport class ChainStreamClient {\n public readonly requestCtx: ChainStreamRequestContext;\n\n // WebSocket streaming client\n public readonly stream: StreamApi;\n\n // REST API modules\n public readonly blockchain: typeof blockchainApi;\n public readonly dex: typeof dexApi;\n public readonly dexpool: typeof dexPoolApi;\n public readonly ipfs: typeof ipfsApi;\n public readonly job: typeof jobApi;\n public readonly kyt: typeof kytApi;\n public readonly ranking: typeof rankingApi;\n public readonly redPacket: typeof redPacketApi;\n public readonly token: typeof tokenApi;\n public readonly trade: typeof tradeApi;\n public readonly transaction: typeof transactionApi;\n public readonly wallet: typeof walletApi;\n public readonly watchlist: typeof watchlistApi;\n public readonly webhook: typeof webhookApi;\n\n public constructor(accessToken: string | TokenProvider, options: ChainStreamClientOptions = {}) {\n const baseUrl: string = options.serverUrl ?? \"https://api.chainstream.io\";\n const streamUrl: string =\n options.streamUrl ?? \"wss://realtime-dex.chainstream.io/connection/websocket\";\n\n this.requestCtx = { baseUrl, streamUrl, accessToken };\n\n // Configure the API client with authentication\n configure({\n accessToken,\n basePath: baseUrl,\n debugging: options.debug,\n });\n\n // Assign API modules\n this.blockchain = blockchainApi;\n this.dex = dexApi;\n this.dexpool = dexPoolApi;\n this.ipfs = ipfsApi;\n this.job = jobApi;\n this.kyt = kytApi;\n this.ranking = rankingApi;\n this.redPacket = redPacketApi;\n this.token = tokenApi;\n this.trade = tradeApi;\n this.transaction = transactionApi;\n this.wallet = walletApi;\n this.watchlist = watchlistApi;\n this.webhook = webhookApi;\n\n // Initialize WebSocket streaming client\n this.stream = new StreamApi(this.requestCtx);\n\n // Only auto-connect WebSocket if explicitly enabled\n if (options.autoConnectWebSocket === true) {\n this.stream.connect();\n }\n }\n\n /**\n * Wait for a job to complete using Server-Sent Events (SSE)\n * @param jobId - The job ID to wait for\n * @param timeout - Timeout in milliseconds (default: 60000)\n * @returns Promise that resolves with the job result\n */\n async waitForJob<T>(jobId: string, timeout = 60000): Promise<T> {\n const accessToken =\n typeof this.requestCtx.accessToken === \"string\"\n ? this.requestCtx.accessToken\n : await this.requestCtx.accessToken.getToken();\n\n return new Promise((resolve, reject) => {\n const sse = new EventSourcePolyfill(`${this.requestCtx.baseUrl}/v2/job/${jobId}/streaming`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n const timeoutId = setTimeout(() => {\n sse.close();\n reject(new Error(`Job ${jobId} timed out after ${timeout}ms`));\n }, timeout);\n\n sse.onmessage = event => {\n try {\n console.log(\"event.data: \", event.data);\n const data = JSON.parse(event.data as string);\n\n if (data.status === \"pending\") return;\n\n clearTimeout(timeoutId);\n sse.close();\n\n if (data.status === \"error\") {\n reject(new Error(data.error || data.message || \"Unknown error\"));\n } else if (data.status === \"failed\") {\n reject(new Error(data.error || \"Job failed\"));\n } else if (data.status === \"completed\") {\n if (data.success === false) {\n reject(new Error(data.error || \"Transaction failed\"));\n } else {\n resolve(data as T);\n }\n } else {\n reject(new Error(`Unexpected job status: ${data.status}`));\n }\n } catch {\n clearTimeout(timeoutId);\n sse.close();\n reject(new Error(\"Error parsing event data\"));\n }\n };\n\n sse.onopen = () => {\n console.log(\"SSE connection opened\");\n };\n\n sse.onerror = error => {\n const errorEvent = error as Event & { message?: string };\n if (errorEvent.message?.includes(\"No activity within\")) {\n console.log(\"SSE reconnecting due to inactivity...\");\n return;\n }\n\n clearTimeout(timeoutId);\n sse.close();\n reject(new Error(`Error in SSE connection: ${error}`));\n };\n });\n }\n}\n\nexport interface PostOptions {\n idempotencyKey?: string;\n}\n","import Axios, { AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry, { exponentialDelay } from \"axios-retry\";\n\nimport type { TokenProvider } from \"../chainstream.js\";\n\n/**\n * The options for the ChainStream API client.\n */\nexport type ChainStreamApiOptions = {\n /**\n * The access token for authentication.\n * Can be a string or a TokenProvider that dynamically provides tokens.\n */\n accessToken: string | TokenProvider;\n\n /** The base path for the API. Defaults to https://api.chainstream.io */\n basePath?: string;\n\n /** If true, logs API requests and responses to the console. */\n debugging?: boolean;\n\n /** The source for the API request, used for analytics. */\n source?: string;\n\n /** The version of the source for the API request, used for analytics. */\n sourceVersion?: string;\n};\n\nlet axiosInstance: AxiosInstance;\nlet currentOptions: ChainStreamApiOptions | undefined = undefined;\n\n/**\n * Configures the ChainStream API client with the given options.\n *\n * @param {ChainStreamApiOptions} options - The ChainStream API options.\n */\nexport const configure = (options: ChainStreamApiOptions) => {\n const baseURL = options.basePath || \"https://api.chainstream.io\";\n\n currentOptions = {\n ...options,\n basePath: baseURL,\n };\n\n axiosInstance = Axios.create({\n baseURL,\n });\n\n axiosRetry(axiosInstance, {\n retryDelay: exponentialDelay,\n });\n\n // Add request interceptor for authentication\n axiosInstance.interceptors.request.use(async config => {\n const token =\n typeof options.accessToken === \"string\"\n ? options.accessToken\n : await options.accessToken.getToken();\n\n config.headers.Authorization = `Bearer ${token}`;\n config.headers[\"Content-Type\"] = \"application/json\";\n\n if (options.source) {\n config.headers[\"X-Source\"] = options.source;\n }\n if (options.sourceVersion) {\n config.headers[\"X-Source-Version\"] = options.sourceVersion;\n }\n\n if (options.debugging) {\n console.log(`[ChainStream API] ${config.method?.toUpperCase()} ${config.url}`);\n }\n\n return config;\n });\n\n // Add response interceptor for debugging\n if (options.debugging) {\n axiosInstance.interceptors.response.use(\n response => {\n console.log(`[ChainStream API] Response:`, response.status, response.data);\n return response;\n },\n error => {\n console.error(`[ChainStream API] Error:`, error.response?.status, error.response?.data);\n return Promise.reject(error);\n },\n );\n }\n};\n\n/**\n * Adds an idempotency key to request config if provided\n *\n * @param config - The Axios request configuration.\n * @param idempotencyKey - The idempotency key.\n * @returns The Axios request configuration with the idempotency key.\n */\nconst addIdempotencyKey = (\n config: AxiosRequestConfig,\n idempotencyKey?: string,\n): AxiosRequestConfig => {\n if (!idempotencyKey) {\n return config;\n }\n\n return {\n ...config,\n headers: {\n ...(config.headers || {}),\n \"X-Idempotency-Key\": idempotencyKey,\n },\n };\n};\n\n/**\n * The ChainStream API client function that handles authentication and error handling.\n *\n * @param {AxiosRequestConfig} config - The Axios request configuration.\n * @param idempotencyKey - Optional idempotency key.\n * @returns {Promise<T>} A promise that resolves to the response data.\n * @throws {Error} If the request fails.\n */\nexport const chainstreamApiClient = async <T>(\n config: AxiosRequestConfig,\n idempotencyKey?: string,\n): Promise<T> => {\n if (!axiosInstance) {\n throw new Error(\"ChainStream API client not configured. Call configure() first.\");\n }\n\n if (!config.url || config.url === \"\") {\n throw new Error(\"AxiosRequestConfig URL is empty.\");\n }\n\n if (!config.method || config.method === \"\") {\n throw new Error(\"AxiosRequestConfig method is empty.\");\n }\n\n // Add idempotency key to the request headers if provided\n const configWithIdempotencyKey = addIdempotencyKey(config, idempotencyKey);\n\n try {\n const response = await axiosInstance(configWithIdempotencyKey);\n return response.data as T;\n } catch (error) {\n // eslint-disable-next-line import/no-named-as-default-member\n if (Axios.isAxiosError(error) && error.response) {\n const statusCode = error.response.status;\n const responseData = error.response.data;\n\n throw new Error(\n `ChainStream API error (${statusCode}): ${\n typeof responseData === \"string\" ? responseData : JSON.stringify(responseData)\n }`,\n );\n }\n\n throw error;\n }\n};\n\n/**\n * Get the current configuration\n */\nexport const getConfig = () => currentOptions;\n","import { Centrifuge, ConnectionTokenContext } from \"@chainstream-io/centrifuge\";\nimport { ChainStreamRequestContext } from \"../chainstream.js\";\nimport { Resolution } from \"../openapi-client/index.js\";\nimport {\n WsDexPoolBalance,\n WsDexProtocol,\n WsNewToken,\n WsTokenMetadata,\n WsTokenHolder,\n WsTokenStat,\n WsTokenLiquidity,\n WsTokenMaxLiquidity,\n WsTokenTotalLiquidity,\n WsSocialMedia,\n WsWalletBalance,\n WsTokenSupply,\n WsWalletPnl,\n WsChannelType,\n WsCandle,\n WsPriceType,\n WsTradeActivity,\n WsWalletTokenPnl,\n WsRankingType,\n WsDex,\n WsRankingTokenList,\n WsTokenBondingCurve,\n} from \"./stream.model.js\";\nimport { replaceFilterFields } from \"./stream.fields.js\";\n\nexport interface Unsubscribable {\n unsubscribe(): void;\n}\n\nexport class StreamApi {\n private realtimeClient!: Centrifuge;\n private listenersMap: Map<string, Set<(data: unknown) => void>>;\n private context: ChainStreamRequestContext;\n private initPromise: Promise<void> | null = null;\n\n constructor(context: ChainStreamRequestContext) {\n this.context = context;\n this.listenersMap = new Map();\n }\n\n /**\n * Initialize Centrifuge client with current token\n * This is called lazily when connect() is called\n */\n private async initClient(): Promise<void> {\n if (this.realtimeClient) {\n return;\n }\n\n // Get initial token for URL\n const token = await this.getTokenValue();\n const realtimeEndpoint = this.buildWsUrl(this.context.streamUrl, token);\n\n this.realtimeClient = new Centrifuge(realtimeEndpoint, {\n getToken: async (_ctx: ConnectionTokenContext) => {\n return this.getTokenValue();\n },\n });\n\n this.realtimeClient\n .on(\"connected\", () => {\n console.log(\"[streaming] connected\");\n })\n .on(\"disconnected\", ctx => {\n console.warn(\"[streaming] disconnected\", ctx);\n })\n .on(\"error\", err => {\n console.error(\"[streaming] error: \", err);\n });\n }\n\n /**\n * Wait for initialization to complete\n * If not initialized, auto-connect first\n */\n private async ensureInitialized(): Promise<void> {\n if (!this.initPromise) {\n // Auto-connect if not initialized\n this.connect();\n }\n await this.initPromise;\n }\n\n /**\n * Get token value from string or TokenProvider\n */\n private async getTokenValue(): Promise<string> {\n return typeof this.context.accessToken === \"string\"\n ? this.context.accessToken\n : await this.context.accessToken.getToken();\n }\n\n /**\n * Build WebSocket URL with token as query parameter\n */\n private buildWsUrl(endpoint: string, token: string): string {\n const url = new URL(endpoint);\n url.searchParams.set(\"token\", token);\n return url.toString();\n }\n\n /**\n * Connect to the WebSocket server.\n * This is automatically called when you use subscribe methods if not already connected.\n * You can also call this method manually for explicit control.\n */\n connect(): void {\n // Start initialization and store the promise\n this.initPromise = this.initClient().then(() => {\n this.realtimeClient.connect();\n });\n }\n\n /**\n * Disconnect from the WebSocket server.\n * All subscriptions will be automatically removed.\n */\n disconnect(): void {\n if (this.realtimeClient) {\n this.realtimeClient.disconnect();\n }\n }\n\n /**\n * Check if the WebSocket is currently connected.\n */\n isConnected(): boolean {\n return this.realtimeClient?.state === \"connected\";\n }\n\n /**\n * Start batching commands for efficient bulk operations\n * All subscription commands after this call will be batched until stopBatching is called\n */\n startBatching(): void {\n if (this.realtimeClient) {\n this.realtimeClient.startBatching();\n }\n }\n\n /**\n * Stop batching and flush all collected commands to the server\n * This will send all batched subscription commands in a single network request\n */\n stopBatching(): void {\n if (this.realtimeClient) {\n this.realtimeClient.stopBatching();\n }\n }\n\n /**\n * Batch subscribe method that accepts a function containing subscription calls\n * All subscription methods called within the function will be batched\n * @param batchFunction Function containing subscription method calls\n * @returns Array of unsubscribe functions\n */\n batchSubscribe(batchFunction: () => Unsubscribable[]): Unsubscribable[] {\n // Start batching commands\n this.startBatching();\n\n // Execute the batch function (all subscription calls will be batched)\n const unsubscribables = batchFunction();\n\n // Stop batching and flush all commands\n this.stopBatching();\n\n return unsubscribables;\n }\n\n /**\n * Batch unsubscribe method that accepts an array of unsubscribe functions\n * All unsubscribe calls will be executed at once\n * @param unsubscribables Array of unsubscribe functions to execute\n */\n batchUnsubscribe(unsubscribables: Unsubscribable[]): void {\n if (!unsubscribables || unsubscribables.length === 0) {\n return;\n }\n\n // Execute all unsubscribe calls\n unsubscribables.forEach(unsub => {\n if (unsub && typeof unsub.unsubscribe === \"function\") {\n unsub.unsubscribe();\n }\n });\n }\n\n subscribe<T = unknown>(\n channel: string,\n fn: (data: T) => void,\n filter?: string,\n methodName?: string,\n ): Unsubscribable {\n // Add listener immediately\n let listeners = this.listenersMap.get(channel);\n if (!listeners) {\n listeners = new Set();\n this.listenersMap.set(channel, listeners);\n }\n listeners.add(fn as (data: unknown) => void);\n\n // Perform subscription after initialization is complete\n this.ensureInitialized().then(() => {\n let sub = this.realtimeClient.getSubscription(channel);\n\n if (!sub) {\n console.log(\"[xrealtime] create new sub: \", channel);\n\n // Process filter expression with method-specific field mappings\n const processedFilter =\n filter && methodName ? replaceFilterFields(filter, methodName) : filter;\n\n sub = this.realtimeClient.newSubscription(channel, {\n delta: \"fossil\",\n ...(processedFilter && { filter: processedFilter }),\n });\n\n sub\n .on(\"subscribed\", () => {\n console.log(\"[xrealtime] subscribed\", channel);\n })\n .on(\"unsubscribed\", () => {\n console.log(\"[xrealtime] unsubscribed\", channel);\n })\n .on(\"publication\", ctx => {\n const currentListeners = this.listenersMap.get(channel);\n currentListeners?.forEach(it => it(ctx.data));\n })\n .subscribe();\n }\n });\n\n return new StreamUnsubscribable<T>(this, channel, fn);\n }\n\n unsubscribe<T = unknown>(channel: string, fn: (data: T) => void): void {\n const listeners = this.listenersMap.get(channel);\n if (!listeners) {\n return;\n }\n\n listeners.delete(fn as (data: unknown) => void);\n console.log(\"unsubscribe, remain listeners: \", listeners.size);\n\n if (listeners.size === 0) {\n console.log(\"unsubscribe channel: \", channel);\n this.listenersMap.delete(channel);\n\n // Remove subscription after initialization is complete\n this.ensureInitialized().then(() => {\n const sub = this.realtimeClient.getSubscription(channel);\n if (sub) {\n sub.unsubscribe();\n this.realtimeClient.removeSubscription(sub);\n }\n });\n }\n }\n\n private formatScientificNotation(value: unknown): string {\n if (value === null || value === undefined) {\n return \"0\";\n }\n\n const strValue = value.toString();\n if (strValue.includes(\"e-\") || strValue.includes(\"E-\")) {\n return Number(value)\n .toFixed(20)\n .replace(/\\.?0+$/, \"\");\n }\n\n return strValue;\n }\n\n /**\n * Parse candle data from WebSocket message\n */\n private parseCandleData(data: Record<string, unknown>): WsCandle {\n return {\n address: data.a as string,\n open: data.o as string,\n close: data.c as string,\n high: data.h as string,\n low: data.l as string,\n volume: data.v as string,\n resolution: data.r as Resolution,\n time: data.t as number,\n number: data.n as number,\n };\n }\n\n /**\n * Subscribe to token candles (K-line)\n * Channel: dex-candle:{chain}_{tokenAddress}_{resolution} (USD)\n * Channel: dex-candle-in-native:{chain}_{tokenAddress}_{resolution} (Native)\n * @param priceType - \"usd\" (default) or \"native\"\n */\n subscribeTokenCandles({\n chain,\n tokenAddress,\n resolution,\n callback,\n filter,\n priceType = \"usd\",\n }: {\n chain: string;\n tokenAddress: string;\n resolution: Resolution;\n callback: (data: WsCandle) => void;\n filter?: string;\n priceType?: WsPriceType;\n }): Unsubscribable {\n const prefix = priceType === \"native\" ? \"dex-candle-in-native\" : \"dex-candle\";\n const channel = `${prefix}:${chain}_${tokenAddress}_${resolution}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => callback(this.parseCandleData(data)),\n filter,\n \"subscribeTokenCandles\",\n );\n }\n\n /**\n * Subscribe to pool candles (K-line)\n * Channel: dex-pool-candle:{chain}_{poolAddress}_{resolution} (USD)\n * Channel: dex-pool-candle-in-native:{chain}_{poolAddress}_{resolution} (Native)\n * @param priceType - \"usd\" (default) or \"native\"\n */\n subscribePoolCandles({\n chain,\n poolAddress,\n resolution,\n callback,\n filter,\n priceType = \"usd\",\n }: {\n chain: string;\n poolAddress: string;\n resolution: Resolution;\n callback: (data: WsCandle) => void;\n filter?: string;\n priceType?: WsPriceType;\n }): Unsubscribable {\n const prefix = priceType === \"native\" ? \"dex-pool-candle-in-native\" : \"dex-pool-candle\";\n const channel = `${prefix}:${chain}_${poolAddress}_${resolution}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => callback(this.parseCandleData(data)),\n filter,\n \"subscribePoolCandles\",\n );\n }\n\n /**\n * Subscribe to pair candles (K-line)\n * Channel: dex-pair-candle:{chain}_{pairAddress}_{resolution} (USD)\n * Channel: dex-pair-candle-in-native:{chain}_{pairAddress}_{resolution} (Native)\n * @param pairAddress - format: {tokenA}-{tokenB}\n * @param priceType - \"usd\" (default) or \"native\"\n */\n subscribePairCandles({\n chain,\n pairAddress,\n resolution,\n callback,\n filter,\n priceType = \"usd\",\n }: {\n chain: string;\n pairAddress: string;\n resolution: Resolution;\n callback: (data: WsCandle) => void;\n filter?: string;\n priceType?: WsPriceType;\n }): Unsubscribable {\n const prefix = priceType === \"native\" ? \"dex-pair-candle-in-native\" : \"dex-pair-candle\";\n const channel = `${prefix}:${chain}_${pairAddress}_${resolution}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => callback(this.parseCandleData(data)),\n filter,\n \"subscribePairCandles\",\n );\n }\n\n /**\n * Parse token stat data for a specific time window\n * @param data - Raw WebSocket data\n * @param suffix - Time window suffix (e.g., \"1m\", \"5m\", \"1h\", \"1W\", \"1M\")\n */\n private parseTokenStatWindow(\n data: Record<string, unknown>,\n suffix: string,\n ): Record<string, number | string | undefined> {\n return {\n [`buys${suffix}`]: data[`b${suffix}`] as number | undefined,\n [`sells${suffix}`]: data[`s${suffix}`] as number | undefined,\n [`buyers${suffix}`]: data[`be${suffix}`] as number | undefined,\n [`sellers${suffix}`]: data[`se${suffix}`] as number | undefined,\n [`buyVolumeInUsd${suffix}`]: this.formatScientificNotation(data[`bviu${suffix}`]),\n [`sellVolumeInUsd${suffix}`]: this.formatScientificNotation(data[`sviu${suffix}`]),\n [`price${suffix}`]: this.formatScientificNotation(data[`p${suffix}`]),\n [`openInUsd${suffix}`]: this.formatScientificNotation(data[`oiu${suffix}`]),\n [`closeInUsd${suffix}`]: this.formatScientificNotation(data[`ciu${suffix}`]),\n [`volumeChangeRatio${suffix}`]: this.formatScientificNotation(data[`vpc${suffix}`]),\n [`trades${suffix}`]: data[`tr${suffix}`] as number | undefined,\n [`dappProgramCount${suffix}`]: data[`dpc${suffix}`] as number | undefined,\n [`poolCount${suffix}`]: data[`pc${suffix}`] as number | undefined,\n [`liquidityInUsd${suffix}`]: this.formatScientificNotation(data[`liq${suffix}`]),\n [`liquidityChangeRatio${suffix}`]: this.formatScientificNotation(data[`lpc${suffix}`]),\n };\n }\n\n /**\n * Parse social media data from short field names\n */\n private parseSocialMedia(sm: Record<string, unknown> | undefined): WsSocialMedia | undefined {\n if (!sm) return undefined;\n return {\n twitter: sm.tw as string | undefined,\n telegram: sm.tg as string | undefined,\n website: sm.w as string | undefined,\n tiktok: sm.tt as string | undefined,\n discord: sm.dc as string | undefined,\n facebook: sm.fb as string | undefined,\n github: sm.gh as string | undefined,\n instagram: sm.ig as string | undefined,\n linkedin: sm.li as string | undefined,\n medium: sm.md as string | undefined,\n reddit: sm.rd as string | undefined,\n youtube: sm.yt as string | undefined,\n bitbucket: sm.bb as string | undefined,\n };\n }\n\n /**\n * Parse DEX protocol data from short field names\n */\n private parseDexProtocol(lf: Record<string, unknown> | undefined): WsDexProtocol | undefined {\n if (!lf) return undefined;\n const result: WsDexProtocol = {};\n if (lf.pa) result.programAddress = lf.pa as string;\n if (lf.pf) result.protocolFamily = lf.pf as string;\n if (lf.pn) result.protocolName = lf.pn as string;\n return result;\n }\n\n /**\n * Parse a TokenMetadataTimeEvent from raw WebSocket data\n */\n private parseTokenMetadata(data: Record<string, unknown>): WsTokenMetadata {\n const result: WsTokenMetadata = {\n tokenAddress: data.a as string,\n };\n if (data.n != null) result.name = data.n as string;\n if (data.dec != null) result.decimals = data.dec as number;\n if (data.s != null) result.symbol = data.s as string;\n if (data.iu != null) result.imageUrl = data.iu as string;\n if (data.de != null) result.description = data.de as string;\n if (data.sm) result.socialMedia = this.parseSocialMedia(data.sm as Record<string, unknown>);\n if (data.cts != null) result.createdAtMs = data.cts as number;\n if (data.cgi != null) result.coingeckoCoinId = data.cgi as string;\n if (data.lf) result.launchFrom = this.parseDexProtocol(data.lf as Record<string, unknown>);\n if (data.mt) result.migratedTo = this.parseDexProtocol(data.mt as Record<string, unknown>);\n return result;\n }\n\n /**\n * Subscribe to token trade statistics\n * Channel: dex-token-stats:{chain}_{tokenAddress}\n * Time windows: 1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 24h, 1W, 1M\n */\n subscribeTokenStats({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenStat) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-stats:${chain}_${tokenAddress}`;\n // Time window suffixes - note: 1W and 1M use uppercase\n const timeWindows = [\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"2h\", \"4h\", \"6h\", \"8h\", \"24h\", \"1W\", \"1M\"];\n\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => {\n // Parse all time window data\n const windowData = timeWindows.reduce(\n (acc, suffix) => ({\n ...acc,\n ...this.parseTokenStatWindow(data, suffix),\n }),\n {} as Record<string, number | string | undefined>,\n );\n\n callback({\n address: data.a as string,\n timestamp: data.t as number,\n price: this.formatScientificNotation(data.p),\n ...windowData,\n } as WsTokenStat);\n },\n filter,\n \"subscribeTokenStats\",\n );\n }\n\n subscribeTokenHolders({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenHolder) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-holding:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n holders: data.h as number,\n top100HoldersAmount: this.formatScientificNotation(data.t100a),\n top50HoldersAmount: this.formatScientificNotation(data.t50a),\n top10HoldersAmount: this.formatScientificNotation(data.t10a),\n top100Holders: data.t100h as number,\n top50Holders: data.t50h as number,\n top10Holders: data.t10h as number,\n top100HoldersRatio: this.formatScientificNotation(data.t100r),\n top50HoldersRatio: this.formatScientificNotation(data.t50r),\n top10HoldersRatio: this.formatScientificNotation(data.t10r),\n creatorsHolders: data.ch as number,\n creatorsAmount: this.formatScientificNotation(data.ca),\n creatorsRatio: this.formatScientificNotation(data.cr),\n balanceTagFreshHolders: data.btfh as number,\n balanceTagFreshAmount: this.formatScientificNotation(data.btfa),\n balanceTagFreshRatio: this.formatScientificNotation(data.btfr),\n balanceTagSandwichHolders: data.btsh as number,\n balanceTagSandwichAmount: this.formatScientificNotation(data.btsa),\n balanceTagSandwichRatio: this.formatScientificNotation(data.btsr),\n balanceTagBundleHolders: data.btbh as number,\n balanceTagBundleAmount: this.formatScientificNotation(data.btba),\n balanceTagBundleRatio: this.formatScientificNotation(data.btbr),\n balanceTagSniperHolders: data.btsnh as number,\n balanceTagSniperAmount: this.formatScientificNotation(data.btsna),\n balanceTagSniperRatio: this.formatScientificNotation(data.btsnr),\n balanceTagDevHolders: data.btdh as number,\n balanceTagDevAmount: this.formatScientificNotation(data.btda),\n balanceTagDevRatio: this.formatScientificNotation(data.btdr),\n balanceTagProHolders: data.btph as number,\n balanceTagProAmount: this.formatScientificNotation(data.btpa),\n balanceTagProRatio: this.formatScientificNotation(data.btpr),\n balanceTagInsiderHolders: data.btih as number,\n balanceTagInsiderAmount: this.formatScientificNotation(data.btia),\n balanceTagInsiderRatio: this.formatScientificNotation(data.btir),\n balanceTagSmartHolders: data.btsmh as number,\n balanceTagSmartAmount: this.formatScientificNotation(data.btsma),\n balanceTagSmartRatio: this.formatScientificNotation(data.btsmr),\n balanceTagKolHolders: data.btkh as number,\n balanceTagKolAmount: this.formatScientificNotation(data.btka),\n balanceTagKolRatio: this.formatScientificNotation(data.btkr),\n balanceTagPhishingHolders: data.btphh as number,\n balanceTagPhishingAmount: this.formatScientificNotation(data.btpha),\n balanceTagPhishingRatio: this.formatScientificNotation(data.btphr),\n balanceTagBluechipHolders: data.btblh as number,\n balanceTagBluechipAmount: this.formatScientificNotation(data.btbla),\n balanceTagBluechipRatio: this.formatScientificNotation(data.btblr),\n balanceTagRatHolders: data.btrh as number,\n balanceTagRatAmount: this.formatScientificNotation(data.btra),\n balanceTagRatRatio: this.formatScientificNotation(data.btrr),\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenHolders\",\n );\n }\n\n /**\n * Subscribe to new token events (single token per event, supports CEL filter)\n * Channel: dex-new-token:{chain}\n */\n subscribeNewToken({\n chain,\n callback,\n filter,\n }: {\n chain: string;\n callback: (data: WsNewToken) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-new-token:${chain}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => {\n const result: WsNewToken = {\n tokenAddress: data.a as string,\n name: data.n as string,\n symbol: data.s as string,\n createdAtMs: data.cts as number,\n };\n\n if (data.dec != null) result.decimals = data.dec as number;\n if (data.iu != null) result.imageUrl = data.iu as string;\n if (data.de != null) result.description = data.de as string;\n if (data.sm) result.socialMedia = this.parseSocialMedia(data.sm as Record<string, unknown>);\n if (data.cgi != null) result.coingeckoCoinId = data.cgi as string;\n if (data.lf) result.launchFrom = this.parseDexProtocol(data.lf as Record<string, unknown>);\n if (data.mt) result.migratedTo = this.parseDexProtocol(data.mt as Record<string, unknown>);\n\n callback(result);\n },\n filter,\n \"subscribeNewToken\",\n );\n }\n\n /**\n * Subscribe to new tokens metadata (batch, aggregated every 1 second)\n * Channel: dex-new-tokens-metadata:{chain}\n * No CEL filter support\n */\n subscribeNewTokensMetadata({\n chain,\n callback,\n }: {\n chain: string;\n callback: (data: WsTokenMetadata[]) => void;\n }): Unsubscribable {\n const channel = `dex-new-tokens-metadata:${chain}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(data.map(it => this.parseTokenMetadata(it))),\n );\n }\n\n /**\n * Subscribe to new tokens list (batch from token-created-to-realtime-pipeline)\n * Channel: dex-new-tokens:{chain}\n * No CEL filter support\n */\n subscribeNewTokens({\n chain,\n callback,\n }: {\n chain: string;\n callback: (data: WsTokenMetadata[]) => void;\n }): Unsubscribable {\n const channel = `dex-new-tokens:${chain}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(data.map(it => this.parseTokenMetadata(it))),\n );\n }\n\n subscribeTokenSupply({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenSupply) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-supply:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n supply: data.s as string,\n marketCapInUsd: data.mc as string,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenSupply\",\n );\n }\n\n subscribeTokenLiquidity({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenLiquidity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-general-stat-num:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n metricType: data.t as WsTokenLiquidity[\"metricType\"],\n value: data.v as string,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenLiquidity\",\n );\n }\n\n /**\n * Subscribe to token max liquidity updates\n * Pushes the max liquidity info of a token in a single pool\n * Channel: dex-token-liquidity:{chain}_{token_address}\n */\n subscribeTokenMaxLiquidity({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenMaxLiquidity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-liquidity:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n poolAddress: data.p as string,\n liquidityInUsd: data.liu as string,\n liquidityInNative: data.lin as string,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenMaxLiquidity\",\n );\n }\n\n /**\n * Subscribe to token total liquidity updates\n * Pushes the total liquidity info of a token across all pools\n * Channel: dex-token-total-liquidity:{chain}_{token_address}\n */\n subscribeTokenTotalLiquidity({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenTotalLiquidity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-total-liquidity:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n liquidityInUsd: data.liu as string,\n liquidityInNative: data.lin as string,\n poolCount: data.pc as number,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenTotalLiquidity\",\n );\n }\n\n subscribeRankingTokensLiquidity({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenLiquidity[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-general_stat_num-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(it => ({\n tokenAddress: it.a as string,\n metricType: it.t as WsTokenLiquidity[\"metricType\"],\n value: it.v as string,\n timestamp: it.ts as number,\n })),\n ),\n );\n }\n\n subscribeRankingTokensList({\n chain,\n ranking_type,\n dex,\n callback,\n }: {\n chain: string;\n ranking_type: WsRankingType;\n dex?: WsDex;\n callback: (data: WsRankingTokenList[]) => void;\n }): Unsubscribable {\n const channel = dex\n ? `dex-ranking-list:${chain}_${ranking_type}_${dex}`\n : `dex-ranking-list:${chain}_${ranking_type}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(item => {\n const result: WsRankingTokenList = {};\n const t = item.t as Record<string, unknown> | undefined;\n const bc = item.bc as Record<string, unknown> | undefined;\n const h = item.h as Record<string, unknown> | undefined;\n const s = item.s as Record<string, unknown> | undefined;\n const ts = item.ts as Record<string, unknown> | undefined;\n\n // TokenMetadata (t)\n if (t) {\n result.metadata = {\n tokenAddress: t.a as string,\n };\n if (t.n) {\n result.metadata.name = t.n as string;\n }\n if (t.s) {\n result.metadata.symbol = t.s as string;\n }\n if (t.iu) {\n result.metadata.imageUrl = t.iu as string;\n }\n if (t.de) {\n result.metadata.description = t.de as string;\n }\n if (t.dec) {\n result.metadata.decimals = t.dec as number;\n }\n if (t.cts) {\n result.metadata.createdAtMs = t.cts as number;\n }\n if (t.lf) {\n result.metadata.launchFrom = this.parseDexProtocol(t.lf as Record<string, unknown>);\n }\n if (t.mt) {\n result.metadata.migratedTo = this.parseDexProtocol(t.mt as Record<string, unknown>);\n }\n if (t.sm) {\n result.metadata.socialMedia = this.parseSocialMedia(t.sm as Record<string, unknown>);\n }\n }\n\n // WsTokenBondingCurve (bc)\n if (bc) {\n result.bondingCurve = {};\n if (bc.pr) {\n result.bondingCurve.progressRatio = this.formatScientificNotation(bc.pr);\n }\n }\n\n // TokenHolder (h)\n if (h) {\n result.holder = {\n tokenAddress: h.a as string,\n timestamp: (h.ts as number) || 0,\n };\n if (h.h) {\n result.holder.holders = h.h as number;\n }\n if (h.t100a) {\n result.holder.top100HoldersAmount = this.formatScientificNotation(h.t100a);\n }\n if (h.t50a) {\n result.holder.top50HoldersAmount = this.formatScientificNotation(h.t50a);\n }\n if (h.t10a) {\n result.holder.top10HoldersAmount = this.formatScientificNotation(h.t10a);\n }\n if (h.t100h) {\n result.holder.top100Holders = h.t100h as number;\n }\n if (h.t50h) {\n result.holder.top50Holders = h.t50h as number;\n }\n if (h.t10h) {\n result.holder.top10Holders = h.t10h as number;\n }\n if (h.t100r) {\n result.holder.top100HoldersRatio = this.formatScientificNotation(h.t100r);\n }\n if (h.t50r) {\n result.holder.top50HoldersRatio = this.formatScientificNotation(h.t50r);\n }\n if (h.t10r) {\n result.holder.top10HoldersRatio = this.formatScientificNotation(h.t10r);\n }\n }\n\n // WsTokenSupply (s)\n if (s) {\n result.supply = {\n tokenAddress: s.a as string,\n timestamp: (s.ts as number) || 0,\n };\n if (s.s) {\n result.supply.supply = s.s as string;\n }\n if (s.mc) {\n result.supply.marketCapInUsd = s.mc as string;\n }\n }\n\n // TokenStat (ts)\n if (ts) {\n result.stat = {\n address: ts.a as string,\n timestamp: (ts.t as number) || 0,\n };\n\n // 1m data\n if (ts.b1m) {\n result.stat.buys1m = ts.b1m as number;\n }\n if (ts.s1m) {\n result.stat.sells1m = ts.s1m as number;\n }\n if (ts.be1m) {\n result.stat.buyers1m = ts.be1m as number;\n }\n if (ts.se1m) {\n result.stat.sellers1m = ts.se1m as number;\n }\n if (ts.bviu1m) {\n result.stat.buyVolumeInUsd1m = this.formatScientificNotation(ts.bviu1m);\n }\n if (ts.sviu1m) {\n result.stat.sellVolumeInUsd1m = this.formatScientificNotation(ts.sviu1m);\n }\n if (ts.p1m) {\n result.stat.price1m = this.formatScientificNotation(ts.p1m);\n }\n\n // Current price\n if (ts.p) {\n result.stat.price = this.formatScientificNotation(ts.p);\n }\n }\n\n return result;\n }),\n ),\n );\n }\n\n subscribeRankingTokensStats({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenStat[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-stats-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(\n it =>\n ({\n address: it.a,\n timestamp: it.t,\n buys1m: it.b1m,\n sells1m: it.s1m,\n buyers1m: it.be1m,\n sellers1m: it.se1m,\n buyVolumeInUsd1m: this.formatScientificNotation(it.bviu1m),\n sellVolumeInUsd1m: this.formatScientificNotation(it.sviu1m),\n price1m: this.formatScientificNotation(it.p1m),\n openInUsd1m: this.formatScientificNotation(it.oiu1m),\n closeInUsd1m: this.formatScientificNotation(it.ciu1m),\n buys5m: it.b5m,\n sells5m: it.s5m,\n buyers5m: it.be5m,\n sellers5m: it.se5m,\n buyVolumeInUsd5m: this.formatScientificNotation(it.bviu5m),\n sellVolumeInUsd5m: this.formatScientificNotation(it.sviu5m),\n price5m: this.formatScientificNotation(it.p5m),\n openInUsd5m: this.formatScientificNotation(it.oiu5m),\n closeInUsd5m: this.formatScientificNotation(it.ciu5m),\n price: this.formatScientificNotation(it.p),\n }) as WsTokenStat,\n ),\n ),\n );\n }\n\n subscribeRankingTokensHolders({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenHolder[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-holding-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(\n it =>\n ({\n tokenAddress: it.a,\n holders: it.h,\n top100HoldersAmount: this.formatScientificNotation(it.t100a),\n top50HoldersAmount: this.formatScientificNotation(it.t50a),\n top10HoldersAmount: this.formatScientificNotation(it.t10a),\n top100Holders: it.t100h,\n top50Holders: it.t50h,\n top10Holders: it.t10h,\n top100HoldersRatio: this.formatScientificNotation(it.t100r),\n top50HoldersRatio: this.formatScientificNotation(it.t50r),\n top10HoldersRatio: this.formatScientificNotation(it.t10r),\n timestamp: it.ts,\n }) as WsTokenHolder,\n ),\n ),\n );\n }\n\n subscribeRankingTokensSupply({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenSupply[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-supply-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(it => ({\n tokenAddress: it.a as string,\n supply: it.s as string,\n marketCapInUsd: it.mc as string,\n timestamp: it.ts as number,\n })),\n ),\n );\n }\n\n subscribeRankingTokensBondingCurve({\n chain,\n callback,\n }: {\n chain: string;\n callback: (data: WsTokenBondingCurve[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-bounding-curve-list:${chain}_new`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(it => ({\n tokenAddress: it.a as string,\n progressRatio: it.pr as string,\n })),\n ),\n );\n }\n\n subscribeWalletBalance({\n chain,\n walletAddress,\n callback,\n filter,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsWalletBalance[]) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-wallet-balance:${chain}_${walletAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback([\n {\n walletAddress: data.a as string,\n tokenAddress: data.ta as string,\n tokenPriceInUsd: data.tpiu as string,\n balance: data.b as string,\n timestamp: data.t as number,\n },\n ]),\n filter,\n \"subscribeWalletBalance\",\n );\n }\n\n subscribeWalletPnl({\n chain,\n walletAddress,\n callback,\n filter,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsWalletTokenPnl) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-wallet-token-pnl:${chain}_${walletAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n walletAddress: data.a as string,\n tokenAddress: data.ta as string,\n timestamp: data.t as number,\n buyCount: data.bs as number,\n buyCount30d: data.bs30d as number,\n buyCount7d: data.bs7d as number,\n sellCount: data.ss as number,\n sellCount30d: data.ss30d as number,\n sellCount7d: data.ss7d as number,\n tokenPriceInUsd: data.tpiu as string | undefined,\n opentime: data.ot as number | undefined,\n lasttime: data.lt as number | undefined,\n closetime: data.ct as number | undefined,\n buyAmount: data.ba as string | undefined,\n buyAmountInUsd: data.baiu as string | undefined,\n sellAmount: data.sa as string | undefined,\n sellAmountInUsd: data.saiu as string | undefined,\n heldDurationTimestamp: data.hdts as number | undefined,\n averageBuyPriceInUsd: data.abpiu as string | undefined,\n averageSellPriceInUsd: data.aspiu as string | undefined,\n unrealizedProfitInUsd: data.upiu as string | undefined,\n unrealizedProfitRatio: data.upr as string | undefined,\n realizedProfitInUsd: data.rpiu as string | undefined,\n realizedProfitRatio: data.rpr as string | undefined,\n totalRealizedProfitInUsd: data.trpiu as string | undefined,\n totalRealizedProfitRatio: data.trr as string | undefined,\n }),\n filter,\n \"subscribeWalletPnl\",\n );\n }\n\n subscribeWalletPnlList({\n chain,\n walletAddress,\n callback,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsWalletPnl[]) => void;\n }): Unsubscribable {\n const channel = `dex-wallet-pnl-list:${chain}_${walletAddress}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(\n it =>\n ({\n walletAddress: it.a,\n buys: it.bs,\n buyAmount: it.ba,\n buyAmountInUsd: it.baiu,\n averageBuyPriceInUsd: it.abpiu,\n sellAmount: it.sa,\n sellAmountInUsd: it.saiu,\n sells: it.ss,\n wins: it.ws,\n winRatio: it.wr,\n pnlInUsd: it.piu,\n averagePnlInUsd: it.apiu,\n pnlRatio: it.pr,\n profitableDays: it.pd,\n losingDays: it.ld,\n tokens: it.ts,\n resolution: it.r,\n }) as WsWalletPnl,\n ),\n ),\n );\n }\n\n subscribeTokenTrade({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTradeActivity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-trade:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n timestamp: data.t as number,\n kind: data.k as string,\n buyAmount: data.ba as string,\n buyAmountInUsd: data.baiu as string,\n buyTokenAddress: data.btma as string,\n buyTokenName: data.btn as string,\n buyTokenSymbol: data.bts as string,\n buyWalletAddress: data.bwa as string,\n sellAmount: data.sa as string,\n sellAmountInUsd: data.saiu as string,\n sellTokenAddress: data.stma as string,\n sellTokenName: data.stn as string,\n sellTokenSymbol: data.sts as string,\n sellWalletAddress: data.swa as string,\n txHash: data.h as string,\n }),\n filter,\n \"subscribeTokenTrades\",\n );\n }\n\n subscribeWalletTrade({\n chain,\n walletAddress,\n callback,\n filter,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsTradeActivity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-wallet-trade:${chain}_${walletAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n timestamp: data.t as number,\n kind: data.k as string,\n buyAmount: data.ba as string,\n buyAmountInUsd: data.baiu as string,\n buyTokenAddress: data.btma as string,\n buyTokenName: data.btn as string,\n buyTokenSymbol: data.bts as string,\n buyWalletAddress: data.bwa as string,\n sellAmount: data.sa as string,\n sellAmountInUsd: data.saiu as string,\n sellTokenAddress: data.stma as string,\n sellTokenName: data.stn as string,\n sellTokenSymbol: data.sts as string,\n sellWalletAddress: data.swa as string,\n txHash: data.h as string,\n }),\n filter,\n \"subscribeTokenTrades\",\n );\n }\n\n subscribeDexPoolBalance({\n chain,\n poolAddress,\n callback,\n }: {\n chain: string;\n poolAddress: string;\n callback: (data: WsDexPoolBalance) => void;\n }): Unsubscribable {\n const channel = `dex-pool-balance:${chain}_${poolAddress}`;\n return this.subscribe(channel, (data: Record<string, unknown>) =>\n callback({\n poolAddress: data.a as string,\n tokenAAddress: data.taa as string,\n tokenALiquidityInUsd: data.taliu as string,\n tokenBAddress: data.tba as string,\n tokenBLiquidityInUsd: data.tbliu as string,\n }),\n );\n }\n}\n\nclass StreamUnsubscribable<T> {\n constructor(\n private readonly streamApi: StreamApi,\n private readonly channel: string,\n private readonly fn: (data: T) => void,\n ) {}\n\n unsubscribe(): void {\n this.streamApi.unsubscribe(this.channel, this.fn);\n }\n}\n","/**\n * Field mappings for CEL filter expressions\n * Maps human-readable field names to short field names used in the API\n * Organized by subscription method to handle field name conflicts\n */\n\nexport interface FieldMapping {\n readonly [key: string]: string;\n}\n\nexport interface MethodFieldMappings {\n readonly [methodName: string]: FieldMapping;\n}\n\n/**\n * Field mappings organized by subscription method\n * Each method can have its own field mappings to handle conflicts\n */\nexport const CEL_FIELD_MAPPINGS: MethodFieldMappings = {\n // Wallet balance subscription fields\n subscribeWalletBalance: {\n walletAddress: \"a\",\n tokenAddress: \"ta\",\n tokenPriceInUsd: \"tpiu\",\n balance: \"b\",\n timestamp: \"t\",\n },\n\n // Token candles subscription fields\n subscribeTokenCandles: {\n open: \"o\",\n close: \"c\",\n high: \"h\",\n low: \"l\",\n volume: \"v\",\n resolution: \"r\",\n time: \"t\",\n number: \"n\",\n },\n\n // Token stats subscription fields\n subscribeTokenStats: {\n address: \"a\",\n timestamp: \"t\",\n buys1m: \"b1m\",\n sells1m: \"s1m\",\n buyers1m: \"be1m\",\n sellers1m: \"se1m\",\n buyVolumeInUsd1m: \"bviu1m\",\n sellVolumeInUsd1m: \"sviu1m\",\n price1m: \"p1m\",\n openInUsd1m: \"oiu1m\",\n closeInUsd1m: \"ciu1m\",\n buys5m: \"b5m\",\n sells5m: \"s5m\",\n buyers5m: \"be5m\",\n sellers5m: \"se5m\",\n buyVolumeInUsd5m: \"bviu5m\",\n sellVolumeInUsd5m: \"sviu5m\",\n price5m: \"p5m\",\n openInUsd5m: \"oiu5m\",\n closeInUsd5m: \"ciu5m\",\n buys15m: \"b15m\",\n sells15m: \"s15m\",\n buyers15m: \"be15m\",\n sellers15m: \"se15m\",\n buyVolumeInUsd15m: \"bviu15m\",\n sellVolumeInUsd15m: \"sviu15m\",\n price15m: \"p15m\",\n openInUsd15m: \"oiu15m\",\n closeInUsd15m: \"ciu15m\",\n buys30m: \"b30m\",\n sells30m: \"s30m\",\n buyers30m: \"be30m\",\n sellers30m: \"se30m\",\n buyVolumeInUsd30m: \"bviu30m\",\n sellVolumeInUsd30m: \"sviu30m\",\n price30m: \"p30m\",\n openInUsd30m: \"oiu30m\",\n closeInUsd30m: \"ciu30m\",\n buys1h: \"b1h\",\n sells1h: \"s1h\",\n buyers1h: \"be1h\",\n sellers1h: \"se1h\",\n buyVolumeInUsd1h: \"bviu1h\",\n sellVolumeInUsd1h: \"sviu1h\",\n price1h: \"p1h\",\n openInUsd1h: \"oiu1h\",\n closeInUsd1h: \"ciu1h\",\n buys4h: \"b4h\",\n sells4h: \"s4h\",\n buyers4h: \"be4h\",\n sellers4h: \"se4h\",\n buyVolumeInUsd4h: \"bviu4h\",\n sellVolumeInUsd4h: \"sviu4h\",\n price4h: \"p4h\",\n openInUsd4h: \"oiu4h\",\n closeInUsd4h: \"ciu4h\",\n buys24h: \"b24h\",\n sells24h: \"s24h\",\n buyers24h: \"be24h\",\n sellers24h: \"se24h\",\n buyVolumeInUsd24h: \"bviu24h\",\n sellVolumeInUsd24h: \"sviu24h\",\n price24h: \"p24h\",\n price: \"p\",\n openInUsd24h: \"oiu24h\",\n closeInUsd24h: \"ciu24h\",\n },\n\n // Token holder subscription fields\n subscribeTokenHolders: {\n tokenAddress: \"a\",\n holders: \"h\",\n top100HoldersAmount: \"t100a\",\n top50HoldersAmount: \"t50a\",\n top10HoldersAmount: \"t10a\",\n top100Holders: \"t100h\",\n top50Holders: \"t50h\",\n top10Holders: \"t10h\",\n top100HoldersRatio: \"t100r\",\n top50HoldersRatio: \"t50r\",\n top10HoldersRatio: \"t10r\",\n creatorsHolders: \"ch\",\n creatorsAmount: \"ca\",\n creatorsRatio: \"cr\",\n balanceTagFreshHolders: \"btfh\",\n balanceTagFreshAmount: \"btfa\",\n balanceTagFreshRatio: \"btfr\",\n balanceTagSandwichHolders: \"btsh\",\n balanceTagSandwichAmount: \"btsa\",\n balanceTagSandwichRatio: \"btsr\",\n balanceTagBundleHolders: \"btbh\",\n balanceTagBundleAmount: \"btba\",\n balanceTagBundleRatio: \"btbr\",\n balanceTagSniperHolders: \"btsnh\",\n balanceTagSniperAmount: \"btsna\",\n balanceTagSniperRatio: \"btsnr\",\n balanceTagDevHolders: \"btdh\",\n balanceTagDevAmount: \"btda\",\n balanceTagDevRatio: \"btdr\",\n balanceTagProHolders: \"btph\",\n balanceTagProAmount: \"btpa\",\n balanceTagProRatio: \"btpr\",\n balanceTagInsiderHolders: \"btih\",\n balanceTagInsiderAmount: \"btia\",\n balanceTagInsiderRatio: \"btir\",\n balanceTagSmartHolders: \"btsmh\",\n balanceTagSmartAmount: \"btsma\",\n balanceTagSmartRatio: \"btsmr\",\n balanceTagKolHolders: \"btkh\",\n balanceTagKolAmount: \"btka\",\n balanceTagKolRatio: \"btkr\",\n balanceTagPhishingHolders: \"btphh\",\n balanceTagPhishingAmount: \"btpha\",\n balanceTagPhishingRatio: \"btphr\",\n balanceTagBluechipHolders: \"btblh\",\n balanceTagBluechipAmount: \"btbla\",\n balanceTagBluechipRatio: \"btblr\",\n balanceTagRatHolders: \"btrh\",\n balanceTagRatAmount: \"btra\",\n balanceTagRatRatio: \"btrr\",\n timestamp: \"ts\",\n },\n\n // New token subscription fields (dex-new-token, supports CEL filter)\n subscribeNewToken: {\n tokenAddress: \"a\",\n name: \"n\",\n symbol: \"s\",\n decimals: \"dec\",\n imageUrl: \"iu\",\n description: \"de\",\n createdAtMs: \"cts\",\n coingeckoCoinId: \"cgi\",\n \"socialMedia.twitter\": \"sm.tw\",\n \"socialMedia.telegram\": \"sm.tg\",\n \"socialMedia.website\": \"sm.w\",\n \"socialMedia.tiktok\": \"sm.tt\",\n \"socialMedia.discord\": \"sm.dc\",\n \"socialMedia.facebook\": \"sm.fb\",\n \"socialMedia.github\": \"sm.gh\",\n \"socialMedia.instagram\": \"sm.ig\",\n \"socialMedia.linkedin\": \"sm.li\",\n \"socialMedia.medium\": \"sm.md\",\n \"socialMedia.reddit\": \"sm.rd\",\n \"socialMedia.youtube\": \"sm.yt\",\n \"socialMedia.bitbucket\": \"sm.bb\",\n \"launchFrom.programAddress\": \"lf.pa\",\n \"launchFrom.protocolFamily\": \"lf.pf\",\n \"launchFrom.protocolName\": \"lf.pn\",\n \"migratedTo.programAddress\": \"mt.pa\",\n \"migratedTo.protocolFamily\": \"mt.pf\",\n \"migratedTo.protocolName\": \"mt.pn\",\n },\n\n // Token supply subscription fields\n subscribeTokenSupply: {\n tokenAddress: \"a\",\n supply: \"s\",\n timestamp: \"ts\",\n },\n\n // Dex pool balance subscription fields\n subscribeDexPoolBalance: {\n poolAddress: \"a\",\n tokenAAddress: \"taa\",\n tokenALiquidityInUsd: \"taliu\",\n tokenBAddress: \"tba\",\n tokenBLiquidityInUsd: \"tbliu\",\n },\n\n // Token liquidity subscription fields\n subscribeTokenLiquidity: {\n tokenAddress: \"a\",\n metricType: \"t\",\n value: \"v\",\n timestamp: \"ts\",\n },\n\n // New token metadata subscription fields (dex-new-tokens-metadata)\n subscribeNewTokensMetadata: {\n tokenAddress: \"a\",\n name: \"n\",\n decimals: \"dec\",\n symbol: \"s\",\n imageUrl: \"iu\",\n description: \"de\",\n createdAtMs: \"cts\",\n coingeckoCoinId: \"cgi\",\n \"socialMedia.twitter\": \"sm.tw\",\n \"socialMedia.telegram\": \"sm.tg\",\n \"socialMedia.website\": \"sm.w\",\n \"socialMedia.tiktok\": \"sm.tt\",\n \"socialMedia.discord\": \"sm.dc\",\n \"socialMedia.facebook\": \"sm.fb\",\n \"socialMedia.github\": \"sm.gh\",\n \"socialMedia.instagram\": \"sm.ig\",\n \"socialMedia.linkedin\": \"sm.li\",\n \"socialMedia.medium\": \"sm.md\",\n \"socialMedia.reddit\": \"sm.rd\",\n \"socialMedia.youtube\": \"sm.yt\",\n \"socialMedia.bitbucket\": \"sm.bb\",\n \"launchFrom.programAddress\": \"lf.pa\",\n \"launchFrom.protocolFamily\": \"lf.pf\",\n \"launchFrom.protocolName\": \"lf.pn\",\n \"migratedTo.programAddress\": \"mt.pa\",\n \"migratedTo.protocolFamily\": \"mt.pf\",\n \"migratedTo.protocolName\": \"mt.pn\",\n },\n\n // New tokens list subscription fields (dex-new-tokens)\n subscribeNewTokens: {\n tokenAddress: \"a\",\n name: \"n\",\n decimals: \"dec\",\n symbol: \"s\",\n imageUrl: \"iu\",\n description: \"de\",\n createdAtMs: \"cts\",\n coingeckoCoinId: \"cgi\",\n \"socialMedia.twitter\": \"sm.tw\",\n \"socialMedia.telegram\": \"sm.tg\",\n \"socialMedia.website\": \"sm.w\",\n \"socialMedia.tiktok\": \"sm.tt\",\n \"socialMedia.discord\": \"sm.dc\",\n \"socialMedia.facebook\": \"sm.fb\",\n \"socialMedia.github\": \"sm.gh\",\n \"socialMedia.instagram\": \"sm.ig\",\n \"socialMedia.linkedin\": \"sm.li\",\n \"socialMedia.medium\": \"sm.md\",\n \"socialMedia.reddit\": \"sm.rd\",\n \"socialMedia.youtube\": \"sm.yt\",\n \"socialMedia.bitbucket\": \"sm.bb\",\n \"launchFrom.programAddress\": \"lf.pa\",\n \"launchFrom.protocolFamily\": \"lf.pf\",\n \"launchFrom.protocolName\": \"lf.pn\",\n \"migratedTo.programAddress\": \"mt.pa\",\n \"migratedTo.protocolFamily\": \"mt.pf\",\n \"migratedTo.protocolName\": \"mt.pn\",\n },\n\n // Token trades subscription fields\n subscribeTokenTrades: {\n tokenAddress: \"a\",\n timestamp: \"t\",\n kind: \"k\",\n buyAmount: \"ba\",\n buyAmountInUsd: \"baiu\",\n buyTokenAddress: \"btma\",\n buyTokenName: \"btn\",\n buyTokenSymbol: \"bts\",\n buyWalletAddress: \"bwa\",\n sellAmount: \"sa\",\n sellAmountInUsd: \"saiu\",\n sellTokenAddress: \"stma\",\n sellTokenName: \"stn\",\n sellTokenSymbol: \"sts\",\n sellWalletAddress: \"swa\",\n txHash: \"h\",\n },\n\n // Wallet token PnL subscription fields\n subscribeWalletPnl: {\n walletAddress: \"a\",\n tokenAddress: \"ta\",\n tokenPriceInUsd: \"tpiu\",\n timestamp: \"t\",\n opentime: \"ot\",\n lasttime: \"lt\",\n closetime: \"ct\",\n buyAmount: \"ba\",\n buyAmountInUsd: \"baiu\",\n buyCount: \"bs\",\n buyCount30d: \"bs30d\",\n buyCount7d: \"bs7d\",\n sellAmount: \"sa\",\n sellAmountInUsd: \"saiu\",\n sellCount: \"ss\",\n sellCount30d: \"ss30d\",\n sellCount7d: \"ss7d\",\n heldDurationTimestamp: \"hdts\",\n averageBuyPriceInUsd: \"abpiu\",\n averageSellPriceInUsd: \"aspiu\",\n unrealizedProfitInUsd: \"upiu\",\n unrealizedProfitRatio: \"upr\",\n realizedProfitInUsd: \"rpiu\",\n realizedProfitRatio: \"rpr\",\n totalRealizedProfitInUsd: \"trpiu\",\n totalRealizedProfitRatio: \"trr\",\n },\n\n // Token max liquidity subscription fields\n subscribeTokenMaxLiquidity: {\n tokenAddress: \"a\",\n poolAddress: \"p\",\n liquidityInUsd: \"liu\",\n liquidityInNative: \"lin\",\n timestamp: \"ts\",\n },\n\n // Token total liquidity subscription fields\n subscribeTokenTotalLiquidity: {\n tokenAddress: \"a\",\n liquidityInUsd: \"liu\",\n liquidityInNative: \"lin\",\n poolCount: \"pc\",\n timestamp: \"ts\",\n },\n} as const;\n\n/**\n * Get field mappings for a specific subscription method\n * @param methodName - The name of the subscription method\n * @returns Field mapping object for the method, or empty object if not found\n */\nexport function getFieldMappings(methodName: string): FieldMapping {\n return CEL_FIELD_MAPPINGS[methodName] || {};\n}\n\n/**\n * Replace long field names with short field names in a filter expression\n * Automatically adds meta. prefix if not present\n * Supports nested field paths (e.g., launchFrom.protocolFamily -> lf.pf)\n * @param filter - Original filter expression\n * @param methodName - The name of the subscription method\n * @returns Filter expression with short field names and meta. prefix\n */\nexport function replaceFilterFields(filter: string, methodName: string): string {\n if (!filter) {\n return filter;\n }\n\n const fieldMappings = getFieldMappings(methodName);\n let result = filter;\n\n // Sort entries by key length descending to replace longer (nested) paths first\n // This prevents partial replacements (e.g., \"launchFrom\" matching before \"launchFrom.protocolFamily\")\n const sortedEntries = Object.entries(fieldMappings).sort(([a], [b]) => b.length - a.length);\n\n for (const [longField, shortField] of sortedEntries) {\n // Escape dots in field names for regex\n const escapedField = longField.replace(/\\./g, \"\\\\.\");\n\n // Handle both cases: with and without meta. prefix\n const patterns = [\n // Pattern 1: meta.fieldName (with meta. prefix) — check first to avoid double meta.\n new RegExp(`\\\\bmeta\\\\.${escapedField}\\\\b`, \"g\"),\n // Pattern 2: fieldName (without meta. prefix)\n new RegExp(`\\\\b${escapedField}\\\\b`, \"g\"),\n ];\n\n patterns.forEach(pattern => {\n result = result.replace(pattern, `meta.${shortField}`);\n });\n }\n\n return result;\n}\n\n/**\n * Type-safe field mapping for specific subscription methods\n */\nexport type SubscriptionMethod = keyof typeof CEL_FIELD_MAPPINGS;\n\n/**\n * Get available field names for a specific subscription method\n * @param methodName - The name of the subscription method\n * @returns Array of available field names\n */\nexport function getAvailableFields(methodName: string): string[] {\n const mappings = getFieldMappings(methodName);\n return Object.keys(mappings);\n}\n","import { Resolution } from \"../openapi-client/index.js\";\n\nexport enum WsTokenActivityType {\n Sell = \"sell\",\n Buy = \"buy\",\n AddLiquidity = \"add_liquidity\",\n RemoveLiquidity = \"remove_liquidity\",\n}\n\nexport enum WsChannelType {\n New = \"new\",\n HOT = \"trending\",\n US_STOCKS = \"us_stocks\",\n FINAL_STRETCH = \"graduated\",\n MIGRATED = \"completed\",\n}\n\nexport enum WsMetricType {\n LIQUIDITY_IN_USD = \"liquidity_in_usd\",\n MIGRATED_RATIO = \"migrated_ratio\",\n}\n\nexport interface WsTokenActivity {\n address: string;\n priceUsd: string;\n amount: string;\n type: WsTokenActivityType;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Token trade statistics for multiple time windows.\n * Time windows: 1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 24h, 1W, 1M\n */\nexport interface WsTokenStat {\n /** Token address */\n address: string;\n /** Timestamp in milliseconds (UTC time when pipeline processed) */\n timestamp: number;\n /** Current token price in USD (first positive closeInUsd across windows, or from cache) */\n price?: string;\n\n // 1m window\n buys1m?: number;\n sells1m?: number;\n buyers1m?: number;\n sellers1m?: number;\n buyVolumeInUsd1m?: string;\n sellVolumeInUsd1m?: string;\n price1m?: string;\n openInUsd1m?: string;\n closeInUsd1m?: string;\n volumeChangeRatio1m?: string;\n trades1m?: number;\n dappProgramCount1m?: number;\n poolCount1m?: number;\n liquidityInUsd1m?: string;\n liquidityChangeRatio1m?: string;\n\n // 5m window\n buys5m?: number;\n sells5m?: number;\n buyers5m?: number;\n sellers5m?: number;\n buyVolumeInUsd5m?: string;\n sellVolumeInUsd5m?: string;\n price5m?: string;\n openInUsd5m?: string;\n closeInUsd5m?: string;\n volumeChangeRatio5m?: string;\n trades5m?: number;\n dappProgramCount5m?: number;\n poolCount5m?: number;\n liquidityInUsd5m?: string;\n liquidityChangeRatio5m?: string;\n\n // 15m window\n buys15m?: number;\n sells15m?: number;\n buyers15m?: number;\n sellers15m?: number;\n buyVolumeInUsd15m?: string;\n sellVolumeInUsd15m?: string;\n price15m?: string;\n openInUsd15m?: string;\n closeInUsd15m?: string;\n volumeChangeRatio15m?: string;\n trades15m?: number;\n dappProgramCount15m?: number;\n poolCount15m?: number;\n liquidityInUsd15m?: string;\n liquidityChangeRatio15m?: string;\n\n // 30m window\n buys30m?: number;\n sells30m?: number;\n buyers30m?: number;\n sellers30m?: number;\n buyVolumeInUsd30m?: string;\n sellVolumeInUsd30m?: string;\n price30m?: string;\n openInUsd30m?: string;\n closeInUsd30m?: string;\n volumeChangeRatio30m?: string;\n trades30m?: number;\n dappProgramCount30m?: number;\n poolCount30m?: number;\n liquidityInUsd30m?: string;\n liquidityChangeRatio30m?: string;\n\n // 1h window\n buys1h?: number;\n sells1h?: number;\n buyers1h?: number;\n sellers1h?: number;\n buyVolumeInUsd1h?: string;\n sellVolumeInUsd1h?: string;\n price1h?: string;\n openInUsd1h?: string;\n closeInUsd1h?: string;\n volumeChangeRatio1h?: string;\n trades1h?: number;\n dappProgramCount1h?: number;\n poolCount1h?: number;\n liquidityInUsd1h?: string;\n liquidityChangeRatio1h?: string;\n\n // 2h window\n buys2h?: number;\n sells2h?: number;\n buyers2h?: number;\n sellers2h?: number;\n buyVolumeInUsd2h?: string;\n sellVolumeInUsd2h?: string;\n price2h?: string;\n openInUsd2h?: string;\n closeInUsd2h?: string;\n volumeChangeRatio2h?: string;\n trades2h?: number;\n dappProgramCount2h?: number;\n poolCount2h?: number;\n liquidityInUsd2h?: string;\n liquidityChangeRatio2h?: string;\n\n // 4h window\n buys4h?: number;\n sells4h?: number;\n buyers4h?: number;\n sellers4h?: number;\n buyVolumeInUsd4h?: string;\n sellVolumeInUsd4h?: string;\n price4h?: string;\n openInUsd4h?: string;\n closeInUsd4h?: string;\n volumeChangeRatio4h?: string;\n trades4h?: number;\n dappProgramCount4h?: number;\n poolCount4h?: number;\n liquidityInUsd4h?: string;\n liquidityChangeRatio4h?: string;\n\n // 6h window\n buys6h?: number;\n sells6h?: number;\n buyers6h?: number;\n sellers6h?: number;\n buyVolumeInUsd6h?: string;\n sellVolumeInUsd6h?: string;\n price6h?: string;\n openInUsd6h?: string;\n closeInUsd6h?: string;\n volumeChangeRatio6h?: string;\n trades6h?: number;\n dappProgramCount6h?: number;\n poolCount6h?: number;\n liquidityInUsd6h?: string;\n liquidityChangeRatio6h?: string;\n\n // 8h window\n buys8h?: number;\n sells8h?: number;\n buyers8h?: number;\n sellers8h?: number;\n buyVolumeInUsd8h?: string;\n sellVolumeInUsd8h?: string;\n price8h?: string;\n openInUsd8h?: string;\n closeInUsd8h?: string;\n volumeChangeRatio8h?: string;\n trades8h?: number;\n dappProgramCount8h?: number;\n poolCount8h?: number;\n liquidityInUsd8h?: string;\n liquidityChangeRatio8h?: string;\n\n // 24h window\n buys24h?: number;\n sells24h?: number;\n buyers24h?: number;\n sellers24h?: number;\n buyVolumeInUsd24h?: string;\n sellVolumeInUsd24h?: string;\n price24h?: string;\n openInUsd24h?: string;\n closeInUsd24h?: string;\n volumeChangeRatio24h?: string;\n trades24h?: number;\n dappProgramCount24h?: number;\n poolCount24h?: number;\n liquidityInUsd24h?: string;\n liquidityChangeRatio24h?: string;\n\n // 1W (1 week) window - note: JSON keys use uppercase W\n buys1W?: number;\n sells1W?: number;\n buyers1W?: number;\n sellers1W?: number;\n buyVolumeInUsd1W?: string;\n sellVolumeInUsd1W?: string;\n price1W?: string;\n openInUsd1W?: string;\n closeInUsd1W?: string;\n volumeChangeRatio1W?: string;\n trades1W?: number;\n dappProgramCount1W?: number;\n poolCount1W?: number;\n liquidityInUsd1W?: string;\n liquidityChangeRatio1W?: string;\n\n // 1M (1 month) window - note: JSON keys use uppercase M\n buys1M?: number;\n sells1M?: number;\n buyers1M?: number;\n sellers1M?: number;\n buyVolumeInUsd1M?: string;\n sellVolumeInUsd1M?: string;\n price1M?: string;\n openInUsd1M?: string;\n closeInUsd1M?: string;\n volumeChangeRatio1M?: string;\n trades1M?: number;\n dappProgramCount1M?: number;\n poolCount1M?: number;\n liquidityInUsd1M?: string;\n liquidityChangeRatio1M?: string;\n}\n\nexport interface WsTokenHolder {\n tokenAddress: string;\n holders?: number;\n top100HoldersAmount?: string;\n top50HoldersAmount?: string;\n top10HoldersAmount?: string;\n top100Holders?: number;\n top50Holders?: number;\n top10Holders?: number;\n top100HoldersRatio?: string;\n top50HoldersRatio?: string;\n top10HoldersRatio?: string;\n creatorsHolders?: number;\n creatorsAmount?: string;\n creatorsRatio?: string;\n balanceTagFreshHolders?: number;\n balanceTagFreshAmount?: string;\n balanceTagFreshRatio?: string;\n balanceTagSandwichHolders?: number;\n balanceTagSandwichAmount?: string;\n balanceTagSandwichRatio?: string;\n balanceTagBundleHolders?: number;\n balanceTagBundleAmount?: string;\n balanceTagBundleRatio?: string;\n balanceTagSniperHolders?: number;\n balanceTagSniperAmount?: string;\n balanceTagSniperRatio?: string;\n balanceTagDevHolders?: number;\n balanceTagDevAmount?: string;\n balanceTagDevRatio?: string;\n balanceTagProHolders?: number;\n balanceTagProAmount?: string;\n balanceTagProRatio?: string;\n balanceTagInsiderHolders?: number;\n balanceTagInsiderAmount?: string;\n balanceTagInsiderRatio?: string;\n balanceTagSmartHolders?: number;\n balanceTagSmartAmount?: string;\n balanceTagSmartRatio?: string;\n balanceTagKolHolders?: number;\n balanceTagKolAmount?: string;\n balanceTagKolRatio?: string;\n balanceTagPhishingHolders?: number;\n balanceTagPhishingAmount?: string;\n balanceTagPhishingRatio?: string;\n balanceTagBluechipHolders?: number;\n balanceTagBluechipAmount?: string;\n balanceTagBluechipRatio?: string;\n balanceTagRatHolders?: number;\n balanceTagRatAmount?: string;\n balanceTagRatRatio?: string;\n timestamp: number;\n}\n\nexport interface WsWalletBalance {\n walletAddress: string;\n tokenAddress: string;\n tokenPriceInUsd: string;\n balance: string;\n timestamp: number;\n}\n\nexport interface WsWalletPnl {\n walletAddress: string;\n buys: number;\n buyAmount: string;\n buyAmountInUsd: string;\n averageBuyPriceInUsd: string;\n sellAmount: string;\n sellAmountInUsd: string;\n sells: number;\n wins: number;\n winRatio: string;\n pnlInUsd: string;\n averagePnlInUsd: string;\n pnlRatio: string;\n profitableDays: number;\n losingDays: number;\n tokens: number;\n resolution: string;\n}\n\nexport interface WsNewToken {\n tokenAddress: string;\n name: string;\n symbol: string;\n decimals?: number;\n imageUrl?: string;\n description?: string;\n socialMedia?: WsSocialMedia;\n coingeckoCoinId?: string;\n launchFrom?: WsDexProtocol;\n migratedTo?: WsDexProtocol;\n createdAtMs: number;\n}\n\nexport interface WsTokenSupply {\n tokenAddress: string;\n supply?: string;\n marketCapInUsd?: string;\n timestamp: number;\n}\n\nexport interface WsDexPoolBalance {\n poolAddress: string;\n tokenAAddress: string;\n tokenALiquidityInUsd: string;\n tokenBAddress: string;\n tokenBLiquidityInUsd: string;\n}\n\nexport interface WsTokenLiquidity {\n tokenAddress: string;\n metricType: WsMetricType;\n value: string;\n timestamp: number;\n}\n\nexport interface WsTokenMaxLiquidity {\n tokenAddress: string;\n poolAddress: string;\n liquidityInUsd: string;\n liquidityInNative: string;\n timestamp: number;\n}\n\nexport interface WsTokenTotalLiquidity {\n tokenAddress: string;\n liquidityInUsd: string;\n liquidityInNative: string;\n poolCount: number;\n timestamp: number;\n}\n\nexport interface WsDexProtocol {\n programAddress?: string;\n protocolFamily?: string;\n protocolName?: string;\n}\n\nexport interface WsTokenBondingCurve {\n tokenAddress?: string;\n progressRatio?: string;\n}\n\nexport interface WsTokenMetadata {\n tokenAddress: string;\n name?: string;\n decimals?: number;\n symbol?: string;\n imageUrl?: string;\n description?: string;\n socialMedia?: WsSocialMedia;\n createdAtMs?: number;\n coingeckoCoinId?: string;\n launchFrom?: WsDexProtocol;\n migratedTo?: WsDexProtocol;\n}\n\nexport interface WsSocialMedia {\n twitter?: string;\n telegram?: string;\n website?: string;\n tiktok?: string;\n discord?: string;\n facebook?: string;\n github?: string;\n instagram?: string;\n linkedin?: string;\n medium?: string;\n reddit?: string;\n youtube?: string;\n bitbucket?: string;\n}\n\nexport interface WsCandle {\n address: string;\n open: string;\n close: string;\n high: string;\n low: string;\n volume: string;\n resolution: Resolution;\n time: number;\n number: number;\n}\n\nexport type WsPriceType = \"usd\" | \"native\";\n\nexport interface WsTradeActivity {\n tokenAddress: string;\n timestamp: number;\n kind: string;\n buyAmount: string;\n buyAmountInUsd: string;\n buyTokenAddress: string;\n buyTokenName: string;\n buyTokenSymbol: string;\n buyWalletAddress: string;\n sellAmount: string;\n sellAmountInUsd: string;\n sellTokenAddress: string;\n sellTokenName: string;\n sellTokenSymbol: string;\n sellWalletAddress: string;\n txHash: string;\n}\n\nexport interface WsWalletTokenPnl {\n walletAddress: string;\n tokenAddress: string;\n timestamp: number;\n buyCount: number;\n buyCount30d: number;\n buyCount7d: number;\n sellCount: number;\n sellCount30d: number;\n sellCount7d: number;\n tokenPriceInUsd?: string;\n opentime?: number;\n lasttime?: number;\n closetime?: number;\n buyAmount?: string;\n buyAmountInUsd?: string;\n sellAmount?: string;\n sellAmountInUsd?: string;\n heldDurationTimestamp?: number;\n averageBuyPriceInUsd?: string;\n averageSellPriceInUsd?: string;\n unrealizedProfitInUsd?: string;\n unrealizedProfitRatio?: string;\n realizedProfitInUsd?: string;\n realizedProfitRatio?: string;\n totalRealizedProfitInUsd?: string;\n totalRealizedProfitRatio?: string;\n}\n\nexport enum WsRankingType {\n NEW = \"new\",\n HOT = \"trending\",\n STOCKS = \"stocks\",\n FINALSTRETCH = \"completed\",\n MIGRATED = \"graduated\",\n}\n\nexport enum WsDex {\n PUMP_FUN = \"pump_fun\",\n RAYDIUM_LAUNCHPAD = \"raydium_launchpad\",\n METEOR_DYNAMIC_BOUNDING_CURVE = \"meteora_dynamic_bounding_curve\",\n BONK_FUN = \"bonk_fun\",\n BOOP_FUN = \"boop_fun\",\n MOONIT_FUN = \"moonit_fun\",\n}\n\nexport interface WsRankingTokenList {\n metadata?: WsTokenMetadata;\n holder?: WsTokenHolder;\n supply?: WsTokenSupply;\n stat?: WsTokenStat;\n bondingCurve?: WsTokenBondingCurve;\n}\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { Blockchain, BlockchainLatestBlock, ChainSymbol } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.GET_SUPPORTED_BLOCKCHAINS.DESCRIPTION\n * @summary CONTROLLER.GET_SUPPORTED_BLOCKCHAINS.SUMMARY\n */\nexport const getSupportedBlockchains = (options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<Blockchain[]>({ url: `/v2/blockchain`, method: \"GET\" }, options);\n};\n/**\n * CONTROLLER.GET_LATEST_BLOCK.DESCRIPTION\n * @summary CONTROLLER.GET_LATEST_BLOCK.SUMMARY\n */\nexport const getLatestBlock = (\n chain: ChainSymbol,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<BlockchainLatestBlock>(\n { url: `/v2/blockchain/${chain}/latest_block`, method: \"GET\" },\n options,\n );\n};\nexport type GetSupportedBlockchainsResult = NonNullable<\n Awaited<ReturnType<typeof getSupportedBlockchains>>\n>;\nexport type GetLatestBlockResult = NonNullable<Awaited<ReturnType<typeof getLatestBlock>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n CreateTokenInput,\n CreateTokenReply,\n DexQuoteResponse,\n ListDexParams,\n PageResponseDex,\n QuoteParams,\n SwapInput,\n SwapReply,\n SwapRouteInput,\n SwapRouteResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.DEX.LIST.DESCRIPTION\n * @summary CONTROLLER.DEX.LIST.SUMMARY\n */\nexport const listDex = (\n params?: ListDexParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDex>({ url: `/v2/dex`, method: \"GET\", params }, options);\n};\n/**\n * CONTROLLER.DEX.CREATE.DESCRIPTION\n * @summary CONTROLLER.DEX.CREATE.SUMMARY\n */\nexport const createToken = (\n chain: ChainSymbol,\n createTokenInput: CreateTokenInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<CreateTokenReply>(\n {\n url: `/v2/dex/${chain}/create`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: createTokenInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.DEX.QUOTE.DESCRIPTION\n * @summary CONTROLLER.DEX.QUOTE.SUMMARY\n */\nexport const quote = (\n chain: ChainSymbol,\n params: QuoteParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<DexQuoteResponse>(\n { url: `/v2/dex/${chain}/quote`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.DEX.ROUTE.DESCRIPTION\n * @summary CONTROLLER.DEX.ROUTE.SUMMARY\n */\nexport const route = (\n chain: ChainSymbol,\n swapRouteInput: SwapRouteInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SwapRouteResponse>(\n {\n url: `/v2/dex/${chain}/route`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: swapRouteInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.DEX.SWAP.DESCRIPTION\n * @summary CONTROLLER.DEX.SWAP.SUMMARY\n */\nexport const swap = (\n chain: ChainSymbol,\n swapInput: SwapInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SwapReply>(\n {\n url: `/v2/dex/${chain}/swap`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: swapInput,\n },\n options,\n );\n};\nexport type ListDexResult = NonNullable<Awaited<ReturnType<typeof listDex>>>;\nexport type CreateTokenResult = NonNullable<Awaited<ReturnType<typeof createToken>>>;\nexport type QuoteResult = NonNullable<Awaited<ReturnType<typeof quote>>>;\nexport type RouteResult = NonNullable<Awaited<ReturnType<typeof route>>>;\nexport type SwapResult = NonNullable<Awaited<ReturnType<typeof swap>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n DexPoolDetail,\n GetDexpoolSnapshotsParams,\n PageResponseDexPoolSnapshot,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.DEXPOOL.GET.DESCRIPTION\n * @summary CONTROLLER.DEXPOOL.GET.SUMMARY\n */\nexport const getDexpool = (\n chain: ChainSymbol,\n poolAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<DexPoolDetail>(\n { url: `/v2/dexpools/${chain}/${poolAddress}`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.DEXPOOL.SNAPSHOTS.DESCRIPTION\n * @summary CONTROLLER.DEXPOOL.SNAPSHOTS.SUMMARY\n */\nexport const getDexpoolSnapshots = (\n chain: ChainSymbol,\n poolAddress: string,\n params?: GetDexpoolSnapshotsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDexPoolSnapshot>(\n { url: `/v2/dexpools/${chain}/${poolAddress}/snapshots`, method: \"GET\", params },\n options,\n );\n};\nexport type GetDexpoolResult = NonNullable<Awaited<ReturnType<typeof getDexpool>>>;\nexport type GetDexpoolSnapshotsResult = NonNullable<\n Awaited<ReturnType<typeof getDexpoolSnapshots>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { PresignResponseModel } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.IPFS.PRESIGN.DESCRIPTION\n * @summary CONTROLLER.IPFS.PRESIGN.SUMMARY\n */\nexport const presign = (options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<PresignResponseModel>(\n { url: `/v2/ipfs/presign`, method: \"POST\" },\n options,\n );\n};\nexport type PresignResult = NonNullable<Awaited<ReturnType<typeof presign>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { JobDTO, JobStreamingDTO } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.JOB.GET.DESCRIPTION\n * @summary CONTROLLER.JOB.GET.SUMMARY\n */\nexport const get = (id: string, options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<JobDTO>({ url: `/v2/job/${id}`, method: \"GET\" }, options);\n};\n/**\n * CONTROLLER.JOB.STREAMING.DESCRIPTION\n * @summary CONTROLLER.JOB.STREAMING.SUMMARY\n */\nexport const streaming = (id: string, options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<JobStreamingDTO>(\n { url: `/v2/job/${id}/streaming`, method: \"GET\" },\n options,\n );\n};\nexport type GetResult = NonNullable<Awaited<ReturnType<typeof get>>>;\nexport type StreamingResult = NonNullable<Awaited<ReturnType<typeof streaming>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n KYTRegisterAddressInput,\n KYTRegisterTransferInput,\n KYTRegisterWithdrawalInput,\n KytAddressRiskResponse,\n KytAlertsResponse,\n KytDirectExposureResponse,\n KytFraudAssessmentResponse,\n KytNetworkIdentificationsResponse,\n KytRegisterAddressResponse,\n KytTransferBaseResponse,\n KytWithdrawalAddressIdentificationsResponse,\n KytWithdrawalBaseResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.KYT.REGISTER_ADDRESS.DESCRIPTION\n * @summary CONTROLLER.KYT.REGISTER_ADDRESS.SUMMARY\n */\nexport const registerAddress = (\n kYTRegisterAddressInput: KYTRegisterAddressInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytRegisterAddressResponse>(\n {\n url: `/v2/kyt/address`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: kYTRegisterAddressInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_ADDRESS_RISK.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_ADDRESS_RISK.SUMMARY\n */\nexport const getAddressRisk = (\n address: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytAddressRiskResponse>(\n { url: `/v2/kyt/addresses/${address}/risk`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.REGISTER_TRANSFER.DESCRIPTION\n * @summary CONTROLLER.KYT.REGISTER_TRANSFER.SUMMARY\n */\nexport const registerTransfer = (\n kYTRegisterTransferInput: KYTRegisterTransferInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytTransferBaseResponse>(\n {\n url: `/v2/kyt/transfer`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: kYTRegisterTransferInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_ALERTS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_ALERTS.SUMMARY\n */\nexport const getTransferAlerts = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytAlertsResponse>(\n { url: `/v2/kyt/transfers/${transferId}/alerts`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_DIRECT_EXPOSURE.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_DIRECT_EXPOSURE.SUMMARY\n */\nexport const getTransferDirectExposure = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytDirectExposureResponse>(\n { url: `/v2/kyt/transfers/${transferId}/exposures/direct`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_NETWORK_IDENTIFICATIONS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_NETWORK_IDENTIFICATIONS.SUMMARY\n */\nexport const getTransferNetworkIdentifications = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytNetworkIdentificationsResponse>(\n { url: `/v2/kyt/transfers/${transferId}/network-identifications`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_SUMMARY.SUMMARY\n */\nexport const getTransferSummary = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytTransferBaseResponse>(\n { url: `/v2/kyt/transfers/${transferId}/summary`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.REGISTER_WITHDRAWAL.DESCRIPTION\n * @summary CONTROLLER.KYT.REGISTER_WITHDRAWAL.SUMMARY\n */\nexport const registerWithdrawal = (\n kYTRegisterWithdrawalInput: KYTRegisterWithdrawalInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytWithdrawalBaseResponse>(\n {\n url: `/v2/kyt/withdrawal`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: kYTRegisterWithdrawalInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_ADDRESS_IDENTIFICATIONS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_ADDRESS_IDENTIFICATIONS.SUMMARY\n */\nexport const getWithdrawalAddressIdentifications = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytWithdrawalAddressIdentificationsResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/address-identifications`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_ALERTS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_ALERTS.SUMMARY\n */\nexport const getWithdrawalAlerts = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytAlertsResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/alerts`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_DIRECT_EXPOSURE.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_DIRECT_EXPOSURE.SUMMARY\n */\nexport const getWithdrawalDirectExposure = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytDirectExposureResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/exposures/direct`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_FRAUD_ASSESSMENT.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_FRAUD_ASSESSMENT.SUMMARY\n */\nexport const getWithdrawalFraudAssessment = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytFraudAssessmentResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/fraud-assessment`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_NETWORK_IDENTIFICATIONS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_NETWORK_IDENTIFICATIONS.SUMMARY\n */\nexport const getWithdrawalNetworkIdentifications = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytNetworkIdentificationsResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/network-identifications`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_SUMMARY.SUMMARY\n */\nexport const getWithdrawalSummary = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytWithdrawalBaseResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/summary`, method: \"GET\" },\n options,\n );\n};\nexport type RegisterAddressResult = NonNullable<Awaited<ReturnType<typeof registerAddress>>>;\nexport type GetAddressRiskResult = NonNullable<Awaited<ReturnType<typeof getAddressRisk>>>;\nexport type RegisterTransferResult = NonNullable<Awaited<ReturnType<typeof registerTransfer>>>;\nexport type GetTransferAlertsResult = NonNullable<Awaited<ReturnType<typeof getTransferAlerts>>>;\nexport type GetTransferDirectExposureResult = NonNullable<\n Awaited<ReturnType<typeof getTransferDirectExposure>>\n>;\nexport type GetTransferNetworkIdentificationsResult = NonNullable<\n Awaited<ReturnType<typeof getTransferNetworkIdentifications>>\n>;\nexport type GetTransferSummaryResult = NonNullable<Awaited<ReturnType<typeof getTransferSummary>>>;\nexport type RegisterWithdrawalResult = NonNullable<Awaited<ReturnType<typeof registerWithdrawal>>>;\nexport type GetWithdrawalAddressIdentificationsResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalAddressIdentifications>>\n>;\nexport type GetWithdrawalAlertsResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalAlerts>>\n>;\nexport type GetWithdrawalDirectExposureResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalDirectExposure>>\n>;\nexport type GetWithdrawalFraudAssessmentResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalFraudAssessment>>\n>;\nexport type GetWithdrawalNetworkIdentificationsResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalNetworkIdentifications>>\n>;\nexport type GetWithdrawalSummaryResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalSummary>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n GetFinalStretchTokensParams,\n GetHotTokensParams,\n GetMigratedTokensParams,\n GetNewTokensParams,\n GetStocksTokensParams,\n RankingDuration,\n Token,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.RANKING.FINAL_STRETCH_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.FINAL_STRETCH_TOKENS.SUMMARY\n */\nexport const getFinalStretchTokens = (\n chain: ChainSymbol,\n params?: GetFinalStretchTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/finalStretch`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.HOT_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.HOT_TOKENS.SUMMARY\n */\nexport const getHotTokens = (\n chain: ChainSymbol,\n duration: RankingDuration,\n params?: GetHotTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/hotTokens/${duration}`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.MIGRATED_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.MIGRATED_TOKENS.SUMMARY\n */\nexport const getMigratedTokens = (\n chain: ChainSymbol,\n params?: GetMigratedTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/migrated`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.NEW_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.NEW_TOKENS.SUMMARY\n */\nexport const getNewTokens = (\n chain: ChainSymbol,\n params?: GetNewTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/newTokens`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.STOCKS_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.STOCKS_TOKENS.SUMMARY\n */\nexport const getStocksTokens = (\n chain: ChainSymbol,\n params?: GetStocksTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/stocks`, method: \"GET\", params },\n options,\n );\n};\nexport type GetFinalStretchTokensResult = NonNullable<\n Awaited<ReturnType<typeof getFinalStretchTokens>>\n>;\nexport type GetHotTokensResult = NonNullable<Awaited<ReturnType<typeof getHotTokens>>>;\nexport type GetMigratedTokensResult = NonNullable<Awaited<ReturnType<typeof getMigratedTokens>>>;\nexport type GetNewTokensResult = NonNullable<Awaited<ReturnType<typeof getNewTokens>>>;\nexport type GetStocksTokensResult = NonNullable<Awaited<ReturnType<typeof getStocksTokens>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n ClaimRedPacketRequest,\n ClaimRedPacketResponse,\n CreateRedPacketRequest,\n CreateRedPacketResponse,\n GetClaimsByAddressParams,\n GetClaimsParams,\n GetRedpacketsByAddressParams,\n GetRedpacketsParams,\n RedPacket,\n RedPacketClaimsPage,\n RedPacketSendTxRequest,\n RedPacketSendTxResponse,\n RedPacketsPage,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.RED_PACKET.GET_REDPACKETS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_REDPACKETS.SUMMARY\n */\nexport const getRedpackets = (\n params?: GetRedpacketsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketsPage>(\n { url: `/v2/redpacket`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.GET_CLAIMS_BY_ADDRESS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_CLAIMS_BY_ADDRESS.SUMMARY\n */\nexport const getClaimsByAddress = (\n address: string,\n params?: GetClaimsByAddressParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketClaimsPage>(\n { url: `/v2/redpacket/wallet/${address}/claims`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.GET_REDPACKETS_BY_ADDRESS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_REDPACKETS_BY_ADDRESS.SUMMARY\n */\nexport const getRedpacketsByAddress = (\n address: string,\n params?: GetRedpacketsByAddressParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketsPage>(\n { url: `/v2/redpacket/wallet/${address}/redpackets`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.CLAIM.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.CLAIM.SUMMARY\n */\nexport const claimRedpacket = (\n chain: ChainSymbol,\n claimRedPacketRequest: ClaimRedPacketRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<ClaimRedPacketResponse>(\n {\n url: `/v2/redpacket/${chain}/claim`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: claimRedPacketRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.CREATE.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.CREATE.SUMMARY\n */\nexport const createRedpacket = (\n chain: ChainSymbol,\n createRedPacketRequest: CreateRedPacketRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<CreateRedPacketResponse>(\n {\n url: `/v2/redpacket/${chain}/create`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: createRedPacketRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.SEND.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.SEND.SUMMARY\n */\nexport const redpacketSend = (\n chain: ChainSymbol,\n redPacketSendTxRequest: RedPacketSendTxRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketSendTxResponse>(\n {\n url: `/v2/redpacket/${chain}/send`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: redPacketSendTxRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.GET.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET.SUMMARY\n */\nexport const getRedpacket = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacket>({ url: `/v2/redpacket/${id}`, method: \"GET\" }, options);\n};\n/**\n * CONTROLLER.RED_PACKET.GET_CLAIMS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_CLAIMS.SUMMARY\n */\nexport const getClaims = (\n id: string,\n params?: GetClaimsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketClaimsPage>(\n { url: `/v2/redpacket/${id}/claims`, method: \"GET\", params },\n options,\n );\n};\nexport type GetRedpacketsResult = NonNullable<Awaited<ReturnType<typeof getRedpackets>>>;\nexport type GetClaimsByAddressResult = NonNullable<Awaited<ReturnType<typeof getClaimsByAddress>>>;\nexport type GetRedpacketsByAddressResult = NonNullable<\n Awaited<ReturnType<typeof getRedpacketsByAddress>>\n>;\nexport type ClaimRedpacketResult = NonNullable<Awaited<ReturnType<typeof claimRedpacket>>>;\nexport type CreateRedpacketResult = NonNullable<Awaited<ReturnType<typeof createRedpacket>>>;\nexport type RedpacketSendResult = NonNullable<Awaited<ReturnType<typeof redpacketSend>>>;\nexport type GetRedpacketResult = NonNullable<Awaited<ReturnType<typeof getRedpacket>>>;\nexport type GetClaimsResult = NonNullable<Awaited<ReturnType<typeof getClaims>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n GetCandlesParams,\n GetDevTokensParams,\n GetHoldersMultiParams,\n GetHoldersParams,\n GetMarketDataMulti200,\n GetMarketDataMultiParams,\n GetMetadataMulti200,\n GetMetadataMultiParams,\n GetMintAndBurnParams,\n GetPairCandlesParams,\n GetPoolCandlesParams,\n GetPoolsParams,\n GetPriceByTimeParams,\n GetPricesParams,\n GetStatsMulti200,\n GetStatsMultiParams,\n GetTokenLiquiditySnapshotsParams,\n GetTokenTradersParams,\n GetTokenTransferTotalParams,\n GetTokenTransfersParams,\n GetTokensParams,\n ListTokenParams,\n PageResponseDevToken,\n PageResponseDexPool,\n PageResponseToken,\n PageResponseTokenHolder,\n PageResponseTokenLiquiditySnapshot,\n PageResponseTokenMintBurn,\n PageResponseTokenPrice,\n PageResponseTokenTrader,\n PageResponseTokenTransfer,\n SearchParams,\n Token,\n TokenCandle,\n TokenCreation,\n TokenHolder,\n TokenMarketData,\n TokenMetadata,\n TokenPage,\n TokenPrice,\n TokenStats,\n TokenTraderTag,\n TokenTransferTotal,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.TOKEN.SEARCH.DESCRIPTION\n * @summary CONTROLLER.TOKEN.SEARCH.SUMMARY\n */\nexport const search = (\n params?: SearchParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenPage>(\n { url: `/v2/token/search`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_DEV_TOKENS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_DEV_TOKENS.SUMMARY\n */\nexport const getDevTokens = (\n chain: ChainSymbol,\n devAddress: string,\n params?: GetDevTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDevToken>(\n { url: `/v2/token/${chain}/dev/${devAddress}/tokens`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOKEN_LIST.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOKEN_LIST.SUMMARY\n */\nexport const listToken = (\n chain: ChainSymbol,\n params?: ListTokenParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseToken>(\n { url: `/v2/token/${chain}/list`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_MARKET_DATA_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_MARKET_DATA_MULTI.SUMMARY\n */\nexport const getMarketDataMulti = (\n chain: ChainSymbol,\n params: GetMarketDataMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GetMarketDataMulti200>(\n { url: `/v2/token/${chain}/marketData/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_METADATA_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_METADATA_MULTI.SUMMARY\n */\nexport const getMetadataMulti = (\n chain: ChainSymbol,\n params: GetMetadataMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GetMetadataMulti200>(\n { url: `/v2/token/${chain}/metadata/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOKENS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOKENS.SUMMARY\n */\nexport const getTokens = (\n chain: ChainSymbol,\n params: GetTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/token/${chain}/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_PAIR_CANDLES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_PAIR_CANDLES.SUMMARY\n */\nexport const getPairCandles = (\n chain: ChainSymbol,\n pair: string,\n params: GetPairCandlesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCandle[]>(\n { url: `/v2/token/${chain}/pair/${pair}/candles`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_POOL_CANDLES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_POOL_CANDLES.SUMMARY\n */\nexport const getPoolCandles = (\n chain: ChainSymbol,\n poolAddress: string,\n params: GetPoolCandlesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCandle[]>(\n { url: `/v2/token/${chain}/pool/${poolAddress}/candles`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_STATS_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_STATS_MULTI.SUMMARY\n */\nexport const getStatsMulti = (\n chain: ChainSymbol,\n params: GetStatsMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GetStatsMulti200>(\n { url: `/v2/token/${chain}/stats/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET.SUMMARY\n */\nexport const getToken = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token>(\n { url: `/v2/token/${chain}/${tokenAddress}`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_CANDLES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_CANDLES.SUMMARY\n */\nexport const getCandles = (\n chain: ChainSymbol,\n tokenAddress: string,\n params: GetCandlesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCandle[]>(\n { url: `/v2/token/${chain}/${tokenAddress}/candles`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_CREATION.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_CREATION.SUMMARY\n */\nexport const getCreation = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCreation>(\n { url: `/v2/token/${chain}/${tokenAddress}/creation`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_HOLDERS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_HOLDERS.SUMMARY\n */\nexport const getHolders = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetHoldersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenHolder>(\n { url: `/v2/token/${chain}/${tokenAddress}/holders`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_HOLDERS_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_HOLDERS_MULTI.SUMMARY\n */\nexport const getHoldersMulti = (\n chain: ChainSymbol,\n tokenAddress: string,\n params: GetHoldersMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenHolder[]>(\n { url: `/v2/token/${chain}/${tokenAddress}/holders/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_LIQUIDITY_SNAPSHOTS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_LIQUIDITY_SNAPSHOTS.SUMMARY\n */\nexport const getTokenLiquiditySnapshots = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTokenLiquiditySnapshotsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenLiquiditySnapshot>(\n { url: `/v2/token/${chain}/${tokenAddress}/liquiditySnapshots`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_MARKET_CAP.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_MARKET_CAP.SUMMARY\n */\nexport const getMarketData = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenMarketData>(\n { url: `/v2/token/${chain}/${tokenAddress}/marketData`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_METADATA.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_METADATA.SUMMARY\n */\nexport const getMetadata = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenMetadata>(\n { url: `/v2/token/${chain}/${tokenAddress}/metadata`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_MINT_AND_BURN.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_MINT_AND_BURN.SUMMARY\n */\nexport const getMintAndBurn = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetMintAndBurnParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenMintBurn>(\n { url: `/v2/token/${chain}/${tokenAddress}/mintAndBurn`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_POOLS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_POOLS.SUMMARY\n */\nexport const getPools = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetPoolsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDexPool>(\n { url: `/v2/token/${chain}/${tokenAddress}/pools`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_PRICE_BY_TIME.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_PRICE_BY_TIME.SUMMARY\n */\nexport const getPriceByTime = (\n chain: ChainSymbol,\n tokenAddress: string,\n params: GetPriceByTimeParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenPrice>(\n { url: `/v2/token/${chain}/${tokenAddress}/price`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_PRICES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_PRICES.SUMMARY\n */\nexport const getPrices = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetPricesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenPrice>(\n { url: `/v2/token/${chain}/${tokenAddress}/prices`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_SECURITY.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_SECURITY.SUMMARY\n */\nexport const getSecurity = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<unknown>(\n { url: `/v2/token/${chain}/${tokenAddress}/security`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_STATS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_STATS.SUMMARY\n */\nexport const getStats = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenStats>(\n { url: `/v2/token/${chain}/${tokenAddress}/stats`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOP_HOLDERS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOP_HOLDERS.SUMMARY\n */\nexport const getTopHolders = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenHolder>(\n { url: `/v2/token/${chain}/${tokenAddress}/topHolders`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOKEN_TRADERS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOKEN_TRADERS.SUMMARY\n */\nexport const getTokenTraders = (\n chain: ChainSymbol,\n tokenAddress: string,\n tag: TokenTraderTag,\n params?: GetTokenTradersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenTrader>(\n { url: `/v2/token/${chain}/${tokenAddress}/traders/${tag}`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TRANSFER_TOTAL.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TRANSFER_TOTAL.SUMMARY\n */\nexport const getTokenTransferTotal = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTokenTransferTotalParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenTransferTotal>(\n { url: `/v2/token/${chain}/${tokenAddress}/transfer-total`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TRANSFER_LIST.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TRANSFER_LIST.SUMMARY\n */\nexport const getTokenTransfers = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTokenTransfersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenTransfer>(\n { url: `/v2/token/${chain}/${tokenAddress}/transfers`, method: \"GET\", params },\n options,\n );\n};\nexport type SearchResult = NonNullable<Awaited<ReturnType<typeof search>>>;\nexport type GetDevTokensResult = NonNullable<Awaited<ReturnType<typeof getDevTokens>>>;\nexport type ListTokenResult = NonNullable<Awaited<ReturnType<typeof listToken>>>;\nexport type GetMarketDataMultiResult = NonNullable<Awaited<ReturnType<typeof getMarketDataMulti>>>;\nexport type GetMetadataMultiResult = NonNullable<Awaited<ReturnType<typeof getMetadataMulti>>>;\nexport type GetTokensResult = NonNullable<Awaited<ReturnType<typeof getTokens>>>;\nexport type GetPairCandlesResult = NonNullable<Awaited<ReturnType<typeof getPairCandles>>>;\nexport type GetPoolCandlesResult = NonNullable<Awaited<ReturnType<typeof getPoolCandles>>>;\nexport type GetStatsMultiResult = NonNullable<Awaited<ReturnType<typeof getStatsMulti>>>;\nexport type GetTokenResult = NonNullable<Awaited<ReturnType<typeof getToken>>>;\nexport type GetCandlesResult = NonNullable<Awaited<ReturnType<typeof getCandles>>>;\nexport type GetCreationResult = NonNullable<Awaited<ReturnType<typeof getCreation>>>;\nexport type GetHoldersResult = NonNullable<Awaited<ReturnType<typeof getHolders>>>;\nexport type GetHoldersMultiResult = NonNullable<Awaited<ReturnType<typeof getHoldersMulti>>>;\nexport type GetTokenLiquiditySnapshotsResult = NonNullable<\n Awaited<ReturnType<typeof getTokenLiquiditySnapshots>>\n>;\nexport type GetMarketDataResult = NonNullable<Awaited<ReturnType<typeof getMarketData>>>;\nexport type GetMetadataResult = NonNullable<Awaited<ReturnType<typeof getMetadata>>>;\nexport type GetMintAndBurnResult = NonNullable<Awaited<ReturnType<typeof getMintAndBurn>>>;\nexport type GetPoolsResult = NonNullable<Awaited<ReturnType<typeof getPools>>>;\nexport type GetPriceByTimeResult = NonNullable<Awaited<ReturnType<typeof getPriceByTime>>>;\nexport type GetPricesResult = NonNullable<Awaited<ReturnType<typeof getPrices>>>;\nexport type GetSecurityResult = NonNullable<Awaited<ReturnType<typeof getSecurity>>>;\nexport type GetStatsResult = NonNullable<Awaited<ReturnType<typeof getStats>>>;\nexport type GetTopHoldersResult = NonNullable<Awaited<ReturnType<typeof getTopHolders>>>;\nexport type GetTokenTradersResult = NonNullable<Awaited<ReturnType<typeof getTokenTraders>>>;\nexport type GetTokenTransferTotalResult = NonNullable<\n Awaited<ReturnType<typeof getTokenTransferTotal>>\n>;\nexport type GetTokenTransfersResult = NonNullable<Awaited<ReturnType<typeof getTokenTransfers>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n GetActivitiesParams,\n GetTopTradersParams,\n GetTraderGainersLosersParams,\n GetTradesParams,\n PageResponseTopTrader,\n PageResponseTradeDetail,\n PageResponseTraderGainersLosersItem,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.TRADE.GET.TOKEN.DESCRIPTION\n * @summary CONTROLLER.TRADE.GET.TOKEN.SUMMARY\n */\nexport const getTrades = (\n chain: ChainSymbol,\n params?: GetTradesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTradeDetail>(\n { url: `/v2/trade/${chain}`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TRADE.GET.TOKEN_ACTIVITIES.DESCRIPTION\n * @summary CONTROLLER.TRADE.GET.TOKEN_ACTIVITIES.SUMMARY\n */\nexport const getActivities = (\n chain: ChainSymbol,\n params?: GetActivitiesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTradeDetail>(\n { url: `/v2/trade/${chain}/activities`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TRADE.GET.TOP_TRADERS.DESCRIPTION\n * @summary CONTROLLER.TRADE.GET.TOP_TRADERS.SUMMARY\n */\nexport const getTopTraders = (\n chain: ChainSymbol,\n params: GetTopTradersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTopTrader>(\n { url: `/v2/trade/${chain}/top-traders`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TRADER.GET_GAINERS_LOSERS.DESCRIPTION\n * @summary CONTROLLER.TRADER.GET_GAINERS_LOSERS.SUMMARY\n */\nexport const getTraderGainersLosers = (\n chain: ChainSymbol,\n params?: GetTraderGainersLosersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTraderGainersLosersItem>(\n { url: `/v2/trade/${chain}/trader-gainers-losers`, method: \"GET\", params },\n options,\n );\n};\nexport type GetTradesResult = NonNullable<Awaited<ReturnType<typeof getTrades>>>;\nexport type GetActivitiesResult = NonNullable<Awaited<ReturnType<typeof getActivities>>>;\nexport type GetTopTradersResult = NonNullable<Awaited<ReturnType<typeof getTopTraders>>>;\nexport type GetTraderGainersLosersResult = NonNullable<\n Awaited<ReturnType<typeof getTraderGainersLosers>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n EstimateGasLimitInput,\n EstimateGasLimitResponse,\n GasPriceResponse,\n SendTxInput,\n SendTxResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.TRANSACTION.ESTIMATE_GAS_LIMIT.DESCRIPTION\n * @summary CONTROLLER.TRANSACTION.ESTIMATE_GAS_LIMIT.SUMMARY\n */\nexport const getGasLimit = (\n chain: \"bsc\" | \"eth\",\n estimateGasLimitInput: EstimateGasLimitInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EstimateGasLimitResponse>(\n {\n url: `/v2/transaction/${chain}/estimate-gas-limit`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: estimateGasLimitInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.TRANSACTION.GET_GAS_PRICE.DESCRIPTION\n * @summary CONTROLLER.TRANSACTION.GET_GAS_PRICE.SUMMARY\n */\nexport const getGasPrice = (\n chain: \"bsc\" | \"eth\",\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GasPriceResponse>(\n { url: `/v2/transaction/${chain}/gas-price`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TRANSACTION.SEND.DESCRIPTION\n * @summary CONTROLLER.TRANSACTION.SEND.SUMMARY\n */\nexport const send = (\n chain: \"sol\" | \"bsc\" | \"eth\",\n sendTxInput: SendTxInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SendTxResponse>(\n {\n url: `/v2/transaction/${chain}/send`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: sendTxInput,\n },\n options,\n );\n};\nexport type GetGasLimitResult = NonNullable<Awaited<ReturnType<typeof getGasLimit>>>;\nexport type GetGasPriceResult = NonNullable<Awaited<ReturnType<typeof getGasPrice>>>;\nexport type SendResult = NonNullable<Awaited<ReturnType<typeof send>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n CalculatePnlInput,\n ChainSymbol,\n GetBalanceUpdatesParams,\n GetNetWorthByTokensParams,\n GetNetWorthChartParams,\n GetNetWorthDetailsParams,\n GetNetWorthParams,\n GetNetWorthSummaryParams,\n GetPnlByTokenParams,\n GetPnlByWalletParams,\n GetPnlDetailsParams,\n GetPnlParams,\n GetTokensBalanceParams,\n GetWalletFirstTxParams,\n GetWalletTransferTotalParams,\n GetWalletTransfersParams,\n NetWorthByTokensResult,\n PageResponseBalanceUpdate,\n PageResponseNetWorthByTokensItem,\n PageResponseWalletTransfer,\n PnlDetailsResult,\n SuccessResponse,\n TransferTotalResponse,\n WalletNetWorthChartResponse,\n WalletNetWorthDetailsPage,\n WalletNetWorthPage,\n WalletNetWorthSummaryResponse,\n WalletPnlSummary,\n WalletsMapResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.WALLET.GET_FIRST_TX.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_FIRST_TX.SUMMARY\n */\nexport const getWalletFirstTx = (\n chain: ChainSymbol,\n params: GetWalletFirstTxParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletsMapResponse>(\n { url: `/v2/wallet/${chain}/first-tx`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_SUMMARY.SUMMARY\n */\nexport const getNetWorthSummary = (\n chain: ChainSymbol,\n params: GetNetWorthSummaryParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthSummaryResponse>(\n { url: `/v2/wallet/${chain}/net-worth-summary`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_BY_WALLET.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_BY_WALLET.SUMMARY\n */\nexport const getPnlByWallet = (\n chain: ChainSymbol,\n params: GetPnlByWalletParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PnlDetailsResult>(\n { url: `/v2/wallet/${chain}/pnl-by-wallet`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_BALANCE_UPDATES.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_BALANCE_UPDATES.SUMMARY\n */\nexport const getBalanceUpdates = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetBalanceUpdatesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseBalanceUpdate>(\n { url: `/v2/wallet/${chain}/${walletAddress}/balance-updates`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.CALCULATE_PNL.DESCRIPTION\n * @summary CONTROLLER.WALLET.CALCULATE_PNL.SUMMARY\n */\nexport const calculatePnl = (\n chain: ChainSymbol,\n walletAddress: string,\n calculatePnlInput: CalculatePnlInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SuccessResponse>(\n {\n url: `/v2/wallet/${chain}/${walletAddress}/calculate-pnl`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: calculatePnlInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH.SUMMARY\n */\nexport const getNetWorth = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetNetWorthParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthPage>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_CHART.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_CHART.SUMMARY\n */\nexport const getNetWorthChart = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetNetWorthChartParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthChartResponse>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth-chart`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_DETAILS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_DETAILS.SUMMARY\n */\nexport const getNetWorthDetails = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetNetWorthDetailsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthDetailsPage>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth-details`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_BY_TOKENS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_BY_TOKENS.SUMMARY\n */\nexport const getNetWorthByTokens = (\n chain: ChainSymbol,\n walletAddress: string,\n params: GetNetWorthByTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<NetWorthByTokensResult>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth/tokens`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_SUMMARY.SUMMARY\n */\nexport const getPnl = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetPnlParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletPnlSummary>(\n { url: `/v2/wallet/${chain}/${walletAddress}/pnl`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_BY_TOKEN.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_BY_TOKEN.SUMMARY\n */\nexport const getPnlByToken = (\n chain: ChainSymbol,\n walletAddress: string,\n params: GetPnlByTokenParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PnlDetailsResult>(\n { url: `/v2/wallet/${chain}/${walletAddress}/pnl-by-token`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_DETAILS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_DETAILS.SUMMARY\n */\nexport const getPnlDetails = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetPnlDetailsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PnlDetailsResult>(\n { url: `/v2/wallet/${chain}/${walletAddress}/pnl-details`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_TOKENS_BALANCE.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_TOKENS_BALANCE.SUMMARY\n */\nexport const getTokensBalance = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetTokensBalanceParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseNetWorthByTokensItem>(\n { url: `/v2/wallet/${chain}/${walletAddress}/tokens-balance`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_TRANSFER_TOTAL.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_TRANSFER_TOTAL.SUMMARY\n */\nexport const getWalletTransferTotal = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetWalletTransferTotalParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TransferTotalResponse>(\n { url: `/v2/wallet/${chain}/${walletAddress}/transfer-total`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_TRANSFERS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_TRANSFERS.SUMMARY\n */\nexport const getWalletTransfers = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetWalletTransfersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseWalletTransfer>(\n { url: `/v2/wallet/${chain}/${walletAddress}/transfers`, method: \"GET\", params },\n options,\n );\n};\nexport type GetWalletFirstTxResult = NonNullable<Awaited<ReturnType<typeof getWalletFirstTx>>>;\nexport type GetNetWorthSummaryResult = NonNullable<Awaited<ReturnType<typeof getNetWorthSummary>>>;\nexport type GetPnlByWalletResult = NonNullable<Awaited<ReturnType<typeof getPnlByWallet>>>;\nexport type GetBalanceUpdatesResult = NonNullable<Awaited<ReturnType<typeof getBalanceUpdates>>>;\nexport type CalculatePnlResult = NonNullable<Awaited<ReturnType<typeof calculatePnl>>>;\nexport type GetNetWorthResult = NonNullable<Awaited<ReturnType<typeof getNetWorth>>>;\nexport type GetNetWorthChartResult = NonNullable<Awaited<ReturnType<typeof getNetWorthChart>>>;\nexport type GetNetWorthDetailsResult = NonNullable<Awaited<ReturnType<typeof getNetWorthDetails>>>;\nexport type GetNetWorthByTokensResult = NonNullable<\n Awaited<ReturnType<typeof getNetWorthByTokens>>\n>;\nexport type GetPnlResult = NonNullable<Awaited<ReturnType<typeof getPnl>>>;\nexport type GetPnlByTokenResult = NonNullable<Awaited<ReturnType<typeof getPnlByToken>>>;\nexport type GetPnlDetailsResult = NonNullable<Awaited<ReturnType<typeof getPnlDetails>>>;\nexport type GetTokensBalanceResult = NonNullable<Awaited<ReturnType<typeof getTokensBalance>>>;\nexport type GetWalletTransferTotalResult = NonNullable<\n Awaited<ReturnType<typeof getWalletTransferTotal>>\n>;\nexport type GetWalletTransfersResult = NonNullable<Awaited<ReturnType<typeof getWalletTransfers>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { ChainSymbol, WatchlistAddResponseModel } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.WATCHLIST.ADD.DESCRIPTION\n * @summary CONTROLLER.WATCHLIST.ADD.SUMMARY\n */\nexport const watchlistAdd = (\n chain: ChainSymbol,\n walletAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WatchlistAddResponseModel>(\n { url: `/v2/watchlist/${chain}/${walletAddress}`, method: \"POST\" },\n options,\n );\n};\nexport type WatchlistAddResult = NonNullable<Awaited<ReturnType<typeof watchlistAdd>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n CreateWebhookRequest,\n EndpointListResponse,\n EndpointOperationResponse,\n EndpointSecretResponse,\n ListEndpointsParams,\n UpdateWebhookRequest,\n WebhookEndpoint,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.ENDPOINT.LIST.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.LIST.SUMMARY\n */\nexport const listEndpoints = (\n params?: ListEndpointsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointListResponse>(\n { url: `/v2/webhook/endpoint`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.CREATE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.CREATE.SUMMARY\n */\nexport const createEndpoint = (\n createWebhookRequest: CreateWebhookRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WebhookEndpoint>(\n {\n url: `/v2/webhook/endpoint`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: createWebhookRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.UPDATE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.UPDATE.SUMMARY\n */\nexport const updateEndpoint = (\n updateWebhookRequest: UpdateWebhookRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WebhookEndpoint>(\n {\n url: `/v2/webhook/endpoint`,\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n data: updateWebhookRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.GET.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.GET.SUMMARY\n */\nexport const getEndpoint = (id: string, options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<WebhookEndpoint>(\n { url: `/v2/webhook/endpoint/${id}`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.DELETE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.DELETE.SUMMARY\n */\nexport const deleteEndpoint = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointOperationResponse>(\n { url: `/v2/webhook/endpoint/${id}`, method: \"DELETE\" },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.GET.SECRET.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.GET.SECRET.SUMMARY\n */\nexport const getEndpointSecret = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointSecretResponse>(\n { url: `/v2/webhook/endpoint/${id}/secret`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.ROTATE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.ROTATE.SUMMARY\n */\nexport const rotateEndpointSecret = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointOperationResponse>(\n { url: `/v2/webhook/endpoint/${id}/secret/rotate`, method: \"POST\" },\n options,\n );\n};\nexport type ListEndpointsResult = NonNullable<Awaited<ReturnType<typeof listEndpoints>>>;\nexport type CreateEndpointResult = NonNullable<Awaited<ReturnType<typeof createEndpoint>>>;\nexport type UpdateEndpointResult = NonNullable<Awaited<ReturnType<typeof updateEndpoint>>>;\nexport type GetEndpointResult = NonNullable<Awaited<ReturnType<typeof getEndpoint>>>;\nexport type DeleteEndpointResult = NonNullable<Awaited<ReturnType<typeof deleteEndpoint>>>;\nexport type GetEndpointSecretResult = NonNullable<Awaited<ReturnType<typeof getEndpointSecret>>>;\nexport type RotateEndpointSecretResult = NonNullable<\n Awaited<ReturnType<typeof rotateEndpointSecret>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\n/**\n * Activity type (extends TradeType)\n */\nexport type ActivityType = (typeof ActivityType)[keyof typeof ActivityType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const ActivityType = {\n BUY: \"BUY\",\n SELL: \"SELL\",\n LIQUIDITY_INITIALIZE: \"LIQUIDITY_INITIALIZE\",\n LIQUIDITY_ADD: \"LIQUIDITY_ADD\",\n LIQUIDITY_REMOVE: \"LIQUIDITY_REMOVE\",\n RED_PACKET_CREATE: \"RED_PACKET_CREATE\",\n RED_PACKET_CLAIM: \"RED_PACKET_CLAIM\",\n RED_PACKET_COMPLETE: \"RED_PACKET_COMPLETE\",\n RED_PACKET_REFUND: \"RED_PACKET_REFUND\",\n} as const;\n\n/**\n * Balance change type\n */\nexport type BalanceChangeType = (typeof BalanceChangeType)[keyof typeof BalanceChangeType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const BalanceChangeType = {\n INCREASE: \"INCREASE\",\n DECREASE: \"DECREASE\",\n} as const;\n\n/**\n * Balance token type\n */\nexport type BalanceTokenType = (typeof BalanceTokenType)[keyof typeof BalanceTokenType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const BalanceTokenType = {\n SOL: \"SOL\",\n SPL: \"SPL\",\n} as const;\n\n/**\n * Balance update record\n */\nexport interface BalanceUpdate {\n accountOwnerAddress: string;\n balanceChange: string;\n balanceChangeInNative: string;\n balanceChangeInUsd: string;\n blockHash: string;\n blockHeight: number;\n /** @nullable */\n blockSlot?: number | null;\n blockTimestamp: number;\n changeType: BalanceChangeType;\n index: number;\n postBalance: string;\n postBalanceInNative: string;\n postBalanceInUsd: string;\n preBalance: string;\n preBalanceInNative: string;\n preBalanceInUsd: string;\n tokenAccountAddress: string;\n tokenAddress: string;\n transactionSignature: string;\n type: BalanceTokenType;\n}\n\n/**\n * Blockchain information\n */\nexport interface Blockchain {\n chainId: number;\n explorerUrl: string;\n name: string;\n symbol: string;\n}\n\nexport interface BlockchainLatestBlock {\n blockhash: string;\n lastValidBlockHeight: number;\n}\n\n/**\n * Boolean result response\n */\nexport interface BooleanResult {\n result: boolean;\n}\n\nexport interface CalculatePnlInput {\n /** @nullable */\n tokenAddresses?: string[] | null;\n}\n\n/**\n * Supported blockchain chains\n */\nexport type ChainSymbol = (typeof ChainSymbol)[keyof typeof ChainSymbol];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const ChainSymbol = {\n sol: \"sol\",\n eth: \"eth\",\n bsc: \"bsc\",\n} as const;\n\n/**\n * DTO.RED_PACKET.CLAIMER\n */\nexport interface ClaimRedPacketRequest {\n /** DTO.RED_PACKET.CLAIMER */\n claimer: string;\n /**\n * DTO.RED_PACKET.PACKET_ID\n * @nullable\n */\n packetId?: string | null;\n /**\n * DTO.RED_PACKET.PASSWORD\n * @nullable\n */\n password?: string | null;\n /**\n * DTO.RED_PACKET.SHARE_ID\n * @nullable\n */\n shareId?: string | null;\n}\n\n/**\n * Claim red packet response\n */\nexport interface ClaimRedPacketResponse {\n /** DTO.RED_PACKET.SERIALIZED_TX */\n txSerialize: string;\n}\n\n/**\n * DTO.RED_PACKET.CREATOR\n */\nexport interface CreateRedPacketRequest {\n /**\n * DTO.RED_PACKET.CLAIM_AUTHORITY\n * @nullable\n */\n claimAuthority?: string | null;\n /** DTO.RED_PACKET.CREATOR */\n creator: string;\n /**\n * DTO.RED_PACKET.EXPIRATION\n * @nullable\n */\n expiration?: number | null;\n /**\n * DTO.RED_PACKET.FIXED_AMOUNT\n * @nullable\n */\n fixedAmount?: string | null;\n /** DTO.RED_PACKET.MAX_CLAIMS */\n maxClaims: number;\n /**\n * DTO.RED_PACKET.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.RED_PACKET.MINT */\n mint: string;\n /**\n * DTO.RED_PACKET.PASSWORD\n * @nullable\n */\n password?: string | null;\n /**\n * DTO.RED_PACKET.TOTAL_AMOUNT\n * @nullable\n */\n totalAmount?: string | null;\n}\n\n/**\n * Create red packet response\n */\nexport interface CreateRedPacketResponse {\n /** DTO.RED_PACKET.SHARE_ID */\n shareId: string;\n /** DTO.RED_PACKET.SERIALIZED_TX */\n txSerialize: string;\n}\n\n/**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\nexport type CreateWebhookRequestMetadata = { [key: string]: unknown } | null;\n\n/**\n * Request to create a webhook endpoint\n */\nexport interface CreateWebhookRequest {\n /**\n * DTO.ENDPOINT.CHANNELS\n * @nullable\n */\n channels?: WebhookChannel[] | null;\n /**\n * DTO.ENDPOINT.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * DTO.ENDPOINT.DISABLED\n * @nullable\n */\n disabled?: boolean | null;\n /**\n * DTO.ENDPOINT.FILTER\n * @nullable\n */\n filter?: string | null;\n /**\n * DTO.ENDPOINT.FILTER_TYPES\n * @nullable\n */\n filterTypes?: string[] | null;\n /**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\n metadata?: CreateWebhookRequestMetadata;\n /**\n * DTO.ENDPOINT.RATE_LIMIT\n * @minimum 0\n * @nullable\n */\n rateLimit?: number | null;\n /**\n * DTO.ENDPOINT.SECRET\n * @nullable\n */\n secret?: string | null;\n /** DTO.ENDPOINT.URL */\n url: string;\n}\n\n/**\n * Token info returned by `get_dev_tokens` — mirrors TS `DevTokenDTO`.\n */\nexport interface DevToken {\n /** Token address */\n address: string;\n /** Market data */\n marketData: TokenMarketData;\n /** Token metadata */\n metadata: TokenMetadata;\n /** Trade statistics */\n stats: TokenStats;\n}\n\n/**\n * DEX information\n */\nexport interface Dex {\n /** Chain identifier */\n chain: string;\n /**\n * DEX image URL\n * @nullable\n */\n image?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family name\n * @nullable\n */\n protocolFamily?: DexProtocolFamily;\n}\n\n/**\n * DEX pool\n */\nexport interface DexPool {\n /** Chain */\n chain: string;\n /** Pool address */\n poolAddress: string;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family\n * @nullable\n */\n protocolFamily?: string | null;\n /** Token A address */\n tokenAAddress: string;\n /** Token B address */\n tokenBAddress: string;\n /**\n * TVL in native token\n * @nullable\n */\n tvlInSol?: string | null;\n /**\n * TVL in USD\n * @nullable\n */\n tvlInUsd?: string | null;\n}\n\n/**\n * DEX pool detail\n */\nexport interface DexPoolDetail {\n /** Chain identifier */\n chain: string;\n /**\n * Creation block timestamp\n * @nullable\n */\n createdBlockTimestamp?: string | null;\n /**\n * Fee rate\n * @nullable\n */\n feeRate?: string | null;\n /**\n * Image URL\n * @nullable\n */\n image?: string | null;\n /**\n * Liquidity model\n * @minimum 0\n * @nullable\n */\n liquidityModel?: number | null;\n /** Pool address */\n poolAddress: string;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family\n * @nullable\n */\n protocolFamily?: string | null;\n /**\n * Protocol name\n * @nullable\n */\n protocolName?: string | null;\n /**\n * Tick spacing\n * @nullable\n */\n tickSpacing?: number | null;\n /** Token A address */\n tokenAAddress: string;\n /**\n * Token A liquidity\n * @nullable\n */\n tokenALiquidity?: DexPoolTokenLiquidity;\n /** Token B address */\n tokenBAddress: string;\n /**\n * Token B liquidity\n * @nullable\n */\n tokenBLiquidity?: DexPoolTokenLiquidity;\n /**\n * Token count\n * @nullable\n */\n tokenCount?: number | null;\n /**\n * TVL in native token\n * @nullable\n */\n tvlInSol?: string | null;\n /**\n * TVL in USD\n * @nullable\n */\n tvlInUsd?: string | null;\n /**\n * Pool type\n * @minimum 0\n * @nullable\n */\n type?: number | null;\n /**\n * Pool version\n * @minimum 0\n * @nullable\n */\n version?: number | null;\n}\n\n/**\n * DEX pool liquidity model (0=Unknown, 1=ReserveBased, 2=PositionBased, 3=Virtual, 4=Shared)\n */\nexport type DexPoolLiquidityModel =\n (typeof DexPoolLiquidityModel)[keyof typeof DexPoolLiquidityModel];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexPoolLiquidityModel = {\n Unknown: \"Unknown\",\n ReserveBased: \"ReserveBased\",\n PositionBased: \"PositionBased\",\n Virtual: \"Virtual\",\n Shared: \"Shared\",\n} as const;\n\n/**\n * DEX pool liquidity snapshot\n */\nexport interface DexPoolSnapshot {\n /** Block height */\n blockHeight: number;\n /**\n * Block slot (optional)\n * @nullable\n */\n blockSlot?: number | null;\n /** Block timestamp (ms) */\n blockTimestamp: number;\n /** Pool address */\n poolAddress: string;\n /** Snapshot timestamp (ms) */\n snapshotTime: number;\n /** Token A snapshot */\n tokenA: DexPoolTokenSnapshot;\n /** Token B snapshot */\n tokenB: DexPoolTokenSnapshot;\n /** TVL in native token */\n tvlInNative: string;\n /** TVL in USD */\n tvlInUsd: string;\n}\n\n/**\n * DEX pool token liquidity\n */\nexport interface DexPoolTokenLiquidity {\n /** Amount in native token */\n amountInNative: string;\n /** Amount in USD */\n amountInUsd: string;\n /** Token decimals */\n decimals: number;\n /** Price in native token */\n priceNative: string;\n /** Price in USD */\n priceUsd: string;\n /** Token address */\n tokenAddress: string;\n /** Vault amount */\n vaultAmount: string;\n}\n\n/**\n * DEX pool token snapshot\n */\nexport interface DexPoolTokenSnapshot {\n /** Amount in native token */\n amountInNative: string;\n /** Amount in USD */\n amountInUsd: string;\n /** Token decimals */\n decimals: number;\n /** Price in native token */\n priceNative: string;\n /** Price in USD */\n priceUsd: string;\n /** Token address */\n tokenAddress: string;\n /** Vault amount */\n vaultAmount: string;\n}\n\n/**\n * DEX pool type (0=Unknown, 1=Standard, 2=Concentrated, 3=Weighted, 4=Stable)\n */\nexport type DexPoolType = (typeof DexPoolType)[keyof typeof DexPoolType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexPoolType = {\n Unknown: \"Unknown\",\n Standard: \"Standard\",\n Concentrated: \"Concentrated\",\n Weighted: \"Weighted\",\n Stable: \"Stable\",\n} as const;\n\n/**\n * DEX pool version (0=Unknown, 1=V1, 2=V2, 3=V3)\n */\nexport type DexPoolVersion = (typeof DexPoolVersion)[keyof typeof DexPoolVersion];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexPoolVersion = {\n Unknown: \"Unknown\",\n V1: \"V1\",\n V2: \"V2\",\n V3: \"V3\",\n} as const;\n\n/**\n * DEX protocol family identifier\n */\nexport type DexProtocolFamily = (typeof DexProtocolFamily)[keyof typeof DexProtocolFamily];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexProtocolFamily = {\n Raydium: \"Raydium\",\n Pumpfun: \"Pumpfun\",\n Pumpswap: \"Pumpswap\",\n Meteora: \"Meteora\",\n Moonshot: \"Moonshot\",\n Jupiter: \"Jupiter\",\n Orca: \"Orca\",\n OrcaWhirpool: \"OrcaWhirpool\",\n OpenBook: \"OpenBook\",\n Phoenix: \"Phoenix\",\n Lifinity: \"Lifinity\",\n MagicEden: \"MagicEden\",\n Tensor: \"Tensor\",\n Aldrin: \"Aldrin\",\n AldrinAmm: \"AldrinAmm\",\n BonkFun: \"BonkFun\",\n BoopFun: \"BoopFun\",\n CremaFinance: \"CremaFinance\",\n Cropper: \"Cropper\",\n Cykura: \"Cykura\",\n Dradex: \"Dradex\",\n Fluxbeam: \"Fluxbeam\",\n GooseFx: \"GooseFx\",\n Invariant: \"Invariant\",\n Intro: \"Intro\",\n Metaplex: \"Metaplex\",\n OasisProgram: \"OasisProgram\",\n Obric: \"Obric\",\n PancakeClmm: \"PancakeClmm\",\n Penguin: \"Penguin\",\n Saber: \"Saber\",\n Saros: \"Saros\",\n Sencha: \"Sencha\",\n Sentre: \"Sentre\",\n Serum: \"Serum\",\n Solana: \"Solana\",\n SolFi: \"SolFi\",\n Stabble: \"Stabble\",\n StepFinance: \"StepFinance\",\n StepN: \"StepN\",\n Symmetry: \"Symmetry\",\n ZeroFi: \"ZeroFi\",\n Unknown: \"Unknown\",\n} as const;\n\n/**\n * Paginated list of webhook endpoints\n */\nexport interface EndpointListResponse {\n /** DTO.ENDPOINT.PAGE.DATA */\n data: WebhookEndpoint[];\n /** DTO.ENDPOINT.PAGE.DONE */\n done: boolean;\n /**\n * DTO.ENDPOINT.PAGE.ITERATOR\n * @nullable\n */\n iterator?: string | null;\n /**\n * DTO.ENDPOINT.PAGE.PREV_ITERATOR\n * @nullable\n */\n prevIterator?: string | null;\n}\n\n/**\n * Boolean result for endpoint operations (delete, rotate secret)\n */\nexport interface EndpointOperationResponse {\n /** DTO.ENDPOINT.SUCCESS */\n success: boolean;\n}\n\n/**\n * Ordering direction for paginated endpoint listing\n */\nexport type EndpointOrder = (typeof EndpointOrder)[keyof typeof EndpointOrder];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const EndpointOrder = {\n ascending: \"ascending\",\n descending: \"descending\",\n} as const;\n\n/**\n * Secret response for a webhook endpoint\n */\nexport interface EndpointSecretResponse {\n /** DTO.ENDPOINT.SECRET */\n secret: string;\n}\n\nexport interface ErrorDetail {\n /** @minimum 0 */\n code: number;\n /** @nullable */\n details?: ErrorField[] | null;\n message: string;\n}\n\nexport interface ErrorField {\n field: string;\n message: string;\n}\n\nexport interface ErrorResponse {\n error: ErrorDetail;\n}\n\n/**\n * Filter condition for token queries\n */\nexport interface FilterCondition {\n /** Field name to filter */\n field: string;\n /** Operator (gt, gte, lt, lte, eq, ne) */\n operator: string;\n /** Value to compare */\n value: string;\n}\n\n/**\n * Hot token ranking duration\n */\nexport type HotTokenDuration = (typeof HotTokenDuration)[keyof typeof HotTokenDuration];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const HotTokenDuration = {\n \"1m\": \"1m\",\n \"5m\": \"5m\",\n \"1h\": \"1h\",\n \"4h\": \"4h\",\n \"24h\": \"24h\",\n} as const;\n\n/**\n * Response from IPFS JSON upload — mirrors TS `uploadJson` return type.\n */\nexport interface IpfsUploadResponse {\n /** IPFS content identifier (CID) */\n cid: string;\n /**\n * File name\n * @nullable\n */\n name?: string | null;\n /**\n * Pin size in bytes\n * @nullable\n */\n size?: number | null;\n /** Public IPFS URL */\n url: string;\n}\n\nexport interface KYTRegisterAddressInput {\n /** DTO.KYT.REGISTER_ADDRESS_REQUEST.ADDRESS */\n address: string;\n}\n\nexport interface KYTRegisterTransferInput {\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.ASSET */\n asset: string;\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.DIRECTION */\n direction: TransferDirection;\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.NETWORK */\n network: KytNetwork;\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.TRANSFER_REFERENCE */\n transferReference: string;\n}\n\nexport interface KYTRegisterWithdrawalInput {\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ADDRESS */\n address: string;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET */\n asset: string;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_AMOUNT */\n assetAmount: string;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_DENOMINATION\n * @nullable\n */\n assetDenomination?: string | null;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_ID\n * @nullable\n */\n assetId?: string | null;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_PRICE\n * @nullable\n */\n assetPrice?: string | null;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ATTEMPT_TIMESTAMP */\n attemptTimestamp: string;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.NETWORK */\n network: KytNetwork;\n}\n\nexport interface KytAddressExposure {\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.CATEGORY\n * @nullable\n */\n category?: string | null;\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.DIRECTION\n * @nullable\n */\n direction?: string | null;\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.EXPOSURE_TYPE\n * @nullable\n */\n exposureType?: string | null;\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.VALUE\n * @nullable\n */\n value?: string | null;\n}\n\nexport interface KytAddressIdentification {\n /**\n * DTO.KYT.CHAINALYSIS_ADDRESS_IDENTIFICATION.ADDRESS_NAME\n * @nullable\n */\n addressName?: string | null;\n /**\n * DTO.KYT.CHAINALYSIS_ADDRESS_IDENTIFICATION.CATEGORY_ID\n * @nullable\n */\n categoryId?: number | null;\n /**\n * DTO.KYT.CHAINALYSIS_ADDRESS_IDENTIFICATION.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n}\n\n/**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.CLUSTER\n * @nullable\n */\nexport type KytAddressRiskResponseCluster = { [key: string]: unknown } | null;\n\nexport interface KytAddressRiskResponse {\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.ADDRESS */\n address: string;\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.ADDRESS_IDENTIFICATIONS */\n addressIdentifications?: unknown[];\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.ADDRESS_TYPE\n * @nullable\n */\n addressType?: string | null;\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.CLUSTER\n * @nullable\n */\n cluster?: KytAddressRiskResponseCluster;\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.EXPOSURES */\n exposures?: KytAddressExposure[];\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.RISK\n * @nullable\n */\n risk?: string | null;\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.RISK_REASON\n * @nullable\n */\n riskReason?: string | null;\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.STATUS\n * @nullable\n */\n status?: string | null;\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.TRIGGERS */\n triggers?: unknown[];\n}\n\nexport interface KytAlertDetail {\n /**\n * DTO.KYT.ALERT_DETAIL.ALERT_AMOUNT\n * @nullable\n */\n alertAmount?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.ALERT_LEVEL\n * @nullable\n */\n alertLevel?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.CATEGORY_ID\n * @nullable\n */\n categoryId?: number | null;\n /**\n * DTO.KYT.ALERT_DETAIL.EXPOSURE_TYPE\n * @nullable\n */\n exposureType?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.EXTERNAL_ID\n * @nullable\n */\n externalId?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.MEMO\n * @nullable\n */\n memo?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.SERVICE\n * @nullable\n */\n service?: string | null;\n}\n\nexport interface KytAlertsResponse {\n /** DTO.KYT.TRANSFER_ALERTS_RESPONSE.ALERTS */\n alerts: KytAlertDetail[];\n}\n\nexport interface KytAlteryaIdentification {\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.ADDRESS\n * @nullable\n */\n address?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.CHAIN\n * @nullable\n */\n chain?: string | null;\n /** DTO.KYT.ALTERYA_IDENTIFICATION.LABELS */\n labels?: string[];\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.OBJECT\n * @nullable\n */\n object?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.ON_CHAIN_ACTIVITY\n * @nullable\n */\n on_chain_activity?: KytOnChainActivity;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.REASON\n * @nullable\n */\n reason?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.RISK_LEVEL\n * @nullable\n */\n risk_level?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.RISK_SCORE\n * @nullable\n */\n risk_score?: string | null;\n}\n\nexport interface KytDirectExposureDetail {\n /**\n * DTO.KYT.DIRECT_EXPOSURE_DETAIL.CATEGORY_ID\n * @nullable\n */\n categoryId?: number | null;\n /**\n * DTO.KYT.DIRECT_EXPOSURE_DETAIL.NAME\n * @nullable\n */\n name?: string | null;\n}\n\nexport interface KytDirectExposureResponse {\n /**\n * DTO.KYT.TRANSFER_DIRECT_EXPOSURE_RESPONSE.DIRECT\n * @nullable\n */\n direct?: KytDirectExposureDetail;\n}\n\nexport interface KytFraudAssessmentResponse {\n /** DTO.KYT.WITHDRAWAL_FRAUD_ASSESSMENT_RESPONSE.ALTERYA_IDENTIFICATIONS */\n alteryaIdentifications?: KytAlteryaIdentification[];\n}\n\nexport type KytNetwork = (typeof KytNetwork)[keyof typeof KytNetwork];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const KytNetwork = {\n Solana: \"Solana\",\n bitcoin: \"bitcoin\",\n ethereum: \"ethereum\",\n} as const;\n\nexport interface KytNetworkIdentificationOrg {\n /**\n * DTO.KYT.NETWORK_IDENTIFICATION_ORG.NAME\n * @nullable\n */\n name?: string | null;\n}\n\nexport interface KytNetworkIdentificationsResponse {\n /**\n * DTO.KYT.TRANSFER_NETWORK_IDENTIFICATIONS_RESPONSE.COUNT\n * @nullable\n */\n count?: number | null;\n /** DTO.KYT.TRANSFER_NETWORK_IDENTIFICATIONS_RESPONSE.NETWORK_IDENTIFICATION_ORGS */\n networkIdentificationOrgs?: KytNetworkIdentificationOrg[];\n}\n\nexport interface KytOnChainActivity {\n /**\n * DTO.KYT.ON_CHAIN_ACTIVITY.FIRST_TRANSACTION_AT\n * @nullable\n */\n first_transaction_at?: number | null;\n}\n\nexport interface KytRegisterAddressResponse {\n /** DTO.KYT.REGISTER_ADDRESS_RESPONSE.ADDRESS */\n address: string;\n}\n\nexport interface KytTransferBaseResponse {\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.ASSET */\n asset: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.ASSET_AMOUNT\n * @nullable\n */\n assetAmount?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.ASSET_ID\n * @nullable\n */\n assetId?: string | null;\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.EXTERNAL_ID */\n externalId: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.IDX\n * @nullable\n */\n idx?: number | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.NETWORK */\n network: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.OUTPUT_ADDRESS\n * @nullable\n */\n outputAddress?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.TIMESTAMP\n * @nullable\n */\n timestamp?: string | null;\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.TRANSFER_REFERENCE */\n transferReference: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.TX\n * @nullable\n */\n tx?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.USD_AMOUNT\n * @nullable\n */\n usdAmount?: string | null;\n}\n\nexport interface KytWithdrawalAddressIdentificationsResponse {\n /** DTO.KYT.WITHDRAWAL_ADDRESS_IDENTIFICATIONS_RESPONSE.CHAINALYSIS_IDENTIFICATIONS */\n chainalysisIdentifications?: KytAddressIdentification[];\n /** DTO.KYT.WITHDRAWAL_ADDRESS_IDENTIFICATIONS_RESPONSE.CUSTOM_ADDRESSES */\n customAddresses?: unknown[];\n}\n\nexport interface KytWithdrawalBaseResponse {\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ADDRESS */\n address: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ASSET */\n asset: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ASSET_AMOUNT */\n assetAmount: string;\n /**\n * DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ASSET_ID\n * @nullable\n */\n assetId?: string | null;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ATTEMPT_IDENTIFIER */\n attemptIdentifier: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.EXTERNAL_ID */\n externalId: string;\n /**\n * DTO.KYT.WITHDRAWAL_BASE_RESPONSE.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.NETWORK */\n network: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.UPDATED_AT */\n updatedAt: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.USD_AMOUNT */\n usdAmount: string;\n}\n\n/**\n * Launchpad tag for token filtering\n */\nexport type LaunchpadTag = (typeof LaunchpadTag)[keyof typeof LaunchpadTag];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const LaunchpadTag = {\n pump_fun: \"pump_fun\",\n raydium_launchpad: \"raydium_launchpad\",\n meteora_dynamic_bounding_curve: \"meteora_dynamic_bounding_curve\",\n bonk_fun: \"bonk_fun\",\n moonit_fun: \"moonit_fun\",\n} as const;\n\n/**\n * Mint/burn type filter\n */\nexport type MintBurnType = (typeof MintBurnType)[keyof typeof MintBurnType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const MintBurnType = {\n all: \"all\",\n mint: \"mint\",\n burn: \"burn\",\n} as const;\n\n/**\n * Single token net-worth item (mirrors TS WalletNetWorthItemDTO).\n */\nexport interface NetWorthByTokensItem {\n amount: string;\n chain: string;\n decimals: number;\n /** @nullable */\n logoUri?: string | null;\n name: string;\n priceInNative: string;\n priceInUsd: string;\n symbol: string;\n tokenAddress: string;\n valueInNative: string;\n valueInUsd: string;\n}\n\n/**\n * Wallet net-worth by tokens result (mirrors TS WalletNetWorthByTokensResult).\n */\nexport interface NetWorthByTokensResult {\n currentTimestamp: string;\n data: NetWorthByTokensItem[];\n totalValueInNative: string;\n totalValueInUsd: string;\n walletAddress: string;\n}\n\n/**\n * Single data point in a net-worth chart time series.\n */\nexport interface NetWorthHistoryItem {\n netWorth: string;\n netWorthChange: string;\n netWorthChangePercent: string;\n timestamp: string;\n}\n\nexport interface NetWorthSummaryValue {\n value: string;\n}\n\n/**\n * Pagination direction\n */\nexport type PageDirection = (typeof PageDirection)[keyof typeof PageDirection];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PageDirection = {\n next: \"next\",\n prev: \"prev\",\n} as const;\n\n/**\n * Balance update record\n */\nexport type PageResponseBalanceUpdateDataItem = {\n accountOwnerAddress: string;\n balanceChange: string;\n balanceChangeInNative: string;\n balanceChangeInUsd: string;\n blockHash: string;\n blockHeight: number;\n /** @nullable */\n blockSlot?: number | null;\n blockTimestamp: number;\n changeType: BalanceChangeType;\n index: number;\n postBalance: string;\n postBalanceInNative: string;\n postBalanceInUsd: string;\n preBalance: string;\n preBalanceInNative: string;\n preBalanceInUsd: string;\n tokenAccountAddress: string;\n tokenAddress: string;\n transactionSignature: string;\n type: BalanceTokenType;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseBalanceUpdate {\n /** Page data */\n data: PageResponseBalanceUpdateDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token info returned by `get_dev_tokens` — mirrors TS `DevTokenDTO`.\n */\nexport type PageResponseDevTokenDataItem = {\n /** Token address */\n address: string;\n /** Market data */\n marketData: TokenMarketData;\n /** Token metadata */\n metadata: TokenMetadata;\n /** Trade statistics */\n stats: TokenStats;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDevToken {\n /** Page data */\n data: PageResponseDevTokenDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * DEX information\n */\nexport type PageResponseDexDataItem = {\n /** Chain identifier */\n chain: string;\n /**\n * DEX image URL\n * @nullable\n */\n image?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family name\n * @nullable\n */\n protocolFamily?: DexProtocolFamily;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDex {\n /** Page data */\n data: PageResponseDexDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * DEX pool\n */\nexport type PageResponseDexPoolDataItem = {\n /** Chain */\n chain: string;\n /** Pool address */\n poolAddress: string;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family\n * @nullable\n */\n protocolFamily?: string | null;\n /** Token A address */\n tokenAAddress: string;\n /** Token B address */\n tokenBAddress: string;\n /**\n * TVL in native token\n * @nullable\n */\n tvlInSol?: string | null;\n /**\n * TVL in USD\n * @nullable\n */\n tvlInUsd?: string | null;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDexPool {\n /** Page data */\n data: PageResponseDexPoolDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * DEX pool liquidity snapshot\n */\nexport type PageResponseDexPoolSnapshotDataItem = {\n /** Block height */\n blockHeight: number;\n /**\n * Block slot (optional)\n * @nullable\n */\n blockSlot?: number | null;\n /** Block timestamp (ms) */\n blockTimestamp: number;\n /** Pool address */\n poolAddress: string;\n /** Snapshot timestamp (ms) */\n snapshotTime: number;\n /** Token A snapshot */\n tokenA: DexPoolTokenSnapshot;\n /** Token B snapshot */\n tokenB: DexPoolTokenSnapshot;\n /** TVL in native token */\n tvlInNative: string;\n /** TVL in USD */\n tvlInUsd: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDexPoolSnapshot {\n /** Page data */\n data: PageResponseDexPoolSnapshotDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Single token net-worth item (mirrors TS WalletNetWorthItemDTO).\n */\nexport type PageResponseNetWorthByTokensItemDataItem = {\n amount: string;\n chain: string;\n decimals: number;\n /** @nullable */\n logoUri?: string | null;\n name: string;\n priceInNative: string;\n priceInUsd: string;\n symbol: string;\n tokenAddress: string;\n valueInNative: string;\n valueInUsd: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseNetWorthByTokensItem {\n /** Page data */\n data: PageResponseNetWorthByTokensItemDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token entity — mirrors TS `TokenDTO extends TokenMetadataDTO`.\n\nTS uses class inheritance to flatten metadata into the top level.\nRust uses `#[serde(flatten)]` for the same effect.\n */\nexport type PageResponseTokenDataItem = {\n address: string;\n chain: string;\n /** @nullable */\n coingeckoCoinId?: string | null;\n decimals: number;\n /** @nullable */\n description?: string | null;\n /** @nullable */\n devLastTokenCreatedAt?: string | null;\n /** @nullable */\n devTotalTokens?: string | null;\n /** @nullable */\n extension?: TokenExtra;\n extra?: TokenExtra;\n /** @nullable */\n imageUrl?: string | null;\n /** @nullable */\n market?: string | null;\n /** Market data */\n marketData?: TokenMarketData;\n /** @nullable */\n metadataAddress?: string | null;\n name: string;\n socialMedias?: TokenSocialMedias;\n /** Token statistics */\n stats?: TokenStats;\n symbol: string;\n /** @nullable */\n tokenCreatedAt?: number | null;\n /** @nullable */\n tokenCreatedBlockHeight?: string | null;\n /** @nullable */\n tokenCreatedSlot?: string | null;\n /** @nullable */\n tokenCreatedTxSignature?: string | null;\n tokenCreators?: TokenCreator[];\n /** @nullable */\n uri?: string | null;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseToken {\n /** Page data */\n data: PageResponseTokenDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token holder\n */\nexport type PageResponseTokenHolderDataItem = {\n amount: string;\n amountInUsd: string;\n percentage: string;\n walletAddress: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenHolder {\n /** Page data */\n data: PageResponseTokenHolderDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token liquidity snapshot\n */\nexport type PageResponseTokenLiquiditySnapshotDataItem = {\n calculatedAt: number;\n maxLiquidityInNative: string;\n maxLiquidityInUsd: string;\n maxLiquidityPoolAddress: string;\n poolCount: number;\n priceNative: string;\n priceUsd: string;\n snapshotTime: number;\n totalLiquidityInNative: string;\n totalLiquidityInUsd: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenLiquiditySnapshot {\n /** Page data */\n data: PageResponseTokenLiquiditySnapshotDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token mint/burn event\n */\nexport type PageResponseTokenMintBurnDataItem = {\n amount: string;\n blockHeight: number;\n blockTimestamp: number;\n mintBurnType: MintBurnType;\n tokenAddress: string;\n transactionSignature: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenMintBurn {\n /** Page data */\n data: PageResponseTokenMintBurnDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token price\n */\nexport type PageResponseTokenPriceDataItem = {\n /** Token address */\n address: string;\n /**\n * Price in native token\n * @nullable\n */\n priceInSol?: string | null;\n /** Price in USD */\n priceInUsd: string;\n /** Timestamp */\n timestamp: number;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenPrice {\n /** Page data */\n data: PageResponseTokenPriceDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token trader info — mirrors TS `TokenTraderDTO`\n */\nexport type PageResponseTokenTraderDataItem = {\n /** Wallet address */\n address: string;\n /**\n * Block timestamp (sniper)\n * @nullable\n */\n blockTimestamp?: string | null;\n /**\n * Onchain account creation time (fresh/dev)\n * @nullable\n */\n onchainCreatedAt?: string | null;\n /**\n * Percentile rank of trade amount in USD (pro/insider)\n * @nullable\n */\n percentileRankTradeAmountInUsd?: string | null;\n /**\n * Percentile rank of trade count (pro)\n * @nullable\n */\n percentileRankTradeCount?: number | null;\n /**\n * Rank trade amount in USD (insider)\n * @nullable\n */\n rankTradeAmountInUsd?: string | null;\n /**\n * Trade amount in native token (pro/insider)\n * @nullable\n */\n tradeAmountInNative?: string | null;\n /**\n * Trade amount in USD (pro/insider)\n * @nullable\n */\n tradeAmountInUsd?: string | null;\n /**\n * Trade count (pro/insider)\n * @nullable\n */\n tradeCount?: number | null;\n /**\n * Transaction signature (sandwish/bundle/sniper)\n * @nullable\n */\n transactionSignature?: string | null;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenTrader {\n /** Page data */\n data: PageResponseTokenTraderDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token transfer\n */\nexport type PageResponseTokenTransferDataItem = {\n amount: string;\n /** @nullable */\n amountInUsd?: string | null;\n blockTimestamp: number;\n fromAddress: string;\n id: string;\n /** Transfer status: unknown / succeeded / failed */\n status: string;\n toAddress: string;\n tokenAddress: string;\n transactionSignature: string;\n /** Transfer type: unknown / in / out */\n type: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenTransfer {\n /** Page data */\n data: PageResponseTokenTransferDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Top trader statistics\n */\nexport type PageResponseTopTraderDataItem = {\n buyAmount: string;\n buyAmountInNative: string;\n buyAmountInUsd: string;\n buyCount: number;\n sellAmount: string;\n sellAmountInNative: string;\n sellAmountInUsd: string;\n sellCount: number;\n tokenAddress: string;\n tradeAmount: string;\n tradeCount: number;\n walletAddress: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTopTrader {\n /** Page data */\n data: PageResponseTopTraderDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Trade detail\n */\nexport type PageResponseTradeDetailDataItem = {\n /** Account owner address (trader wallet) */\n accountOwnerAddress: string;\n /** Block height */\n blockHeight: number;\n /** Block timestamp (milliseconds) */\n blockTimestamp: number;\n /** Chain identifier */\n chain: string;\n /**\n * DEX image\n * @nullable\n */\n dexImage?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n dexProgramAddress?: string | null;\n /**\n * DEX protocol family\n * @nullable\n */\n dexProtocolFamily?: string | null;\n /** Pool address */\n poolAddress: string;\n /** Side token address */\n sideTokenAddress: string;\n /** Side token amount */\n sideTokenAmount: string;\n /** Side token amount in native currency */\n sideTokenAmountInNative: string;\n /** Side token amount in USD */\n sideTokenAmountInUsd: string;\n /**\n * Side token image URL\n * @nullable\n */\n sideTokenImageUrl?: string | null;\n /** Side token name */\n sideTokenName: string;\n /** Side token price in native currency */\n sideTokenPriceInNative: string;\n /** Side token price in USD */\n sideTokenPriceInUsd: string;\n /** Side token symbol */\n sideTokenSymbol: string;\n /** Transaction status */\n status: string;\n /** Token address */\n tokenAddress: string;\n /** Token amount */\n tokenAmount: string;\n /** Token amount in native currency */\n tokenAmountInNative: string;\n /** Token amount in USD */\n tokenAmountInUsd: string;\n /**\n * Token image URL\n * @nullable\n */\n tokenImageUrl?: string | null;\n /** Token name */\n tokenName: string;\n /** Token price in native currency */\n tokenPriceInNative: string;\n /** Token price in USD */\n tokenPriceInUsd: string;\n /** Token symbol */\n tokenSymbol: string;\n /** Transaction signature */\n transactionSignature: string;\n /** Trade type (BUY/SELL) */\n type: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTradeDetail {\n /** Page data */\n data: PageResponseTradeDetailDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Trader gainers/losers item — PnL-based ranking\n */\nexport type PageResponseTraderGainersLosersItemDataItem = {\n address: string;\n chain: string;\n pnl: string;\n tradeCount: string;\n volume: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTraderGainersLosersItem {\n /** Page data */\n data: PageResponseTraderGainersLosersItemDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Wallet transfer\n */\nexport type PageResponseWalletTransferDataItem = {\n amount: string;\n /** @nullable */\n amountInUsd?: string | null;\n blockTimestamp: number;\n fromAddress: string;\n id: string;\n toAddress: string;\n tokenAddress: string;\n transactionSignature: string;\n transferType: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseWalletTransfer {\n /** Page data */\n data: PageResponseWalletTransferDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * PnL detail for a single wallet-token pair (mirrors TS PnlDetailItemDTO).\n */\nexport interface PnlDetailItem {\n avgBuyPriceInUsd: string;\n avgProfitPerTradeInUsd: string;\n avgSellPriceInUsd: string;\n balance: string;\n buyAmount: string;\n buyAmountInUsd: string;\n buys: string;\n currentValue: string;\n decimals?: number;\n /** @nullable */\n logoUri?: string | null;\n name?: string;\n priceInUsd: string;\n realizedProfitInUsd: string;\n realizedProfitRatio: string;\n sellAmount: string;\n sellAmountInUsd: string;\n sells: string;\n symbol?: string;\n tokenAddress: string;\n totalProfitInUsd: string;\n totalProfitRatio: string;\n totalTrades: string;\n unrealizedProfitInUsd: string;\n unrealizedProfitRatio: string;\n walletAddress: string;\n}\n\n/**\n * Aggregated PnL summary across all items (mirrors TS PnlDetailSummaryDTO).\n */\nexport interface PnlDetailSummary {\n avgProfitPerTradeInUsd: string;\n buyAmountInUsd: string;\n buys: string;\n currentValue: string;\n losses: string;\n realizedProfitInUsd: string;\n realizedProfitRatio: string;\n sellAmountInUsd: string;\n sells: string;\n tokens: string;\n totalCostInUsd: string;\n totalProfitInUsd: string;\n totalTrades: string;\n unrealizedProfitInUsd: string;\n winRate: string;\n wins: string;\n}\n\n/**\n * Full PnL details result with cursor pagination.\n */\nexport interface PnlDetailsResult {\n data: PnlDetailItem[];\n /** @nullable */\n endCursor?: string | null;\n hasNext?: boolean;\n hasPrev?: boolean;\n /** @nullable */\n startCursor?: string | null;\n summary: PnlDetailSummary;\n}\n\n/**\n * PnL resolution period\n */\nexport type PnlResolution = (typeof PnlResolution)[keyof typeof PnlResolution];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PnlResolution = {\n \"1d\": \"1d\",\n \"7d\": \"7d\",\n \"30d\": \"30d\",\n all: \"all\",\n} as const;\n\n/**\n * Pool sort field\n */\nexport type PoolSortField = (typeof PoolSortField)[keyof typeof PoolSortField];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PoolSortField = {\n tvlInSol: \"tvlInSol\",\n tvlInUsd: \"tvlInUsd\",\n} as const;\n\n/**\n * Price type for candle data\n */\nexport type PriceType = (typeof PriceType)[keyof typeof PriceType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PriceType = {\n usd: \"usd\",\n native: \"native\",\n} as const;\n\n/**\n * Range filter condition – mirrors TS `FilterCondition` used with min/max.\n */\nexport interface RangeFilterCondition {\n field: string;\n /** @nullable */\n max?: string | null;\n /** @nullable */\n min?: string | null;\n}\n\nexport type RankingDuration = (typeof RankingDuration)[keyof typeof RankingDuration];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const RankingDuration = {\n \"1m\": \"1m\",\n \"5m\": \"5m\",\n \"1h\": \"1h\",\n \"4h\": \"4h\",\n \"24h\": \"24h\",\n} as const;\n\nexport type RankingTag = (typeof RankingTag)[keyof typeof RankingTag];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const RankingTag = {\n pump_fun: \"pump_fun\",\n raydium_launchpad: \"raydium_launchpad\",\n meteora_dynamic_bounding_curve: \"meteora_dynamic_bounding_curve\",\n bonk_fun: \"bonk_fun\",\n moonit_fun: \"moonit_fun\",\n} as const;\n\n/**\n * Red packet detail\n */\nexport interface RedPacket {\n /**\n * DTO.RED_PACKET.CHAIN\n * @nullable\n */\n chain?: string | null;\n /**\n * DTO.RED_PACKET.CLAIM_AUTHORITY\n * @nullable\n */\n claimAuthority?: string | null;\n /**\n * DTO.RED_PACKET.CLAIMED_AMOUNT\n * @nullable\n */\n claimedAmount?: string | null;\n /**\n * DTO.RED_PACKET.CLAIMED_COUNT\n * @nullable\n */\n claimedCount?: number | null;\n /**\n * DTO.RED_PACKET.CREATED_AT\n * @nullable\n */\n createdAt?: number | null;\n /** DTO.RED_PACKET.CREATOR */\n creator: string;\n /**\n * DTO.RED_PACKET.EXPIRATION\n * @nullable\n */\n expiration?: number | null;\n /**\n * DTO.RED_PACKET.WITHDRAWED\n * @nullable\n */\n expired?: boolean | null;\n /**\n * DTO.RED_PACKET.EXPIRES_AT\n * @nullable\n */\n expiredAt?: number | null;\n /** DTO.RED_PACKET.ID */\n id: string;\n /** DTO.RED_PACKET.MAX_CLAIMS */\n maxClaims: number;\n /**\n * DTO.RED_PACKET.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.RED_PACKET.MINT */\n mint: string;\n /**\n * DTO.RED_PACKET.REFUND_AMOUNT\n * @nullable\n */\n refundedAmount?: string | null;\n /**\n * DTO.RED_PACKET.SHARE_ID\n * @nullable\n */\n shareId?: string | null;\n /** DTO.RED_PACKET.TOTAL_AMOUNT */\n totalAmount: string;\n /**\n * DTO.RED_PACKET.TX_HASH\n * @nullable\n */\n txHash?: string | null;\n}\n\n/**\n * Red packet claim record\n */\nexport interface RedPacketClaim {\n /** DTO.RED_PACKET.AMOUNT */\n amount: string;\n /**\n * DTO.RED_PACKET.CHAIN\n * @nullable\n */\n chain?: string | null;\n /**\n * DTO.RED_PACKET.CLAIMED_AT\n * @nullable\n */\n claimedAt?: number | null;\n /** DTO.RED_PACKET.CLAIMER */\n claimer: string;\n /**\n * DTO.RED_PACKET.CREATOR\n * @nullable\n */\n creator?: string | null;\n /** DTO.RED_PACKET.MINT */\n mint: string;\n /** DTO.RED_PACKET.PACKET_ID */\n packetId: string;\n /**\n * DTO.RED_PACKET.TX_HASH\n * @nullable\n */\n txHash?: string | null;\n}\n\n/**\n * Paginated red packet claims response\n */\nexport interface RedPacketClaimsPage {\n /** @nullable */\n endCursor?: string | null;\n hasNextPage: boolean;\n records: RedPacketClaim[];\n /** @nullable */\n startCursor?: string | null;\n total: number;\n}\n\n/**\n * Send red packet transaction request\n */\nexport interface RedPacketSendTxRequest {\n /** DTO.RED_PACKET.SIGNED_TX */\n signedTx: string;\n}\n\n/**\n * Send red packet transaction response\n */\nexport interface RedPacketSendTxResponse {\n /** DTO.RED_PACKET.SIGNATURE */\n signature: string;\n}\n\n/**\n * Paginated red packets response\n */\nexport interface RedPacketsPage {\n /** @nullable */\n endCursor?: string | null;\n hasNextPage: boolean;\n records: RedPacket[];\n /** @nullable */\n startCursor?: string | null;\n total: number;\n}\n\n/**\n * Candle resolution\n */\nexport type Resolution = (typeof Resolution)[keyof typeof Resolution];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const Resolution = {\n \"1s\": \"1s\",\n \"15s\": \"15s\",\n \"30s\": \"30s\",\n \"1m\": \"1m\",\n \"3m\": \"3m\",\n \"5m\": \"5m\",\n \"15m\": \"15m\",\n \"30m\": \"30m\",\n \"1h\": \"1h\",\n \"2h\": \"2h\",\n \"4h\": \"4h\",\n \"6h\": \"6h\",\n \"8h\": \"8h\",\n \"12h\": \"12h\",\n \"1d\": \"1d\",\n \"3d\": \"3d\",\n \"1w\": \"1w\",\n \"1M\": \"1M\",\n} as const;\n\n/**\n * Search mode: `fast` returns only OpenSearch fields (default), `normal` enriches with full data.\n */\nexport type SearchMode = (typeof SearchMode)[keyof typeof SearchMode];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SearchMode = {\n fast: \"fast\",\n normal: \"normal\",\n} as const;\n\nexport type SearchSortBy = (typeof SearchSortBy)[keyof typeof SearchSortBy];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SearchSortBy = {\n marketCapInUsd: \"marketCapInUsd\",\n liquidityInUsd: \"liquidityInUsd\",\n priceInUsd: \"priceInUsd\",\n holderCount: \"holderCount\",\n h24VolumeInUsd: \"h24VolumeInUsd\",\n h24Transactions: \"h24Transactions\",\n tokenCreatedAt: \"tokenCreatedAt\",\n} as const;\n\n/**\n * Sort direction (case-insensitive: accepts \"asc\"/\"ASC\"/\"Asc\" etc.)\n */\nexport type SortDirection = (typeof SortDirection)[keyof typeof SortDirection];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SortDirection = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\nexport interface SuccessResponse {\n success: boolean;\n}\n\n/**\n * Time frame for statistics\n */\nexport type TimeFrame = (typeof TimeFrame)[keyof typeof TimeFrame];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TimeFrame = {\n \"30m\": \"30m\",\n \"1h\": \"1h\",\n \"2h\": \"2h\",\n \"4h\": \"4h\",\n \"6h\": \"6h\",\n \"8h\": \"8h\",\n \"12h\": \"12h\",\n \"24h\": \"24h\",\n} as const;\n\n/**\n * Token entity — mirrors TS `TokenDTO extends TokenMetadataDTO`.\n\nTS uses class inheritance to flatten metadata into the top level.\nRust uses `#[serde(flatten)]` for the same effect.\n */\nexport interface Token {\n address: string;\n chain: string;\n /** @nullable */\n coingeckoCoinId?: string | null;\n decimals: number;\n /** @nullable */\n description?: string | null;\n /** @nullable */\n devLastTokenCreatedAt?: string | null;\n /** @nullable */\n devTotalTokens?: string | null;\n /** @nullable */\n extension?: TokenExtra;\n extra?: TokenExtra;\n /** @nullable */\n imageUrl?: string | null;\n /** @nullable */\n market?: string | null;\n /** Market data */\n marketData?: TokenMarketData;\n /** @nullable */\n metadataAddress?: string | null;\n name: string;\n socialMedias?: TokenSocialMedias;\n /** Token statistics */\n stats?: TokenStats;\n symbol: string;\n /** @nullable */\n tokenCreatedAt?: number | null;\n /** @nullable */\n tokenCreatedBlockHeight?: string | null;\n /** @nullable */\n tokenCreatedSlot?: string | null;\n /** @nullable */\n tokenCreatedTxSignature?: string | null;\n tokenCreators?: TokenCreator[];\n /** @nullable */\n uri?: string | null;\n}\n\n/**\n * Token balance\n */\nexport interface TokenBalance {\n /** Balance amount */\n amount: string;\n /**\n * Balance in USD\n * @nullable\n */\n amountInUsd?: string | null;\n /**\n * Token decimals\n * @nullable\n */\n decimals?: number | null;\n /**\n * Token image URL\n * @nullable\n */\n imageUrl?: string | null;\n /** Token address */\n tokenAddress: string;\n /**\n * Token name\n * @nullable\n */\n tokenName?: string | null;\n /**\n * Token symbol\n * @nullable\n */\n tokenSymbol?: string | null;\n}\n\n/**\n * Token candle (OHLCV)\n */\nexport interface TokenCandle {\n /** Close price */\n close: string;\n /** High price */\n high: string;\n /** Low price */\n low: string;\n /** Open price */\n open: string;\n /** Timestamp */\n timestamp: number;\n /** Volume */\n volume: string;\n}\n\n/**\n * Token creation info — mirrors TS `TokenCreationDTO`\n */\nexport interface TokenCreation {\n /** @nullable */\n blockHash?: string | null;\n blockHeight: number;\n blockSlot: number;\n /** @nullable */\n blockTimestamp?: number | null;\n tokenAddress: string;\n transactionSignature: string;\n type: string;\n}\n\n/**\n * Token creator info\n */\nexport interface TokenCreator {\n /** @nullable */\n address?: string | null;\n /** @nullable */\n isVerified?: boolean | null;\n /** @nullable */\n share?: number | null;\n}\n\n/**\n * Token extra metadata\n */\nexport interface TokenExtra {\n /** @nullable */\n collectionAddress?: string | null;\n /** @nullable */\n editionNonce?: number | null;\n /** @nullable */\n freezeAuthority?: string | null;\n /** @nullable */\n fungible?: boolean | null;\n /** @nullable */\n isMutable?: boolean | null;\n /** @nullable */\n isNative?: boolean | null;\n /** @nullable */\n isVerifiedCollection?: boolean | null;\n /** @nullable */\n isWrapped?: boolean | null;\n /** @nullable */\n key?: string | null;\n /** @nullable */\n launchFromProgramAddress?: string | null;\n /** @nullable */\n launchFromProtocolFamily?: string | null;\n /** @nullable */\n migratedAt?: number | null;\n /** @nullable */\n migratedToPoolAddress?: string | null;\n /** @nullable */\n migratedToProgramAddress?: string | null;\n /** @nullable */\n migratedToProtocolFamily?: string | null;\n /** @nullable */\n mintAuthority?: string | null;\n /** @nullable */\n primarySaleHappened?: boolean | null;\n /** @nullable */\n programAddress?: string | null;\n /** @nullable */\n sellerFeeBasisPoints?: number | null;\n /** @nullable */\n tokenStandard?: string | null;\n /** @nullable */\n updateAuthority?: string | null;\n}\n\nexport type TokenField = (typeof TokenField)[keyof typeof TokenField];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenField = {\n marketDatapriceInUsd: \"marketData.priceInUsd\",\n statspriceChangeRatioInUsd1m: \"stats.priceChangeRatioInUsd1m\",\n statspriceChangeRatioInUsd5m: \"stats.priceChangeRatioInUsd5m\",\n statspriceChangeRatioInUsd1h: \"stats.priceChangeRatioInUsd1h\",\n statspriceChangeRatioInUsd4h: \"stats.priceChangeRatioInUsd4h\",\n statspriceChangeRatioInUsd24h: \"stats.priceChangeRatioInUsd24h\",\n marketDatamarketCapInUsd: \"marketData.marketCapInUsd\",\n marketDatamaxPoolTvlInUsd: \"marketData.maxPoolTvlInUsd\",\n marketDatatotalTvlInUsd: \"marketData.totalTvlInUsd\",\n marketDatatop10TotalHoldings: \"marketData.top10TotalHoldings\",\n marketDatatop10HoldingsRatio: \"marketData.top10HoldingsRatio\",\n marketDatatop100TotalHoldings: \"marketData.top100TotalHoldings\",\n marketDatatop100HoldingsRatio: \"marketData.top100HoldingsRatio\",\n marketDataholders: \"marketData.holders\",\n marketDatacreatorHoldings: \"marketData.creatorHoldings\",\n marketDatacreatorHoldingsRatio: \"marketData.creatorHoldingsRatio\",\n statsbuys1m: \"stats.buys1m\",\n statsbuys5m: \"stats.buys5m\",\n statsbuys15m: \"stats.buys15m\",\n statsbuys30m: \"stats.buys30m\",\n statsbuys1h: \"stats.buys1h\",\n statsbuys4h: \"stats.buys4h\",\n statsbuys24h: \"stats.buys24h\",\n statssells1m: \"stats.sells1m\",\n statssells5m: \"stats.sells5m\",\n statssells15m: \"stats.sells15m\",\n statssells30m: \"stats.sells30m\",\n statssells1h: \"stats.sells1h\",\n statssells4h: \"stats.sells4h\",\n statssells24h: \"stats.sells24h\",\n statstrades1m: \"stats.trades1m\",\n statstrades5m: \"stats.trades5m\",\n statstrades1h: \"stats.trades1h\",\n statstrades4h: \"stats.trades4h\",\n statstrades24h: \"stats.trades24h\",\n statstraders1m: \"stats.traders1m\",\n statstraders5m: \"stats.traders5m\",\n statstraders1h: \"stats.traders1h\",\n statstraders4h: \"stats.traders4h\",\n statstraders24h: \"stats.traders24h\",\n statsvolumesInUsd1m: \"stats.volumesInUsd1m\",\n statsvolumesInUsd5m: \"stats.volumesInUsd5m\",\n statsvolumesInUsd1h: \"stats.volumesInUsd1h\",\n statsvolumesInUsd4h: \"stats.volumesInUsd4h\",\n statsvolumesInUsd24h: \"stats.volumesInUsd24h\",\n tokenCreatedAt: \"tokenCreatedAt\",\n} as const;\n\nexport type TokenFilter = (typeof TokenFilter)[keyof typeof TokenFilter];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenFilter = {\n has_social_media: \"has_social_media\",\n has_twitter: \"has_twitter\",\n has_telegram: \"has_telegram\",\n has_website: \"has_website\",\n has_tiktok: \"has_tiktok\",\n has_discord: \"has_discord\",\n has_facebook: \"has_facebook\",\n has_github: \"has_github\",\n has_instagram: \"has_instagram\",\n has_linkedin: \"has_linkedin\",\n has_medium: \"has_medium\",\n has_reddit: \"has_reddit\",\n has_youtube: \"has_youtube\",\n has_bitbucket: \"has_bitbucket\",\n} as const;\n\n/**\n * Token holder\n */\nexport interface TokenHolder {\n amount: string;\n amountInUsd: string;\n percentage: string;\n walletAddress: string;\n}\n\n/**\n * Token liquidity snapshot\n */\nexport interface TokenLiquiditySnapshot {\n calculatedAt: number;\n maxLiquidityInNative: string;\n maxLiquidityInUsd: string;\n maxLiquidityPoolAddress: string;\n poolCount: number;\n priceNative: string;\n priceUsd: string;\n snapshotTime: number;\n totalLiquidityInNative: string;\n totalLiquidityInUsd: string;\n}\n\nexport type TokenListSortField = (typeof TokenListSortField)[keyof typeof TokenListSortField];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenListSortField = {\n h24VolumeInUsd: \"h24VolumeInUsd\",\n h24PriceChangeRatio: \"h24PriceChangeRatio\",\n h24Buys: \"h24Buys\",\n h24Sells: \"h24Sells\",\n h24Trades: \"h24Trades\",\n h24Buyers: \"h24Buyers\",\n h24Sellers: \"h24Sellers\",\n h24BuyVolumeInUsd: \"h24BuyVolumeInUsd\",\n h24SellVolumeInUsd: \"h24SellVolumeInUsd\",\n h4VolumeInUsd: \"h4VolumeInUsd\",\n h4PriceChangeRatio: \"h4PriceChangeRatio\",\n h4Buys: \"h4Buys\",\n h4Sells: \"h4Sells\",\n h4Trades: \"h4Trades\",\n h4Buyers: \"h4Buyers\",\n h4Sellers: \"h4Sellers\",\n h4BuyVolumeInUsd: \"h4BuyVolumeInUsd\",\n h4SellVolumeInUsd: \"h4SellVolumeInUsd\",\n h1VolumeInUsd: \"h1VolumeInUsd\",\n h1PriceChangeRatio: \"h1PriceChangeRatio\",\n h1Buys: \"h1Buys\",\n h1Sells: \"h1Sells\",\n h1Trades: \"h1Trades\",\n h1Buyers: \"h1Buyers\",\n h1Sellers: \"h1Sellers\",\n h1BuyVolumeInUsd: \"h1BuyVolumeInUsd\",\n h1SellVolumeInUsd: \"h1SellVolumeInUsd\",\n m30VolumeInUsd: \"m30VolumeInUsd\",\n m30PriceChangeRatio: \"m30PriceChangeRatio\",\n m30Buys: \"m30Buys\",\n m30Sells: \"m30Sells\",\n m30Trades: \"m30Trades\",\n m30Buyers: \"m30Buyers\",\n m30Sellers: \"m30Sellers\",\n m30BuyVolumeInUsd: \"m30BuyVolumeInUsd\",\n m30SellVolumeInUsd: \"m30SellVolumeInUsd\",\n m15VolumeInUsd: \"m15VolumeInUsd\",\n m15PriceChangeRatio: \"m15PriceChangeRatio\",\n m15Buys: \"m15Buys\",\n m15Sells: \"m15Sells\",\n m15Trades: \"m15Trades\",\n m15Buyers: \"m15Buyers\",\n m15Sellers: \"m15Sellers\",\n m15BuyVolumeInUsd: \"m15BuyVolumeInUsd\",\n m15SellVolumeInUsd: \"m15SellVolumeInUsd\",\n m5VolumeInUsd: \"m5VolumeInUsd\",\n m5PriceChangeRatio: \"m5PriceChangeRatio\",\n m5Buys: \"m5Buys\",\n m5Sells: \"m5Sells\",\n m5Trades: \"m5Trades\",\n m5Buyers: \"m5Buyers\",\n m5Sellers: \"m5Sellers\",\n m5BuyVolumeInUsd: \"m5BuyVolumeInUsd\",\n m5SellVolumeInUsd: \"m5SellVolumeInUsd\",\n m1VolumeInUsd: \"m1VolumeInUsd\",\n m1PriceChangeRatio: \"m1PriceChangeRatio\",\n m1Buys: \"m1Buys\",\n m1Sells: \"m1Sells\",\n m1Trades: \"m1Trades\",\n m1Buyers: \"m1Buyers\",\n m1Sellers: \"m1Sellers\",\n m1BuyVolumeInUsd: \"m1BuyVolumeInUsd\",\n m1SellVolumeInUsd: \"m1SellVolumeInUsd\",\n} as const;\n\n/**\n * Token market data\n */\nexport interface TokenMarketData {\n /** @nullable */\n bluechipHoldingsRatio?: string | null;\n /** @nullable */\n bluechipTotalHolders?: string | null;\n /** @nullable */\n bluechipTotalHoldings?: string | null;\n /** @nullable */\n bundleHoldingsRatio?: string | null;\n /** @nullable */\n bundleTotalHolders?: string | null;\n /** @nullable */\n bundleTotalHoldings?: string | null;\n /** @nullable */\n circulatingSupply?: string | null;\n /** @nullable */\n completionRatio?: string | null;\n /** @nullable */\n devHoldingsRatio?: string | null;\n /** @nullable */\n devTotalHolders?: string | null;\n /** @nullable */\n devTotalHoldings?: string | null;\n /** @nullable */\n fdvInSol?: string | null;\n /** @nullable */\n fdvInUsd?: string | null;\n /** @nullable */\n freshHoldingsRatio?: string | null;\n /** @nullable */\n freshTotalHolders?: string | null;\n /** @nullable */\n freshTotalHoldings?: string | null;\n /** @nullable */\n holders?: string | null;\n /** @nullable */\n insiderHoldingsRatio?: string | null;\n /** @nullable */\n insiderTotalHolders?: string | null;\n /** @nullable */\n insiderTotalHoldings?: string | null;\n /** @nullable */\n kolHoldingsRatio?: string | null;\n /** @nullable */\n kolTotalHolders?: string | null;\n /** @nullable */\n kolTotalHoldings?: string | null;\n /** @nullable */\n marketCapInSol?: string | null;\n /** @nullable */\n marketCapInUsd?: string | null;\n /** @nullable */\n maxPoolTvlInSol?: string | null;\n /** @nullable */\n maxPoolTvlInUsd?: string | null;\n /** @nullable */\n priceInSol?: string | null;\n /** @nullable */\n priceInUsd?: string | null;\n /** @nullable */\n proHoldingsRatio?: string | null;\n /** @nullable */\n proTotalHolders?: string | null;\n /** @nullable */\n proTotalHoldings?: string | null;\n /** @nullable */\n sandwishHoldingsRatio?: string | null;\n /** @nullable */\n sandwishTotalHolders?: string | null;\n /** @nullable */\n sandwishTotalHoldings?: string | null;\n /** @nullable */\n sniperHoldingsRatio?: string | null;\n /** @nullable */\n sniperTotalHolders?: string | null;\n /** @nullable */\n sniperTotalHoldings?: string | null;\n /** @nullable */\n top100HoldingsRatio?: string | null;\n /** @nullable */\n top100TotalHoldings?: string | null;\n /** @nullable */\n top10HoldingsRatio?: string | null;\n /** @nullable */\n top10TotalHoldings?: string | null;\n /** @nullable */\n top50HoldingsRatio?: string | null;\n /** @nullable */\n top50TotalHoldings?: string | null;\n /** @nullable */\n totalSupply?: string | null;\n /** @nullable */\n totalTvlInSol?: string | null;\n /** @nullable */\n totalTvlInUsd?: string | null;\n}\n\n/**\n * Token metadata\n */\nexport interface TokenMetadata {\n address: string;\n chain: string;\n /** @nullable */\n coingeckoCoinId?: string | null;\n decimals: string;\n /** @nullable */\n description?: string | null;\n /** @nullable */\n devLastTokenCreatedAt?: string | null;\n /** @nullable */\n devTotalTokens?: string | null;\n extra?: TokenExtra;\n /** @nullable */\n imageUrl?: string | null;\n /** @nullable */\n metadataAddress?: string | null;\n name: string;\n socialMedias?: TokenSocialMedias;\n symbol: string;\n /** @nullable */\n tokenCreatedAt?: number | null;\n /** @nullable */\n tokenCreatedBlockHeight?: string | null;\n /** @nullable */\n tokenCreatedSlot?: string | null;\n /** @nullable */\n tokenCreatedTxSignature?: string | null;\n tokenCreators?: TokenCreator[];\n /** @nullable */\n updatedAt?: string | null;\n /** @nullable */\n uri?: string | null;\n}\n\n/**\n * Token mint/burn event\n */\nexport interface TokenMintBurn {\n amount: string;\n blockHeight: number;\n blockTimestamp: number;\n mintBurnType: MintBurnType;\n tokenAddress: string;\n transactionSignature: string;\n}\n\n/**\n * @nullable\n */\nexport type TokenPageCountsByProtocols = { [key: string]: number } | null;\n\n/**\n * Token search result page — mirrors TS `TokenPage`.\nExtends `PageResponse<Token>` with `countsByProtocols`.\n */\nexport interface TokenPage {\n /** @nullable */\n countsByProtocols?: TokenPageCountsByProtocols;\n data: Token[];\n /** @nullable */\n endCursor?: string | null;\n hasNext?: boolean;\n hasPrev?: boolean;\n /** @nullable */\n startCursor?: string | null;\n}\n\n/**\n * Token price\n */\nexport interface TokenPrice {\n /** Token address */\n address: string;\n /**\n * Price in native token\n * @nullable\n */\n priceInSol?: string | null;\n /** Price in USD */\n priceInUsd: string;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Token social media links\n */\nexport interface TokenSocialMedias {\n /** @nullable */\n bitbucket?: string | null;\n /** @nullable */\n discord?: string | null;\n /** @nullable */\n facebook?: string | null;\n /** @nullable */\n github?: string | null;\n /** @nullable */\n instagram?: string | null;\n /** @nullable */\n linkedin?: string | null;\n /** @nullable */\n medium?: string | null;\n /** @nullable */\n reddit?: string | null;\n /** @nullable */\n telegram?: string | null;\n /** @nullable */\n tiktok?: string | null;\n /** @nullable */\n twitter?: string | null;\n /** @nullable */\n website?: string | null;\n /** @nullable */\n youtube?: string | null;\n}\n\n/**\n * Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields.\n */\nexport type TokenStatsPeriods = { [key: string]: TokenTradeStatPeriod };\n\n/**\n * Token statistics with nested time period data\n */\nexport interface TokenStats {\n address: string;\n /** Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields. */\n periods: TokenStatsPeriods;\n}\n\n/**\n * Single time window trade statistics period\n */\nexport interface TokenTradeStatPeriod {\n averagePriceInNative?: string;\n averagePriceInUsd?: string;\n /** @nullable */\n buySellRatio?: string | null;\n buyVolume?: string;\n buyVolumeInNative?: string;\n buyVolumeInUsd?: string;\n buyers?: string;\n buys?: string;\n closeInNative?: string;\n closeInUsd?: string;\n currentLiquidityInUsd?: string;\n dappProgramCount?: string;\n highInNative?: string;\n highInUsd?: string;\n /** @nullable */\n liquidityChangeRatio?: string | null;\n lowInNative?: string;\n lowInUsd?: string;\n openInNative?: string;\n openInUsd?: string;\n poolCount?: string;\n prevBuyVolume?: string;\n prevBuyVolumeInNative?: string;\n prevBuyVolumeInUsd?: string;\n prevBuyers?: string;\n prevBuys?: string;\n prevCloseInNative?: string;\n prevCloseInUsd?: string;\n prevDappProgramCount?: string;\n prevHighInNative?: string;\n prevHighInUsd?: string;\n prevLiquidityInUsd?: string;\n prevLowInNative?: string;\n prevLowInUsd?: string;\n prevOpenInNative?: string;\n prevOpenInUsd?: string;\n prevPoolCount?: string;\n prevSellVolume?: string;\n prevSellVolumeInNative?: string;\n prevSellVolumeInUsd?: string;\n prevSellers?: string;\n prevSells?: string;\n prevTrades?: string;\n priceChangeRatioInUsd?: string;\n sellVolume?: string;\n sellVolumeInNative?: string;\n sellVolumeInUsd?: string;\n sellers?: string;\n sells?: string;\n totalVolumeInNative?: string;\n totalVolumeInUsd?: string;\n traders?: string;\n trades?: string;\n /** @nullable */\n updatedAt?: string | null;\n /** @nullable */\n volumeChangeRatio?: string | null;\n}\n\n/**\n * Token trader info — mirrors TS `TokenTraderDTO`\n */\nexport interface TokenTrader {\n /** Wallet address */\n address: string;\n /**\n * Block timestamp (sniper)\n * @nullable\n */\n blockTimestamp?: string | null;\n /**\n * Onchain account creation time (fresh/dev)\n * @nullable\n */\n onchainCreatedAt?: string | null;\n /**\n * Percentile rank of trade amount in USD (pro/insider)\n * @nullable\n */\n percentileRankTradeAmountInUsd?: string | null;\n /**\n * Percentile rank of trade count (pro)\n * @nullable\n */\n percentileRankTradeCount?: number | null;\n /**\n * Rank trade amount in USD (insider)\n * @nullable\n */\n rankTradeAmountInUsd?: string | null;\n /**\n * Trade amount in native token (pro/insider)\n * @nullable\n */\n tradeAmountInNative?: string | null;\n /**\n * Trade amount in USD (pro/insider)\n * @nullable\n */\n tradeAmountInUsd?: string | null;\n /**\n * Trade count (pro/insider)\n * @nullable\n */\n tradeCount?: number | null;\n /**\n * Transaction signature (sandwish/bundle/sniper)\n * @nullable\n */\n transactionSignature?: string | null;\n}\n\n/**\n * Token trader tag\n */\nexport type TokenTraderTag = (typeof TokenTraderTag)[keyof typeof TokenTraderTag];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenTraderTag = {\n fresh: \"fresh\",\n sandwish: \"sandwish\",\n bundle: \"bundle\",\n sniper: \"sniper\",\n dev: \"dev\",\n pro: \"pro\",\n insider: \"insider\",\n kol: \"kol\",\n bluechip: \"bluechip\",\n smart: \"smart\",\n} as const;\n\n/**\n * Token transfer\n */\nexport interface TokenTransfer {\n amount: string;\n /** @nullable */\n amountInUsd?: string | null;\n blockTimestamp: number;\n fromAddress: string;\n id: string;\n /** Transfer status: unknown / succeeded / failed */\n status: string;\n toAddress: string;\n tokenAddress: string;\n transactionSignature: string;\n /** Transfer type: unknown / in / out */\n type: string;\n}\n\n/**\n * Token transfer total count\n */\nexport interface TokenTransferTotal {\n total: number;\n}\n\n/**\n * Top trader statistics\n */\nexport interface TopTrader {\n buyAmount: string;\n buyAmountInNative: string;\n buyAmountInUsd: string;\n buyCount: number;\n sellAmount: string;\n sellAmountInNative: string;\n sellAmountInUsd: string;\n sellCount: number;\n tokenAddress: string;\n tradeAmount: string;\n tradeCount: number;\n walletAddress: string;\n}\n\n/**\n * Sort field for top traders query\n */\nexport type TopTraderSortBy = (typeof TopTraderSortBy)[keyof typeof TopTraderSortBy];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TopTraderSortBy = {\n tradeAmount: \"tradeAmount\",\n tradeCount: \"tradeCount\",\n} as const;\n\n/**\n * Trade detail\n */\nexport interface TradeDetail {\n /** Account owner address (trader wallet) */\n accountOwnerAddress: string;\n /** Block height */\n blockHeight: number;\n /** Block timestamp (milliseconds) */\n blockTimestamp: number;\n /** Chain identifier */\n chain: string;\n /**\n * DEX image\n * @nullable\n */\n dexImage?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n dexProgramAddress?: string | null;\n /**\n * DEX protocol family\n * @nullable\n */\n dexProtocolFamily?: string | null;\n /** Pool address */\n poolAddress: string;\n /** Side token address */\n sideTokenAddress: string;\n /** Side token amount */\n sideTokenAmount: string;\n /** Side token amount in native currency */\n sideTokenAmountInNative: string;\n /** Side token amount in USD */\n sideTokenAmountInUsd: string;\n /**\n * Side token image URL\n * @nullable\n */\n sideTokenImageUrl?: string | null;\n /** Side token name */\n sideTokenName: string;\n /** Side token price in native currency */\n sideTokenPriceInNative: string;\n /** Side token price in USD */\n sideTokenPriceInUsd: string;\n /** Side token symbol */\n sideTokenSymbol: string;\n /** Transaction status */\n status: string;\n /** Token address */\n tokenAddress: string;\n /** Token amount */\n tokenAmount: string;\n /** Token amount in native currency */\n tokenAmountInNative: string;\n /** Token amount in USD */\n tokenAmountInUsd: string;\n /**\n * Token image URL\n * @nullable\n */\n tokenImageUrl?: string | null;\n /** Token name */\n tokenName: string;\n /** Token price in native currency */\n tokenPriceInNative: string;\n /** Token price in USD */\n tokenPriceInUsd: string;\n /** Token symbol */\n tokenSymbol: string;\n /** Transaction signature */\n transactionSignature: string;\n /** Trade type (BUY/SELL) */\n type: string;\n}\n\n/**\n * Trade type\n */\nexport type TradeType = (typeof TradeType)[keyof typeof TradeType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TradeType = {\n BUY: \"BUY\",\n SELL: \"SELL\",\n} as const;\n\n/**\n * Trader gainers/losers item — PnL-based ranking\n */\nexport interface TraderGainersLosersItem {\n address: string;\n chain: string;\n pnl: string;\n tradeCount: string;\n volume: string;\n}\n\n/**\n * Trader PnL resolution period\n */\nexport type TraderPnlResolution = (typeof TraderPnlResolution)[keyof typeof TraderPnlResolution];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TraderPnlResolution = {\n \"1d\": \"1d\",\n \"7d\": \"7d\",\n \"30d\": \"30d\",\n} as const;\n\n/**\n * Transaction status\n */\nexport type TransactionStatus = (typeof TransactionStatus)[keyof typeof TransactionStatus];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TransactionStatus = {\n UNKNOWN: \"UNKNOWN\",\n SUCCEEDED: \"SUCCEEDED\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type TransferDirection = (typeof TransferDirection)[keyof typeof TransferDirection];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TransferDirection = {\n sent: \"sent\",\n received: \"received\",\n} as const;\n\nexport interface TransferTotalResponse {\n total: number;\n}\n\n/**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\nexport type UpdateWebhookRequestMetadata = { [key: string]: unknown } | null;\n\n/**\n * Request to update a webhook endpoint\n */\nexport interface UpdateWebhookRequest {\n /**\n * DTO.ENDPOINT.CHANNELS\n * @nullable\n */\n channels?: WebhookChannel[] | null;\n /**\n * DTO.ENDPOINT.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * DTO.ENDPOINT.DISABLED\n * @nullable\n */\n disabled?: boolean | null;\n /** DTO.ENDPOINT.ENDPOINT_ID */\n endpointId: string;\n /**\n * DTO.ENDPOINT.FILTER\n * @nullable\n */\n filter?: string | null;\n /**\n * DTO.ENDPOINT.FILTER_TYPES\n * @nullable\n */\n filterTypes?: string[] | null;\n /**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\n metadata?: UpdateWebhookRequestMetadata;\n /**\n * DTO.ENDPOINT.RATE_LIMIT\n * @minimum 0\n * @nullable\n */\n rateLimit?: number | null;\n /**\n * DTO.ENDPOINT.URL\n * @nullable\n */\n url?: string | null;\n}\n\n/**\n * Wallet balances\n */\nexport interface WalletBalances {\n /** Chain identifier */\n chain: string;\n /**\n * Native token balance\n * @nullable\n */\n nativeBalance?: string | null;\n /**\n * Native balance in USD\n * @nullable\n */\n nativeBalanceInUsd?: string | null;\n /** Token balances */\n tokens: TokenBalance[];\n /**\n * Total value in USD\n * @nullable\n */\n totalValueInUsd?: string | null;\n /** Wallet address */\n walletAddress: string;\n}\n\n/**\n * Wallet first transaction summary\n */\nexport interface WalletFirstTx {\n balanceChange: string;\n blockNumber: number;\n blockTime: number;\n decimals: number;\n tokenAddress: string;\n txHash: string;\n}\n\n/**\n * Wallet net worth summary\n */\nexport interface WalletNetWorth {\n chain: string;\n /** @nullable */\n tokenCount?: number | null;\n /** @nullable */\n totalValueInNative?: string | null;\n /** @nullable */\n totalValueInUsd?: string | null;\n walletAddress: string;\n}\n\n/**\n * Wallet net-worth chart response with pagination.\n */\nexport interface WalletNetWorthChartResponse {\n currentTimestamp: string;\n history: NetWorthHistoryItem[];\n pastTimestamp: string;\n walletAddress: string;\n}\n\n/**\n * Paginated wallet net-worth details (mirrors TS WalletNetWorthDetailsPage).\n */\nexport interface WalletNetWorthDetailsPage {\n data: NetWorthByTokensItem[];\n /** @nullable */\n endCursor?: string | null;\n hasNext?: boolean;\n hasPrev?: boolean;\n netWorth: string;\n requestedTimestamp: string;\n resolvedTimestamp: string;\n /** @nullable */\n startCursor?: string | null;\n walletAddress: string;\n}\n\n/**\n * Paginated wallet net-worth page (mirrors TS WalletNetWorthPage).\n */\nexport interface WalletNetWorthPage {\n currentTimestamp: string;\n data: NetWorthByTokensItem[];\n /** @nullable */\n endCursor?: string | null;\n hasNext?: boolean;\n hasPrev?: boolean;\n /** @nullable */\n startCursor?: string | null;\n totalValueInNative: string;\n totalValueInUsd: string;\n walletAddress: string;\n}\n\nexport type WalletNetWorthSummaryResponseWallets = { [key: string]: NetWorthSummaryValue };\n\nexport interface WalletNetWorthSummaryResponse {\n currentTimestamp: string;\n wallets: WalletNetWorthSummaryResponseWallets;\n}\n\n/**\n * Wallet PnL Summary (aggregated across all tokens for a given resolution)\n */\nexport interface WalletPnlSummary {\n avgProfitPerTradeInUsd: string;\n buyAmountInUsd: string;\n buys: string;\n losses: string;\n realizedProfitInUsd: string;\n realizedProfitRatio: string;\n resolution: string;\n sellAmountInUsd: string;\n sells: string;\n tokens: string;\n totalCostInUsd: string;\n totalProfitInUsd: string;\n totalProfitRatio: string;\n totalTrades: string;\n unrealizedProfitInUsd: string;\n unrealizedProfitRatio: string;\n /** @nullable */\n updatedAt?: string | null;\n walletAddress: string;\n winRate: string;\n wins: string;\n}\n\n/**\n * Wallet transfer\n */\nexport interface WalletTransfer {\n amount: string;\n /** @nullable */\n amountInUsd?: string | null;\n blockTimestamp: number;\n fromAddress: string;\n id: string;\n toAddress: string;\n tokenAddress: string;\n transactionSignature: string;\n transferType: string;\n}\n\nexport type WalletsMapResponseWallets = { [key: string]: WalletFirstTx };\n\nexport interface WalletsMapResponse {\n wallets: WalletsMapResponseWallets;\n}\n\n/**\n * Watchlist entity\n */\nexport interface Watchlist {\n /** List of watchlist items */\n items: WatchlistItem[];\n /** User ID or identifier */\n userId: string;\n}\n\n/**\n * Watchlist item\n */\nexport interface WatchlistItem {\n /** Chain identifier */\n chain: string;\n /** Wallet address being watched */\n walletAddress: string;\n}\n\n/**\n * Webhook event channel\n */\nexport type WebhookChannel = (typeof WebhookChannel)[keyof typeof WebhookChannel];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const WebhookChannel = {\n soltokenmigrated: \"sol.token.migrated\",\n soltokencreated: \"sol.token.created\",\n} as const;\n\n/**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\nexport type WebhookEndpointMetadata = { [key: string]: unknown } | null;\n\n/**\n * Webhook endpoint response\n */\nexport interface WebhookEndpoint {\n /**\n * DTO.ENDPOINT.CHANNELS\n * @nullable\n */\n channels?: WebhookChannel[] | null;\n /**\n * DTO.ENDPOINT.CREATED_AT\n * @nullable\n */\n createdAt?: string | null;\n /**\n * DTO.ENDPOINT.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * DTO.ENDPOINT.DISABLED\n * @nullable\n */\n disabled?: boolean | null;\n /**\n * DTO.ENDPOINT.FILTER\n * @nullable\n */\n filter?: string | null;\n /**\n * DTO.ENDPOINT.FILTER_TYPES\n * @nullable\n */\n filterTypes?: string[] | null;\n /** DTO.ENDPOINT.ID */\n id: string;\n /**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\n metadata?: WebhookEndpointMetadata;\n /**\n * DTO.ENDPOINT.RATE_LIMIT\n * @minimum 0\n * @nullable\n */\n rateLimit?: number | null;\n /**\n * DTO.ENDPOINT.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /** DTO.ENDPOINT.URL */\n url: string;\n}\n\n/**\n * DTO.DEX.IDENTIFIER\n */\nexport type SwapInputDex = (typeof SwapInputDex)[keyof typeof SwapInputDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapInputDex = {\n jupiter: \"jupiter\",\n kyberswap: \"kyberswap\",\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n moonshot: \"moonshot\",\n candy: \"candy\",\n launchpad: \"launchpad\",\n} as const;\n\n/**\n * DTO.DEX.SWAP.MODE\n */\nexport type SwapInputSwapMode = (typeof SwapInputSwapMode)[keyof typeof SwapInputSwapMode];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapInputSwapMode = {\n ExactIn: \"ExactIn\",\n ExactOut: \"ExactOut\",\n} as const;\n\nexport interface SwapInput {\n /** DTO.DEX.IDENTIFIER */\n dex: SwapInputDex;\n /**\n * DTO.DEX.WALLET\n * @minLength 8\n * @maxLength 64\n */\n userAddress: string;\n /** DTO.DEX.BASE.PRIORITY_FEE */\n priorityFee?: string;\n /** DTO.DEX.SWAP.POOL_ADDRESS */\n poolAddress?: string;\n /** DTO.DEX.SWAP.AMOUNT */\n amount: string;\n /** DTO.DEX.SWAP.MODE */\n swapMode: SwapInputSwapMode;\n /**\n * DTO.DEX.SWAP.SLIPPAGE\n * @minimum 0\n * @maximum 100\n */\n slippage: number;\n /** DTO.DEX.SWAP.INPUT_MINT */\n inputMint?: string;\n /** DTO.DEX.SWAP.OUTPUT_MINT */\n outputMint?: string;\n}\n\nexport interface SwapReply {\n /** DTO.DEX.SWAP.SERIALIZED_TX */\n serializedTx: string;\n /** DTO.DEX.SWAP.ELAPSED_TIME */\n elapsedTime: number;\n}\n\n/**\n * DTO.DEX.IDENTIFIER\n */\nexport type SwapRouteInputDex = (typeof SwapRouteInputDex)[keyof typeof SwapRouteInputDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapRouteInputDex = {\n jupiter: \"jupiter\",\n kyberswap: \"kyberswap\",\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n moonshot: \"moonshot\",\n candy: \"candy\",\n launchpad: \"launchpad\",\n} as const;\n\n/**\n * DTO.DEX.SWAP.MODE\n */\nexport type SwapRouteInputSwapMode =\n (typeof SwapRouteInputSwapMode)[keyof typeof SwapRouteInputSwapMode];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapRouteInputSwapMode = {\n ExactIn: \"ExactIn\",\n ExactOut: \"ExactOut\",\n} as const;\n\nexport interface SwapRouteInput {\n /** DTO.DEX.IDENTIFIER */\n dex: SwapRouteInputDex;\n /**\n * DTO.DEX.WALLET\n * @minLength 8\n * @maxLength 64\n */\n userAddress: string;\n /** DTO.DEX.BASE.PRIORITY_FEE */\n priorityFee?: string;\n /** DTO.DEX.SWAP.AMOUNT */\n amount: string;\n /** DTO.DEX.SWAP.MODE */\n swapMode: SwapRouteInputSwapMode;\n /**\n * DTO.DEX.SWAP.SLIPPAGE\n * @minimum 0\n * @maximum 100\n */\n slippage: number;\n /** DTO.DEX.SWAP.INPUT_MINT */\n inputMint?: string;\n /** DTO.DEX.SWAP.OUTPUT_MINT */\n outputMint?: string;\n /** DTO.DEX.SWAP.RECIPIENT_ADDRESS */\n recipientAddress?: string;\n /** DTO.DEX.SWAP.PERMIT */\n permit?: string;\n /** DTO.DEX.SWAP.DEADLINE */\n deadline?: number;\n /** DTO.DEX.BASE.TIP_FEE */\n tipFee?: string;\n /** DTO.DEX.BASE.IS_ANTI_MEV */\n isAntiMev?: boolean;\n /** DTO.DEX.SWAP.MAX_FEE_PER_GAS */\n maxFeePerGas?: string;\n /** DTO.DEX.SWAP.MAX_PRIORITY_FEE_PER_GAS */\n maxPriorityFeePerGas?: string;\n /** DTO.DEX.SWAP.GAS_PRICE */\n gasPrice?: string;\n /** DTO.DEX.SWAP.GAS_LIMIT */\n gasLimit?: string;\n}\n\n/**\n * DTO.DEX.SWAP.ROUTE_INFO\n */\nexport type SwapRouteResponseRouteInfo = { [key: string]: unknown };\n\nexport interface SwapRouteResponse {\n /** DTO.DEX.SWAP.ARGS */\n args: SwapRouteInput;\n /** DTO.DEX.SWAP.SERIALIZED_TX */\n serializedTx: string;\n /** DTO.DEX.SWAP.ROUTE_INFO */\n routeInfo: SwapRouteResponseRouteInfo;\n /** DTO.DEX.SWAP.ELAPSED_TIME */\n elapsedTime: number;\n}\n\nexport interface DexQuoteResponse {\n /** DTO.DEX.QUOTE.AMOUNT_OUT */\n amountOut?: string;\n /** DTO.DEX.QUOTE.MIN_AMOUNT_OUT */\n minAmountOut?: string;\n /** DTO.DEX.QUOTE.CURRENT_PRICE */\n currentPrice?: string;\n /** DTO.DEX.QUOTE.EXECUTION_PRICE */\n executionPrice?: string;\n /** DTO.DEX.QUOTE.PRICE_IMPACT */\n priceImpact?: string;\n /** DTO.DEX.QUOTE.FEE */\n fee?: string;\n}\n\n/**\n * DTO.DEX.IDENTIFIER\n */\nexport type CreateTokenInputDex = (typeof CreateTokenInputDex)[keyof typeof CreateTokenInputDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const CreateTokenInputDex = {\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n moonshot: \"moonshot\",\n candy: \"candy\",\n launchpad: \"launchpad\",\n} as const;\n\n/**\n * DTO.DEX.MINT.EXTRA\n */\nexport type CreateTokenInputExtra = { [key: string]: unknown };\n\nexport interface CreateTokenInput {\n /** DTO.DEX.IDENTIFIER */\n dex: CreateTokenInputDex;\n /**\n * DTO.DEX.WALLET\n * @minLength 8\n * @maxLength 64\n */\n userAddress: string;\n /** DTO.DEX.BASE.PRIORITY_FEE */\n priorityFee?: string;\n /**\n * DTO.DEX.MINT.NAME\n * @minLength 1\n * @maxLength 32\n */\n name: string;\n /**\n * DTO.DEX.MINT.SYMBOL\n * @minLength 1\n * @maxLength 10\n */\n symbol: string;\n /** DTO.DEX.MINT.URI */\n uri?: string;\n /** DTO.DEX.MINT.IMAGE */\n image?: string;\n /** DTO.DEX.MINT.EXTRA */\n extra?: CreateTokenInputExtra;\n}\n\nexport interface CreateTokenReply {\n /** DTO.DEX.CREATE_TOKEN.SERIALIZED_TX */\n serializedTx: string;\n /** DTO.DEX.CREATE_TOKEN.MINT_ADDRESS */\n mintAddress: string;\n}\n\n/**\n * DTO.TRANSACTION.SEND.SUBMIT_TYPE\n */\nexport type SendTxInputSubmitType =\n (typeof SendTxInputSubmitType)[keyof typeof SendTxInputSubmitType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SendTxInputSubmitType = {\n default: \"default\",\n priority: \"priority\",\n} as const;\n\n/**\n * DTO.TRANSACTION.SEND.OPTIONS\n */\nexport type SendTxInputOptions = { [key: string]: unknown };\n\nexport interface SendTxInput {\n /** DTO.TRANSACTION.SEND.SIGNED_TX */\n signedTx: string;\n /** DTO.TRANSACTION.SEND.SUBMIT_TYPE */\n submitType?: SendTxInputSubmitType;\n /** DTO.TRANSACTION.SEND.OPTIONS */\n options?: SendTxInputOptions;\n}\n\nexport interface SendTxResponse {\n /** DTO.TRANSACTION.SEND.SIGNATURE */\n signature: string;\n /** DTO.TRANSACTION.SEND.ELAPSED_TIME */\n elapsedTime: number;\n /** DTO.TRANSACTION.SEND.JOB_ID */\n jobId: string;\n}\n\nexport interface GasPriceResponse {\n /** Current gas price in wei (hex string) */\n gasPrice: string;\n /** Chain symbol */\n chain: string;\n}\n\nexport interface EstimateGasLimitInput {\n /** From address */\n from: string;\n /** To address */\n to: string;\n /** Transaction data (hex) */\n data: string;\n /** Value to send (in wei, hex string) */\n value?: string;\n}\n\nexport interface EstimateGasLimitResponse {\n /** Estimated gas limit (hex string) */\n gasLimit: string;\n /** Chain symbol */\n chain: string;\n}\n\n/**\n * DTO.JOB.RESULT\n */\nexport type JobDTOResult = { [key: string]: unknown };\n\nexport interface JobDTO {\n /** DTO.JOB.STATE */\n state: string;\n /** DTO.JOB.RESULT */\n result: JobDTOResult;\n}\n\n/**\n * DTO.JOB.STREAMING.DATA\n */\nexport type JobStreamingDTOData = { [key: string]: unknown };\n\nexport interface JobStreamingDTO {\n /** DTO.JOB.STREAMING.ID */\n id: number;\n /** DTO.JOB.STREAMING.DATA */\n data: JobStreamingDTOData;\n}\n\nexport interface PresignResponseModel {\n /** Presigned upload URL */\n presignUrl: string;\n}\n\nexport interface WatchlistAddResponseModel {\n success: boolean;\n}\n\nexport type ListDexParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.DEX.LIST.CHAINS\n */\n chains?: string[];\n /**\n * DTO.DEX.LIST.DEX_PROGRAM\n */\n dexProgram?: string;\n};\n\nexport type QuoteParams = {\n /**\n * DTO.DEX.QUOTE.DEX\n */\n dex: QuoteDex;\n /**\n * DTO.DEX.QUOTE.AMOUNT\n */\n amount: string;\n /**\n * DTO.DEX.QUOTE.INPUT_MINT\n */\n inputMint: string;\n /**\n * DTO.DEX.QUOTE.OUTPUT_MINT\n */\n outputMint: string;\n /**\n * DTO.DEX.QUOTE.EXACT_IN\n */\n exactIn?: boolean;\n /**\n * DTO.DEX.QUOTE.SLIPPAGE\n */\n slippage: number;\n};\n\nexport type QuoteDex = (typeof QuoteDex)[keyof typeof QuoteDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const QuoteDex = {\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n} as const;\n\nexport type GetDexpoolSnapshotsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.DEXPOOL.SNAPSHOTS.TIME\n */\n time?: number;\n};\n\nexport type GetFinalStretchTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetHotTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetMigratedTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetNewTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetStocksTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetRedpacketsParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.RED_PACKET.CREATOR\n */\n creator?: string;\n /**\n * DTO.RED_PACKET.CHAIN\n */\n chain?: ChainSymbol;\n};\n\nexport type GetClaimsByAddressParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetRedpacketsByAddressParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetClaimsParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type SearchParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.SEARCH.CHAINS\n */\n chains?: string[];\n /**\n * DTO.TOKEN.SEARCH.QUERY\n */\n q?: string;\n /**\n * DTO.TOKEN.SEARCH.SORT_DIRECTION\n */\n sort?: SortDirection;\n /**\n * DTO.TOKEN.SEARCH.PROTOCOLS\n */\n protocols?: string[];\n /**\n * DTO.TOKEN.SEARCH.SORT_BY\n */\n sortBy?: SearchSortBy;\n /**\n * DTO.TOKEN.SEARCH.MODE\n */\n mode?: SearchMode;\n};\n\nexport type GetDevTokensParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type ListTokenParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.LIST.SORT_DIRECTION\n */\n sort?: SortDirection;\n /**\n * DTO.TOKEN.LIST.QUERY.SORT_BY\n */\n sortBy?: TokenListSortField;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_VOLUME_IN_USD\n */\n min_h24_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_VOLUME_IN_USD\n */\n max_h24_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_PRICE_CHANGE_RATIO\n */\n min_h24_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_PRICE_CHANGE_RATIO\n */\n max_h24_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_BUYS\n */\n min_h24_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_BUYS\n */\n max_h24_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_SELLS\n */\n min_h24_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_SELLS\n */\n max_h24_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_TRADES\n */\n min_h24_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_TRADES\n */\n max_h24_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_BUYERS\n */\n min_h24_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_BUYERS\n */\n max_h24_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_SELLERS\n */\n min_h24_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_SELLERS\n */\n max_h24_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_BUY_VOLUME_IN_USD\n */\n min_h24_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_BUY_VOLUME_IN_USD\n */\n max_h24_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_SELL_VOLUME_IN_USD\n */\n min_h24_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_SELL_VOLUME_IN_USD\n */\n max_h24_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_VOLUME_IN_USD\n */\n min_h4_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_VOLUME_IN_USD\n */\n max_h4_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_PRICE_CHANGE_RATIO\n */\n min_h4_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_PRICE_CHANGE_RATIO\n */\n max_h4_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_BUYS\n */\n min_h4_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_BUYS\n */\n max_h4_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_SELLS\n */\n min_h4_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_SELLS\n */\n max_h4_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_TRADES\n */\n min_h4_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_TRADES\n */\n max_h4_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_BUYERS\n */\n min_h4_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_BUYERS\n */\n max_h4_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_SELLERS\n */\n min_h4_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_SELLERS\n */\n max_h4_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_BUY_VOLUME_IN_USD\n */\n min_h4_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_BUY_VOLUME_IN_USD\n */\n max_h4_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_SELL_VOLUME_IN_USD\n */\n min_h4_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_SELL_VOLUME_IN_USD\n */\n max_h4_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_VOLUME_IN_USD\n */\n min_h1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_VOLUME_IN_USD\n */\n max_h1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_PRICE_CHANGE_RATIO\n */\n min_h1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_PRICE_CHANGE_RATIO\n */\n max_h1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_BUYS\n */\n min_h1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_BUYS\n */\n max_h1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_SELLS\n */\n min_h1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_SELLS\n */\n max_h1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_TRADES\n */\n min_h1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_TRADES\n */\n max_h1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_BUYERS\n */\n min_h1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_BUYERS\n */\n max_h1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_SELLERS\n */\n min_h1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_SELLERS\n */\n max_h1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_BUY_VOLUME_IN_USD\n */\n min_h1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_BUY_VOLUME_IN_USD\n */\n max_h1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_SELL_VOLUME_IN_USD\n */\n min_h1_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_SELL_VOLUME_IN_USD\n */\n max_h1_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_VOLUME_IN_USD\n */\n min_m30_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_VOLUME_IN_USD\n */\n max_m30_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_PRICE_CHANGE_RATIO\n */\n min_m30_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_PRICE_CHANGE_RATIO\n */\n max_m30_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_BUYS\n */\n min_m30_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_BUYS\n */\n max_m30_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_SELLS\n */\n min_m30_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_SELLS\n */\n max_m30_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_TRADES\n */\n min_m30_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_TRADES\n */\n max_m30_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_BUYERS\n */\n min_m30_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_BUYERS\n */\n max_m30_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_SELLERS\n */\n min_m30_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_SELLERS\n */\n max_m30_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_BUY_VOLUME_IN_USD\n */\n min_m30_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_BUY_VOLUME_IN_USD\n */\n max_m30_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_SELL_VOLUME_IN_USD\n */\n min_m30_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_SELL_VOLUME_IN_USD\n */\n max_m30_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_VOLUME_IN_USD\n */\n min_m15_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_VOLUME_IN_USD\n */\n max_m15_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_PRICE_CHANGE_RATIO\n */\n min_m15_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_PRICE_CHANGE_RATIO\n */\n max_m15_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_BUYS\n */\n min_m15_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_BUYS\n */\n max_m15_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_SELLS\n */\n min_m15_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_SELLS\n */\n max_m15_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_TRADES\n */\n min_m15_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_TRADES\n */\n max_m15_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_BUYERS\n */\n min_m15_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_BUYERS\n */\n max_m15_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_SELLERS\n */\n min_m15_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_SELLERS\n */\n max_m15_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_BUY_VOLUME_IN_USD\n */\n min_m15_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_BUY_VOLUME_IN_USD\n */\n max_m15_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_SELL_VOLUME_IN_USD\n */\n min_m15_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_SELL_VOLUME_IN_USD\n */\n max_m15_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_VOLUME_IN_USD\n */\n min_m5_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_VOLUME_IN_USD\n */\n max_m5_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_PRICE_CHANGE_RATIO\n */\n min_m5_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_PRICE_CHANGE_RATIO\n */\n max_m5_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_BUYS\n */\n min_m5_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_BUYS\n */\n max_m5_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_SELLS\n */\n min_m5_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_SELLS\n */\n max_m5_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_TRADES\n */\n min_m5_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_TRADES\n */\n max_m5_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_BUYERS\n */\n min_m5_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_BUYERS\n */\n max_m5_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_SELLERS\n */\n min_m5_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_SELLERS\n */\n max_m5_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_BUY_VOLUME_IN_USD\n */\n min_m5_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_BUY_VOLUME_IN_USD\n */\n max_m5_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_SELL_VOLUME_IN_USD\n */\n min_m5_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_SELL_VOLUME_IN_USD\n */\n max_m5_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_VOLUME_IN_USD\n */\n min_m1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_VOLUME_IN_USD\n */\n max_m1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_PRICE_CHANGE_RATIO\n */\n min_m1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_PRICE_CHANGE_RATIO\n */\n max_m1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_BUYS\n */\n min_m1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_BUYS\n */\n max_m1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_SELLS\n */\n min_m1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_SELLS\n */\n max_m1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_TRADES\n */\n min_m1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_TRADES\n */\n max_m1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_BUYERS\n */\n min_m1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_BUYERS\n */\n max_m1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_SELLERS\n */\n min_m1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_SELLERS\n */\n max_m1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_BUY_VOLUME_IN_USD\n */\n min_m1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_BUY_VOLUME_IN_USD\n */\n max_m1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_SELL_VOLUME_IN_USD\n */\n min_m1_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_SELL_VOLUME_IN_USD\n */\n max_m1_sell_volume_in_usd?: string;\n};\n\nexport type GetMarketDataMultiParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetMarketDataMulti200 = {\n [key: string]: {\n /** @nullable */\n bluechipHoldingsRatio?: string | null;\n /** @nullable */\n bluechipTotalHolders?: string | null;\n /** @nullable */\n bluechipTotalHoldings?: string | null;\n /** @nullable */\n bundleHoldingsRatio?: string | null;\n /** @nullable */\n bundleTotalHolders?: string | null;\n /** @nullable */\n bundleTotalHoldings?: string | null;\n /** @nullable */\n circulatingSupply?: string | null;\n /** @nullable */\n completionRatio?: string | null;\n /** @nullable */\n devHoldingsRatio?: string | null;\n /** @nullable */\n devTotalHolders?: string | null;\n /** @nullable */\n devTotalHoldings?: string | null;\n /** @nullable */\n fdvInSol?: string | null;\n /** @nullable */\n fdvInUsd?: string | null;\n /** @nullable */\n freshHoldingsRatio?: string | null;\n /** @nullable */\n freshTotalHolders?: string | null;\n /** @nullable */\n freshTotalHoldings?: string | null;\n /** @nullable */\n holders?: string | null;\n /** @nullable */\n insiderHoldingsRatio?: string | null;\n /** @nullable */\n insiderTotalHolders?: string | null;\n /** @nullable */\n insiderTotalHoldings?: string | null;\n /** @nullable */\n kolHoldingsRatio?: string | null;\n /** @nullable */\n kolTotalHolders?: string | null;\n /** @nullable */\n kolTotalHoldings?: string | null;\n /** @nullable */\n marketCapInSol?: string | null;\n /** @nullable */\n marketCapInUsd?: string | null;\n /** @nullable */\n maxPoolTvlInSol?: string | null;\n /** @nullable */\n maxPoolTvlInUsd?: string | null;\n /** @nullable */\n priceInSol?: string | null;\n /** @nullable */\n priceInUsd?: string | null;\n /** @nullable */\n proHoldingsRatio?: string | null;\n /** @nullable */\n proTotalHolders?: string | null;\n /** @nullable */\n proTotalHoldings?: string | null;\n /** @nullable */\n sandwishHoldingsRatio?: string | null;\n /** @nullable */\n sandwishTotalHolders?: string | null;\n /** @nullable */\n sandwishTotalHoldings?: string | null;\n /** @nullable */\n sniperHoldingsRatio?: string | null;\n /** @nullable */\n sniperTotalHolders?: string | null;\n /** @nullable */\n sniperTotalHoldings?: string | null;\n /** @nullable */\n top100HoldingsRatio?: string | null;\n /** @nullable */\n top100TotalHoldings?: string | null;\n /** @nullable */\n top10HoldingsRatio?: string | null;\n /** @nullable */\n top10TotalHoldings?: string | null;\n /** @nullable */\n top50HoldingsRatio?: string | null;\n /** @nullable */\n top50TotalHoldings?: string | null;\n /** @nullable */\n totalSupply?: string | null;\n /** @nullable */\n totalTvlInSol?: string | null;\n /** @nullable */\n totalTvlInUsd?: string | null;\n };\n};\n\nexport type GetMetadataMultiParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetMetadataMulti200 = {\n [key: string]: {\n address: string;\n chain: string;\n /** @nullable */\n coingeckoCoinId?: string | null;\n decimals: string;\n /** @nullable */\n description?: string | null;\n /** @nullable */\n devLastTokenCreatedAt?: string | null;\n /** @nullable */\n devTotalTokens?: string | null;\n extra?: TokenExtra;\n /** @nullable */\n imageUrl?: string | null;\n /** @nullable */\n metadataAddress?: string | null;\n name: string;\n socialMedias?: TokenSocialMedias;\n symbol: string;\n /** @nullable */\n tokenCreatedAt?: number | null;\n /** @nullable */\n tokenCreatedBlockHeight?: string | null;\n /** @nullable */\n tokenCreatedSlot?: string | null;\n /** @nullable */\n tokenCreatedTxSignature?: string | null;\n tokenCreators?: TokenCreator[];\n /** @nullable */\n updatedAt?: string | null;\n /** @nullable */\n uri?: string | null;\n };\n};\n\nexport type GetTokensParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY (JSON array of filter conditions)\n */\n filterBy?: string;\n};\n\nexport type GetPairCandlesParams = {\n /**\n * DTO.CANDLE.RESOLUTION\n */\n resolution: Resolution;\n /**\n * DTO.CANDLE.PRICE_TYPE\n */\n priceType?: PriceType;\n /**\n * DTO.CANDLE.FROM\n */\n from?: number;\n /**\n * DTO.CANDLE.TO\n */\n to?: number;\n /**\n * DTO.TOKEN.CANDLE.LIMIT\n */\n limit?: number;\n};\n\nexport type GetPoolCandlesParams = {\n /**\n * DTO.CANDLE.RESOLUTION\n */\n resolution: Resolution;\n /**\n * DTO.CANDLE.PRICE_TYPE\n */\n priceType?: PriceType;\n /**\n * DTO.CANDLE.FROM\n */\n from?: number;\n /**\n * DTO.CANDLE.TO\n */\n to?: number;\n /**\n * DTO.TOKEN.CANDLE.LIMIT\n */\n limit?: number;\n};\n\nexport type GetStatsMultiParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\n/**\n * Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields.\n */\nexport type GetStatsMulti200Periods = { [key: string]: TokenTradeStatPeriod };\n\nexport type GetStatsMulti200 = {\n [key: string]: {\n address: string;\n /** Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields. */\n periods: GetStatsMulti200Periods;\n };\n};\n\nexport type GetCandlesParams = {\n /**\n * DTO.CANDLE.RESOLUTION\n */\n resolution: Resolution;\n /**\n * DTO.CANDLE.PRICE_TYPE\n */\n priceType?: PriceType;\n /**\n * DTO.CANDLE.FROM\n */\n from?: number;\n /**\n * DTO.CANDLE.TO\n */\n to?: number;\n /**\n * DTO.TOKEN.CANDLE.LIMIT\n */\n limit?: number;\n};\n\nexport type GetHoldersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetHoldersMultiParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n};\n\nexport type GetTokenLiquiditySnapshotsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.LIQUIDITY_SNAPSHOTS.TIME\n */\n time?: number;\n};\n\nexport type GetMintAndBurnParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.MINT_BURN.TYPE\n */\n type?: MintBurnType;\n};\n\nexport type GetPoolsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.POOLS.SORT_BY\n */\n sortBy?: PoolSortField;\n /**\n * DTO.TOKEN.POOLS.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.TOKEN.POOLS.MIN_TVL_IN_SOL\n */\n minTvlInSol?: string;\n /**\n * DTO.TOKEN.POOLS.MAX_TVL_IN_SOL\n */\n maxTvlInSol?: string;\n /**\n * DTO.TOKEN.POOLS.MIN_TVL_IN_USD\n */\n minTvlInUsd?: string;\n /**\n * DTO.TOKEN.POOLS.MAX_TVL_IN_USD\n */\n maxTvlInUsd?: string;\n};\n\nexport type GetPriceByTimeParams = {\n /**\n * DTO.TOKEN.PRICE.TIMESTAMP\n */\n timestamp: number;\n};\n\nexport type GetPricesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTokenTradersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTokenTransferTotalParams = {\n /**\n * DTO.TOKEN.TRANSFER.QUERY.BEFORE_TIMESTAMP\n */\n beforeTimestamp?: number;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.AFTER_TIMESTAMP\n */\n afterTimestamp?: number;\n};\n\nexport type GetTokenTransfersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.FROM_TIMESTAMP.DESCRIPTION\n */\n fromTimestamp?: number;\n /**\n * GLOBAL.TO_TIMESTAMP.DESCRIPTION\n */\n toTimestamp?: number;\n};\n\nexport type GetTradesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * GLOBAL.WALLETADDRESS.DESCRIPTION\n */\n walletAddress?: string;\n /**\n * GLOBAL.POOLADDRESS.DESCRIPTION\n */\n poolAddress?: string;\n /**\n * DTO.TRADE.BEFORE_TIMESTAMP\n */\n beforeTimestamp?: number;\n /**\n * DTO.TRADE.AFTER_TIMESTAMP\n */\n afterTimestamp?: number;\n /**\n * DTO.TRADE.BEFORE_BLOCK_HEIGHT\n */\n beforeBlockHeight?: number;\n /**\n * DTO.TRADE.AFTER_BLOCK_HEIGHT\n */\n afterBlockHeight?: number;\n /**\n * DTO.TRADE.TRANSACTIONS_SIGNATURE\n */\n transactionsSignature?: string;\n /**\n * DTO.TRADE.TYPE\n */\n type?: TradeType;\n};\n\nexport type GetActivitiesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * GLOBAL.WALLETADDRESS.DESCRIPTION\n */\n walletAddress?: string;\n /**\n * GLOBAL.POOLADDRESS.DESCRIPTION\n */\n poolAddress?: string;\n /**\n * DTO.TRADE.BEFORE_TIMESTAMP\n */\n beforeTimestamp?: number;\n /**\n * DTO.TRADE.AFTER_TIMESTAMP\n */\n afterTimestamp?: number;\n /**\n * DTO.TRADE.BEFORE_BLOCK_HEIGHT\n */\n beforeBlockHeight?: number;\n /**\n * DTO.TRADE.AFTER_BLOCK_HEIGHT\n */\n afterBlockHeight?: number;\n /**\n * DTO.TRADE.TRANSACTIONS_SIGNATURE\n */\n transactionsSignature?: string;\n /**\n * DTO.TRADE.ACTIVITY_TYPE\n */\n type?: ActivityType;\n};\n\nexport type GetTopTradersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress: string;\n /**\n * DTO.TRADE.TIME_FRAME\n */\n timeFrame?: TimeFrame;\n /**\n * DTO.TRADE.SORT_TYPE\n */\n sortType?: SortDirection;\n /**\n * DTO.TRADE.SORT_BY\n */\n sortBy?: TopTraderSortBy;\n};\n\nexport type GetTraderGainersLosersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TRADER.GAINERS_LOSERS.QUERY.RESOLUTION\n */\n resolution?: TraderPnlResolution;\n /**\n * DTO.TRADER.GAINERS_LOSERS.QUERY.SORT_TYPE\n */\n sortType?: SortDirection;\n};\n\nexport type GetWalletFirstTxParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n};\n\nexport type GetNetWorthSummaryParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n};\n\nexport type GetPnlByWalletParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress: string;\n};\n\nexport type GetBalanceUpdatesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * DTO.WALLET.BALANCE_UPDATES.TIME_FROM\n */\n timeFrom?: number;\n /**\n * DTO.WALLET.BALANCE_UPDATES.TIME_TO\n */\n timeTo?: number;\n /**\n * DTO.WALLET.BALANCE_UPDATES.TYPE\n */\n type?: BalanceTokenType;\n /**\n * DTO.WALLET.BALANCE_UPDATES.CHANGE_TYPE\n */\n changeType?: BalanceChangeType;\n};\n\nexport type GetNetWorthParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetNetWorthChartParams = {\n /**\n * DTO.WALLET.NET_WORTH_CHART.HOURS (1-720, default 24)\n */\n hours?: number;\n};\n\nexport type GetNetWorthDetailsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.WALLET.NET_WORTH_DETAILS.HOURS (0=realtime, 1-720=historical snapshot, default 0)\n */\n hours?: number;\n};\n\nexport type GetNetWorthByTokensParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetPnlParams = {\n /**\n * DTO.WALLET.PNL_SUMMARY.QUERY.RESOLUTION\n */\n resolution?: PnlResolution;\n};\n\nexport type GetPnlByTokenParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetPnlDetailsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTokensBalanceParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetWalletTransferTotalParams = {\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.AFTER_TIMESTAMP\n */\n fromTimestamp?: number;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.BEFORE_TIMESTAMP\n */\n toTimestamp?: number;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT\n */\n minTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT\n */\n maxTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT_IN_USD\n */\n minTokenAmountInUsd?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT_IN_USD\n */\n maxTokenAmountInUsd?: string;\n};\n\nexport type GetWalletTransfersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.AFTER_TIMESTAMP\n */\n fromTimestamp?: number;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.BEFORE_TIMESTAMP\n */\n toTimestamp?: number;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT\n */\n minTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT\n */\n maxTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT_IN_USD\n */\n minTokenAmountInUsd?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT_IN_USD\n */\n maxTokenAmountInUsd?: string;\n};\n\nexport type ListEndpointsParams = {\n /**\n * DTO.ENDPOINT.LIMIT\n */\n limit?: number;\n /**\n * DTO.ENDPOINT.ITERATOR\n */\n iterator?: string;\n /**\n * DTO.ENDPOINT.ORDER\n */\n order?: EndpointOrder;\n};\n"],"mappings":"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","names":["WsTokenActivityType","WsChannelType","WsMetricType","WsRankingType","WsDex"]}
1
+ {"version":3,"sources":["../src/chainstream.ts","../src/openapi-client/chainstreamApiClient.ts","../src/stream/stream.ts","../src/stream/stream.fields.ts","../src/stream/stream.model.ts","../src/openapi-client/generated/blockchain/blockchain.ts","../src/openapi-client/generated/dex/dex.ts","../src/openapi-client/generated/dex-pool/dex-pool.ts","../src/openapi-client/generated/ipfs/ipfs.ts","../src/openapi-client/generated/job/job.ts","../src/openapi-client/generated/kyt/kyt.ts","../src/openapi-client/generated/ranking/ranking.ts","../src/openapi-client/generated/red-packet/red-packet.ts","../src/openapi-client/generated/token/token.ts","../src/openapi-client/generated/trade/trade.ts","../src/openapi-client/generated/transaction/transaction.ts","../src/openapi-client/generated/wallet/wallet.ts","../src/openapi-client/generated/watchlist/watchlist.ts","../src/openapi-client/generated/webhook/webhook.ts","../src/openapi-client/generated/chainStreamAPI.schemas.ts"],"sourcesContent":["import { EventSourcePolyfill } from \"event-source-polyfill\";\nimport { configure } from \"./openapi-client/chainstreamApiClient.js\";\nimport { StreamApi } from \"./stream/index.js\";\n\n// Import all API modules\nimport * as blockchainApi from \"./openapi-client/generated/blockchain/blockchain.js\";\nimport * as dexApi from \"./openapi-client/generated/dex/dex.js\";\nimport * as dexPoolApi from \"./openapi-client/generated/dex-pool/dex-pool.js\";\nimport * as ipfsApi from \"./openapi-client/generated/ipfs/ipfs.js\";\nimport * as jobApi from \"./openapi-client/generated/job/job.js\";\nimport * as kytApi from \"./openapi-client/generated/kyt/kyt.js\";\nimport * as rankingApi from \"./openapi-client/generated/ranking/ranking.js\";\nimport * as redPacketApi from \"./openapi-client/generated/red-packet/red-packet.js\";\nimport * as tokenApi from \"./openapi-client/generated/token/token.js\";\nimport * as tradeApi from \"./openapi-client/generated/trade/trade.js\";\nimport * as transactionApi from \"./openapi-client/generated/transaction/transaction.js\";\nimport * as walletApi from \"./openapi-client/generated/wallet/wallet.js\";\nimport * as watchlistApi from \"./openapi-client/generated/watchlist/watchlist.js\";\nimport * as webhookApi from \"./openapi-client/generated/webhook/webhook.js\";\n\nexport interface TokenProvider {\n getToken(): Promise<string> | string;\n}\n\nexport interface ChainStreamRequestContext {\n baseUrl: string;\n streamUrl: string;\n accessToken: string | TokenProvider;\n}\n\nexport interface ChainStreamClientOptions {\n debug?: boolean;\n serverUrl?: string;\n streamUrl?: string;\n /**\n * Whether to automatically connect to WebSocket on initialization.\n * Default: false\n *\n * If set to true, WebSocket will connect automatically.\n * If false or not set, you need to manually call `client.stream.connect()` when needed.\n */\n autoConnectWebSocket?: boolean;\n}\n\nexport class ChainStreamClient {\n public readonly requestCtx: ChainStreamRequestContext;\n\n // WebSocket streaming client\n public readonly stream: StreamApi;\n\n // REST API modules\n public readonly blockchain: typeof blockchainApi;\n public readonly dex: typeof dexApi;\n public readonly dexpool: typeof dexPoolApi;\n public readonly ipfs: typeof ipfsApi;\n public readonly job: typeof jobApi;\n public readonly kyt: typeof kytApi;\n public readonly ranking: typeof rankingApi;\n public readonly redPacket: typeof redPacketApi;\n public readonly token: typeof tokenApi;\n public readonly trade: typeof tradeApi;\n public readonly transaction: typeof transactionApi;\n public readonly wallet: typeof walletApi;\n public readonly watchlist: typeof watchlistApi;\n public readonly webhook: typeof webhookApi;\n\n public constructor(accessToken: string | TokenProvider, options: ChainStreamClientOptions = {}) {\n const baseUrl: string = options.serverUrl ?? \"https://api.chainstream.io\";\n const streamUrl: string =\n options.streamUrl ?? \"wss://realtime-dex.chainstream.io/connection/websocket\";\n\n this.requestCtx = { baseUrl, streamUrl, accessToken };\n\n // Configure the API client with authentication\n configure({\n accessToken,\n basePath: baseUrl,\n debugging: options.debug,\n });\n\n // Assign API modules\n this.blockchain = blockchainApi;\n this.dex = dexApi;\n this.dexpool = dexPoolApi;\n this.ipfs = ipfsApi;\n this.job = jobApi;\n this.kyt = kytApi;\n this.ranking = rankingApi;\n this.redPacket = redPacketApi;\n this.token = tokenApi;\n this.trade = tradeApi;\n this.transaction = transactionApi;\n this.wallet = walletApi;\n this.watchlist = watchlistApi;\n this.webhook = webhookApi;\n\n // Initialize WebSocket streaming client\n this.stream = new StreamApi(this.requestCtx);\n\n // Only auto-connect WebSocket if explicitly enabled\n if (options.autoConnectWebSocket === true) {\n this.stream.connect();\n }\n }\n\n /**\n * Wait for a job to complete using Server-Sent Events (SSE)\n * @param jobId - The job ID to wait for\n * @param timeout - Timeout in milliseconds (default: 60000)\n * @returns Promise that resolves with the job result\n */\n async waitForJob<T>(jobId: string, timeout = 60000): Promise<T> {\n const accessToken =\n typeof this.requestCtx.accessToken === \"string\"\n ? this.requestCtx.accessToken\n : await this.requestCtx.accessToken.getToken();\n\n return new Promise((resolve, reject) => {\n const sse = new EventSourcePolyfill(`${this.requestCtx.baseUrl}/v2/job/${jobId}/streaming`, {\n headers: {\n Authorization: `Bearer ${accessToken}`,\n },\n });\n\n const timeoutId = setTimeout(() => {\n sse.close();\n reject(new Error(`Job ${jobId} timed out after ${timeout}ms`));\n }, timeout);\n\n sse.onmessage = event => {\n try {\n console.log(\"event.data: \", event.data);\n const data = JSON.parse(event.data as string);\n\n if (data.status === \"pending\") return;\n\n clearTimeout(timeoutId);\n sse.close();\n\n if (data.status === \"error\") {\n reject(new Error(data.error || data.message || \"Unknown error\"));\n } else if (data.status === \"failed\") {\n reject(new Error(data.error || \"Job failed\"));\n } else if (data.status === \"completed\") {\n if (data.success === false) {\n reject(new Error(data.error || \"Transaction failed\"));\n } else {\n resolve(data as T);\n }\n } else {\n reject(new Error(`Unexpected job status: ${data.status}`));\n }\n } catch {\n clearTimeout(timeoutId);\n sse.close();\n reject(new Error(\"Error parsing event data\"));\n }\n };\n\n sse.onopen = () => {\n console.log(\"SSE connection opened\");\n };\n\n sse.onerror = error => {\n const errorEvent = error as Event & { message?: string };\n if (errorEvent.message?.includes(\"No activity within\")) {\n console.log(\"SSE reconnecting due to inactivity...\");\n return;\n }\n\n clearTimeout(timeoutId);\n sse.close();\n reject(new Error(`Error in SSE connection: ${error}`));\n };\n });\n }\n}\n\nexport interface PostOptions {\n idempotencyKey?: string;\n}\n","import Axios, { AxiosInstance, AxiosRequestConfig } from \"axios\";\nimport axiosRetry, { exponentialDelay } from \"axios-retry\";\n\nimport type { TokenProvider } from \"../chainstream.js\";\n\n/**\n * The options for the ChainStream API client.\n */\nexport type ChainStreamApiOptions = {\n /**\n * The access token for authentication.\n * Can be a string or a TokenProvider that dynamically provides tokens.\n */\n accessToken: string | TokenProvider;\n\n /** The base path for the API. Defaults to https://api.chainstream.io */\n basePath?: string;\n\n /** If true, logs API requests and responses to the console. */\n debugging?: boolean;\n\n /** The source for the API request, used for analytics. */\n source?: string;\n\n /** The version of the source for the API request, used for analytics. */\n sourceVersion?: string;\n};\n\nlet axiosInstance: AxiosInstance;\nlet currentOptions: ChainStreamApiOptions | undefined = undefined;\n\n/**\n * Configures the ChainStream API client with the given options.\n *\n * @param {ChainStreamApiOptions} options - The ChainStream API options.\n */\nexport const configure = (options: ChainStreamApiOptions) => {\n const baseURL = options.basePath || \"https://api.chainstream.io\";\n\n currentOptions = {\n ...options,\n basePath: baseURL,\n };\n\n axiosInstance = Axios.create({\n baseURL,\n });\n\n axiosRetry(axiosInstance, {\n retryDelay: exponentialDelay,\n });\n\n // Add request interceptor for authentication\n axiosInstance.interceptors.request.use(async config => {\n const token =\n typeof options.accessToken === \"string\"\n ? options.accessToken\n : await options.accessToken.getToken();\n\n config.headers.Authorization = `Bearer ${token}`;\n config.headers[\"Content-Type\"] = \"application/json\";\n\n if (options.source) {\n config.headers[\"X-Source\"] = options.source;\n }\n if (options.sourceVersion) {\n config.headers[\"X-Source-Version\"] = options.sourceVersion;\n }\n\n if (options.debugging) {\n console.log(`[ChainStream API] ${config.method?.toUpperCase()} ${config.url}`);\n }\n\n return config;\n });\n\n // Add response interceptor for debugging\n if (options.debugging) {\n axiosInstance.interceptors.response.use(\n response => {\n console.log(`[ChainStream API] Response:`, response.status, response.data);\n return response;\n },\n error => {\n console.error(`[ChainStream API] Error:`, error.response?.status, error.response?.data);\n return Promise.reject(error);\n },\n );\n }\n};\n\n/**\n * Adds an idempotency key to request config if provided\n *\n * @param config - The Axios request configuration.\n * @param idempotencyKey - The idempotency key.\n * @returns The Axios request configuration with the idempotency key.\n */\nconst addIdempotencyKey = (\n config: AxiosRequestConfig,\n idempotencyKey?: string,\n): AxiosRequestConfig => {\n if (!idempotencyKey) {\n return config;\n }\n\n return {\n ...config,\n headers: {\n ...(config.headers || {}),\n \"X-Idempotency-Key\": idempotencyKey,\n },\n };\n};\n\n/**\n * The ChainStream API client function that handles authentication and error handling.\n *\n * @param {AxiosRequestConfig} config - The Axios request configuration.\n * @param idempotencyKey - Optional idempotency key.\n * @returns {Promise<T>} A promise that resolves to the response data.\n * @throws {Error} If the request fails.\n */\nexport const chainstreamApiClient = async <T>(\n config: AxiosRequestConfig,\n idempotencyKey?: string,\n): Promise<T> => {\n if (!axiosInstance) {\n throw new Error(\"ChainStream API client not configured. Call configure() first.\");\n }\n\n if (!config.url || config.url === \"\") {\n throw new Error(\"AxiosRequestConfig URL is empty.\");\n }\n\n if (!config.method || config.method === \"\") {\n throw new Error(\"AxiosRequestConfig method is empty.\");\n }\n\n // Add idempotency key to the request headers if provided\n const configWithIdempotencyKey = addIdempotencyKey(config, idempotencyKey);\n\n try {\n const response = await axiosInstance(configWithIdempotencyKey);\n return response.data as T;\n } catch (error) {\n // eslint-disable-next-line import/no-named-as-default-member\n if (Axios.isAxiosError(error) && error.response) {\n const statusCode = error.response.status;\n const responseData = error.response.data;\n\n throw new Error(\n `ChainStream API error (${statusCode}): ${\n typeof responseData === \"string\" ? responseData : JSON.stringify(responseData)\n }`,\n );\n }\n\n throw error;\n }\n};\n\n/**\n * Get the current configuration\n */\nexport const getConfig = () => currentOptions;\n","import { Centrifuge, ConnectionTokenContext } from \"@chainstream-io/centrifuge\";\nimport { ChainStreamRequestContext } from \"../chainstream.js\";\nimport { Resolution } from \"../openapi-client/index.js\";\nimport {\n WsDexPoolBalance,\n WsDexProtocol,\n WsNewToken,\n WsTokenMetadata,\n WsTokenHolder,\n WsTokenStat,\n WsTokenLiquidity,\n WsTokenMaxLiquidity,\n WsTokenTotalLiquidity,\n WsSocialMedia,\n WsWalletBalance,\n WsTokenSupply,\n WsWalletPnl,\n WsChannelType,\n WsCandle,\n WsPriceType,\n WsTradeActivity,\n WsWalletTokenPnl,\n WsRankingType,\n WsDex,\n WsRankingTokenList,\n WsTokenBondingCurve,\n} from \"./stream.model.js\";\nimport { replaceFilterFields } from \"./stream.fields.js\";\n\nexport interface Unsubscribable {\n unsubscribe(): void;\n}\n\nexport class StreamApi {\n private realtimeClient!: Centrifuge;\n private listenersMap: Map<string, Set<(data: unknown) => void>>;\n private context: ChainStreamRequestContext;\n private initPromise: Promise<void> | null = null;\n\n constructor(context: ChainStreamRequestContext) {\n this.context = context;\n this.listenersMap = new Map();\n }\n\n /**\n * Initialize Centrifuge client with current token\n * This is called lazily when connect() is called\n */\n private async initClient(): Promise<void> {\n if (this.realtimeClient) {\n return;\n }\n\n // Get initial token for URL\n const token = await this.getTokenValue();\n const realtimeEndpoint = this.buildWsUrl(this.context.streamUrl, token);\n\n this.realtimeClient = new Centrifuge(realtimeEndpoint, {\n getToken: async (_ctx: ConnectionTokenContext) => {\n return this.getTokenValue();\n },\n });\n\n this.realtimeClient\n .on(\"connected\", () => {\n console.log(\"[streaming] connected\");\n })\n .on(\"disconnected\", ctx => {\n console.warn(\"[streaming] disconnected\", ctx);\n })\n .on(\"error\", err => {\n console.error(\"[streaming] error: \", err);\n });\n }\n\n /**\n * Wait for initialization to complete\n * If not initialized, auto-connect first\n */\n private async ensureInitialized(): Promise<void> {\n if (!this.initPromise) {\n // Auto-connect if not initialized\n this.connect();\n }\n await this.initPromise;\n }\n\n /**\n * Get token value from string or TokenProvider\n */\n private async getTokenValue(): Promise<string> {\n return typeof this.context.accessToken === \"string\"\n ? this.context.accessToken\n : await this.context.accessToken.getToken();\n }\n\n /**\n * Build WebSocket URL with token as query parameter\n */\n private buildWsUrl(endpoint: string, token: string): string {\n const url = new URL(endpoint);\n url.searchParams.set(\"token\", token);\n return url.toString();\n }\n\n /**\n * Connect to the WebSocket server.\n * This is automatically called when you use subscribe methods if not already connected.\n * You can also call this method manually for explicit control.\n */\n connect(): void {\n // Start initialization and store the promise\n this.initPromise = this.initClient().then(() => {\n this.realtimeClient.connect();\n });\n }\n\n /**\n * Disconnect from the WebSocket server.\n * All subscriptions will be automatically removed.\n */\n disconnect(): void {\n if (this.realtimeClient) {\n this.realtimeClient.disconnect();\n }\n }\n\n /**\n * Check if the WebSocket is currently connected.\n */\n isConnected(): boolean {\n return this.realtimeClient?.state === \"connected\";\n }\n\n /**\n * Start batching commands for efficient bulk operations\n * All subscription commands after this call will be batched until stopBatching is called\n */\n startBatching(): void {\n if (this.realtimeClient) {\n this.realtimeClient.startBatching();\n }\n }\n\n /**\n * Stop batching and flush all collected commands to the server\n * This will send all batched subscription commands in a single network request\n */\n stopBatching(): void {\n if (this.realtimeClient) {\n this.realtimeClient.stopBatching();\n }\n }\n\n /**\n * Batch subscribe method that accepts a function containing subscription calls\n * All subscription methods called within the function will be batched\n * @param batchFunction Function containing subscription method calls\n * @returns Array of unsubscribe functions\n */\n batchSubscribe(batchFunction: () => Unsubscribable[]): Unsubscribable[] {\n // Start batching commands\n this.startBatching();\n\n // Execute the batch function (all subscription calls will be batched)\n const unsubscribables = batchFunction();\n\n // Stop batching and flush all commands\n this.stopBatching();\n\n return unsubscribables;\n }\n\n /**\n * Batch unsubscribe method that accepts an array of unsubscribe functions\n * All unsubscribe calls will be executed at once\n * @param unsubscribables Array of unsubscribe functions to execute\n */\n batchUnsubscribe(unsubscribables: Unsubscribable[]): void {\n if (!unsubscribables || unsubscribables.length === 0) {\n return;\n }\n\n // Execute all unsubscribe calls\n unsubscribables.forEach(unsub => {\n if (unsub && typeof unsub.unsubscribe === \"function\") {\n unsub.unsubscribe();\n }\n });\n }\n\n subscribe<T = unknown>(\n channel: string,\n fn: (data: T) => void,\n filter?: string,\n methodName?: string,\n ): Unsubscribable {\n // Add listener immediately\n let listeners = this.listenersMap.get(channel);\n if (!listeners) {\n listeners = new Set();\n this.listenersMap.set(channel, listeners);\n }\n listeners.add(fn as (data: unknown) => void);\n\n // Perform subscription after initialization is complete\n this.ensureInitialized().then(() => {\n let sub = this.realtimeClient.getSubscription(channel);\n\n if (!sub) {\n console.log(\"[xrealtime] create new sub: \", channel);\n\n // Process filter expression with method-specific field mappings\n const processedFilter =\n filter && methodName ? replaceFilterFields(filter, methodName) : filter;\n\n sub = this.realtimeClient.newSubscription(channel, {\n delta: \"fossil\",\n ...(processedFilter && { filter: processedFilter }),\n });\n\n sub\n .on(\"subscribed\", () => {\n console.log(\"[xrealtime] subscribed\", channel);\n })\n .on(\"unsubscribed\", () => {\n console.log(\"[xrealtime] unsubscribed\", channel);\n })\n .on(\"publication\", ctx => {\n const currentListeners = this.listenersMap.get(channel);\n currentListeners?.forEach(it => it(ctx.data));\n })\n .subscribe();\n }\n });\n\n return new StreamUnsubscribable<T>(this, channel, fn);\n }\n\n unsubscribe<T = unknown>(channel: string, fn: (data: T) => void): void {\n const listeners = this.listenersMap.get(channel);\n if (!listeners) {\n return;\n }\n\n listeners.delete(fn as (data: unknown) => void);\n console.log(\"unsubscribe, remain listeners: \", listeners.size);\n\n if (listeners.size === 0) {\n console.log(\"unsubscribe channel: \", channel);\n this.listenersMap.delete(channel);\n\n // Remove subscription after initialization is complete\n this.ensureInitialized().then(() => {\n const sub = this.realtimeClient.getSubscription(channel);\n if (sub) {\n sub.unsubscribe();\n this.realtimeClient.removeSubscription(sub);\n }\n });\n }\n }\n\n private formatScientificNotation(value: unknown): string {\n if (value === null || value === undefined) {\n return \"0\";\n }\n\n const strValue = value.toString();\n if (strValue.includes(\"e-\") || strValue.includes(\"E-\")) {\n return Number(value)\n .toFixed(20)\n .replace(/\\.?0+$/, \"\");\n }\n\n return strValue;\n }\n\n /**\n * Parse candle data from WebSocket message\n */\n private parseCandleData(data: Record<string, unknown>): WsCandle {\n return {\n address: data.a as string,\n open: data.o as string,\n close: data.c as string,\n high: data.h as string,\n low: data.l as string,\n volume: data.v as string,\n resolution: data.r as Resolution,\n time: data.t as number,\n number: data.n as number,\n };\n }\n\n /**\n * Subscribe to token candles (K-line)\n * Channel: dex-candle:{chain}_{tokenAddress}_{resolution} (USD)\n * Channel: dex-candle-in-native:{chain}_{tokenAddress}_{resolution} (Native)\n * @param priceType - \"usd\" (default) or \"native\"\n */\n subscribeTokenCandles({\n chain,\n tokenAddress,\n resolution,\n callback,\n filter,\n priceType = \"usd\",\n }: {\n chain: string;\n tokenAddress: string;\n resolution: Resolution;\n callback: (data: WsCandle) => void;\n filter?: string;\n priceType?: WsPriceType;\n }): Unsubscribable {\n const prefix = priceType === \"native\" ? \"dex-candle-in-native\" : \"dex-candle\";\n const channel = `${prefix}:${chain}_${tokenAddress}_${resolution}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => callback(this.parseCandleData(data)),\n filter,\n \"subscribeTokenCandles\",\n );\n }\n\n /**\n * Subscribe to pool candles (K-line)\n * Channel: dex-pool-candle:{chain}_{poolAddress}_{resolution} (USD)\n * Channel: dex-pool-candle-in-native:{chain}_{poolAddress}_{resolution} (Native)\n * @param priceType - \"usd\" (default) or \"native\"\n */\n subscribePoolCandles({\n chain,\n poolAddress,\n resolution,\n callback,\n filter,\n priceType = \"usd\",\n }: {\n chain: string;\n poolAddress: string;\n resolution: Resolution;\n callback: (data: WsCandle) => void;\n filter?: string;\n priceType?: WsPriceType;\n }): Unsubscribable {\n const prefix = priceType === \"native\" ? \"dex-pool-candle-in-native\" : \"dex-pool-candle\";\n const channel = `${prefix}:${chain}_${poolAddress}_${resolution}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => callback(this.parseCandleData(data)),\n filter,\n \"subscribePoolCandles\",\n );\n }\n\n /**\n * Subscribe to pair candles (K-line)\n * Channel: dex-pair-candle:{chain}_{pairAddress}_{resolution} (USD)\n * Channel: dex-pair-candle-in-native:{chain}_{pairAddress}_{resolution} (Native)\n * @param pairAddress - format: {tokenA}-{tokenB}\n * @param priceType - \"usd\" (default) or \"native\"\n */\n subscribePairCandles({\n chain,\n pairAddress,\n resolution,\n callback,\n filter,\n priceType = \"usd\",\n }: {\n chain: string;\n pairAddress: string;\n resolution: Resolution;\n callback: (data: WsCandle) => void;\n filter?: string;\n priceType?: WsPriceType;\n }): Unsubscribable {\n const prefix = priceType === \"native\" ? \"dex-pair-candle-in-native\" : \"dex-pair-candle\";\n const channel = `${prefix}:${chain}_${pairAddress}_${resolution}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => callback(this.parseCandleData(data)),\n filter,\n \"subscribePairCandles\",\n );\n }\n\n /**\n * Parse token stat data for a specific time window\n * @param data - Raw WebSocket data\n * @param suffix - Time window suffix (e.g., \"1m\", \"5m\", \"1h\", \"1W\", \"1M\")\n */\n private parseTokenStatWindow(\n data: Record<string, unknown>,\n suffix: string,\n ): Record<string, number | string | undefined> {\n return {\n [`buys${suffix}`]: data[`b${suffix}`] as number | undefined,\n [`sells${suffix}`]: data[`s${suffix}`] as number | undefined,\n [`buyers${suffix}`]: data[`be${suffix}`] as number | undefined,\n [`sellers${suffix}`]: data[`se${suffix}`] as number | undefined,\n [`buyVolumeInUsd${suffix}`]: this.formatScientificNotation(data[`bviu${suffix}`]),\n [`sellVolumeInUsd${suffix}`]: this.formatScientificNotation(data[`sviu${suffix}`]),\n [`price${suffix}`]: this.formatScientificNotation(data[`p${suffix}`]),\n [`openInUsd${suffix}`]: this.formatScientificNotation(data[`oiu${suffix}`]),\n [`closeInUsd${suffix}`]: this.formatScientificNotation(data[`ciu${suffix}`]),\n [`volumeChangeRatio${suffix}`]: this.formatScientificNotation(data[`vpc${suffix}`]),\n [`trades${suffix}`]: data[`tr${suffix}`] as number | undefined,\n [`dappProgramCount${suffix}`]: data[`dpc${suffix}`] as number | undefined,\n [`poolCount${suffix}`]: data[`pc${suffix}`] as number | undefined,\n [`liquidityInUsd${suffix}`]: this.formatScientificNotation(data[`liq${suffix}`]),\n [`liquidityChangeRatio${suffix}`]: this.formatScientificNotation(data[`lpc${suffix}`]),\n };\n }\n\n /**\n * Parse social media data from short field names\n */\n private parseSocialMedia(sm: Record<string, unknown> | undefined): WsSocialMedia | undefined {\n if (!sm) return undefined;\n return {\n twitter: sm.tw as string | undefined,\n telegram: sm.tg as string | undefined,\n website: sm.w as string | undefined,\n tiktok: sm.tt as string | undefined,\n discord: sm.dc as string | undefined,\n facebook: sm.fb as string | undefined,\n github: sm.gh as string | undefined,\n instagram: sm.ig as string | undefined,\n linkedin: sm.li as string | undefined,\n medium: sm.md as string | undefined,\n reddit: sm.rd as string | undefined,\n youtube: sm.yt as string | undefined,\n bitbucket: sm.bb as string | undefined,\n };\n }\n\n /**\n * Parse DEX protocol data from short field names\n */\n private parseDexProtocol(lf: Record<string, unknown> | undefined): WsDexProtocol | undefined {\n if (!lf) return undefined;\n const result: WsDexProtocol = {};\n if (lf.pa) result.programAddress = lf.pa as string;\n if (lf.pf) result.protocolFamily = lf.pf as string;\n if (lf.pn) result.protocolName = lf.pn as string;\n return result;\n }\n\n /**\n * Parse a TokenMetadataTimeEvent from raw WebSocket data\n */\n private parseTokenMetadata(data: Record<string, unknown>): WsTokenMetadata {\n const result: WsTokenMetadata = {\n tokenAddress: data.a as string,\n };\n if (data.n != null) result.name = data.n as string;\n if (data.dec != null) result.decimals = data.dec as number;\n if (data.s != null) result.symbol = data.s as string;\n if (data.iu != null) result.imageUrl = data.iu as string;\n if (data.de != null) result.description = data.de as string;\n if (data.sm) result.socialMedia = this.parseSocialMedia(data.sm as Record<string, unknown>);\n if (data.cts != null) result.createdAtMs = data.cts as number;\n if (data.cgi != null) result.coingeckoCoinId = data.cgi as string;\n if (data.lf) result.launchFrom = this.parseDexProtocol(data.lf as Record<string, unknown>);\n if (data.mt) result.migratedTo = this.parseDexProtocol(data.mt as Record<string, unknown>);\n return result;\n }\n\n /**\n * Subscribe to token trade statistics\n * Channel: dex-token-stats:{chain}_{tokenAddress}\n * Time windows: 1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 24h, 1W, 1M\n */\n subscribeTokenStats({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenStat) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-stats:${chain}_${tokenAddress}`;\n // Time window suffixes - note: 1W and 1M use uppercase\n const timeWindows = [\"1m\", \"5m\", \"15m\", \"30m\", \"1h\", \"2h\", \"4h\", \"6h\", \"8h\", \"24h\", \"1W\", \"1M\"];\n\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => {\n // Parse all time window data\n const windowData = timeWindows.reduce(\n (acc, suffix) => ({\n ...acc,\n ...this.parseTokenStatWindow(data, suffix),\n }),\n {} as Record<string, number | string | undefined>,\n );\n\n callback({\n address: data.a as string,\n timestamp: data.t as number,\n price: this.formatScientificNotation(data.p),\n ...windowData,\n } as WsTokenStat);\n },\n filter,\n \"subscribeTokenStats\",\n );\n }\n\n subscribeTokenHolders({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenHolder) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-holding:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n holders: data.h as number,\n top100HoldersAmount: this.formatScientificNotation(data.t100a),\n top50HoldersAmount: this.formatScientificNotation(data.t50a),\n top10HoldersAmount: this.formatScientificNotation(data.t10a),\n top100Holders: data.t100h as number,\n top50Holders: data.t50h as number,\n top10Holders: data.t10h as number,\n top100HoldersRatio: this.formatScientificNotation(data.t100r),\n top50HoldersRatio: this.formatScientificNotation(data.t50r),\n top10HoldersRatio: this.formatScientificNotation(data.t10r),\n creatorsHolders: data.ch as number,\n creatorsAmount: this.formatScientificNotation(data.ca),\n creatorsRatio: this.formatScientificNotation(data.cr),\n balanceTagFreshHolders: data.btfh as number,\n balanceTagFreshAmount: this.formatScientificNotation(data.btfa),\n balanceTagFreshRatio: this.formatScientificNotation(data.btfr),\n balanceTagSandwichHolders: data.btsh as number,\n balanceTagSandwichAmount: this.formatScientificNotation(data.btsa),\n balanceTagSandwichRatio: this.formatScientificNotation(data.btsr),\n balanceTagBundleHolders: data.btbh as number,\n balanceTagBundleAmount: this.formatScientificNotation(data.btba),\n balanceTagBundleRatio: this.formatScientificNotation(data.btbr),\n balanceTagSniperHolders: data.btsnh as number,\n balanceTagSniperAmount: this.formatScientificNotation(data.btsna),\n balanceTagSniperRatio: this.formatScientificNotation(data.btsnr),\n balanceTagDevHolders: data.btdh as number,\n balanceTagDevAmount: this.formatScientificNotation(data.btda),\n balanceTagDevRatio: this.formatScientificNotation(data.btdr),\n balanceTagProHolders: data.btph as number,\n balanceTagProAmount: this.formatScientificNotation(data.btpa),\n balanceTagProRatio: this.formatScientificNotation(data.btpr),\n balanceTagInsiderHolders: data.btih as number,\n balanceTagInsiderAmount: this.formatScientificNotation(data.btia),\n balanceTagInsiderRatio: this.formatScientificNotation(data.btir),\n balanceTagSmartHolders: data.btsmh as number,\n balanceTagSmartAmount: this.formatScientificNotation(data.btsma),\n balanceTagSmartRatio: this.formatScientificNotation(data.btsmr),\n balanceTagKolHolders: data.btkh as number,\n balanceTagKolAmount: this.formatScientificNotation(data.btka),\n balanceTagKolRatio: this.formatScientificNotation(data.btkr),\n balanceTagPhishingHolders: data.btphh as number,\n balanceTagPhishingAmount: this.formatScientificNotation(data.btpha),\n balanceTagPhishingRatio: this.formatScientificNotation(data.btphr),\n balanceTagBluechipHolders: data.btblh as number,\n balanceTagBluechipAmount: this.formatScientificNotation(data.btbla),\n balanceTagBluechipRatio: this.formatScientificNotation(data.btblr),\n balanceTagRatHolders: data.btrh as number,\n balanceTagRatAmount: this.formatScientificNotation(data.btra),\n balanceTagRatRatio: this.formatScientificNotation(data.btrr),\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenHolders\",\n );\n }\n\n /**\n * Subscribe to new token events (single token per event, supports CEL filter)\n * Channel: dex-new-token:{chain}\n */\n subscribeNewToken({\n chain,\n callback,\n filter,\n }: {\n chain: string;\n callback: (data: WsNewToken) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-new-token:${chain}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) => {\n const result: WsNewToken = {\n tokenAddress: data.a as string,\n name: data.n as string,\n symbol: data.s as string,\n createdAtMs: data.cts as number,\n };\n\n if (data.dec != null) result.decimals = data.dec as number;\n if (data.iu != null) result.imageUrl = data.iu as string;\n if (data.de != null) result.description = data.de as string;\n if (data.sm) result.socialMedia = this.parseSocialMedia(data.sm as Record<string, unknown>);\n if (data.cgi != null) result.coingeckoCoinId = data.cgi as string;\n if (data.lf) result.launchFrom = this.parseDexProtocol(data.lf as Record<string, unknown>);\n if (data.mt) result.migratedTo = this.parseDexProtocol(data.mt as Record<string, unknown>);\n\n callback(result);\n },\n filter,\n \"subscribeNewToken\",\n );\n }\n\n /**\n * Subscribe to new tokens metadata (batch, aggregated every 1 second)\n * Channel: dex-new-tokens-metadata:{chain}\n * No CEL filter support\n */\n subscribeNewTokensMetadata({\n chain,\n callback,\n }: {\n chain: string;\n callback: (data: WsTokenMetadata[]) => void;\n }): Unsubscribable {\n const channel = `dex-new-tokens-metadata:${chain}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(data.map(it => this.parseTokenMetadata(it))),\n );\n }\n\n /**\n * Subscribe to new tokens list (batch from token-created-to-realtime-pipeline)\n * Channel: dex-new-tokens:{chain}\n * No CEL filter support\n */\n subscribeNewTokens({\n chain,\n callback,\n }: {\n chain: string;\n callback: (data: WsTokenMetadata[]) => void;\n }): Unsubscribable {\n const channel = `dex-new-tokens:${chain}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(data.map(it => this.parseTokenMetadata(it))),\n );\n }\n\n subscribeTokenSupply({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenSupply) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-supply:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n supply: data.s as string,\n marketCapInUsd: data.mc as string,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenSupply\",\n );\n }\n\n subscribeTokenLiquidity({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenLiquidity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-general-stat-num:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n metricType: data.t as WsTokenLiquidity[\"metricType\"],\n value: data.v as string,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenLiquidity\",\n );\n }\n\n /**\n * Subscribe to token max liquidity updates\n * Pushes the max liquidity info of a token in a single pool\n * Channel: dex-token-liquidity:{chain}_{token_address}\n */\n subscribeTokenMaxLiquidity({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenMaxLiquidity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-liquidity:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n poolAddress: data.p as string,\n liquidityInUsd: data.liu as string,\n liquidityInNative: data.lin as string,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenMaxLiquidity\",\n );\n }\n\n /**\n * Subscribe to token total liquidity updates\n * Pushes the total liquidity info of a token across all pools\n * Channel: dex-token-total-liquidity:{chain}_{token_address}\n */\n subscribeTokenTotalLiquidity({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTokenTotalLiquidity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-token-total-liquidity:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n liquidityInUsd: data.liu as string,\n liquidityInNative: data.lin as string,\n poolCount: data.pc as number,\n timestamp: data.ts as number,\n }),\n filter,\n \"subscribeTokenTotalLiquidity\",\n );\n }\n\n subscribeRankingTokensLiquidity({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenLiquidity[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-general_stat_num-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(it => ({\n tokenAddress: it.a as string,\n metricType: it.t as WsTokenLiquidity[\"metricType\"],\n value: it.v as string,\n timestamp: it.ts as number,\n })),\n ),\n );\n }\n\n subscribeRankingTokensList({\n chain,\n ranking_type,\n dex,\n callback,\n }: {\n chain: string;\n ranking_type: WsRankingType;\n dex?: WsDex;\n callback: (data: WsRankingTokenList[]) => void;\n }): Unsubscribable {\n const channel = dex\n ? `dex-ranking-list:${chain}_${ranking_type}_${dex}`\n : `dex-ranking-list:${chain}_${ranking_type}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(item => {\n const result: WsRankingTokenList = {};\n const t = item.t as Record<string, unknown> | undefined;\n const bc = item.bc as Record<string, unknown> | undefined;\n const h = item.h as Record<string, unknown> | undefined;\n const s = item.s as Record<string, unknown> | undefined;\n const ts = item.ts as Record<string, unknown> | undefined;\n\n // TokenMetadata (t)\n if (t) {\n result.metadata = {\n tokenAddress: t.a as string,\n };\n if (t.n) {\n result.metadata.name = t.n as string;\n }\n if (t.s) {\n result.metadata.symbol = t.s as string;\n }\n if (t.iu) {\n result.metadata.imageUrl = t.iu as string;\n }\n if (t.de) {\n result.metadata.description = t.de as string;\n }\n if (t.dec) {\n result.metadata.decimals = t.dec as number;\n }\n if (t.cts) {\n result.metadata.createdAtMs = t.cts as number;\n }\n if (t.lf) {\n result.metadata.launchFrom = this.parseDexProtocol(t.lf as Record<string, unknown>);\n }\n if (t.mt) {\n result.metadata.migratedTo = this.parseDexProtocol(t.mt as Record<string, unknown>);\n }\n if (t.sm) {\n result.metadata.socialMedia = this.parseSocialMedia(t.sm as Record<string, unknown>);\n }\n }\n\n // WsTokenBondingCurve (bc)\n if (bc) {\n result.bondingCurve = {};\n if (bc.pr) {\n result.bondingCurve.progressRatio = this.formatScientificNotation(bc.pr);\n }\n }\n\n // TokenHolder (h)\n if (h) {\n result.holder = {\n tokenAddress: h.a as string,\n timestamp: (h.ts as number) || 0,\n };\n if (h.h) {\n result.holder.holders = h.h as number;\n }\n if (h.t100a) {\n result.holder.top100HoldersAmount = this.formatScientificNotation(h.t100a);\n }\n if (h.t50a) {\n result.holder.top50HoldersAmount = this.formatScientificNotation(h.t50a);\n }\n if (h.t10a) {\n result.holder.top10HoldersAmount = this.formatScientificNotation(h.t10a);\n }\n if (h.t100h) {\n result.holder.top100Holders = h.t100h as number;\n }\n if (h.t50h) {\n result.holder.top50Holders = h.t50h as number;\n }\n if (h.t10h) {\n result.holder.top10Holders = h.t10h as number;\n }\n if (h.t100r) {\n result.holder.top100HoldersRatio = this.formatScientificNotation(h.t100r);\n }\n if (h.t50r) {\n result.holder.top50HoldersRatio = this.formatScientificNotation(h.t50r);\n }\n if (h.t10r) {\n result.holder.top10HoldersRatio = this.formatScientificNotation(h.t10r);\n }\n }\n\n // WsTokenSupply (s)\n if (s) {\n result.supply = {\n tokenAddress: s.a as string,\n timestamp: (s.ts as number) || 0,\n };\n if (s.s) {\n result.supply.supply = s.s as string;\n }\n if (s.mc) {\n result.supply.marketCapInUsd = s.mc as string;\n }\n }\n\n // TokenStat (ts)\n if (ts) {\n result.stat = {\n address: ts.a as string,\n timestamp: (ts.t as number) || 0,\n };\n\n // 1m data\n if (ts.b1m) {\n result.stat.buys1m = ts.b1m as number;\n }\n if (ts.s1m) {\n result.stat.sells1m = ts.s1m as number;\n }\n if (ts.be1m) {\n result.stat.buyers1m = ts.be1m as number;\n }\n if (ts.se1m) {\n result.stat.sellers1m = ts.se1m as number;\n }\n if (ts.bviu1m) {\n result.stat.buyVolumeInUsd1m = this.formatScientificNotation(ts.bviu1m);\n }\n if (ts.sviu1m) {\n result.stat.sellVolumeInUsd1m = this.formatScientificNotation(ts.sviu1m);\n }\n if (ts.p1m) {\n result.stat.price1m = this.formatScientificNotation(ts.p1m);\n }\n\n // Current price\n if (ts.p) {\n result.stat.price = this.formatScientificNotation(ts.p);\n }\n }\n\n return result;\n }),\n ),\n );\n }\n\n subscribeRankingTokensStats({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenStat[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-stats-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(\n it =>\n ({\n address: it.a,\n timestamp: it.t,\n buys1m: it.b1m,\n sells1m: it.s1m,\n buyers1m: it.be1m,\n sellers1m: it.se1m,\n buyVolumeInUsd1m: this.formatScientificNotation(it.bviu1m),\n sellVolumeInUsd1m: this.formatScientificNotation(it.sviu1m),\n price1m: this.formatScientificNotation(it.p1m),\n openInUsd1m: this.formatScientificNotation(it.oiu1m),\n closeInUsd1m: this.formatScientificNotation(it.ciu1m),\n buys5m: it.b5m,\n sells5m: it.s5m,\n buyers5m: it.be5m,\n sellers5m: it.se5m,\n buyVolumeInUsd5m: this.formatScientificNotation(it.bviu5m),\n sellVolumeInUsd5m: this.formatScientificNotation(it.sviu5m),\n price5m: this.formatScientificNotation(it.p5m),\n openInUsd5m: this.formatScientificNotation(it.oiu5m),\n closeInUsd5m: this.formatScientificNotation(it.ciu5m),\n price: this.formatScientificNotation(it.p),\n }) as WsTokenStat,\n ),\n ),\n );\n }\n\n subscribeRankingTokensHolders({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenHolder[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-holding-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(\n it =>\n ({\n tokenAddress: it.a,\n holders: it.h,\n top100HoldersAmount: this.formatScientificNotation(it.t100a),\n top50HoldersAmount: this.formatScientificNotation(it.t50a),\n top10HoldersAmount: this.formatScientificNotation(it.t10a),\n top100Holders: it.t100h,\n top50Holders: it.t50h,\n top10Holders: it.t10h,\n top100HoldersRatio: this.formatScientificNotation(it.t100r),\n top50HoldersRatio: this.formatScientificNotation(it.t50r),\n top10HoldersRatio: this.formatScientificNotation(it.t10r),\n timestamp: it.ts,\n }) as WsTokenHolder,\n ),\n ),\n );\n }\n\n subscribeRankingTokensSupply({\n chain,\n channelType,\n callback,\n }: {\n chain: string;\n channelType: WsChannelType;\n callback: (data: WsTokenSupply[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-supply-list:${chain}_${channelType}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(it => ({\n tokenAddress: it.a as string,\n supply: it.s as string,\n marketCapInUsd: it.mc as string,\n timestamp: it.ts as number,\n })),\n ),\n );\n }\n\n subscribeRankingTokensBondingCurve({\n chain,\n callback,\n }: {\n chain: string;\n callback: (data: WsTokenBondingCurve[]) => void;\n }): Unsubscribable {\n const channel = `dex-ranking-token-bounding-curve-list:${chain}_new`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(it => ({\n tokenAddress: it.a as string,\n progressRatio: it.pr as string,\n })),\n ),\n );\n }\n\n subscribeWalletBalance({\n chain,\n walletAddress,\n callback,\n filter,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsWalletBalance[]) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-wallet-balance:${chain}_${walletAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback([\n {\n walletAddress: data.a as string,\n tokenAddress: data.ta as string,\n tokenPriceInUsd: data.tpiu as string,\n balance: data.b as string,\n timestamp: data.t as number,\n },\n ]),\n filter,\n \"subscribeWalletBalance\",\n );\n }\n\n subscribeWalletPnl({\n chain,\n walletAddress,\n callback,\n filter,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsWalletTokenPnl) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-wallet-token-pnl:${chain}_${walletAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n walletAddress: data.a as string,\n tokenAddress: data.ta as string,\n timestamp: data.t as number,\n buyCount: data.bs as number,\n buyCount30d: data.bs30d as number,\n buyCount7d: data.bs7d as number,\n sellCount: data.ss as number,\n sellCount30d: data.ss30d as number,\n sellCount7d: data.ss7d as number,\n tokenPriceInUsd: data.tpiu as string | undefined,\n opentime: data.ot as number | undefined,\n lasttime: data.lt as number | undefined,\n closetime: data.ct as number | undefined,\n buyAmount: data.ba as string | undefined,\n buyAmountInUsd: data.baiu as string | undefined,\n sellAmount: data.sa as string | undefined,\n sellAmountInUsd: data.saiu as string | undefined,\n heldDurationTimestamp: data.hdts as number | undefined,\n averageBuyPriceInUsd: data.abpiu as string | undefined,\n averageSellPriceInUsd: data.aspiu as string | undefined,\n unrealizedProfitInUsd: data.upiu as string | undefined,\n unrealizedProfitRatio: data.upr as string | undefined,\n realizedProfitInUsd: data.rpiu as string | undefined,\n realizedProfitRatio: data.rpr as string | undefined,\n totalRealizedProfitInUsd: data.trpiu as string | undefined,\n totalRealizedProfitRatio: data.trr as string | undefined,\n }),\n filter,\n \"subscribeWalletPnl\",\n );\n }\n\n subscribeWalletPnlList({\n chain,\n walletAddress,\n callback,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsWalletPnl[]) => void;\n }): Unsubscribable {\n const channel = `dex-wallet-pnl-list:${chain}_${walletAddress}`;\n return this.subscribe(channel, (data: Record<string, unknown>[]) =>\n callback(\n data?.map(\n it =>\n ({\n walletAddress: it.a,\n buys: it.bs,\n buyAmount: it.ba,\n buyAmountInUsd: it.baiu,\n averageBuyPriceInUsd: it.abpiu,\n sellAmount: it.sa,\n sellAmountInUsd: it.saiu,\n sells: it.ss,\n wins: it.ws,\n winRatio: it.wr,\n pnlInUsd: it.piu,\n averagePnlInUsd: it.apiu,\n pnlRatio: it.pr,\n profitableDays: it.pd,\n losingDays: it.ld,\n tokens: it.ts,\n resolution: it.r,\n }) as WsWalletPnl,\n ),\n ),\n );\n }\n\n subscribeTokenTrade({\n chain,\n tokenAddress,\n callback,\n filter,\n }: {\n chain: string;\n tokenAddress: string;\n callback: (data: WsTradeActivity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-trade:${chain}_${tokenAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n timestamp: data.t as number,\n kind: data.k as string,\n buyAmount: data.ba as string,\n buyAmountInUsd: data.baiu as string,\n buyTokenAddress: data.btma as string,\n buyTokenName: data.btn as string,\n buyTokenSymbol: data.bts as string,\n buyWalletAddress: data.bwa as string,\n sellAmount: data.sa as string,\n sellAmountInUsd: data.saiu as string,\n sellTokenAddress: data.stma as string,\n sellTokenName: data.stn as string,\n sellTokenSymbol: data.sts as string,\n sellWalletAddress: data.swa as string,\n txHash: data.h as string,\n }),\n filter,\n \"subscribeTokenTrades\",\n );\n }\n\n subscribeWalletTrade({\n chain,\n walletAddress,\n callback,\n filter,\n }: {\n chain: string;\n walletAddress: string;\n callback: (data: WsTradeActivity) => void;\n filter?: string;\n }): Unsubscribable {\n const channel = `dex-wallet-trade:${chain}_${walletAddress}`;\n return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n tokenAddress: data.a as string,\n timestamp: data.t as number,\n kind: data.k as string,\n buyAmount: data.ba as string,\n buyAmountInUsd: data.baiu as string,\n buyTokenAddress: data.btma as string,\n buyTokenName: data.btn as string,\n buyTokenSymbol: data.bts as string,\n buyWalletAddress: data.bwa as string,\n sellAmount: data.sa as string,\n sellAmountInUsd: data.saiu as string,\n sellTokenAddress: data.stma as string,\n sellTokenName: data.stn as string,\n sellTokenSymbol: data.sts as string,\n sellWalletAddress: data.swa as string,\n txHash: data.h as string,\n }),\n filter,\n \"subscribeTokenTrades\",\n );\n }\n\n subscribeDexPoolBalance({\n chain,\n poolAddress,\n callback,\n }: {\n chain: string;\n poolAddress: string;\n callback: (data: WsDexPoolBalance) => void;\n }): Unsubscribable {\n const channel = `dex-pool-balance:${chain}_${poolAddress}`;\n return this.subscribe(channel, (data: Record<string, unknown>) =>\n callback({\n poolAddress: data.a as string,\n tokenAAddress: data.taa as string,\n tokenALiquidityInUsd: data.taliu as string,\n tokenBAddress: data.tba as string,\n tokenBLiquidityInUsd: data.tbliu as string,\n }),\n );\n }\n}\n\nclass StreamUnsubscribable<T> {\n constructor(\n private readonly streamApi: StreamApi,\n private readonly channel: string,\n private readonly fn: (data: T) => void,\n ) {}\n\n unsubscribe(): void {\n this.streamApi.unsubscribe(this.channel, this.fn);\n }\n}\n","/**\n * Field mappings for CEL filter expressions\n * Maps human-readable field names to short field names used in the API\n * Organized by subscription method to handle field name conflicts\n */\n\nexport interface FieldMapping {\n readonly [key: string]: string;\n}\n\nexport interface MethodFieldMappings {\n readonly [methodName: string]: FieldMapping;\n}\n\n/**\n * Field mappings organized by subscription method\n * Each method can have its own field mappings to handle conflicts\n */\nexport const CEL_FIELD_MAPPINGS: MethodFieldMappings = {\n // Wallet balance subscription fields\n subscribeWalletBalance: {\n walletAddress: \"a\",\n tokenAddress: \"ta\",\n tokenPriceInUsd: \"tpiu\",\n balance: \"b\",\n timestamp: \"t\",\n },\n\n // Token candles subscription fields\n subscribeTokenCandles: {\n open: \"o\",\n close: \"c\",\n high: \"h\",\n low: \"l\",\n volume: \"v\",\n resolution: \"r\",\n time: \"t\",\n number: \"n\",\n },\n\n // Token stats subscription fields\n subscribeTokenStats: {\n address: \"a\",\n timestamp: \"t\",\n buys1m: \"b1m\",\n sells1m: \"s1m\",\n buyers1m: \"be1m\",\n sellers1m: \"se1m\",\n buyVolumeInUsd1m: \"bviu1m\",\n sellVolumeInUsd1m: \"sviu1m\",\n price1m: \"p1m\",\n openInUsd1m: \"oiu1m\",\n closeInUsd1m: \"ciu1m\",\n buys5m: \"b5m\",\n sells5m: \"s5m\",\n buyers5m: \"be5m\",\n sellers5m: \"se5m\",\n buyVolumeInUsd5m: \"bviu5m\",\n sellVolumeInUsd5m: \"sviu5m\",\n price5m: \"p5m\",\n openInUsd5m: \"oiu5m\",\n closeInUsd5m: \"ciu5m\",\n buys15m: \"b15m\",\n sells15m: \"s15m\",\n buyers15m: \"be15m\",\n sellers15m: \"se15m\",\n buyVolumeInUsd15m: \"bviu15m\",\n sellVolumeInUsd15m: \"sviu15m\",\n price15m: \"p15m\",\n openInUsd15m: \"oiu15m\",\n closeInUsd15m: \"ciu15m\",\n buys30m: \"b30m\",\n sells30m: \"s30m\",\n buyers30m: \"be30m\",\n sellers30m: \"se30m\",\n buyVolumeInUsd30m: \"bviu30m\",\n sellVolumeInUsd30m: \"sviu30m\",\n price30m: \"p30m\",\n openInUsd30m: \"oiu30m\",\n closeInUsd30m: \"ciu30m\",\n buys1h: \"b1h\",\n sells1h: \"s1h\",\n buyers1h: \"be1h\",\n sellers1h: \"se1h\",\n buyVolumeInUsd1h: \"bviu1h\",\n sellVolumeInUsd1h: \"sviu1h\",\n price1h: \"p1h\",\n openInUsd1h: \"oiu1h\",\n closeInUsd1h: \"ciu1h\",\n buys4h: \"b4h\",\n sells4h: \"s4h\",\n buyers4h: \"be4h\",\n sellers4h: \"se4h\",\n buyVolumeInUsd4h: \"bviu4h\",\n sellVolumeInUsd4h: \"sviu4h\",\n price4h: \"p4h\",\n openInUsd4h: \"oiu4h\",\n closeInUsd4h: \"ciu4h\",\n buys24h: \"b24h\",\n sells24h: \"s24h\",\n buyers24h: \"be24h\",\n sellers24h: \"se24h\",\n buyVolumeInUsd24h: \"bviu24h\",\n sellVolumeInUsd24h: \"sviu24h\",\n price24h: \"p24h\",\n price: \"p\",\n openInUsd24h: \"oiu24h\",\n closeInUsd24h: \"ciu24h\",\n },\n\n // Token holder subscription fields\n subscribeTokenHolders: {\n tokenAddress: \"a\",\n holders: \"h\",\n top100HoldersAmount: \"t100a\",\n top50HoldersAmount: \"t50a\",\n top10HoldersAmount: \"t10a\",\n top100Holders: \"t100h\",\n top50Holders: \"t50h\",\n top10Holders: \"t10h\",\n top100HoldersRatio: \"t100r\",\n top50HoldersRatio: \"t50r\",\n top10HoldersRatio: \"t10r\",\n creatorsHolders: \"ch\",\n creatorsAmount: \"ca\",\n creatorsRatio: \"cr\",\n balanceTagFreshHolders: \"btfh\",\n balanceTagFreshAmount: \"btfa\",\n balanceTagFreshRatio: \"btfr\",\n balanceTagSandwichHolders: \"btsh\",\n balanceTagSandwichAmount: \"btsa\",\n balanceTagSandwichRatio: \"btsr\",\n balanceTagBundleHolders: \"btbh\",\n balanceTagBundleAmount: \"btba\",\n balanceTagBundleRatio: \"btbr\",\n balanceTagSniperHolders: \"btsnh\",\n balanceTagSniperAmount: \"btsna\",\n balanceTagSniperRatio: \"btsnr\",\n balanceTagDevHolders: \"btdh\",\n balanceTagDevAmount: \"btda\",\n balanceTagDevRatio: \"btdr\",\n balanceTagProHolders: \"btph\",\n balanceTagProAmount: \"btpa\",\n balanceTagProRatio: \"btpr\",\n balanceTagInsiderHolders: \"btih\",\n balanceTagInsiderAmount: \"btia\",\n balanceTagInsiderRatio: \"btir\",\n balanceTagSmartHolders: \"btsmh\",\n balanceTagSmartAmount: \"btsma\",\n balanceTagSmartRatio: \"btsmr\",\n balanceTagKolHolders: \"btkh\",\n balanceTagKolAmount: \"btka\",\n balanceTagKolRatio: \"btkr\",\n balanceTagPhishingHolders: \"btphh\",\n balanceTagPhishingAmount: \"btpha\",\n balanceTagPhishingRatio: \"btphr\",\n balanceTagBluechipHolders: \"btblh\",\n balanceTagBluechipAmount: \"btbla\",\n balanceTagBluechipRatio: \"btblr\",\n balanceTagRatHolders: \"btrh\",\n balanceTagRatAmount: \"btra\",\n balanceTagRatRatio: \"btrr\",\n timestamp: \"ts\",\n },\n\n // New token subscription fields (dex-new-token, supports CEL filter)\n subscribeNewToken: {\n tokenAddress: \"a\",\n name: \"n\",\n symbol: \"s\",\n decimals: \"dec\",\n imageUrl: \"iu\",\n description: \"de\",\n createdAtMs: \"cts\",\n coingeckoCoinId: \"cgi\",\n \"socialMedia.twitter\": \"sm.tw\",\n \"socialMedia.telegram\": \"sm.tg\",\n \"socialMedia.website\": \"sm.w\",\n \"socialMedia.tiktok\": \"sm.tt\",\n \"socialMedia.discord\": \"sm.dc\",\n \"socialMedia.facebook\": \"sm.fb\",\n \"socialMedia.github\": \"sm.gh\",\n \"socialMedia.instagram\": \"sm.ig\",\n \"socialMedia.linkedin\": \"sm.li\",\n \"socialMedia.medium\": \"sm.md\",\n \"socialMedia.reddit\": \"sm.rd\",\n \"socialMedia.youtube\": \"sm.yt\",\n \"socialMedia.bitbucket\": \"sm.bb\",\n \"launchFrom.programAddress\": \"lf.pa\",\n \"launchFrom.protocolFamily\": \"lf.pf\",\n \"launchFrom.protocolName\": \"lf.pn\",\n \"migratedTo.programAddress\": \"mt.pa\",\n \"migratedTo.protocolFamily\": \"mt.pf\",\n \"migratedTo.protocolName\": \"mt.pn\",\n },\n\n // Token supply subscription fields\n subscribeTokenSupply: {\n tokenAddress: \"a\",\n supply: \"s\",\n timestamp: \"ts\",\n },\n\n // Dex pool balance subscription fields\n subscribeDexPoolBalance: {\n poolAddress: \"a\",\n tokenAAddress: \"taa\",\n tokenALiquidityInUsd: \"taliu\",\n tokenBAddress: \"tba\",\n tokenBLiquidityInUsd: \"tbliu\",\n },\n\n // Token liquidity subscription fields\n subscribeTokenLiquidity: {\n tokenAddress: \"a\",\n metricType: \"t\",\n value: \"v\",\n timestamp: \"ts\",\n },\n\n // New token metadata subscription fields (dex-new-tokens-metadata)\n subscribeNewTokensMetadata: {\n tokenAddress: \"a\",\n name: \"n\",\n decimals: \"dec\",\n symbol: \"s\",\n imageUrl: \"iu\",\n description: \"de\",\n createdAtMs: \"cts\",\n coingeckoCoinId: \"cgi\",\n \"socialMedia.twitter\": \"sm.tw\",\n \"socialMedia.telegram\": \"sm.tg\",\n \"socialMedia.website\": \"sm.w\",\n \"socialMedia.tiktok\": \"sm.tt\",\n \"socialMedia.discord\": \"sm.dc\",\n \"socialMedia.facebook\": \"sm.fb\",\n \"socialMedia.github\": \"sm.gh\",\n \"socialMedia.instagram\": \"sm.ig\",\n \"socialMedia.linkedin\": \"sm.li\",\n \"socialMedia.medium\": \"sm.md\",\n \"socialMedia.reddit\": \"sm.rd\",\n \"socialMedia.youtube\": \"sm.yt\",\n \"socialMedia.bitbucket\": \"sm.bb\",\n \"launchFrom.programAddress\": \"lf.pa\",\n \"launchFrom.protocolFamily\": \"lf.pf\",\n \"launchFrom.protocolName\": \"lf.pn\",\n \"migratedTo.programAddress\": \"mt.pa\",\n \"migratedTo.protocolFamily\": \"mt.pf\",\n \"migratedTo.protocolName\": \"mt.pn\",\n },\n\n // New tokens list subscription fields (dex-new-tokens)\n subscribeNewTokens: {\n tokenAddress: \"a\",\n name: \"n\",\n decimals: \"dec\",\n symbol: \"s\",\n imageUrl: \"iu\",\n description: \"de\",\n createdAtMs: \"cts\",\n coingeckoCoinId: \"cgi\",\n \"socialMedia.twitter\": \"sm.tw\",\n \"socialMedia.telegram\": \"sm.tg\",\n \"socialMedia.website\": \"sm.w\",\n \"socialMedia.tiktok\": \"sm.tt\",\n \"socialMedia.discord\": \"sm.dc\",\n \"socialMedia.facebook\": \"sm.fb\",\n \"socialMedia.github\": \"sm.gh\",\n \"socialMedia.instagram\": \"sm.ig\",\n \"socialMedia.linkedin\": \"sm.li\",\n \"socialMedia.medium\": \"sm.md\",\n \"socialMedia.reddit\": \"sm.rd\",\n \"socialMedia.youtube\": \"sm.yt\",\n \"socialMedia.bitbucket\": \"sm.bb\",\n \"launchFrom.programAddress\": \"lf.pa\",\n \"launchFrom.protocolFamily\": \"lf.pf\",\n \"launchFrom.protocolName\": \"lf.pn\",\n \"migratedTo.programAddress\": \"mt.pa\",\n \"migratedTo.protocolFamily\": \"mt.pf\",\n \"migratedTo.protocolName\": \"mt.pn\",\n },\n\n // Token trades subscription fields\n subscribeTokenTrades: {\n tokenAddress: \"a\",\n timestamp: \"t\",\n kind: \"k\",\n buyAmount: \"ba\",\n buyAmountInUsd: \"baiu\",\n buyTokenAddress: \"btma\",\n buyTokenName: \"btn\",\n buyTokenSymbol: \"bts\",\n buyWalletAddress: \"bwa\",\n sellAmount: \"sa\",\n sellAmountInUsd: \"saiu\",\n sellTokenAddress: \"stma\",\n sellTokenName: \"stn\",\n sellTokenSymbol: \"sts\",\n sellWalletAddress: \"swa\",\n txHash: \"h\",\n },\n\n // Wallet token PnL subscription fields\n subscribeWalletPnl: {\n walletAddress: \"a\",\n tokenAddress: \"ta\",\n tokenPriceInUsd: \"tpiu\",\n timestamp: \"t\",\n opentime: \"ot\",\n lasttime: \"lt\",\n closetime: \"ct\",\n buyAmount: \"ba\",\n buyAmountInUsd: \"baiu\",\n buyCount: \"bs\",\n buyCount30d: \"bs30d\",\n buyCount7d: \"bs7d\",\n sellAmount: \"sa\",\n sellAmountInUsd: \"saiu\",\n sellCount: \"ss\",\n sellCount30d: \"ss30d\",\n sellCount7d: \"ss7d\",\n heldDurationTimestamp: \"hdts\",\n averageBuyPriceInUsd: \"abpiu\",\n averageSellPriceInUsd: \"aspiu\",\n unrealizedProfitInUsd: \"upiu\",\n unrealizedProfitRatio: \"upr\",\n realizedProfitInUsd: \"rpiu\",\n realizedProfitRatio: \"rpr\",\n totalRealizedProfitInUsd: \"trpiu\",\n totalRealizedProfitRatio: \"trr\",\n },\n\n // Token max liquidity subscription fields\n subscribeTokenMaxLiquidity: {\n tokenAddress: \"a\",\n poolAddress: \"p\",\n liquidityInUsd: \"liu\",\n liquidityInNative: \"lin\",\n timestamp: \"ts\",\n },\n\n // Token total liquidity subscription fields\n subscribeTokenTotalLiquidity: {\n tokenAddress: \"a\",\n liquidityInUsd: \"liu\",\n liquidityInNative: \"lin\",\n poolCount: \"pc\",\n timestamp: \"ts\",\n },\n} as const;\n\n/**\n * Get field mappings for a specific subscription method\n * @param methodName - The name of the subscription method\n * @returns Field mapping object for the method, or empty object if not found\n */\nexport function getFieldMappings(methodName: string): FieldMapping {\n return CEL_FIELD_MAPPINGS[methodName] || {};\n}\n\n/**\n * Replace long field names with short field names in a filter expression\n * Automatically adds meta. prefix if not present\n * Supports nested field paths (e.g., launchFrom.protocolFamily -> lf.pf)\n * @param filter - Original filter expression\n * @param methodName - The name of the subscription method\n * @returns Filter expression with short field names and meta. prefix\n */\nexport function replaceFilterFields(filter: string, methodName: string): string {\n if (!filter) {\n return filter;\n }\n\n const fieldMappings = getFieldMappings(methodName);\n let result = filter;\n\n // Sort entries by key length descending to replace longer (nested) paths first\n // This prevents partial replacements (e.g., \"launchFrom\" matching before \"launchFrom.protocolFamily\")\n const sortedEntries = Object.entries(fieldMappings).sort(([a], [b]) => b.length - a.length);\n\n for (const [longField, shortField] of sortedEntries) {\n // Escape dots in field names for regex\n const escapedField = longField.replace(/\\./g, \"\\\\.\");\n\n // Handle both cases: with and without meta. prefix\n const patterns = [\n // Pattern 1: meta.fieldName (with meta. prefix) — check first to avoid double meta.\n new RegExp(`\\\\bmeta\\\\.${escapedField}\\\\b`, \"g\"),\n // Pattern 2: fieldName (without meta. prefix)\n new RegExp(`\\\\b${escapedField}\\\\b`, \"g\"),\n ];\n\n patterns.forEach(pattern => {\n result = result.replace(pattern, `meta.${shortField}`);\n });\n }\n\n return result;\n}\n\n/**\n * Type-safe field mapping for specific subscription methods\n */\nexport type SubscriptionMethod = keyof typeof CEL_FIELD_MAPPINGS;\n\n/**\n * Get available field names for a specific subscription method\n * @param methodName - The name of the subscription method\n * @returns Array of available field names\n */\nexport function getAvailableFields(methodName: string): string[] {\n const mappings = getFieldMappings(methodName);\n return Object.keys(mappings);\n}\n","import { Resolution } from \"../openapi-client/index.js\";\n\nexport enum WsTokenActivityType {\n Sell = \"sell\",\n Buy = \"buy\",\n AddLiquidity = \"add_liquidity\",\n RemoveLiquidity = \"remove_liquidity\",\n}\n\nexport enum WsChannelType {\n New = \"new\",\n HOT = \"trending\",\n US_STOCKS = \"us_stocks\",\n FINAL_STRETCH = \"graduated\",\n MIGRATED = \"completed\",\n}\n\nexport enum WsMetricType {\n LIQUIDITY_IN_USD = \"liquidity_in_usd\",\n MIGRATED_RATIO = \"migrated_ratio\",\n}\n\nexport interface WsTokenActivity {\n address: string;\n priceUsd: string;\n amount: string;\n type: WsTokenActivityType;\n txHash: string;\n timestamp: number;\n}\n\n/**\n * Token trade statistics for multiple time windows.\n * Time windows: 1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 24h, 1W, 1M\n */\nexport interface WsTokenStat {\n /** Token address */\n address: string;\n /** Timestamp in milliseconds (UTC time when pipeline processed) */\n timestamp: number;\n /** Current token price in USD (first positive closeInUsd across windows, or from cache) */\n price?: string;\n\n // 1m window\n buys1m?: number;\n sells1m?: number;\n buyers1m?: number;\n sellers1m?: number;\n buyVolumeInUsd1m?: string;\n sellVolumeInUsd1m?: string;\n price1m?: string;\n openInUsd1m?: string;\n closeInUsd1m?: string;\n volumeChangeRatio1m?: string;\n trades1m?: number;\n dappProgramCount1m?: number;\n poolCount1m?: number;\n liquidityInUsd1m?: string;\n liquidityChangeRatio1m?: string;\n\n // 5m window\n buys5m?: number;\n sells5m?: number;\n buyers5m?: number;\n sellers5m?: number;\n buyVolumeInUsd5m?: string;\n sellVolumeInUsd5m?: string;\n price5m?: string;\n openInUsd5m?: string;\n closeInUsd5m?: string;\n volumeChangeRatio5m?: string;\n trades5m?: number;\n dappProgramCount5m?: number;\n poolCount5m?: number;\n liquidityInUsd5m?: string;\n liquidityChangeRatio5m?: string;\n\n // 15m window\n buys15m?: number;\n sells15m?: number;\n buyers15m?: number;\n sellers15m?: number;\n buyVolumeInUsd15m?: string;\n sellVolumeInUsd15m?: string;\n price15m?: string;\n openInUsd15m?: string;\n closeInUsd15m?: string;\n volumeChangeRatio15m?: string;\n trades15m?: number;\n dappProgramCount15m?: number;\n poolCount15m?: number;\n liquidityInUsd15m?: string;\n liquidityChangeRatio15m?: string;\n\n // 30m window\n buys30m?: number;\n sells30m?: number;\n buyers30m?: number;\n sellers30m?: number;\n buyVolumeInUsd30m?: string;\n sellVolumeInUsd30m?: string;\n price30m?: string;\n openInUsd30m?: string;\n closeInUsd30m?: string;\n volumeChangeRatio30m?: string;\n trades30m?: number;\n dappProgramCount30m?: number;\n poolCount30m?: number;\n liquidityInUsd30m?: string;\n liquidityChangeRatio30m?: string;\n\n // 1h window\n buys1h?: number;\n sells1h?: number;\n buyers1h?: number;\n sellers1h?: number;\n buyVolumeInUsd1h?: string;\n sellVolumeInUsd1h?: string;\n price1h?: string;\n openInUsd1h?: string;\n closeInUsd1h?: string;\n volumeChangeRatio1h?: string;\n trades1h?: number;\n dappProgramCount1h?: number;\n poolCount1h?: number;\n liquidityInUsd1h?: string;\n liquidityChangeRatio1h?: string;\n\n // 2h window\n buys2h?: number;\n sells2h?: number;\n buyers2h?: number;\n sellers2h?: number;\n buyVolumeInUsd2h?: string;\n sellVolumeInUsd2h?: string;\n price2h?: string;\n openInUsd2h?: string;\n closeInUsd2h?: string;\n volumeChangeRatio2h?: string;\n trades2h?: number;\n dappProgramCount2h?: number;\n poolCount2h?: number;\n liquidityInUsd2h?: string;\n liquidityChangeRatio2h?: string;\n\n // 4h window\n buys4h?: number;\n sells4h?: number;\n buyers4h?: number;\n sellers4h?: number;\n buyVolumeInUsd4h?: string;\n sellVolumeInUsd4h?: string;\n price4h?: string;\n openInUsd4h?: string;\n closeInUsd4h?: string;\n volumeChangeRatio4h?: string;\n trades4h?: number;\n dappProgramCount4h?: number;\n poolCount4h?: number;\n liquidityInUsd4h?: string;\n liquidityChangeRatio4h?: string;\n\n // 6h window\n buys6h?: number;\n sells6h?: number;\n buyers6h?: number;\n sellers6h?: number;\n buyVolumeInUsd6h?: string;\n sellVolumeInUsd6h?: string;\n price6h?: string;\n openInUsd6h?: string;\n closeInUsd6h?: string;\n volumeChangeRatio6h?: string;\n trades6h?: number;\n dappProgramCount6h?: number;\n poolCount6h?: number;\n liquidityInUsd6h?: string;\n liquidityChangeRatio6h?: string;\n\n // 8h window\n buys8h?: number;\n sells8h?: number;\n buyers8h?: number;\n sellers8h?: number;\n buyVolumeInUsd8h?: string;\n sellVolumeInUsd8h?: string;\n price8h?: string;\n openInUsd8h?: string;\n closeInUsd8h?: string;\n volumeChangeRatio8h?: string;\n trades8h?: number;\n dappProgramCount8h?: number;\n poolCount8h?: number;\n liquidityInUsd8h?: string;\n liquidityChangeRatio8h?: string;\n\n // 24h window\n buys24h?: number;\n sells24h?: number;\n buyers24h?: number;\n sellers24h?: number;\n buyVolumeInUsd24h?: string;\n sellVolumeInUsd24h?: string;\n price24h?: string;\n openInUsd24h?: string;\n closeInUsd24h?: string;\n volumeChangeRatio24h?: string;\n trades24h?: number;\n dappProgramCount24h?: number;\n poolCount24h?: number;\n liquidityInUsd24h?: string;\n liquidityChangeRatio24h?: string;\n\n // 1W (1 week) window - note: JSON keys use uppercase W\n buys1W?: number;\n sells1W?: number;\n buyers1W?: number;\n sellers1W?: number;\n buyVolumeInUsd1W?: string;\n sellVolumeInUsd1W?: string;\n price1W?: string;\n openInUsd1W?: string;\n closeInUsd1W?: string;\n volumeChangeRatio1W?: string;\n trades1W?: number;\n dappProgramCount1W?: number;\n poolCount1W?: number;\n liquidityInUsd1W?: string;\n liquidityChangeRatio1W?: string;\n\n // 1M (1 month) window - note: JSON keys use uppercase M\n buys1M?: number;\n sells1M?: number;\n buyers1M?: number;\n sellers1M?: number;\n buyVolumeInUsd1M?: string;\n sellVolumeInUsd1M?: string;\n price1M?: string;\n openInUsd1M?: string;\n closeInUsd1M?: string;\n volumeChangeRatio1M?: string;\n trades1M?: number;\n dappProgramCount1M?: number;\n poolCount1M?: number;\n liquidityInUsd1M?: string;\n liquidityChangeRatio1M?: string;\n}\n\nexport interface WsTokenHolder {\n tokenAddress: string;\n holders?: number;\n top100HoldersAmount?: string;\n top50HoldersAmount?: string;\n top10HoldersAmount?: string;\n top100Holders?: number;\n top50Holders?: number;\n top10Holders?: number;\n top100HoldersRatio?: string;\n top50HoldersRatio?: string;\n top10HoldersRatio?: string;\n creatorsHolders?: number;\n creatorsAmount?: string;\n creatorsRatio?: string;\n balanceTagFreshHolders?: number;\n balanceTagFreshAmount?: string;\n balanceTagFreshRatio?: string;\n balanceTagSandwichHolders?: number;\n balanceTagSandwichAmount?: string;\n balanceTagSandwichRatio?: string;\n balanceTagBundleHolders?: number;\n balanceTagBundleAmount?: string;\n balanceTagBundleRatio?: string;\n balanceTagSniperHolders?: number;\n balanceTagSniperAmount?: string;\n balanceTagSniperRatio?: string;\n balanceTagDevHolders?: number;\n balanceTagDevAmount?: string;\n balanceTagDevRatio?: string;\n balanceTagProHolders?: number;\n balanceTagProAmount?: string;\n balanceTagProRatio?: string;\n balanceTagInsiderHolders?: number;\n balanceTagInsiderAmount?: string;\n balanceTagInsiderRatio?: string;\n balanceTagSmartHolders?: number;\n balanceTagSmartAmount?: string;\n balanceTagSmartRatio?: string;\n balanceTagKolHolders?: number;\n balanceTagKolAmount?: string;\n balanceTagKolRatio?: string;\n balanceTagPhishingHolders?: number;\n balanceTagPhishingAmount?: string;\n balanceTagPhishingRatio?: string;\n balanceTagBluechipHolders?: number;\n balanceTagBluechipAmount?: string;\n balanceTagBluechipRatio?: string;\n balanceTagRatHolders?: number;\n balanceTagRatAmount?: string;\n balanceTagRatRatio?: string;\n timestamp: number;\n}\n\nexport interface WsWalletBalance {\n walletAddress: string;\n tokenAddress: string;\n tokenPriceInUsd: string;\n balance: string;\n timestamp: number;\n}\n\nexport interface WsWalletPnl {\n walletAddress: string;\n buys: number;\n buyAmount: string;\n buyAmountInUsd: string;\n averageBuyPriceInUsd: string;\n sellAmount: string;\n sellAmountInUsd: string;\n sells: number;\n wins: number;\n winRatio: string;\n pnlInUsd: string;\n averagePnlInUsd: string;\n pnlRatio: string;\n profitableDays: number;\n losingDays: number;\n tokens: number;\n resolution: string;\n}\n\nexport interface WsNewToken {\n tokenAddress: string;\n name: string;\n symbol: string;\n decimals?: number;\n imageUrl?: string;\n description?: string;\n socialMedia?: WsSocialMedia;\n coingeckoCoinId?: string;\n launchFrom?: WsDexProtocol;\n migratedTo?: WsDexProtocol;\n createdAtMs: number;\n}\n\nexport interface WsTokenSupply {\n tokenAddress: string;\n supply?: string;\n marketCapInUsd?: string;\n timestamp: number;\n}\n\nexport interface WsDexPoolBalance {\n poolAddress: string;\n tokenAAddress: string;\n tokenALiquidityInUsd: string;\n tokenBAddress: string;\n tokenBLiquidityInUsd: string;\n}\n\nexport interface WsTokenLiquidity {\n tokenAddress: string;\n metricType: WsMetricType;\n value: string;\n timestamp: number;\n}\n\nexport interface WsTokenMaxLiquidity {\n tokenAddress: string;\n poolAddress: string;\n liquidityInUsd: string;\n liquidityInNative: string;\n timestamp: number;\n}\n\nexport interface WsTokenTotalLiquidity {\n tokenAddress: string;\n liquidityInUsd: string;\n liquidityInNative: string;\n poolCount: number;\n timestamp: number;\n}\n\nexport interface WsDexProtocol {\n programAddress?: string;\n protocolFamily?: string;\n protocolName?: string;\n}\n\nexport interface WsTokenBondingCurve {\n tokenAddress?: string;\n progressRatio?: string;\n}\n\nexport interface WsTokenMetadata {\n tokenAddress: string;\n name?: string;\n decimals?: number;\n symbol?: string;\n imageUrl?: string;\n description?: string;\n socialMedia?: WsSocialMedia;\n createdAtMs?: number;\n coingeckoCoinId?: string;\n launchFrom?: WsDexProtocol;\n migratedTo?: WsDexProtocol;\n}\n\nexport interface WsSocialMedia {\n twitter?: string;\n telegram?: string;\n website?: string;\n tiktok?: string;\n discord?: string;\n facebook?: string;\n github?: string;\n instagram?: string;\n linkedin?: string;\n medium?: string;\n reddit?: string;\n youtube?: string;\n bitbucket?: string;\n}\n\nexport interface WsCandle {\n address: string;\n open: string;\n close: string;\n high: string;\n low: string;\n volume: string;\n resolution: Resolution;\n time: number;\n number: number;\n}\n\nexport type WsPriceType = \"usd\" | \"native\";\n\nexport interface WsTradeActivity {\n tokenAddress: string;\n timestamp: number;\n kind: string;\n buyAmount: string;\n buyAmountInUsd: string;\n buyTokenAddress: string;\n buyTokenName: string;\n buyTokenSymbol: string;\n buyWalletAddress: string;\n sellAmount: string;\n sellAmountInUsd: string;\n sellTokenAddress: string;\n sellTokenName: string;\n sellTokenSymbol: string;\n sellWalletAddress: string;\n txHash: string;\n}\n\nexport interface WsWalletTokenPnl {\n walletAddress: string;\n tokenAddress: string;\n timestamp: number;\n buyCount: number;\n buyCount30d: number;\n buyCount7d: number;\n sellCount: number;\n sellCount30d: number;\n sellCount7d: number;\n tokenPriceInUsd?: string;\n opentime?: number;\n lasttime?: number;\n closetime?: number;\n buyAmount?: string;\n buyAmountInUsd?: string;\n sellAmount?: string;\n sellAmountInUsd?: string;\n heldDurationTimestamp?: number;\n averageBuyPriceInUsd?: string;\n averageSellPriceInUsd?: string;\n unrealizedProfitInUsd?: string;\n unrealizedProfitRatio?: string;\n realizedProfitInUsd?: string;\n realizedProfitRatio?: string;\n totalRealizedProfitInUsd?: string;\n totalRealizedProfitRatio?: string;\n}\n\nexport enum WsRankingType {\n NEW = \"new\",\n HOT = \"trending\",\n STOCKS = \"stocks\",\n FINALSTRETCH = \"completed\",\n MIGRATED = \"graduated\",\n}\n\nexport enum WsDex {\n PUMP_FUN = \"pump_fun\",\n RAYDIUM_LAUNCHPAD = \"raydium_launchpad\",\n METEOR_DYNAMIC_BOUNDING_CURVE = \"meteora_dynamic_bounding_curve\",\n BONK_FUN = \"bonk_fun\",\n BOOP_FUN = \"boop_fun\",\n MOONIT_FUN = \"moonit_fun\",\n}\n\nexport interface WsRankingTokenList {\n metadata?: WsTokenMetadata;\n holder?: WsTokenHolder;\n supply?: WsTokenSupply;\n stat?: WsTokenStat;\n bondingCurve?: WsTokenBondingCurve;\n}\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { Blockchain, BlockchainLatestBlock, ChainSymbol } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.GET_SUPPORTED_BLOCKCHAINS.DESCRIPTION\n * @summary CONTROLLER.GET_SUPPORTED_BLOCKCHAINS.SUMMARY\n */\nexport const getSupportedBlockchains = (options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<Blockchain[]>({ url: `/v2/blockchain`, method: \"GET\" }, options);\n};\n/**\n * CONTROLLER.GET_LATEST_BLOCK.DESCRIPTION\n * @summary CONTROLLER.GET_LATEST_BLOCK.SUMMARY\n */\nexport const getLatestBlock = (\n chain: ChainSymbol,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<BlockchainLatestBlock>(\n { url: `/v2/blockchain/${chain}/latest_block`, method: \"GET\" },\n options,\n );\n};\nexport type GetSupportedBlockchainsResult = NonNullable<\n Awaited<ReturnType<typeof getSupportedBlockchains>>\n>;\nexport type GetLatestBlockResult = NonNullable<Awaited<ReturnType<typeof getLatestBlock>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n CreateTokenInput,\n CreateTokenReply,\n DexQuoteResponse,\n ListDexParams,\n PageResponseDex,\n QuoteParams,\n SwapInput,\n SwapReply,\n SwapRouteInput,\n SwapRouteResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.DEX.LIST.DESCRIPTION\n * @summary CONTROLLER.DEX.LIST.SUMMARY\n */\nexport const listDex = (\n params?: ListDexParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDex>({ url: `/v2/dex`, method: \"GET\", params }, options);\n};\n/**\n * CONTROLLER.DEX.CREATE.DESCRIPTION\n * @summary CONTROLLER.DEX.CREATE.SUMMARY\n */\nexport const createToken = (\n chain: ChainSymbol,\n createTokenInput: CreateTokenInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<CreateTokenReply>(\n {\n url: `/v2/dex/${chain}/create`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: createTokenInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.DEX.QUOTE.DESCRIPTION\n * @summary CONTROLLER.DEX.QUOTE.SUMMARY\n */\nexport const quote = (\n chain: ChainSymbol,\n params: QuoteParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<DexQuoteResponse>(\n { url: `/v2/dex/${chain}/quote`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.DEX.ROUTE.DESCRIPTION\n * @summary CONTROLLER.DEX.ROUTE.SUMMARY\n */\nexport const route = (\n chain: ChainSymbol,\n swapRouteInput: SwapRouteInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SwapRouteResponse>(\n {\n url: `/v2/dex/${chain}/route`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: swapRouteInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.DEX.SWAP.DESCRIPTION\n * @summary CONTROLLER.DEX.SWAP.SUMMARY\n */\nexport const swap = (\n chain: ChainSymbol,\n swapInput: SwapInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SwapReply>(\n {\n url: `/v2/dex/${chain}/swap`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: swapInput,\n },\n options,\n );\n};\nexport type ListDexResult = NonNullable<Awaited<ReturnType<typeof listDex>>>;\nexport type CreateTokenResult = NonNullable<Awaited<ReturnType<typeof createToken>>>;\nexport type QuoteResult = NonNullable<Awaited<ReturnType<typeof quote>>>;\nexport type RouteResult = NonNullable<Awaited<ReturnType<typeof route>>>;\nexport type SwapResult = NonNullable<Awaited<ReturnType<typeof swap>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n DexPoolDetail,\n GetDexpoolSnapshotsParams,\n PageResponseDexPoolSnapshot,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.DEXPOOL.GET.DESCRIPTION\n * @summary CONTROLLER.DEXPOOL.GET.SUMMARY\n */\nexport const getDexpool = (\n chain: ChainSymbol,\n poolAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<DexPoolDetail>(\n { url: `/v2/dexpools/${chain}/${poolAddress}`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.DEXPOOL.SNAPSHOTS.DESCRIPTION\n * @summary CONTROLLER.DEXPOOL.SNAPSHOTS.SUMMARY\n */\nexport const getDexpoolSnapshots = (\n chain: ChainSymbol,\n poolAddress: string,\n params?: GetDexpoolSnapshotsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDexPoolSnapshot>(\n { url: `/v2/dexpools/${chain}/${poolAddress}/snapshots`, method: \"GET\", params },\n options,\n );\n};\nexport type GetDexpoolResult = NonNullable<Awaited<ReturnType<typeof getDexpool>>>;\nexport type GetDexpoolSnapshotsResult = NonNullable<\n Awaited<ReturnType<typeof getDexpoolSnapshots>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { PresignResponseModel } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.IPFS.PRESIGN.DESCRIPTION\n * @summary CONTROLLER.IPFS.PRESIGN.SUMMARY\n */\nexport const presign = (options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<PresignResponseModel>(\n { url: `/v2/ipfs/presign`, method: \"POST\" },\n options,\n );\n};\nexport type PresignResult = NonNullable<Awaited<ReturnType<typeof presign>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { JobDTO, JobStreamingDTO } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.JOB.GET.DESCRIPTION\n * @summary CONTROLLER.JOB.GET.SUMMARY\n */\nexport const get = (id: string, options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<JobDTO>({ url: `/v2/job/${id}`, method: \"GET\" }, options);\n};\n/**\n * CONTROLLER.JOB.STREAMING.DESCRIPTION\n * @summary CONTROLLER.JOB.STREAMING.SUMMARY\n */\nexport const streaming = (id: string, options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<JobStreamingDTO>(\n { url: `/v2/job/${id}/streaming`, method: \"GET\" },\n options,\n );\n};\nexport type GetResult = NonNullable<Awaited<ReturnType<typeof get>>>;\nexport type StreamingResult = NonNullable<Awaited<ReturnType<typeof streaming>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n KYTRegisterAddressInput,\n KYTRegisterTransferInput,\n KYTRegisterWithdrawalInput,\n KytAddressRiskResponse,\n KytAlertsResponse,\n KytDirectExposureResponse,\n KytFraudAssessmentResponse,\n KytNetworkIdentificationsResponse,\n KytRegisterAddressResponse,\n KytTransferBaseResponse,\n KytWithdrawalAddressIdentificationsResponse,\n KytWithdrawalBaseResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.KYT.REGISTER_ADDRESS.DESCRIPTION\n * @summary CONTROLLER.KYT.REGISTER_ADDRESS.SUMMARY\n */\nexport const registerAddress = (\n kYTRegisterAddressInput: KYTRegisterAddressInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytRegisterAddressResponse>(\n {\n url: `/v2/kyt/address`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: kYTRegisterAddressInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_ADDRESS_RISK.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_ADDRESS_RISK.SUMMARY\n */\nexport const getAddressRisk = (\n address: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytAddressRiskResponse>(\n { url: `/v2/kyt/addresses/${address}/risk`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.REGISTER_TRANSFER.DESCRIPTION\n * @summary CONTROLLER.KYT.REGISTER_TRANSFER.SUMMARY\n */\nexport const registerTransfer = (\n kYTRegisterTransferInput: KYTRegisterTransferInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytTransferBaseResponse>(\n {\n url: `/v2/kyt/transfer`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: kYTRegisterTransferInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_ALERTS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_ALERTS.SUMMARY\n */\nexport const getTransferAlerts = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytAlertsResponse>(\n { url: `/v2/kyt/transfers/${transferId}/alerts`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_DIRECT_EXPOSURE.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_DIRECT_EXPOSURE.SUMMARY\n */\nexport const getTransferDirectExposure = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytDirectExposureResponse>(\n { url: `/v2/kyt/transfers/${transferId}/exposures/direct`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_NETWORK_IDENTIFICATIONS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_NETWORK_IDENTIFICATIONS.SUMMARY\n */\nexport const getTransferNetworkIdentifications = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytNetworkIdentificationsResponse>(\n { url: `/v2/kyt/transfers/${transferId}/network-identifications`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_TRANSFER_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_TRANSFER_SUMMARY.SUMMARY\n */\nexport const getTransferSummary = (\n transferId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytTransferBaseResponse>(\n { url: `/v2/kyt/transfers/${transferId}/summary`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.REGISTER_WITHDRAWAL.DESCRIPTION\n * @summary CONTROLLER.KYT.REGISTER_WITHDRAWAL.SUMMARY\n */\nexport const registerWithdrawal = (\n kYTRegisterWithdrawalInput: KYTRegisterWithdrawalInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytWithdrawalBaseResponse>(\n {\n url: `/v2/kyt/withdrawal`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: kYTRegisterWithdrawalInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_ADDRESS_IDENTIFICATIONS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_ADDRESS_IDENTIFICATIONS.SUMMARY\n */\nexport const getWithdrawalAddressIdentifications = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytWithdrawalAddressIdentificationsResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/address-identifications`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_ALERTS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_ALERTS.SUMMARY\n */\nexport const getWithdrawalAlerts = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytAlertsResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/alerts`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_DIRECT_EXPOSURE.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_DIRECT_EXPOSURE.SUMMARY\n */\nexport const getWithdrawalDirectExposure = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytDirectExposureResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/exposures/direct`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_FRAUD_ASSESSMENT.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_FRAUD_ASSESSMENT.SUMMARY\n */\nexport const getWithdrawalFraudAssessment = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytFraudAssessmentResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/fraud-assessment`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_NETWORK_IDENTIFICATIONS.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_NETWORK_IDENTIFICATIONS.SUMMARY\n */\nexport const getWithdrawalNetworkIdentifications = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytNetworkIdentificationsResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/network-identifications`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.KYT.GET_WITHDRAWAL_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.KYT.GET_WITHDRAWAL_SUMMARY.SUMMARY\n */\nexport const getWithdrawalSummary = (\n withdrawalId: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<KytWithdrawalBaseResponse>(\n { url: `/v2/kyt/withdrawal/${withdrawalId}/summary`, method: \"GET\" },\n options,\n );\n};\nexport type RegisterAddressResult = NonNullable<Awaited<ReturnType<typeof registerAddress>>>;\nexport type GetAddressRiskResult = NonNullable<Awaited<ReturnType<typeof getAddressRisk>>>;\nexport type RegisterTransferResult = NonNullable<Awaited<ReturnType<typeof registerTransfer>>>;\nexport type GetTransferAlertsResult = NonNullable<Awaited<ReturnType<typeof getTransferAlerts>>>;\nexport type GetTransferDirectExposureResult = NonNullable<\n Awaited<ReturnType<typeof getTransferDirectExposure>>\n>;\nexport type GetTransferNetworkIdentificationsResult = NonNullable<\n Awaited<ReturnType<typeof getTransferNetworkIdentifications>>\n>;\nexport type GetTransferSummaryResult = NonNullable<Awaited<ReturnType<typeof getTransferSummary>>>;\nexport type RegisterWithdrawalResult = NonNullable<Awaited<ReturnType<typeof registerWithdrawal>>>;\nexport type GetWithdrawalAddressIdentificationsResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalAddressIdentifications>>\n>;\nexport type GetWithdrawalAlertsResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalAlerts>>\n>;\nexport type GetWithdrawalDirectExposureResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalDirectExposure>>\n>;\nexport type GetWithdrawalFraudAssessmentResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalFraudAssessment>>\n>;\nexport type GetWithdrawalNetworkIdentificationsResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalNetworkIdentifications>>\n>;\nexport type GetWithdrawalSummaryResult = NonNullable<\n Awaited<ReturnType<typeof getWithdrawalSummary>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n GetFinalStretchTokensParams,\n GetHotTokensParams,\n GetMigratedTokensParams,\n GetNewTokensParams,\n GetStocksTokensParams,\n RankingDuration,\n Token,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.RANKING.FINAL_STRETCH_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.FINAL_STRETCH_TOKENS.SUMMARY\n */\nexport const getFinalStretchTokens = (\n chain: ChainSymbol,\n params?: GetFinalStretchTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/finalStretch`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.HOT_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.HOT_TOKENS.SUMMARY\n */\nexport const getHotTokens = (\n chain: ChainSymbol,\n duration: RankingDuration,\n params?: GetHotTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/hotTokens/${duration}`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.MIGRATED_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.MIGRATED_TOKENS.SUMMARY\n */\nexport const getMigratedTokens = (\n chain: ChainSymbol,\n params?: GetMigratedTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/migrated`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.NEW_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.NEW_TOKENS.SUMMARY\n */\nexport const getNewTokens = (\n chain: ChainSymbol,\n params?: GetNewTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/newTokens`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RANKING.STOCKS_TOKENS.DESCRIPTION\n * @summary CONTROLLER.RANKING.STOCKS_TOKENS.SUMMARY\n */\nexport const getStocksTokens = (\n chain: ChainSymbol,\n params?: GetStocksTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/ranking/${chain}/stocks`, method: \"GET\", params },\n options,\n );\n};\nexport type GetFinalStretchTokensResult = NonNullable<\n Awaited<ReturnType<typeof getFinalStretchTokens>>\n>;\nexport type GetHotTokensResult = NonNullable<Awaited<ReturnType<typeof getHotTokens>>>;\nexport type GetMigratedTokensResult = NonNullable<Awaited<ReturnType<typeof getMigratedTokens>>>;\nexport type GetNewTokensResult = NonNullable<Awaited<ReturnType<typeof getNewTokens>>>;\nexport type GetStocksTokensResult = NonNullable<Awaited<ReturnType<typeof getStocksTokens>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n ClaimRedPacketRequest,\n ClaimRedPacketResponse,\n CreateRedPacketRequest,\n CreateRedPacketResponse,\n GetClaimsByAddressParams,\n GetClaimsParams,\n GetRedpacketsByAddressParams,\n GetRedpacketsParams,\n RedPacket,\n RedPacketClaimsPage,\n RedPacketSendTxRequest,\n RedPacketSendTxResponse,\n RedPacketsPage,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.RED_PACKET.GET_REDPACKETS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_REDPACKETS.SUMMARY\n */\nexport const getRedpackets = (\n params?: GetRedpacketsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketsPage>(\n { url: `/v2/redpacket`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.GET_CLAIMS_BY_ADDRESS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_CLAIMS_BY_ADDRESS.SUMMARY\n */\nexport const getClaimsByAddress = (\n address: string,\n params?: GetClaimsByAddressParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketClaimsPage>(\n { url: `/v2/redpacket/wallet/${address}/claims`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.GET_REDPACKETS_BY_ADDRESS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_REDPACKETS_BY_ADDRESS.SUMMARY\n */\nexport const getRedpacketsByAddress = (\n address: string,\n params?: GetRedpacketsByAddressParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketsPage>(\n { url: `/v2/redpacket/wallet/${address}/redpackets`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.CLAIM.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.CLAIM.SUMMARY\n */\nexport const claimRedpacket = (\n chain: ChainSymbol,\n claimRedPacketRequest: ClaimRedPacketRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<ClaimRedPacketResponse>(\n {\n url: `/v2/redpacket/${chain}/claim`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: claimRedPacketRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.CREATE.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.CREATE.SUMMARY\n */\nexport const createRedpacket = (\n chain: ChainSymbol,\n createRedPacketRequest: CreateRedPacketRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<CreateRedPacketResponse>(\n {\n url: `/v2/redpacket/${chain}/create`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: createRedPacketRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.SEND.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.SEND.SUMMARY\n */\nexport const redpacketSend = (\n chain: ChainSymbol,\n redPacketSendTxRequest: RedPacketSendTxRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketSendTxResponse>(\n {\n url: `/v2/redpacket/${chain}/send`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: redPacketSendTxRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.RED_PACKET.GET.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET.SUMMARY\n */\nexport const getRedpacket = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacket>({ url: `/v2/redpacket/${id}`, method: \"GET\" }, options);\n};\n/**\n * CONTROLLER.RED_PACKET.GET_CLAIMS.DESCRIPTION\n * @summary CONTROLLER.RED_PACKET.GET_CLAIMS.SUMMARY\n */\nexport const getClaims = (\n id: string,\n params?: GetClaimsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<RedPacketClaimsPage>(\n { url: `/v2/redpacket/${id}/claims`, method: \"GET\", params },\n options,\n );\n};\nexport type GetRedpacketsResult = NonNullable<Awaited<ReturnType<typeof getRedpackets>>>;\nexport type GetClaimsByAddressResult = NonNullable<Awaited<ReturnType<typeof getClaimsByAddress>>>;\nexport type GetRedpacketsByAddressResult = NonNullable<\n Awaited<ReturnType<typeof getRedpacketsByAddress>>\n>;\nexport type ClaimRedpacketResult = NonNullable<Awaited<ReturnType<typeof claimRedpacket>>>;\nexport type CreateRedpacketResult = NonNullable<Awaited<ReturnType<typeof createRedpacket>>>;\nexport type RedpacketSendResult = NonNullable<Awaited<ReturnType<typeof redpacketSend>>>;\nexport type GetRedpacketResult = NonNullable<Awaited<ReturnType<typeof getRedpacket>>>;\nexport type GetClaimsResult = NonNullable<Awaited<ReturnType<typeof getClaims>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n GetCandlesParams,\n GetDevTokensParams,\n GetHoldersMultiParams,\n GetHoldersParams,\n GetMarketDataMulti200,\n GetMarketDataMultiParams,\n GetMetadataMulti200,\n GetMetadataMultiParams,\n GetMintAndBurnParams,\n GetPairCandlesParams,\n GetPoolCandlesParams,\n GetPoolsParams,\n GetPriceByTimeParams,\n GetPricesParams,\n GetStatsMulti200,\n GetStatsMultiParams,\n GetTokenLiquiditySnapshotsParams,\n GetTokenTradersParams,\n GetTokenTransferTotalParams,\n GetTokenTransfersParams,\n GetTokensParams,\n GetTopHoldersParams,\n ListTokenParams,\n PageResponseDevToken,\n PageResponseDexPool,\n PageResponseToken,\n PageResponseTokenHolder,\n PageResponseTokenLiquiditySnapshot,\n PageResponseTokenMintBurn,\n PageResponseTokenPrice,\n PageResponseTokenTrader,\n PageResponseTokenTransfer,\n SearchParams,\n Token,\n TokenCandle,\n TokenCreation,\n TokenHolder,\n TokenMarketData,\n TokenMetadata,\n TokenPage,\n TokenPrice,\n TokenStats,\n TokenTraderTag,\n TokenTransferTotal,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.TOKEN.SEARCH.DESCRIPTION\n * @summary CONTROLLER.TOKEN.SEARCH.SUMMARY\n */\nexport const search = (\n params?: SearchParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenPage>(\n { url: `/v2/token/search`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_DEV_TOKENS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_DEV_TOKENS.SUMMARY\n */\nexport const getDevTokens = (\n chain: ChainSymbol,\n devAddress: string,\n params?: GetDevTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDevToken>(\n { url: `/v2/token/${chain}/dev/${devAddress}/tokens`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOKEN_LIST.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOKEN_LIST.SUMMARY\n */\nexport const listToken = (\n chain: ChainSymbol,\n params?: ListTokenParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseToken>(\n { url: `/v2/token/${chain}/list`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_MARKET_DATA_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_MARKET_DATA_MULTI.SUMMARY\n */\nexport const getMarketDataMulti = (\n chain: ChainSymbol,\n params: GetMarketDataMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GetMarketDataMulti200>(\n { url: `/v2/token/${chain}/marketData/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_METADATA_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_METADATA_MULTI.SUMMARY\n */\nexport const getMetadataMulti = (\n chain: ChainSymbol,\n params: GetMetadataMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GetMetadataMulti200>(\n { url: `/v2/token/${chain}/metadata/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOKENS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOKENS.SUMMARY\n */\nexport const getTokens = (\n chain: ChainSymbol,\n params: GetTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token[]>(\n { url: `/v2/token/${chain}/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_PAIR_CANDLES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_PAIR_CANDLES.SUMMARY\n */\nexport const getPairCandles = (\n chain: ChainSymbol,\n pair: string,\n params: GetPairCandlesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCandle[]>(\n { url: `/v2/token/${chain}/pair/${pair}/candles`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_POOL_CANDLES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_POOL_CANDLES.SUMMARY\n */\nexport const getPoolCandles = (\n chain: ChainSymbol,\n poolAddress: string,\n params: GetPoolCandlesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCandle[]>(\n { url: `/v2/token/${chain}/pool/${poolAddress}/candles`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_STATS_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_STATS_MULTI.SUMMARY\n */\nexport const getStatsMulti = (\n chain: ChainSymbol,\n params: GetStatsMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GetStatsMulti200>(\n { url: `/v2/token/${chain}/stats/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET.SUMMARY\n */\nexport const getToken = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<Token>(\n { url: `/v2/token/${chain}/${tokenAddress}`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_CANDLES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_CANDLES.SUMMARY\n */\nexport const getCandles = (\n chain: ChainSymbol,\n tokenAddress: string,\n params: GetCandlesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCandle[]>(\n { url: `/v2/token/${chain}/${tokenAddress}/candles`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_CREATION.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_CREATION.SUMMARY\n */\nexport const getCreation = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenCreation>(\n { url: `/v2/token/${chain}/${tokenAddress}/creation`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_HOLDERS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_HOLDERS.SUMMARY\n */\nexport const getHolders = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetHoldersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenHolder>(\n { url: `/v2/token/${chain}/${tokenAddress}/holders`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_HOLDERS_MULTI.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_HOLDERS_MULTI.SUMMARY\n */\nexport const getHoldersMulti = (\n chain: ChainSymbol,\n tokenAddress: string,\n params: GetHoldersMultiParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenHolder[]>(\n { url: `/v2/token/${chain}/${tokenAddress}/holders/multi`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_LIQUIDITY_SNAPSHOTS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_LIQUIDITY_SNAPSHOTS.SUMMARY\n */\nexport const getTokenLiquiditySnapshots = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTokenLiquiditySnapshotsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenLiquiditySnapshot>(\n { url: `/v2/token/${chain}/${tokenAddress}/liquiditySnapshots`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_MARKET_CAP.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_MARKET_CAP.SUMMARY\n */\nexport const getMarketData = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenMarketData>(\n { url: `/v2/token/${chain}/${tokenAddress}/marketData`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_METADATA.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_METADATA.SUMMARY\n */\nexport const getMetadata = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenMetadata>(\n { url: `/v2/token/${chain}/${tokenAddress}/metadata`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_MINT_AND_BURN.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_MINT_AND_BURN.SUMMARY\n */\nexport const getMintAndBurn = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetMintAndBurnParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenMintBurn>(\n { url: `/v2/token/${chain}/${tokenAddress}/mintAndBurn`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_POOLS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_POOLS.SUMMARY\n */\nexport const getPools = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetPoolsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseDexPool>(\n { url: `/v2/token/${chain}/${tokenAddress}/pools`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_PRICE_BY_TIME.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_PRICE_BY_TIME.SUMMARY\n */\nexport const getPriceByTime = (\n chain: ChainSymbol,\n tokenAddress: string,\n params: GetPriceByTimeParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenPrice>(\n { url: `/v2/token/${chain}/${tokenAddress}/price`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_PRICES.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_PRICES.SUMMARY\n */\nexport const getPrices = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetPricesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenPrice>(\n { url: `/v2/token/${chain}/${tokenAddress}/prices`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_SECURITY.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_SECURITY.SUMMARY\n */\nexport const getSecurity = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<unknown>(\n { url: `/v2/token/${chain}/${tokenAddress}/security`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_STATS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_STATS.SUMMARY\n */\nexport const getStats = (\n chain: ChainSymbol,\n tokenAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenStats>(\n { url: `/v2/token/${chain}/${tokenAddress}/stats`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOP_HOLDERS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOP_HOLDERS.SUMMARY\n */\nexport const getTopHolders = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTopHoldersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenHolder>(\n { url: `/v2/token/${chain}/${tokenAddress}/topHolders`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TOKEN_TRADERS.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TOKEN_TRADERS.SUMMARY\n */\nexport const getTokenTraders = (\n chain: ChainSymbol,\n tokenAddress: string,\n tag: TokenTraderTag,\n params?: GetTokenTradersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenTrader>(\n { url: `/v2/token/${chain}/${tokenAddress}/traders/${tag}`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TRANSFER_TOTAL.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TRANSFER_TOTAL.SUMMARY\n */\nexport const getTokenTransferTotal = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTokenTransferTotalParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TokenTransferTotal>(\n { url: `/v2/token/${chain}/${tokenAddress}/transfer-total`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TOKEN.GET_TRANSFER_LIST.DESCRIPTION\n * @summary CONTROLLER.TOKEN.GET_TRANSFER_LIST.SUMMARY\n */\nexport const getTokenTransfers = (\n chain: ChainSymbol,\n tokenAddress: string,\n params?: GetTokenTransfersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTokenTransfer>(\n { url: `/v2/token/${chain}/${tokenAddress}/transfers`, method: \"GET\", params },\n options,\n );\n};\nexport type SearchResult = NonNullable<Awaited<ReturnType<typeof search>>>;\nexport type GetDevTokensResult = NonNullable<Awaited<ReturnType<typeof getDevTokens>>>;\nexport type ListTokenResult = NonNullable<Awaited<ReturnType<typeof listToken>>>;\nexport type GetMarketDataMultiResult = NonNullable<Awaited<ReturnType<typeof getMarketDataMulti>>>;\nexport type GetMetadataMultiResult = NonNullable<Awaited<ReturnType<typeof getMetadataMulti>>>;\nexport type GetTokensResult = NonNullable<Awaited<ReturnType<typeof getTokens>>>;\nexport type GetPairCandlesResult = NonNullable<Awaited<ReturnType<typeof getPairCandles>>>;\nexport type GetPoolCandlesResult = NonNullable<Awaited<ReturnType<typeof getPoolCandles>>>;\nexport type GetStatsMultiResult = NonNullable<Awaited<ReturnType<typeof getStatsMulti>>>;\nexport type GetTokenResult = NonNullable<Awaited<ReturnType<typeof getToken>>>;\nexport type GetCandlesResult = NonNullable<Awaited<ReturnType<typeof getCandles>>>;\nexport type GetCreationResult = NonNullable<Awaited<ReturnType<typeof getCreation>>>;\nexport type GetHoldersResult = NonNullable<Awaited<ReturnType<typeof getHolders>>>;\nexport type GetHoldersMultiResult = NonNullable<Awaited<ReturnType<typeof getHoldersMulti>>>;\nexport type GetTokenLiquiditySnapshotsResult = NonNullable<\n Awaited<ReturnType<typeof getTokenLiquiditySnapshots>>\n>;\nexport type GetMarketDataResult = NonNullable<Awaited<ReturnType<typeof getMarketData>>>;\nexport type GetMetadataResult = NonNullable<Awaited<ReturnType<typeof getMetadata>>>;\nexport type GetMintAndBurnResult = NonNullable<Awaited<ReturnType<typeof getMintAndBurn>>>;\nexport type GetPoolsResult = NonNullable<Awaited<ReturnType<typeof getPools>>>;\nexport type GetPriceByTimeResult = NonNullable<Awaited<ReturnType<typeof getPriceByTime>>>;\nexport type GetPricesResult = NonNullable<Awaited<ReturnType<typeof getPrices>>>;\nexport type GetSecurityResult = NonNullable<Awaited<ReturnType<typeof getSecurity>>>;\nexport type GetStatsResult = NonNullable<Awaited<ReturnType<typeof getStats>>>;\nexport type GetTopHoldersResult = NonNullable<Awaited<ReturnType<typeof getTopHolders>>>;\nexport type GetTokenTradersResult = NonNullable<Awaited<ReturnType<typeof getTokenTraders>>>;\nexport type GetTokenTransferTotalResult = NonNullable<\n Awaited<ReturnType<typeof getTokenTransferTotal>>\n>;\nexport type GetTokenTransfersResult = NonNullable<Awaited<ReturnType<typeof getTokenTransfers>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n ChainSymbol,\n GetActivitiesParams,\n GetTopTradersParams,\n GetTraderGainersLosersParams,\n GetTradesParams,\n PageResponseTopTrader,\n PageResponseTradeDetail,\n PageResponseTraderGainersLosersItem,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.TRADE.GET.TOKEN.DESCRIPTION\n * @summary CONTROLLER.TRADE.GET.TOKEN.SUMMARY\n */\nexport const getTrades = (\n chain: ChainSymbol,\n params?: GetTradesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTradeDetail>(\n { url: `/v2/trade/${chain}`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TRADE.GET.TOKEN_ACTIVITIES.DESCRIPTION\n * @summary CONTROLLER.TRADE.GET.TOKEN_ACTIVITIES.SUMMARY\n */\nexport const getActivities = (\n chain: ChainSymbol,\n params?: GetActivitiesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTradeDetail>(\n { url: `/v2/trade/${chain}/activities`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TRADE.GET.TOP_TRADERS.DESCRIPTION\n * @summary CONTROLLER.TRADE.GET.TOP_TRADERS.SUMMARY\n */\nexport const getTopTraders = (\n chain: ChainSymbol,\n params: GetTopTradersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTopTrader>(\n { url: `/v2/trade/${chain}/top-traders`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.TRADER.GET_GAINERS_LOSERS.DESCRIPTION\n * @summary CONTROLLER.TRADER.GET_GAINERS_LOSERS.SUMMARY\n */\nexport const getTraderGainersLosers = (\n chain: ChainSymbol,\n params?: GetTraderGainersLosersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseTraderGainersLosersItem>(\n { url: `/v2/trade/${chain}/trader-gainers-losers`, method: \"GET\", params },\n options,\n );\n};\nexport type GetTradesResult = NonNullable<Awaited<ReturnType<typeof getTrades>>>;\nexport type GetActivitiesResult = NonNullable<Awaited<ReturnType<typeof getActivities>>>;\nexport type GetTopTradersResult = NonNullable<Awaited<ReturnType<typeof getTopTraders>>>;\nexport type GetTraderGainersLosersResult = NonNullable<\n Awaited<ReturnType<typeof getTraderGainersLosers>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n EstimateGasLimitInput,\n EstimateGasLimitResponse,\n GasPriceResponse,\n SendTxInput,\n SendTxResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.TRANSACTION.ESTIMATE_GAS_LIMIT.DESCRIPTION\n * @summary CONTROLLER.TRANSACTION.ESTIMATE_GAS_LIMIT.SUMMARY\n */\nexport const getGasLimit = (\n chain: \"bsc\" | \"eth\",\n estimateGasLimitInput: EstimateGasLimitInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EstimateGasLimitResponse>(\n {\n url: `/v2/transaction/${chain}/estimate-gas-limit`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: estimateGasLimitInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.TRANSACTION.GET_GAS_PRICE.DESCRIPTION\n * @summary CONTROLLER.TRANSACTION.GET_GAS_PRICE.SUMMARY\n */\nexport const getGasPrice = (\n chain: \"bsc\" | \"eth\",\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<GasPriceResponse>(\n { url: `/v2/transaction/${chain}/gas-price`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.TRANSACTION.SEND.DESCRIPTION\n * @summary CONTROLLER.TRANSACTION.SEND.SUMMARY\n */\nexport const send = (\n chain: \"sol\" | \"bsc\" | \"eth\",\n sendTxInput: SendTxInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SendTxResponse>(\n {\n url: `/v2/transaction/${chain}/send`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: sendTxInput,\n },\n options,\n );\n};\nexport type GetGasLimitResult = NonNullable<Awaited<ReturnType<typeof getGasLimit>>>;\nexport type GetGasPriceResult = NonNullable<Awaited<ReturnType<typeof getGasPrice>>>;\nexport type SendResult = NonNullable<Awaited<ReturnType<typeof send>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n CalculatePnlInput,\n ChainSymbol,\n GetBalanceUpdatesParams,\n GetNetWorthByTokensParams,\n GetNetWorthChartParams,\n GetNetWorthDetailsParams,\n GetNetWorthParams,\n GetNetWorthSummaryParams,\n GetPnlByTokenParams,\n GetPnlByWalletParams,\n GetPnlDetailsParams,\n GetPnlParams,\n GetTokensBalanceParams,\n GetWalletFirstTxParams,\n GetWalletTransferTotalParams,\n GetWalletTransfersParams,\n NetWorthByTokensResult,\n PageResponseBalanceUpdate,\n PageResponseNetWorthByTokensItem,\n PageResponseWalletTransfer,\n PnlDetailsResult,\n SuccessResponse,\n TransferTotalResponse,\n WalletNetWorthChartResponse,\n WalletNetWorthDetailsPage,\n WalletNetWorthPage,\n WalletNetWorthSummaryResponse,\n WalletPnlSummary,\n WalletsMapResponse,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.WALLET.GET_FIRST_TX.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_FIRST_TX.SUMMARY\n */\nexport const getWalletFirstTx = (\n chain: ChainSymbol,\n params: GetWalletFirstTxParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletsMapResponse>(\n { url: `/v2/wallet/${chain}/first-tx`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_SUMMARY.SUMMARY\n */\nexport const getNetWorthSummary = (\n chain: ChainSymbol,\n params: GetNetWorthSummaryParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthSummaryResponse>(\n { url: `/v2/wallet/${chain}/net-worth-summary`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_BY_WALLET.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_BY_WALLET.SUMMARY\n */\nexport const getPnlByWallet = (\n chain: ChainSymbol,\n params: GetPnlByWalletParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PnlDetailsResult>(\n { url: `/v2/wallet/${chain}/pnl-by-wallet`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_BALANCE_UPDATES.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_BALANCE_UPDATES.SUMMARY\n */\nexport const getBalanceUpdates = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetBalanceUpdatesParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseBalanceUpdate>(\n { url: `/v2/wallet/${chain}/${walletAddress}/balance-updates`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.CALCULATE_PNL.DESCRIPTION\n * @summary CONTROLLER.WALLET.CALCULATE_PNL.SUMMARY\n */\nexport const calculatePnl = (\n chain: ChainSymbol,\n walletAddress: string,\n calculatePnlInput: CalculatePnlInput,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<SuccessResponse>(\n {\n url: `/v2/wallet/${chain}/${walletAddress}/calculate-pnl`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: calculatePnlInput,\n },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH.SUMMARY\n */\nexport const getNetWorth = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetNetWorthParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthPage>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_CHART.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_CHART.SUMMARY\n */\nexport const getNetWorthChart = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetNetWorthChartParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthChartResponse>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth-chart`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_DETAILS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_DETAILS.SUMMARY\n */\nexport const getNetWorthDetails = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetNetWorthDetailsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletNetWorthDetailsPage>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth-details`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_NET_WORTH_BY_TOKENS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_NET_WORTH_BY_TOKENS.SUMMARY\n */\nexport const getNetWorthByTokens = (\n chain: ChainSymbol,\n walletAddress: string,\n params: GetNetWorthByTokensParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<NetWorthByTokensResult>(\n { url: `/v2/wallet/${chain}/${walletAddress}/net-worth/tokens`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_SUMMARY.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_SUMMARY.SUMMARY\n */\nexport const getPnl = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetPnlParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WalletPnlSummary>(\n { url: `/v2/wallet/${chain}/${walletAddress}/pnl`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_BY_TOKEN.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_BY_TOKEN.SUMMARY\n */\nexport const getPnlByToken = (\n chain: ChainSymbol,\n walletAddress: string,\n params: GetPnlByTokenParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PnlDetailsResult>(\n { url: `/v2/wallet/${chain}/${walletAddress}/pnl-by-token`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_PNL_DETAILS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_PNL_DETAILS.SUMMARY\n */\nexport const getPnlDetails = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetPnlDetailsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PnlDetailsResult>(\n { url: `/v2/wallet/${chain}/${walletAddress}/pnl-details`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_TOKENS_BALANCE.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_TOKENS_BALANCE.SUMMARY\n */\nexport const getTokensBalance = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetTokensBalanceParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseNetWorthByTokensItem>(\n { url: `/v2/wallet/${chain}/${walletAddress}/tokens-balance`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_TRANSFER_TOTAL.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_TRANSFER_TOTAL.SUMMARY\n */\nexport const getWalletTransferTotal = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetWalletTransferTotalParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<TransferTotalResponse>(\n { url: `/v2/wallet/${chain}/${walletAddress}/transfer-total`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.WALLET.GET_TRANSFERS.DESCRIPTION\n * @summary CONTROLLER.WALLET.GET_TRANSFERS.SUMMARY\n */\nexport const getWalletTransfers = (\n chain: ChainSymbol,\n walletAddress: string,\n params?: GetWalletTransfersParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<PageResponseWalletTransfer>(\n { url: `/v2/wallet/${chain}/${walletAddress}/transfers`, method: \"GET\", params },\n options,\n );\n};\nexport type GetWalletFirstTxResult = NonNullable<Awaited<ReturnType<typeof getWalletFirstTx>>>;\nexport type GetNetWorthSummaryResult = NonNullable<Awaited<ReturnType<typeof getNetWorthSummary>>>;\nexport type GetPnlByWalletResult = NonNullable<Awaited<ReturnType<typeof getPnlByWallet>>>;\nexport type GetBalanceUpdatesResult = NonNullable<Awaited<ReturnType<typeof getBalanceUpdates>>>;\nexport type CalculatePnlResult = NonNullable<Awaited<ReturnType<typeof calculatePnl>>>;\nexport type GetNetWorthResult = NonNullable<Awaited<ReturnType<typeof getNetWorth>>>;\nexport type GetNetWorthChartResult = NonNullable<Awaited<ReturnType<typeof getNetWorthChart>>>;\nexport type GetNetWorthDetailsResult = NonNullable<Awaited<ReturnType<typeof getNetWorthDetails>>>;\nexport type GetNetWorthByTokensResult = NonNullable<\n Awaited<ReturnType<typeof getNetWorthByTokens>>\n>;\nexport type GetPnlResult = NonNullable<Awaited<ReturnType<typeof getPnl>>>;\nexport type GetPnlByTokenResult = NonNullable<Awaited<ReturnType<typeof getPnlByToken>>>;\nexport type GetPnlDetailsResult = NonNullable<Awaited<ReturnType<typeof getPnlDetails>>>;\nexport type GetTokensBalanceResult = NonNullable<Awaited<ReturnType<typeof getTokensBalance>>>;\nexport type GetWalletTransferTotalResult = NonNullable<\n Awaited<ReturnType<typeof getWalletTransferTotal>>\n>;\nexport type GetWalletTransfersResult = NonNullable<Awaited<ReturnType<typeof getWalletTransfers>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type { ChainSymbol, WatchlistAddResponseModel } from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.WATCHLIST.ADD.DESCRIPTION\n * @summary CONTROLLER.WATCHLIST.ADD.SUMMARY\n */\nexport const watchlistAdd = (\n chain: ChainSymbol,\n walletAddress: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WatchlistAddResponseModel>(\n { url: `/v2/watchlist/${chain}/${walletAddress}`, method: \"POST\" },\n options,\n );\n};\nexport type WatchlistAddResult = NonNullable<Awaited<ReturnType<typeof watchlistAdd>>>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\nimport type {\n CreateWebhookRequest,\n EndpointListResponse,\n EndpointOperationResponse,\n EndpointSecretResponse,\n ListEndpointsParams,\n UpdateWebhookRequest,\n WebhookEndpoint,\n} from \"../chainStreamAPI.schemas\";\n\nimport { chainstreamApiClient } from \"../../chainstreamApiClient.js\";\n\ntype SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];\n\n/**\n * CONTROLLER.ENDPOINT.LIST.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.LIST.SUMMARY\n */\nexport const listEndpoints = (\n params?: ListEndpointsParams,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointListResponse>(\n { url: `/v2/webhook/endpoint`, method: \"GET\", params },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.CREATE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.CREATE.SUMMARY\n */\nexport const createEndpoint = (\n createWebhookRequest: CreateWebhookRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WebhookEndpoint>(\n {\n url: `/v2/webhook/endpoint`,\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n data: createWebhookRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.UPDATE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.UPDATE.SUMMARY\n */\nexport const updateEndpoint = (\n updateWebhookRequest: UpdateWebhookRequest,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<WebhookEndpoint>(\n {\n url: `/v2/webhook/endpoint`,\n method: \"PATCH\",\n headers: { \"Content-Type\": \"application/json\" },\n data: updateWebhookRequest,\n },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.GET.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.GET.SUMMARY\n */\nexport const getEndpoint = (id: string, options?: SecondParameter<typeof chainstreamApiClient>) => {\n return chainstreamApiClient<WebhookEndpoint>(\n { url: `/v2/webhook/endpoint/${id}`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.DELETE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.DELETE.SUMMARY\n */\nexport const deleteEndpoint = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointOperationResponse>(\n { url: `/v2/webhook/endpoint/${id}`, method: \"DELETE\" },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.GET.SECRET.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.GET.SECRET.SUMMARY\n */\nexport const getEndpointSecret = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointSecretResponse>(\n { url: `/v2/webhook/endpoint/${id}/secret`, method: \"GET\" },\n options,\n );\n};\n/**\n * CONTROLLER.ENDPOINT.ROTATE.DESCRIPTION\n * @summary CONTROLLER.ENDPOINT.ROTATE.SUMMARY\n */\nexport const rotateEndpointSecret = (\n id: string,\n options?: SecondParameter<typeof chainstreamApiClient>,\n) => {\n return chainstreamApiClient<EndpointOperationResponse>(\n { url: `/v2/webhook/endpoint/${id}/secret/rotate`, method: \"POST\" },\n options,\n );\n};\nexport type ListEndpointsResult = NonNullable<Awaited<ReturnType<typeof listEndpoints>>>;\nexport type CreateEndpointResult = NonNullable<Awaited<ReturnType<typeof createEndpoint>>>;\nexport type UpdateEndpointResult = NonNullable<Awaited<ReturnType<typeof updateEndpoint>>>;\nexport type GetEndpointResult = NonNullable<Awaited<ReturnType<typeof getEndpoint>>>;\nexport type DeleteEndpointResult = NonNullable<Awaited<ReturnType<typeof deleteEndpoint>>>;\nexport type GetEndpointSecretResult = NonNullable<Awaited<ReturnType<typeof getEndpointSecret>>>;\nexport type RotateEndpointSecretResult = NonNullable<\n Awaited<ReturnType<typeof rotateEndpointSecret>>\n>;\n","/**\n * Generated by orval v7.6.0 🍺\n * Do not edit manually.\n * ChainStream API\n * ChainStream Unified API\n * OpenAPI spec version: 2.0\n */\n/**\n * Activity type (extends TradeType)\n */\nexport type ActivityType = (typeof ActivityType)[keyof typeof ActivityType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const ActivityType = {\n BUY: \"BUY\",\n SELL: \"SELL\",\n LIQUIDITY_INITIALIZE: \"LIQUIDITY_INITIALIZE\",\n LIQUIDITY_ADD: \"LIQUIDITY_ADD\",\n LIQUIDITY_REMOVE: \"LIQUIDITY_REMOVE\",\n RED_PACKET_CREATE: \"RED_PACKET_CREATE\",\n RED_PACKET_CLAIM: \"RED_PACKET_CLAIM\",\n RED_PACKET_COMPLETE: \"RED_PACKET_COMPLETE\",\n RED_PACKET_REFUND: \"RED_PACKET_REFUND\",\n} as const;\n\n/**\n * Balance change type\n */\nexport type BalanceChangeType = (typeof BalanceChangeType)[keyof typeof BalanceChangeType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const BalanceChangeType = {\n INCREASE: \"INCREASE\",\n DECREASE: \"DECREASE\",\n} as const;\n\n/**\n * Balance token type\n */\nexport type BalanceTokenType = (typeof BalanceTokenType)[keyof typeof BalanceTokenType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const BalanceTokenType = {\n SOL: \"SOL\",\n SPL: \"SPL\",\n} as const;\n\n/**\n * Balance update record\n */\nexport interface BalanceUpdate {\n /** ENTITY.BALANCE_UPDATE.ACCOUNT_OWNER_ADDRESS */\n accountOwnerAddress: string;\n /** ENTITY.BALANCE_UPDATE.BALANCE_CHANGE */\n balanceChange: string;\n /** ENTITY.BALANCE_UPDATE.BALANCE_CHANGE_IN_NATIVE */\n balanceChangeInNative: string;\n /** ENTITY.BALANCE_UPDATE.BALANCE_CHANGE_IN_USD */\n balanceChangeInUsd: string;\n /** ENTITY.BALANCE_UPDATE.BLOCK_HASH */\n blockHash: string;\n /** ENTITY.BALANCE_UPDATE.BLOCK_HEIGHT */\n blockHeight: number;\n /**\n * ENTITY.BALANCE_UPDATE.BLOCK_SLOT\n * @nullable\n */\n blockSlot?: number | null;\n /** ENTITY.BALANCE_UPDATE.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.BALANCE_UPDATE.CHANGE_TYPE */\n changeType: BalanceChangeType;\n /** ENTITY.BALANCE_UPDATE.INDEX */\n index: number;\n /** ENTITY.BALANCE_UPDATE.POST_BALANCE */\n postBalance: string;\n /** ENTITY.BALANCE_UPDATE.POST_BALANCE_IN_NATIVE */\n postBalanceInNative: string;\n /** ENTITY.BALANCE_UPDATE.POST_BALANCE_IN_USD */\n postBalanceInUsd: string;\n /** ENTITY.BALANCE_UPDATE.PRE_BALANCE */\n preBalance: string;\n /** ENTITY.BALANCE_UPDATE.PRE_BALANCE_IN_NATIVE */\n preBalanceInNative: string;\n /** ENTITY.BALANCE_UPDATE.PRE_BALANCE_IN_USD */\n preBalanceInUsd: string;\n /** ENTITY.BALANCE_UPDATE.TOKEN_ACCOUNT_ADDRESS */\n tokenAccountAddress: string;\n /** ENTITY.BALANCE_UPDATE.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.BALANCE_UPDATE.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** ENTITY.BALANCE_UPDATE.TOKEN_TYPE */\n type: BalanceTokenType;\n}\n\n/**\n * Blockchain information\n */\nexport interface Blockchain {\n /** ENTITY.BLOCKCHAIN.CHAIN_ID */\n chainId: number;\n /** ENTITY.BLOCKCHAIN.EXPLORER_URL */\n explorerUrl: string;\n /** ENTITY.BLOCKCHAIN.NAME */\n name: string;\n /** ENTITY.BLOCKCHAIN.SYMBOL */\n symbol: string;\n}\n\nexport interface BlockchainLatestBlock {\n /** ENTITY.BLOCKCHAIN_LATEST_BLOCK.BLOCKHASH */\n blockhash: string;\n /** ENTITY.BLOCKCHAIN_LATEST_BLOCK.LAST_VALID_BLOCK_HEIGHT */\n lastValidBlockHeight: number;\n}\n\n/**\n * Boolean result response\n */\nexport interface BooleanResult {\n /** ENTITY.BOOLEAN_RESULT.RESULT */\n result: boolean;\n}\n\nexport interface CalculatePnlInput {\n /**\n * DTO.WALLET.CALCULATE_PNL.TOKEN_ADDRESSES\n * @nullable\n */\n tokenAddresses?: string[] | null;\n}\n\n/**\n * Supported blockchain chains\n */\nexport type ChainSymbol = (typeof ChainSymbol)[keyof typeof ChainSymbol];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const ChainSymbol = {\n sol: \"sol\",\n eth: \"eth\",\n bsc: \"bsc\",\n} as const;\n\n/**\n * DTO.RED_PACKET.CLAIMER\n */\nexport interface ClaimRedPacketRequest {\n /** DTO.RED_PACKET.CLAIMER */\n claimer: string;\n /**\n * DTO.RED_PACKET.PACKET_ID\n * @nullable\n */\n packetId?: string | null;\n /**\n * DTO.RED_PACKET.PASSWORD\n * @nullable\n */\n password?: string | null;\n /**\n * DTO.RED_PACKET.SHARE_ID\n * @nullable\n */\n shareId?: string | null;\n}\n\n/**\n * Claim red packet response\n */\nexport interface ClaimRedPacketResponse {\n /** DTO.RED_PACKET.SERIALIZED_TX */\n txSerialize: string;\n}\n\n/**\n * DTO.RED_PACKET.CREATOR\n */\nexport interface CreateRedPacketRequest {\n /**\n * DTO.RED_PACKET.CLAIM_AUTHORITY\n * @nullable\n */\n claimAuthority?: string | null;\n /** DTO.RED_PACKET.CREATOR */\n creator: string;\n /**\n * DTO.RED_PACKET.EXPIRATION\n * @nullable\n */\n expiration?: number | null;\n /**\n * DTO.RED_PACKET.FIXED_AMOUNT\n * @nullable\n */\n fixedAmount?: string | null;\n /** DTO.RED_PACKET.MAX_CLAIMS */\n maxClaims: number;\n /**\n * DTO.RED_PACKET.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.RED_PACKET.MINT */\n mint: string;\n /**\n * DTO.RED_PACKET.PASSWORD\n * @nullable\n */\n password?: string | null;\n /**\n * DTO.RED_PACKET.TOTAL_AMOUNT\n * @nullable\n */\n totalAmount?: string | null;\n}\n\n/**\n * Create red packet response\n */\nexport interface CreateRedPacketResponse {\n /** DTO.RED_PACKET.SHARE_ID */\n shareId: string;\n /** DTO.RED_PACKET.SERIALIZED_TX */\n txSerialize: string;\n}\n\n/**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\nexport type CreateWebhookRequestMetadata = { [key: string]: unknown } | null;\n\n/**\n * Request to create a webhook endpoint\n */\nexport interface CreateWebhookRequest {\n /**\n * DTO.ENDPOINT.CHANNELS\n * @nullable\n */\n channels?: WebhookChannel[] | null;\n /**\n * DTO.ENDPOINT.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * DTO.ENDPOINT.DISABLED\n * @nullable\n */\n disabled?: boolean | null;\n /**\n * DTO.ENDPOINT.FILTER\n * @nullable\n */\n filter?: string | null;\n /**\n * DTO.ENDPOINT.FILTER_TYPES\n * @nullable\n */\n filterTypes?: string[] | null;\n /**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\n metadata?: CreateWebhookRequestMetadata;\n /**\n * DTO.ENDPOINT.RATE_LIMIT\n * @minimum 0\n * @nullable\n */\n rateLimit?: number | null;\n /**\n * DTO.ENDPOINT.SECRET\n * @nullable\n */\n secret?: string | null;\n /** DTO.ENDPOINT.URL */\n url: string;\n}\n\n/**\n * Token info returned by `get_dev_tokens` — mirrors TS `DevTokenDTO`.\n */\nexport interface DevToken {\n /** Token address */\n address: string;\n /** Market data */\n marketData: TokenMarketData;\n /** Token metadata */\n metadata: TokenMetadata;\n /** Trade statistics */\n stats: TokenStats;\n}\n\n/**\n * DEX information\n */\nexport interface Dex {\n /** Chain identifier */\n chain: string;\n /**\n * DEX image URL\n * @nullable\n */\n image?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family name\n * @nullable\n */\n protocolFamily?: DexProtocolFamily;\n}\n\n/**\n * DEX pool\n */\nexport interface DexPool {\n /** Chain */\n chain: string;\n /** Pool address */\n poolAddress: string;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family\n * @nullable\n */\n protocolFamily?: string | null;\n /** Token A address */\n tokenAAddress: string;\n /** Token B address */\n tokenBAddress: string;\n /**\n * TVL in native token\n * @nullable\n */\n tvlInSol?: string | null;\n /**\n * TVL in USD\n * @nullable\n */\n tvlInUsd?: string | null;\n}\n\n/**\n * DEX pool detail\n */\nexport interface DexPoolDetail {\n /** Chain identifier */\n chain: string;\n /**\n * Creation block timestamp\n * @nullable\n */\n createdBlockTimestamp?: string | null;\n /**\n * Fee rate\n * @nullable\n */\n feeRate?: string | null;\n /**\n * Image URL\n * @nullable\n */\n image?: string | null;\n /**\n * Liquidity model\n * @minimum 0\n * @nullable\n */\n liquidityModel?: number | null;\n /** Pool address */\n poolAddress: string;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family\n * @nullable\n */\n protocolFamily?: string | null;\n /**\n * Protocol name\n * @nullable\n */\n protocolName?: string | null;\n /**\n * Tick spacing\n * @nullable\n */\n tickSpacing?: number | null;\n /** Token A address */\n tokenAAddress: string;\n /**\n * Token A liquidity\n * @nullable\n */\n tokenALiquidity?: DexPoolTokenLiquidity;\n /** Token B address */\n tokenBAddress: string;\n /**\n * Token B liquidity\n * @nullable\n */\n tokenBLiquidity?: DexPoolTokenLiquidity;\n /**\n * Token count\n * @nullable\n */\n tokenCount?: number | null;\n /**\n * TVL in native token\n * @nullable\n */\n tvlInSol?: string | null;\n /**\n * TVL in USD\n * @nullable\n */\n tvlInUsd?: string | null;\n /**\n * Pool type\n * @minimum 0\n * @nullable\n */\n type?: number | null;\n /**\n * Pool version\n * @minimum 0\n * @nullable\n */\n version?: number | null;\n}\n\n/**\n * DEX pool liquidity model (0=Unknown, 1=ReserveBased, 2=PositionBased, 3=Virtual, 4=Shared)\n */\nexport type DexPoolLiquidityModel =\n (typeof DexPoolLiquidityModel)[keyof typeof DexPoolLiquidityModel];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexPoolLiquidityModel = {\n Unknown: \"Unknown\",\n ReserveBased: \"ReserveBased\",\n PositionBased: \"PositionBased\",\n Virtual: \"Virtual\",\n Shared: \"Shared\",\n} as const;\n\n/**\n * DEX pool liquidity snapshot\n */\nexport interface DexPoolSnapshot {\n /** Block height */\n blockHeight: number;\n /**\n * Block slot (optional)\n * @nullable\n */\n blockSlot?: number | null;\n /** Block timestamp (ms) */\n blockTimestamp: number;\n /** Pool address */\n poolAddress: string;\n /** Snapshot timestamp (ms) */\n snapshotTime: number;\n /** Token A snapshot */\n tokenA: DexPoolTokenSnapshot;\n /** Token B snapshot */\n tokenB: DexPoolTokenSnapshot;\n /** TVL in native token */\n tvlInNative: string;\n /** TVL in USD */\n tvlInUsd: string;\n}\n\n/**\n * DEX pool token liquidity\n */\nexport interface DexPoolTokenLiquidity {\n /** Amount in native token */\n amountInNative: string;\n /** Amount in USD */\n amountInUsd: string;\n /** Token decimals */\n decimals: number;\n /** Price in native token */\n priceNative: string;\n /** Price in USD */\n priceUsd: string;\n /** Token address */\n tokenAddress: string;\n /** Vault amount */\n vaultAmount: string;\n}\n\n/**\n * DEX pool token snapshot\n */\nexport interface DexPoolTokenSnapshot {\n /** Amount in native token */\n amountInNative: string;\n /** Amount in USD */\n amountInUsd: string;\n /** Token decimals */\n decimals: number;\n /** Price in native token */\n priceNative: string;\n /** Price in USD */\n priceUsd: string;\n /** Token address */\n tokenAddress: string;\n /** Vault amount */\n vaultAmount: string;\n}\n\n/**\n * DEX pool type (0=Unknown, 1=Standard, 2=Concentrated, 3=Weighted, 4=Stable)\n */\nexport type DexPoolType = (typeof DexPoolType)[keyof typeof DexPoolType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexPoolType = {\n Unknown: \"Unknown\",\n Standard: \"Standard\",\n Concentrated: \"Concentrated\",\n Weighted: \"Weighted\",\n Stable: \"Stable\",\n} as const;\n\n/**\n * DEX pool version (0=Unknown, 1=V1, 2=V2, 3=V3)\n */\nexport type DexPoolVersion = (typeof DexPoolVersion)[keyof typeof DexPoolVersion];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexPoolVersion = {\n Unknown: \"Unknown\",\n V1: \"V1\",\n V2: \"V2\",\n V3: \"V3\",\n} as const;\n\n/**\n * DEX protocol family identifier\n */\nexport type DexProtocolFamily = (typeof DexProtocolFamily)[keyof typeof DexProtocolFamily];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const DexProtocolFamily = {\n Raydium: \"Raydium\",\n Pumpfun: \"Pumpfun\",\n Pumpswap: \"Pumpswap\",\n Meteora: \"Meteora\",\n Moonshot: \"Moonshot\",\n Jupiter: \"Jupiter\",\n Orca: \"Orca\",\n OrcaWhirpool: \"OrcaWhirpool\",\n OpenBook: \"OpenBook\",\n Phoenix: \"Phoenix\",\n Lifinity: \"Lifinity\",\n MagicEden: \"MagicEden\",\n Tensor: \"Tensor\",\n Aldrin: \"Aldrin\",\n AldrinAmm: \"AldrinAmm\",\n BonkFun: \"BonkFun\",\n BoopFun: \"BoopFun\",\n CremaFinance: \"CremaFinance\",\n Cropper: \"Cropper\",\n Cykura: \"Cykura\",\n Dradex: \"Dradex\",\n Fluxbeam: \"Fluxbeam\",\n GooseFx: \"GooseFx\",\n Invariant: \"Invariant\",\n Intro: \"Intro\",\n Metaplex: \"Metaplex\",\n OasisProgram: \"OasisProgram\",\n Obric: \"Obric\",\n PancakeClmm: \"PancakeClmm\",\n Penguin: \"Penguin\",\n Saber: \"Saber\",\n Saros: \"Saros\",\n Sencha: \"Sencha\",\n Sentre: \"Sentre\",\n Serum: \"Serum\",\n Solana: \"Solana\",\n SolFi: \"SolFi\",\n Stabble: \"Stabble\",\n StepFinance: \"StepFinance\",\n StepN: \"StepN\",\n Symmetry: \"Symmetry\",\n ZeroFi: \"ZeroFi\",\n Unknown: \"Unknown\",\n} as const;\n\n/**\n * Paginated list of webhook endpoints\n */\nexport interface EndpointListResponse {\n /** DTO.ENDPOINT.PAGE.DATA */\n data: WebhookEndpoint[];\n /** DTO.ENDPOINT.PAGE.DONE */\n done: boolean;\n /**\n * DTO.ENDPOINT.PAGE.ITERATOR\n * @nullable\n */\n iterator?: string | null;\n /**\n * DTO.ENDPOINT.PAGE.PREV_ITERATOR\n * @nullable\n */\n prevIterator?: string | null;\n}\n\n/**\n * Boolean result for endpoint operations (delete, rotate secret)\n */\nexport interface EndpointOperationResponse {\n /** DTO.ENDPOINT.SUCCESS */\n success: boolean;\n}\n\n/**\n * Ordering direction for paginated endpoint listing\n */\nexport type EndpointOrder = (typeof EndpointOrder)[keyof typeof EndpointOrder];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const EndpointOrder = {\n ascending: \"ascending\",\n descending: \"descending\",\n} as const;\n\n/**\n * Secret response for a webhook endpoint\n */\nexport interface EndpointSecretResponse {\n /** DTO.ENDPOINT.SECRET */\n secret: string;\n}\n\nexport interface ErrorDetail {\n /**\n * ENTITY.ERROR_DETAIL.CODE\n * @minimum 0\n */\n code: number;\n /**\n * ENTITY.ERROR_DETAIL.DETAILS\n * @nullable\n */\n details?: ErrorField[] | null;\n /** ENTITY.ERROR_DETAIL.MESSAGE */\n message: string;\n}\n\nexport interface ErrorField {\n /** ENTITY.ERROR_FIELD.FIELD */\n field: string;\n /** ENTITY.ERROR_FIELD.MESSAGE */\n message: string;\n}\n\nexport interface ErrorResponse {\n /** ENTITY.ERROR_RESPONSE.ERROR */\n error: ErrorDetail;\n}\n\n/**\n * Filter condition for token queries\n */\nexport interface FilterCondition {\n /** Field name to filter */\n field: string;\n /** Operator (gt, gte, lt, lte, eq, ne) */\n operator: string;\n /** Value to compare */\n value: string;\n}\n\n/**\n * Hot token ranking duration\n */\nexport type HotTokenDuration = (typeof HotTokenDuration)[keyof typeof HotTokenDuration];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const HotTokenDuration = {\n \"1m\": \"1m\",\n \"5m\": \"5m\",\n \"1h\": \"1h\",\n \"4h\": \"4h\",\n \"24h\": \"24h\",\n} as const;\n\n/**\n * Response from IPFS JSON upload — mirrors TS `uploadJson` return type.\n */\nexport interface IpfsUploadResponse {\n /** IPFS content identifier (CID) */\n cid: string;\n /**\n * File name\n * @nullable\n */\n name?: string | null;\n /**\n * Pin size in bytes\n * @nullable\n */\n size?: number | null;\n /** Public IPFS URL */\n url: string;\n}\n\nexport interface KYTRegisterAddressInput {\n /** DTO.KYT.REGISTER_ADDRESS_REQUEST.ADDRESS */\n address: string;\n}\n\nexport interface KYTRegisterTransferInput {\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.ASSET */\n asset: string;\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.DIRECTION */\n direction: TransferDirection;\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.NETWORK */\n network: KytNetwork;\n /** DTO.KYT.KYT_REGISTER_TRANSFER_REQUEST.TRANSFER_REFERENCE */\n transferReference: string;\n}\n\nexport interface KYTRegisterWithdrawalInput {\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ADDRESS */\n address: string;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET */\n asset: string;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_AMOUNT */\n assetAmount: string;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_DENOMINATION\n * @nullable\n */\n assetDenomination?: string | null;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_ID\n * @nullable\n */\n assetId?: string | null;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ASSET_PRICE\n * @nullable\n */\n assetPrice?: string | null;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.ATTEMPT_TIMESTAMP */\n attemptTimestamp: string;\n /**\n * DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.KYT.KYT_REGISTER_WITHDRAWAL_REQUEST.NETWORK */\n network: KytNetwork;\n}\n\nexport interface KytAddressExposure {\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.CATEGORY\n * @nullable\n */\n category?: string | null;\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.DIRECTION\n * @nullable\n */\n direction?: string | null;\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.EXPOSURE_TYPE\n * @nullable\n */\n exposureType?: string | null;\n /**\n * DTO.KYT.ADDRESS_EXPOSURE.VALUE\n * @nullable\n */\n value?: string | null;\n}\n\nexport interface KytAddressIdentification {\n /**\n * DTO.KYT.CHAINALYSIS_ADDRESS_IDENTIFICATION.ADDRESS_NAME\n * @nullable\n */\n addressName?: string | null;\n /**\n * DTO.KYT.CHAINALYSIS_ADDRESS_IDENTIFICATION.CATEGORY_ID\n * @nullable\n */\n categoryId?: number | null;\n /**\n * DTO.KYT.CHAINALYSIS_ADDRESS_IDENTIFICATION.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n}\n\n/**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.CLUSTER\n * @nullable\n */\nexport type KytAddressRiskResponseCluster = { [key: string]: unknown } | null;\n\nexport interface KytAddressRiskResponse {\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.ADDRESS */\n address: string;\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.ADDRESS_IDENTIFICATIONS */\n addressIdentifications?: unknown[];\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.ADDRESS_TYPE\n * @nullable\n */\n addressType?: string | null;\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.CLUSTER\n * @nullable\n */\n cluster?: KytAddressRiskResponseCluster;\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.EXPOSURES */\n exposures?: KytAddressExposure[];\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.RISK\n * @nullable\n */\n risk?: string | null;\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.RISK_REASON\n * @nullable\n */\n riskReason?: string | null;\n /**\n * DTO.KYT.ADDRESS_RISK_RESPONSE.STATUS\n * @nullable\n */\n status?: string | null;\n /** DTO.KYT.ADDRESS_RISK_RESPONSE.TRIGGERS */\n triggers?: unknown[];\n}\n\nexport interface KytAlertDetail {\n /**\n * DTO.KYT.ALERT_DETAIL.ALERT_AMOUNT\n * @nullable\n */\n alertAmount?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.ALERT_LEVEL\n * @nullable\n */\n alertLevel?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.CATEGORY_ID\n * @nullable\n */\n categoryId?: number | null;\n /**\n * DTO.KYT.ALERT_DETAIL.EXPOSURE_TYPE\n * @nullable\n */\n exposureType?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.EXTERNAL_ID\n * @nullable\n */\n externalId?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.MEMO\n * @nullable\n */\n memo?: string | null;\n /**\n * DTO.KYT.ALERT_DETAIL.SERVICE\n * @nullable\n */\n service?: string | null;\n}\n\nexport interface KytAlertsResponse {\n /** DTO.KYT.TRANSFER_ALERTS_RESPONSE.ALERTS */\n alerts: KytAlertDetail[];\n}\n\nexport interface KytAlteryaIdentification {\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.ADDRESS\n * @nullable\n */\n address?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.CHAIN\n * @nullable\n */\n chain?: string | null;\n /** DTO.KYT.ALTERYA_IDENTIFICATION.LABELS */\n labels?: string[];\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.OBJECT\n * @nullable\n */\n object?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.ON_CHAIN_ACTIVITY\n * @nullable\n */\n on_chain_activity?: KytOnChainActivity;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.REASON\n * @nullable\n */\n reason?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.RISK_LEVEL\n * @nullable\n */\n risk_level?: string | null;\n /**\n * DTO.KYT.ALTERYA_IDENTIFICATION.RISK_SCORE\n * @nullable\n */\n risk_score?: string | null;\n}\n\nexport interface KytDirectExposureDetail {\n /**\n * DTO.KYT.DIRECT_EXPOSURE_DETAIL.CATEGORY_ID\n * @nullable\n */\n categoryId?: number | null;\n /**\n * DTO.KYT.DIRECT_EXPOSURE_DETAIL.NAME\n * @nullable\n */\n name?: string | null;\n}\n\nexport interface KytDirectExposureResponse {\n /**\n * DTO.KYT.TRANSFER_DIRECT_EXPOSURE_RESPONSE.DIRECT\n * @nullable\n */\n direct?: KytDirectExposureDetail;\n}\n\nexport interface KytFraudAssessmentResponse {\n /** DTO.KYT.WITHDRAWAL_FRAUD_ASSESSMENT_RESPONSE.ALTERYA_IDENTIFICATIONS */\n alteryaIdentifications?: KytAlteryaIdentification[];\n}\n\nexport type KytNetwork = (typeof KytNetwork)[keyof typeof KytNetwork];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const KytNetwork = {\n Solana: \"Solana\",\n bitcoin: \"bitcoin\",\n ethereum: \"ethereum\",\n} as const;\n\nexport interface KytNetworkIdentificationOrg {\n /**\n * DTO.KYT.NETWORK_IDENTIFICATION_ORG.NAME\n * @nullable\n */\n name?: string | null;\n}\n\nexport interface KytNetworkIdentificationsResponse {\n /**\n * DTO.KYT.TRANSFER_NETWORK_IDENTIFICATIONS_RESPONSE.COUNT\n * @nullable\n */\n count?: number | null;\n /** DTO.KYT.TRANSFER_NETWORK_IDENTIFICATIONS_RESPONSE.NETWORK_IDENTIFICATION_ORGS */\n networkIdentificationOrgs?: KytNetworkIdentificationOrg[];\n}\n\nexport interface KytOnChainActivity {\n /**\n * DTO.KYT.ON_CHAIN_ACTIVITY.FIRST_TRANSACTION_AT\n * @nullable\n */\n first_transaction_at?: number | null;\n}\n\nexport interface KytRegisterAddressResponse {\n /** DTO.KYT.REGISTER_ADDRESS_RESPONSE.ADDRESS */\n address: string;\n}\n\nexport interface KytTransferBaseResponse {\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.ASSET */\n asset: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.ASSET_AMOUNT\n * @nullable\n */\n assetAmount?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.ASSET_ID\n * @nullable\n */\n assetId?: string | null;\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.EXTERNAL_ID */\n externalId: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.IDX\n * @nullable\n */\n idx?: number | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.NETWORK */\n network: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.OUTPUT_ADDRESS\n * @nullable\n */\n outputAddress?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.TIMESTAMP\n * @nullable\n */\n timestamp?: string | null;\n /** DTO.KYT.TRANSFER_BASE_RESPONSE.TRANSFER_REFERENCE */\n transferReference: string;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.TX\n * @nullable\n */\n tx?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /**\n * DTO.KYT.TRANSFER_BASE_RESPONSE.USD_AMOUNT\n * @nullable\n */\n usdAmount?: string | null;\n}\n\nexport interface KytWithdrawalAddressIdentificationsResponse {\n /** DTO.KYT.WITHDRAWAL_ADDRESS_IDENTIFICATIONS_RESPONSE.CHAINALYSIS_IDENTIFICATIONS */\n chainalysisIdentifications?: KytAddressIdentification[];\n /** DTO.KYT.WITHDRAWAL_ADDRESS_IDENTIFICATIONS_RESPONSE.CUSTOM_ADDRESSES */\n customAddresses?: unknown[];\n}\n\nexport interface KytWithdrawalBaseResponse {\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ADDRESS */\n address: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ASSET */\n asset: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ASSET_AMOUNT */\n assetAmount: string;\n /**\n * DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ASSET_ID\n * @nullable\n */\n assetId?: string | null;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.ATTEMPT_IDENTIFIER */\n attemptIdentifier: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.EXTERNAL_ID */\n externalId: string;\n /**\n * DTO.KYT.WITHDRAWAL_BASE_RESPONSE.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.NETWORK */\n network: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.UPDATED_AT */\n updatedAt: string;\n /** DTO.KYT.WITHDRAWAL_BASE_RESPONSE.USD_AMOUNT */\n usdAmount: string;\n}\n\n/**\n * Launchpad tag for token filtering\n */\nexport type LaunchpadTag = (typeof LaunchpadTag)[keyof typeof LaunchpadTag];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const LaunchpadTag = {\n pump_fun: \"pump_fun\",\n raydium_launchpad: \"raydium_launchpad\",\n meteora_dynamic_bounding_curve: \"meteora_dynamic_bounding_curve\",\n bonk_fun: \"bonk_fun\",\n moonit_fun: \"moonit_fun\",\n} as const;\n\n/**\n * Mint/burn type filter\n */\nexport type MintBurnType = (typeof MintBurnType)[keyof typeof MintBurnType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const MintBurnType = {\n all: \"all\",\n mint: \"mint\",\n burn: \"burn\",\n} as const;\n\n/**\n * Single token net-worth item (mirrors TS WalletNetWorthItemDTO).\n */\nexport interface NetWorthByTokensItem {\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.AMOUNT */\n amount: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.CHAIN */\n chain: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.DECIMALS */\n decimals: number;\n /**\n * ENTITY.NET_WORTH_BY_TOKENS_ITEM.LOGO_URI\n * @nullable\n */\n logoUri?: string | null;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.NAME */\n name: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.PRICE_IN_NATIVE */\n priceInNative: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.PRICE_IN_USD */\n priceInUsd: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.SYMBOL */\n symbol: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.VALUE_IN_NATIVE */\n valueInNative: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.VALUE_IN_USD */\n valueInUsd: string;\n}\n\n/**\n * Wallet net-worth by tokens result (mirrors TS WalletNetWorthByTokensResult).\n */\nexport interface NetWorthByTokensResult {\n /** ENTITY.NET_WORTH_BY_TOKENS_RESULT.CURRENT_TIMESTAMP */\n currentTimestamp: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_RESULT.DATA */\n data: NetWorthByTokensItem[];\n /** ENTITY.NET_WORTH_BY_TOKENS_RESULT.TOTAL_VALUE_IN_NATIVE */\n totalValueInNative: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_RESULT.TOTAL_VALUE_IN_USD */\n totalValueInUsd: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_RESULT.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Single data point in a net-worth chart time series.\n */\nexport interface NetWorthHistoryItem {\n /** ENTITY.NET_WORTH_HISTORY_ITEM.NET_WORTH */\n netWorth: string;\n /** ENTITY.NET_WORTH_HISTORY_ITEM.NET_WORTH_CHANGE */\n netWorthChange: string;\n /** ENTITY.NET_WORTH_HISTORY_ITEM.NET_WORTH_CHANGE_PERCENT */\n netWorthChangePercent: string;\n /** ENTITY.NET_WORTH_HISTORY_ITEM.TIMESTAMP */\n timestamp: string;\n}\n\nexport interface NetWorthSummaryValue {\n /** ENTITY.NET_WORTH_SUMMARY_VALUE.VALUE */\n value: string;\n}\n\n/**\n * Pagination direction\n */\nexport type PageDirection = (typeof PageDirection)[keyof typeof PageDirection];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PageDirection = {\n next: \"next\",\n prev: \"prev\",\n} as const;\n\n/**\n * Balance update record\n */\nexport type PageResponseBalanceUpdateDataItem = {\n /** ENTITY.BALANCE_UPDATE.ACCOUNT_OWNER_ADDRESS */\n accountOwnerAddress: string;\n /** ENTITY.BALANCE_UPDATE.BALANCE_CHANGE */\n balanceChange: string;\n /** ENTITY.BALANCE_UPDATE.BALANCE_CHANGE_IN_NATIVE */\n balanceChangeInNative: string;\n /** ENTITY.BALANCE_UPDATE.BALANCE_CHANGE_IN_USD */\n balanceChangeInUsd: string;\n /** ENTITY.BALANCE_UPDATE.BLOCK_HASH */\n blockHash: string;\n /** ENTITY.BALANCE_UPDATE.BLOCK_HEIGHT */\n blockHeight: number;\n /**\n * ENTITY.BALANCE_UPDATE.BLOCK_SLOT\n * @nullable\n */\n blockSlot?: number | null;\n /** ENTITY.BALANCE_UPDATE.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.BALANCE_UPDATE.CHANGE_TYPE */\n changeType: BalanceChangeType;\n /** ENTITY.BALANCE_UPDATE.INDEX */\n index: number;\n /** ENTITY.BALANCE_UPDATE.POST_BALANCE */\n postBalance: string;\n /** ENTITY.BALANCE_UPDATE.POST_BALANCE_IN_NATIVE */\n postBalanceInNative: string;\n /** ENTITY.BALANCE_UPDATE.POST_BALANCE_IN_USD */\n postBalanceInUsd: string;\n /** ENTITY.BALANCE_UPDATE.PRE_BALANCE */\n preBalance: string;\n /** ENTITY.BALANCE_UPDATE.PRE_BALANCE_IN_NATIVE */\n preBalanceInNative: string;\n /** ENTITY.BALANCE_UPDATE.PRE_BALANCE_IN_USD */\n preBalanceInUsd: string;\n /** ENTITY.BALANCE_UPDATE.TOKEN_ACCOUNT_ADDRESS */\n tokenAccountAddress: string;\n /** ENTITY.BALANCE_UPDATE.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.BALANCE_UPDATE.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** ENTITY.BALANCE_UPDATE.TOKEN_TYPE */\n type: BalanceTokenType;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseBalanceUpdate {\n /** Page data */\n data: PageResponseBalanceUpdateDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token info returned by `get_dev_tokens` — mirrors TS `DevTokenDTO`.\n */\nexport type PageResponseDevTokenDataItem = {\n /** Token address */\n address: string;\n /** Market data */\n marketData: TokenMarketData;\n /** Token metadata */\n metadata: TokenMetadata;\n /** Trade statistics */\n stats: TokenStats;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDevToken {\n /** Page data */\n data: PageResponseDevTokenDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * DEX information\n */\nexport type PageResponseDexDataItem = {\n /** Chain identifier */\n chain: string;\n /**\n * DEX image URL\n * @nullable\n */\n image?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family name\n * @nullable\n */\n protocolFamily?: DexProtocolFamily;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDex {\n /** Page data */\n data: PageResponseDexDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * DEX pool\n */\nexport type PageResponseDexPoolDataItem = {\n /** Chain */\n chain: string;\n /** Pool address */\n poolAddress: string;\n /**\n * DEX program address\n * @nullable\n */\n programAddress?: string | null;\n /**\n * Protocol family\n * @nullable\n */\n protocolFamily?: string | null;\n /** Token A address */\n tokenAAddress: string;\n /** Token B address */\n tokenBAddress: string;\n /**\n * TVL in native token\n * @nullable\n */\n tvlInSol?: string | null;\n /**\n * TVL in USD\n * @nullable\n */\n tvlInUsd?: string | null;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDexPool {\n /** Page data */\n data: PageResponseDexPoolDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * DEX pool liquidity snapshot\n */\nexport type PageResponseDexPoolSnapshotDataItem = {\n /** Block height */\n blockHeight: number;\n /**\n * Block slot (optional)\n * @nullable\n */\n blockSlot?: number | null;\n /** Block timestamp (ms) */\n blockTimestamp: number;\n /** Pool address */\n poolAddress: string;\n /** Snapshot timestamp (ms) */\n snapshotTime: number;\n /** Token A snapshot */\n tokenA: DexPoolTokenSnapshot;\n /** Token B snapshot */\n tokenB: DexPoolTokenSnapshot;\n /** TVL in native token */\n tvlInNative: string;\n /** TVL in USD */\n tvlInUsd: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseDexPoolSnapshot {\n /** Page data */\n data: PageResponseDexPoolSnapshotDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Single token net-worth item (mirrors TS WalletNetWorthItemDTO).\n */\nexport type PageResponseNetWorthByTokensItemDataItem = {\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.AMOUNT */\n amount: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.CHAIN */\n chain: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.DECIMALS */\n decimals: number;\n /**\n * ENTITY.NET_WORTH_BY_TOKENS_ITEM.LOGO_URI\n * @nullable\n */\n logoUri?: string | null;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.NAME */\n name: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.PRICE_IN_NATIVE */\n priceInNative: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.PRICE_IN_USD */\n priceInUsd: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.SYMBOL */\n symbol: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.VALUE_IN_NATIVE */\n valueInNative: string;\n /** ENTITY.NET_WORTH_BY_TOKENS_ITEM.VALUE_IN_USD */\n valueInUsd: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseNetWorthByTokensItem {\n /** Page data */\n data: PageResponseNetWorthByTokensItemDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token entity — mirrors TS `TokenDTO extends TokenMetadataDTO`.\n\nTS uses class inheritance to flatten metadata into the top level.\nRust uses `#[serde(flatten)]` for the same effect.\n */\nexport type PageResponseTokenDataItem = {\n /** ENTITY.TOKEN.ADDRESS */\n address: string;\n /** ENTITY.TOKEN.CHAIN */\n chain: string;\n /**\n * ENTITY.TOKEN.COINGECKO_COIN_ID\n * @nullable\n */\n coingeckoCoinId?: string | null;\n /** ENTITY.TOKEN.DECIMALS */\n decimals: number;\n /**\n * ENTITY.TOKEN.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * ENTITY.TOKEN.DEV_LAST_TOKEN_CREATED_AT\n * @nullable\n */\n devLastTokenCreatedAt?: string | null;\n /**\n * ENTITY.TOKEN.DEV_TOTAL_TOKENS\n * @nullable\n */\n devTotalTokens?: string | null;\n /**\n * ENTITY.TOKEN.EXTENSION\nENTITY.TOKEN.EXTENSION\n * @nullable\n */\n extension?: TokenExtra;\n /** ENTITY.TOKEN.EXTRA */\n extra?: TokenExtra;\n /**\n * ENTITY.TOKEN.IMAGE_URL\n * @nullable\n */\n imageUrl?: string | null;\n /**\n * ENTITY.TOKEN.MARKET\n * @nullable\n */\n market?: string | null;\n /** Market data */\n marketData?: TokenMarketData;\n /**\n * ENTITY.TOKEN.METADATA_ADDRESS\n * @nullable\n */\n metadataAddress?: string | null;\n /** ENTITY.TOKEN.NAME */\n name: string;\n /** ENTITY.TOKEN.SOCIAL_MEDIAS */\n socialMedias?: TokenSocialMedias;\n /** Token statistics */\n stats?: TokenStats;\n /** ENTITY.TOKEN.SYMBOL */\n symbol: string;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_AT\n * @nullable\n */\n tokenCreatedAt?: number | null;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_BLOCK_HEIGHT\n * @nullable\n */\n tokenCreatedBlockHeight?: string | null;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_SLOT\n * @nullable\n */\n tokenCreatedSlot?: string | null;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_TX_SIGNATURE\n * @nullable\n */\n tokenCreatedTxSignature?: string | null;\n /** ENTITY.TOKEN.TOKEN_CREATORS */\n tokenCreators?: TokenCreator[];\n /**\n * ENTITY.TOKEN.URI\n * @nullable\n */\n uri?: string | null;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseToken {\n /** Page data */\n data: PageResponseTokenDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token holder\n */\nexport type PageResponseTokenHolderDataItem = {\n /** ENTITY.TOKEN_HOLDER.AMOUNT */\n amount: string;\n /** ENTITY.TOKEN_HOLDER.AMOUNT_IN_USD */\n amountInUsd: string;\n /** ENTITY.TOKEN_HOLDER.PERCENTAGE */\n percentage: string;\n /** ENTITY.TOKEN_HOLDER.WALLET_ADDRESS */\n walletAddress: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenHolder {\n /** Page data */\n data: PageResponseTokenHolderDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token liquidity snapshot\n */\nexport type PageResponseTokenLiquiditySnapshotDataItem = {\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.CALCULATED_AT */\n calculatedAt: number;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.MAX_LIQUIDITY_IN_NATIVE */\n maxLiquidityInNative: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.MAX_LIQUIDITY_IN_USD */\n maxLiquidityInUsd: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.MAX_LIQUIDITY_POOL_ADDRESS */\n maxLiquidityPoolAddress: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.POOL_COUNT */\n poolCount: number;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.PRICE_NATIVE */\n priceNative: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.PRICE_USD */\n priceUsd: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.SNAPSHOT_TIME */\n snapshotTime: number;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.TOTAL_LIQUIDITY_IN_NATIVE */\n totalLiquidityInNative: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.TOTAL_LIQUIDITY_IN_USD */\n totalLiquidityInUsd: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenLiquiditySnapshot {\n /** Page data */\n data: PageResponseTokenLiquiditySnapshotDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token mint/burn event\n */\nexport type PageResponseTokenMintBurnDataItem = {\n /** ENTITY.TOKEN_MINT_BURN.AMOUNT */\n amount: string;\n /** ENTITY.TOKEN_MINT_BURN.BLOCK_HEIGHT */\n blockHeight: number;\n /** ENTITY.TOKEN_MINT_BURN.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.TOKEN_MINT_BURN.MINT_BURN_TYPE */\n mintBurnType: MintBurnType;\n /** ENTITY.TOKEN_MINT_BURN.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOKEN_MINT_BURN.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenMintBurn {\n /** Page data */\n data: PageResponseTokenMintBurnDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token price\n */\nexport type PageResponseTokenPriceDataItem = {\n /** Token address */\n address: string;\n /**\n * Price in native token\n * @nullable\n */\n priceInSol?: string | null;\n /** Price in USD */\n priceInUsd: string;\n /** Timestamp */\n timestamp: number;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenPrice {\n /** Page data */\n data: PageResponseTokenPriceDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token trader info — mirrors TS `TokenTraderDTO`\n */\nexport type PageResponseTokenTraderDataItem = {\n /** Wallet address */\n address: string;\n /**\n * Block timestamp (sniper)\n * @nullable\n */\n blockTimestamp?: string | null;\n /**\n * Onchain account creation time (fresh/dev)\n * @nullable\n */\n onchainCreatedAt?: string | null;\n /**\n * Percentile rank of trade amount in USD (pro/insider)\n * @nullable\n */\n percentileRankTradeAmountInUsd?: string | null;\n /**\n * Percentile rank of trade count (pro)\n * @nullable\n */\n percentileRankTradeCount?: number | null;\n /**\n * Rank trade amount in USD (insider)\n * @nullable\n */\n rankTradeAmountInUsd?: string | null;\n /**\n * Trade amount in native token (pro/insider)\n * @nullable\n */\n tradeAmountInNative?: string | null;\n /**\n * Trade amount in USD (pro/insider)\n * @nullable\n */\n tradeAmountInUsd?: string | null;\n /**\n * Trade count (pro/insider)\n * @nullable\n */\n tradeCount?: number | null;\n /**\n * Transaction signature (sandwish/bundle/sniper)\n * @nullable\n */\n transactionSignature?: string | null;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenTrader {\n /** Page data */\n data: PageResponseTokenTraderDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token transfer\n */\nexport type PageResponseTokenTransferDataItem = {\n /** ENTITY.TOKEN_TRANSFER.AMOUNT */\n amount: string;\n /**\n * ENTITY.TOKEN_TRANSFER.AMOUNT_IN_USD\n * @nullable\n */\n amountInUsd?: string | null;\n /** ENTITY.TOKEN_TRANSFER.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.TOKEN_TRANSFER.FROM_ADDRESS */\n fromAddress: string;\n /** ENTITY.TOKEN_TRANSFER.ID */\n id: string;\n /** Transfer status: unknown / succeeded / failed */\n status: string;\n /** ENTITY.TOKEN_TRANSFER.TO_ADDRESS */\n toAddress: string;\n /** ENTITY.TOKEN_TRANSFER.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOKEN_TRANSFER.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** Transfer type: unknown / in / out */\n type: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTokenTransfer {\n /** Page data */\n data: PageResponseTokenTransferDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Top trader statistics\n */\nexport type PageResponseTopTraderDataItem = {\n /** ENTITY.TOP_TRADER.BUY_AMOUNT */\n buyAmount: string;\n /** ENTITY.TOP_TRADER.BUY_AMOUNT_IN_NATIVE */\n buyAmountInNative: string;\n /** ENTITY.TOP_TRADER.BUY_AMOUNT_IN_USD */\n buyAmountInUsd: string;\n /** ENTITY.TOP_TRADER.BUY_COUNT */\n buyCount: number;\n /** ENTITY.TOP_TRADER.SELL_AMOUNT */\n sellAmount: string;\n /** ENTITY.TOP_TRADER.SELL_AMOUNT_IN_NATIVE */\n sellAmountInNative: string;\n /** ENTITY.TOP_TRADER.SELL_AMOUNT_IN_USD */\n sellAmountInUsd: string;\n /** ENTITY.TOP_TRADER.SELL_COUNT */\n sellCount: number;\n /** ENTITY.TOP_TRADER.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOP_TRADER.TRADE_AMOUNT */\n tradeAmount: string;\n /** ENTITY.TOP_TRADER.TRADE_COUNT */\n tradeCount: number;\n /** ENTITY.TOP_TRADER.WALLET_ADDRESS */\n walletAddress: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTopTrader {\n /** Page data */\n data: PageResponseTopTraderDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Trade detail\n */\nexport type PageResponseTradeDetailDataItem = {\n /** Account owner address (trader wallet) */\n accountOwnerAddress: string;\n /** Block height */\n blockHeight: number;\n /** Block timestamp (milliseconds) */\n blockTimestamp: number;\n /** Chain identifier */\n chain: string;\n /**\n * DEX image\n * @nullable\n */\n dexImage?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n dexProgramAddress?: string | null;\n /**\n * DEX protocol family\n * @nullable\n */\n dexProtocolFamily?: string | null;\n /** Pool address */\n poolAddress: string;\n /** Side token address */\n sideTokenAddress: string;\n /** Side token amount */\n sideTokenAmount: string;\n /** Side token amount in native currency */\n sideTokenAmountInNative: string;\n /** Side token amount in USD */\n sideTokenAmountInUsd: string;\n /**\n * Side token image URL\n * @nullable\n */\n sideTokenImageUrl?: string | null;\n /** Side token name */\n sideTokenName: string;\n /** Side token price in native currency */\n sideTokenPriceInNative: string;\n /** Side token price in USD */\n sideTokenPriceInUsd: string;\n /** Side token symbol */\n sideTokenSymbol: string;\n /** Transaction status */\n status: string;\n /** Token address */\n tokenAddress: string;\n /** Token amount */\n tokenAmount: string;\n /** Token amount in native currency */\n tokenAmountInNative: string;\n /** Token amount in USD */\n tokenAmountInUsd: string;\n /**\n * Token image URL\n * @nullable\n */\n tokenImageUrl?: string | null;\n /** Token name */\n tokenName: string;\n /** Token price in native currency */\n tokenPriceInNative: string;\n /** Token price in USD */\n tokenPriceInUsd: string;\n /** Token symbol */\n tokenSymbol: string;\n /** Transaction signature */\n transactionSignature: string;\n /** Trade type (BUY/SELL) */\n type: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTradeDetail {\n /** Page data */\n data: PageResponseTradeDetailDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Trader gainers/losers item — PnL-based ranking\n */\nexport type PageResponseTraderGainersLosersItemDataItem = {\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.ADDRESS */\n address: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.CHAIN */\n chain: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.PNL */\n pnl: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.TRADE_COUNT */\n tradeCount: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.VOLUME */\n volume: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseTraderGainersLosersItem {\n /** Page data */\n data: PageResponseTraderGainersLosersItemDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Wallet transfer\n */\nexport type PageResponseWalletTransferDataItem = {\n /** ENTITY.WALLET_TRANSFER.AMOUNT */\n amount: string;\n /**\n * ENTITY.WALLET_TRANSFER.AMOUNT_IN_USD\n * @nullable\n */\n amountInUsd?: string | null;\n /** ENTITY.WALLET_TRANSFER.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.WALLET_TRANSFER.FROM_ADDRESS */\n fromAddress: string;\n /** ENTITY.WALLET_TRANSFER.ID */\n id: string;\n /** ENTITY.WALLET_TRANSFER.TO_ADDRESS */\n toAddress: string;\n /** ENTITY.WALLET_TRANSFER.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.WALLET_TRANSFER.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** ENTITY.WALLET_TRANSFER.TRANSFER_TYPE */\n transferType: string;\n};\n\n/**\n * Generic pagination response\n */\nexport interface PageResponseWalletTransfer {\n /** Page data */\n data: PageResponseWalletTransferDataItem[];\n /**\n * Cursor for the end of current page\n * @nullable\n */\n endCursor?: string | null;\n /** Whether there is a next page */\n hasNext?: boolean;\n /** Whether there is a previous page */\n hasPrev?: boolean;\n /**\n * Cursor for the start of current page\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * PnL detail for a single wallet-token pair (mirrors TS PnlDetailItemDTO).\n */\nexport interface PnlDetailItem {\n /** ENTITY.PNL_DETAIL_ITEM.AVG_BUY_PRICE_IN_USD */\n avgBuyPriceInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.AVG_PROFIT_PER_TRADE_IN_USD */\n avgProfitPerTradeInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.AVG_SELL_PRICE_IN_USD */\n avgSellPriceInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.BALANCE */\n balance: string;\n /** ENTITY.PNL_DETAIL_ITEM.BUY_AMOUNT */\n buyAmount: string;\n /** ENTITY.PNL_DETAIL_ITEM.BUY_AMOUNT_IN_USD */\n buyAmountInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.BUYS */\n buys: string;\n /** ENTITY.PNL_DETAIL_ITEM.CURRENT_VALUE */\n currentValue: string;\n /** ENTITY.PNL_DETAIL_ITEM.DECIMALS */\n decimals?: number;\n /**\n * ENTITY.PNL_DETAIL_ITEM.LOGO_URI\n * @nullable\n */\n logoUri?: string | null;\n /** ENTITY.PNL_DETAIL_ITEM.NAME */\n name?: string;\n /** ENTITY.PNL_DETAIL_ITEM.PRICE_IN_USD */\n priceInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.REALIZED_PROFIT_IN_USD */\n realizedProfitInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.REALIZED_PROFIT_RATIO */\n realizedProfitRatio: string;\n /** ENTITY.PNL_DETAIL_ITEM.SELL_AMOUNT */\n sellAmount: string;\n /** ENTITY.PNL_DETAIL_ITEM.SELL_AMOUNT_IN_USD */\n sellAmountInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.SELLS */\n sells: string;\n /** ENTITY.PNL_DETAIL_ITEM.SYMBOL */\n symbol?: string;\n /** ENTITY.PNL_DETAIL_ITEM.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.PNL_DETAIL_ITEM.TOTAL_PROFIT_IN_USD */\n totalProfitInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.TOTAL_PROFIT_RATIO */\n totalProfitRatio: string;\n /** ENTITY.PNL_DETAIL_ITEM.TOTAL_TRADES */\n totalTrades: string;\n /** ENTITY.PNL_DETAIL_ITEM.UNREALIZED_PROFIT_IN_USD */\n unrealizedProfitInUsd: string;\n /** ENTITY.PNL_DETAIL_ITEM.UNREALIZED_PROFIT_RATIO */\n unrealizedProfitRatio: string;\n /** ENTITY.PNL_DETAIL_ITEM.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Aggregated PnL summary across all items (mirrors TS PnlDetailSummaryDTO).\n */\nexport interface PnlDetailSummary {\n /** ENTITY.PNL_DETAIL_SUMMARY.AVG_PROFIT_PER_TRADE_IN_USD */\n avgProfitPerTradeInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.BUY_AMOUNT_IN_USD */\n buyAmountInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.BUYS */\n buys: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.CURRENT_VALUE */\n currentValue: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.LOSSES */\n losses: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.REALIZED_PROFIT_IN_USD */\n realizedProfitInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.REALIZED_PROFIT_RATIO */\n realizedProfitRatio: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.SELL_AMOUNT_IN_USD */\n sellAmountInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.SELLS */\n sells: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.TOKENS */\n tokens: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.TOTAL_COST_IN_USD */\n totalCostInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.TOTAL_PROFIT_IN_USD */\n totalProfitInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.TOTAL_TRADES */\n totalTrades: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.UNREALIZED_PROFIT_IN_USD */\n unrealizedProfitInUsd: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.WIN_RATE */\n winRate: string;\n /** ENTITY.PNL_DETAIL_SUMMARY.WINS */\n wins: string;\n}\n\n/**\n * Full PnL details result with cursor pagination.\n */\nexport interface PnlDetailsResult {\n /** ENTITY.PNL_DETAILS_RESULT.DATA */\n data: PnlDetailItem[];\n /**\n * ENTITY.PNL_DETAILS_RESULT.END_CURSOR\n * @nullable\n */\n endCursor?: string | null;\n /** ENTITY.PNL_DETAILS_RESULT.HAS_NEXT */\n hasNext?: boolean;\n /** ENTITY.PNL_DETAILS_RESULT.HAS_PREV */\n hasPrev?: boolean;\n /**\n * ENTITY.PNL_DETAILS_RESULT.START_CURSOR\n * @nullable\n */\n startCursor?: string | null;\n /** ENTITY.PNL_DETAILS_RESULT.SUMMARY */\n summary: PnlDetailSummary;\n}\n\n/**\n * PnL resolution period\n */\nexport type PnlResolution = (typeof PnlResolution)[keyof typeof PnlResolution];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PnlResolution = {\n \"1d\": \"1d\",\n \"7d\": \"7d\",\n \"30d\": \"30d\",\n all: \"all\",\n} as const;\n\n/**\n * Pool sort field\n */\nexport type PoolSortField = (typeof PoolSortField)[keyof typeof PoolSortField];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PoolSortField = {\n tvlInSol: \"tvlInSol\",\n tvlInUsd: \"tvlInUsd\",\n} as const;\n\n/**\n * Price type for candle data\n */\nexport type PriceType = (typeof PriceType)[keyof typeof PriceType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const PriceType = {\n usd: \"usd\",\n native: \"native\",\n} as const;\n\n/**\n * Range filter condition – mirrors TS `FilterCondition` used with min/max.\n */\nexport interface RangeFilterCondition {\n /** ENTITY.RANGE_FILTER_CONDITION.FIELD */\n field: string;\n /**\n * ENTITY.RANGE_FILTER_CONDITION.MAX\n * @nullable\n */\n max?: string | null;\n /**\n * ENTITY.RANGE_FILTER_CONDITION.MIN\n * @nullable\n */\n min?: string | null;\n}\n\nexport type RankingDuration = (typeof RankingDuration)[keyof typeof RankingDuration];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const RankingDuration = {\n \"1m\": \"1m\",\n \"5m\": \"5m\",\n \"1h\": \"1h\",\n \"4h\": \"4h\",\n \"24h\": \"24h\",\n} as const;\n\nexport type RankingTag = (typeof RankingTag)[keyof typeof RankingTag];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const RankingTag = {\n pump_fun: \"pump_fun\",\n raydium_launchpad: \"raydium_launchpad\",\n meteora_dynamic_bounding_curve: \"meteora_dynamic_bounding_curve\",\n bonk_fun: \"bonk_fun\",\n moonit_fun: \"moonit_fun\",\n} as const;\n\n/**\n * Red packet detail\n */\nexport interface RedPacket {\n /**\n * DTO.RED_PACKET.CHAIN\n * @nullable\n */\n chain?: string | null;\n /**\n * DTO.RED_PACKET.CLAIM_AUTHORITY\n * @nullable\n */\n claimAuthority?: string | null;\n /**\n * DTO.RED_PACKET.CLAIMED_AMOUNT\n * @nullable\n */\n claimedAmount?: string | null;\n /**\n * DTO.RED_PACKET.CLAIMED_COUNT\n * @nullable\n */\n claimedCount?: number | null;\n /**\n * DTO.RED_PACKET.CREATED_AT\n * @nullable\n */\n createdAt?: number | null;\n /** DTO.RED_PACKET.CREATOR */\n creator: string;\n /**\n * DTO.RED_PACKET.EXPIRATION\n * @nullable\n */\n expiration?: number | null;\n /**\n * DTO.RED_PACKET.WITHDRAWED\n * @nullable\n */\n expired?: boolean | null;\n /**\n * DTO.RED_PACKET.EXPIRES_AT\n * @nullable\n */\n expiredAt?: number | null;\n /** DTO.RED_PACKET.ID */\n id: string;\n /** DTO.RED_PACKET.MAX_CLAIMS */\n maxClaims: number;\n /**\n * DTO.RED_PACKET.MEMO\n * @nullable\n */\n memo?: string | null;\n /** DTO.RED_PACKET.MINT */\n mint: string;\n /**\n * DTO.RED_PACKET.REFUND_AMOUNT\n * @nullable\n */\n refundedAmount?: string | null;\n /**\n * DTO.RED_PACKET.SHARE_ID\n * @nullable\n */\n shareId?: string | null;\n /** DTO.RED_PACKET.TOTAL_AMOUNT */\n totalAmount: string;\n /**\n * DTO.RED_PACKET.TX_HASH\n * @nullable\n */\n txHash?: string | null;\n}\n\n/**\n * Red packet claim record\n */\nexport interface RedPacketClaim {\n /** DTO.RED_PACKET.AMOUNT */\n amount: string;\n /**\n * DTO.RED_PACKET.CHAIN\n * @nullable\n */\n chain?: string | null;\n /**\n * DTO.RED_PACKET.CLAIMED_AT\n * @nullable\n */\n claimedAt?: number | null;\n /** DTO.RED_PACKET.CLAIMER */\n claimer: string;\n /**\n * DTO.RED_PACKET.CREATOR\n * @nullable\n */\n creator?: string | null;\n /** DTO.RED_PACKET.MINT */\n mint: string;\n /** DTO.RED_PACKET.PACKET_ID */\n packetId: string;\n /**\n * DTO.RED_PACKET.TX_HASH\n * @nullable\n */\n txHash?: string | null;\n}\n\n/**\n * Paginated red packet claims response\n */\nexport interface RedPacketClaimsPage {\n /**\n * ENTITY.RED_PACKET_CLAIMS_PAGE.END_CURSOR\n * @nullable\n */\n endCursor?: string | null;\n /** ENTITY.RED_PACKET_CLAIMS_PAGE.HAS_NEXT_PAGE */\n hasNextPage: boolean;\n /** ENTITY.RED_PACKET_CLAIMS_PAGE.RECORDS */\n records: RedPacketClaim[];\n /**\n * ENTITY.RED_PACKET_CLAIMS_PAGE.START_CURSOR\n * @nullable\n */\n startCursor?: string | null;\n /** ENTITY.RED_PACKET_CLAIMS_PAGE.TOTAL */\n total: number;\n}\n\n/**\n * Send red packet transaction request\n */\nexport interface RedPacketSendTxRequest {\n /** DTO.RED_PACKET.SIGNED_TX */\n signedTx: string;\n}\n\n/**\n * Send red packet transaction response\n */\nexport interface RedPacketSendTxResponse {\n /** DTO.RED_PACKET.SIGNATURE */\n signature: string;\n}\n\n/**\n * Paginated red packets response\n */\nexport interface RedPacketsPage {\n /**\n * ENTITY.RED_PACKETS_PAGE.END_CURSOR\n * @nullable\n */\n endCursor?: string | null;\n /** ENTITY.RED_PACKETS_PAGE.HAS_NEXT_PAGE */\n hasNextPage: boolean;\n /** ENTITY.RED_PACKETS_PAGE.RECORDS */\n records: RedPacket[];\n /**\n * ENTITY.RED_PACKETS_PAGE.START_CURSOR\n * @nullable\n */\n startCursor?: string | null;\n /** ENTITY.RED_PACKETS_PAGE.TOTAL */\n total: number;\n}\n\n/**\n * Candle resolution\n */\nexport type Resolution = (typeof Resolution)[keyof typeof Resolution];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const Resolution = {\n \"1s\": \"1s\",\n \"15s\": \"15s\",\n \"30s\": \"30s\",\n \"1m\": \"1m\",\n \"3m\": \"3m\",\n \"5m\": \"5m\",\n \"15m\": \"15m\",\n \"30m\": \"30m\",\n \"1h\": \"1h\",\n \"2h\": \"2h\",\n \"4h\": \"4h\",\n \"6h\": \"6h\",\n \"8h\": \"8h\",\n \"12h\": \"12h\",\n \"1d\": \"1d\",\n \"3d\": \"3d\",\n \"1w\": \"1w\",\n \"1M\": \"1M\",\n} as const;\n\n/**\n * Search mode: `fast` returns only OpenSearch fields (default), `normal` enriches with full data.\n */\nexport type SearchMode = (typeof SearchMode)[keyof typeof SearchMode];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SearchMode = {\n fast: \"fast\",\n normal: \"normal\",\n} as const;\n\nexport type SearchSortBy = (typeof SearchSortBy)[keyof typeof SearchSortBy];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SearchSortBy = {\n marketCapInUsd: \"marketCapInUsd\",\n liquidityInUsd: \"liquidityInUsd\",\n priceInUsd: \"priceInUsd\",\n holderCount: \"holderCount\",\n h24VolumeInUsd: \"h24VolumeInUsd\",\n h24Transactions: \"h24Transactions\",\n tokenCreatedAt: \"tokenCreatedAt\",\n} as const;\n\n/**\n * Sort direction (case-insensitive: accepts \"asc\"/\"ASC\"/\"Asc\" etc.)\n */\nexport type SortDirection = (typeof SortDirection)[keyof typeof SortDirection];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SortDirection = {\n asc: \"asc\",\n desc: \"desc\",\n} as const;\n\nexport interface SuccessResponse {\n /** ENTITY.SUCCESS_RESPONSE.SUCCESS */\n success: boolean;\n}\n\n/**\n * Time frame for statistics\n */\nexport type TimeFrame = (typeof TimeFrame)[keyof typeof TimeFrame];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TimeFrame = {\n \"30m\": \"30m\",\n \"1h\": \"1h\",\n \"2h\": \"2h\",\n \"4h\": \"4h\",\n \"6h\": \"6h\",\n \"8h\": \"8h\",\n \"12h\": \"12h\",\n \"24h\": \"24h\",\n} as const;\n\n/**\n * Token entity — mirrors TS `TokenDTO extends TokenMetadataDTO`.\n\nTS uses class inheritance to flatten metadata into the top level.\nRust uses `#[serde(flatten)]` for the same effect.\n */\nexport interface Token {\n /** ENTITY.TOKEN.ADDRESS */\n address: string;\n /** ENTITY.TOKEN.CHAIN */\n chain: string;\n /**\n * ENTITY.TOKEN.COINGECKO_COIN_ID\n * @nullable\n */\n coingeckoCoinId?: string | null;\n /** ENTITY.TOKEN.DECIMALS */\n decimals: number;\n /**\n * ENTITY.TOKEN.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * ENTITY.TOKEN.DEV_LAST_TOKEN_CREATED_AT\n * @nullable\n */\n devLastTokenCreatedAt?: string | null;\n /**\n * ENTITY.TOKEN.DEV_TOTAL_TOKENS\n * @nullable\n */\n devTotalTokens?: string | null;\n /**\n * ENTITY.TOKEN.EXTENSION\nENTITY.TOKEN.EXTENSION\n * @nullable\n */\n extension?: TokenExtra;\n /** ENTITY.TOKEN.EXTRA */\n extra?: TokenExtra;\n /**\n * ENTITY.TOKEN.IMAGE_URL\n * @nullable\n */\n imageUrl?: string | null;\n /**\n * ENTITY.TOKEN.MARKET\n * @nullable\n */\n market?: string | null;\n /** Market data */\n marketData?: TokenMarketData;\n /**\n * ENTITY.TOKEN.METADATA_ADDRESS\n * @nullable\n */\n metadataAddress?: string | null;\n /** ENTITY.TOKEN.NAME */\n name: string;\n /** ENTITY.TOKEN.SOCIAL_MEDIAS */\n socialMedias?: TokenSocialMedias;\n /** Token statistics */\n stats?: TokenStats;\n /** ENTITY.TOKEN.SYMBOL */\n symbol: string;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_AT\n * @nullable\n */\n tokenCreatedAt?: number | null;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_BLOCK_HEIGHT\n * @nullable\n */\n tokenCreatedBlockHeight?: string | null;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_SLOT\n * @nullable\n */\n tokenCreatedSlot?: string | null;\n /**\n * ENTITY.TOKEN.TOKEN_CREATED_TX_SIGNATURE\n * @nullable\n */\n tokenCreatedTxSignature?: string | null;\n /** ENTITY.TOKEN.TOKEN_CREATORS */\n tokenCreators?: TokenCreator[];\n /**\n * ENTITY.TOKEN.URI\n * @nullable\n */\n uri?: string | null;\n}\n\n/**\n * Token balance\n */\nexport interface TokenBalance {\n /** Balance amount */\n amount: string;\n /**\n * Balance in USD\n * @nullable\n */\n amountInUsd?: string | null;\n /**\n * Token decimals\n * @nullable\n */\n decimals?: number | null;\n /**\n * Token image URL\n * @nullable\n */\n imageUrl?: string | null;\n /** Token address */\n tokenAddress: string;\n /**\n * Token name\n * @nullable\n */\n tokenName?: string | null;\n /**\n * Token symbol\n * @nullable\n */\n tokenSymbol?: string | null;\n}\n\n/**\n * Token candle (OHLCV)\n */\nexport interface TokenCandle {\n /** Close price */\n close: string;\n /** High price */\n high: string;\n /** Low price */\n low: string;\n /** Open price */\n open: string;\n /** Timestamp */\n timestamp: number;\n /** Volume */\n volume: string;\n}\n\n/**\n * Token creation info — mirrors TS `TokenCreationDTO`\n */\nexport interface TokenCreation {\n /**\n * ENTITY.TOKEN_CREATION.BLOCK_HASH\n * @nullable\n */\n blockHash?: string | null;\n /** ENTITY.TOKEN_CREATION.BLOCK_HEIGHT */\n blockHeight: number;\n /** ENTITY.TOKEN_CREATION.BLOCK_SLOT */\n blockSlot: number;\n /**\n * ENTITY.TOKEN_CREATION.BLOCK_TIMESTAMP\n * @nullable\n */\n blockTimestamp?: number | null;\n /** ENTITY.TOKEN_CREATION.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOKEN_CREATION.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** ENTITY.TOKEN_CREATION.TYPE */\n type: string;\n}\n\n/**\n * Token creator info\n */\nexport interface TokenCreator {\n /**\n * ENTITY.TOKEN_CREATOR.ADDRESS\n * @nullable\n */\n address?: string | null;\n /**\n * ENTITY.TOKEN_CREATOR.IS_VERIFIED\n * @nullable\n */\n isVerified?: boolean | null;\n /**\n * ENTITY.TOKEN_CREATOR.SHARE\n * @nullable\n */\n share?: number | null;\n}\n\n/**\n * Token extra metadata\n */\nexport interface TokenExtra {\n /**\n * ENTITY.TOKEN_EXTRA.COLLECTION_ADDRESS\n * @nullable\n */\n collectionAddress?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.EDITION_NONCE\n * @nullable\n */\n editionNonce?: number | null;\n /**\n * ENTITY.TOKEN_EXTRA.FREEZE_AUTHORITY\n * @nullable\n */\n freezeAuthority?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.FUNGIBLE\n * @nullable\n */\n fungible?: boolean | null;\n /**\n * ENTITY.TOKEN_EXTRA.IS_MUTABLE\n * @nullable\n */\n isMutable?: boolean | null;\n /**\n * ENTITY.TOKEN_EXTRA.IS_NATIVE\n * @nullable\n */\n isNative?: boolean | null;\n /**\n * ENTITY.TOKEN_EXTRA.IS_VERIFIED_COLLECTION\n * @nullable\n */\n isVerifiedCollection?: boolean | null;\n /**\n * ENTITY.TOKEN_EXTRA.IS_WRAPPED\n * @nullable\n */\n isWrapped?: boolean | null;\n /**\n * ENTITY.TOKEN_EXTRA.KEY\n * @nullable\n */\n key?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.LAUNCH_FROM_PROGRAM_ADDRESS\n * @nullable\n */\n launchFromProgramAddress?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.LAUNCH_FROM_PROTOCOL_FAMILY\n * @nullable\n */\n launchFromProtocolFamily?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.MIGRATED_AT\n * @nullable\n */\n migratedAt?: number | null;\n /**\n * ENTITY.TOKEN_EXTRA.MIGRATED_TO_POOL_ADDRESS\n * @nullable\n */\n migratedToPoolAddress?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.MIGRATED_TO_PROGRAM_ADDRESS\n * @nullable\n */\n migratedToProgramAddress?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.MIGRATED_TO_PROTOCOL_FAMILY\n * @nullable\n */\n migratedToProtocolFamily?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.MINT_AUTHORITY\n * @nullable\n */\n mintAuthority?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.PRIMARY_SALE_HAPPENED\n * @nullable\n */\n primarySaleHappened?: boolean | null;\n /**\n * ENTITY.TOKEN_EXTRA.PROGRAM_ADDRESS\n * @nullable\n */\n programAddress?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.SELLER_FEE_BASIS_POINTS\n * @nullable\n */\n sellerFeeBasisPoints?: number | null;\n /**\n * ENTITY.TOKEN_EXTRA.TOKEN_STANDARD\n * @nullable\n */\n tokenStandard?: string | null;\n /**\n * ENTITY.TOKEN_EXTRA.UPDATE_AUTHORITY\n * @nullable\n */\n updateAuthority?: string | null;\n}\n\nexport type TokenField = (typeof TokenField)[keyof typeof TokenField];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenField = {\n marketDatapriceInUsd: \"marketData.priceInUsd\",\n statspriceChangeRatioInUsd1m: \"stats.priceChangeRatioInUsd1m\",\n statspriceChangeRatioInUsd5m: \"stats.priceChangeRatioInUsd5m\",\n statspriceChangeRatioInUsd1h: \"stats.priceChangeRatioInUsd1h\",\n statspriceChangeRatioInUsd4h: \"stats.priceChangeRatioInUsd4h\",\n statspriceChangeRatioInUsd24h: \"stats.priceChangeRatioInUsd24h\",\n marketDatamarketCapInUsd: \"marketData.marketCapInUsd\",\n marketDatamaxPoolTvlInUsd: \"marketData.maxPoolTvlInUsd\",\n marketDatatotalTvlInUsd: \"marketData.totalTvlInUsd\",\n marketDatatop10TotalHoldings: \"marketData.top10TotalHoldings\",\n marketDatatop10HoldingsRatio: \"marketData.top10HoldingsRatio\",\n marketDatatop100TotalHoldings: \"marketData.top100TotalHoldings\",\n marketDatatop100HoldingsRatio: \"marketData.top100HoldingsRatio\",\n marketDataholders: \"marketData.holders\",\n marketDatacreatorHoldings: \"marketData.creatorHoldings\",\n marketDatacreatorHoldingsRatio: \"marketData.creatorHoldingsRatio\",\n statsbuys1m: \"stats.buys1m\",\n statsbuys5m: \"stats.buys5m\",\n statsbuys15m: \"stats.buys15m\",\n statsbuys30m: \"stats.buys30m\",\n statsbuys1h: \"stats.buys1h\",\n statsbuys4h: \"stats.buys4h\",\n statsbuys24h: \"stats.buys24h\",\n statssells1m: \"stats.sells1m\",\n statssells5m: \"stats.sells5m\",\n statssells15m: \"stats.sells15m\",\n statssells30m: \"stats.sells30m\",\n statssells1h: \"stats.sells1h\",\n statssells4h: \"stats.sells4h\",\n statssells24h: \"stats.sells24h\",\n statstrades1m: \"stats.trades1m\",\n statstrades5m: \"stats.trades5m\",\n statstrades1h: \"stats.trades1h\",\n statstrades4h: \"stats.trades4h\",\n statstrades24h: \"stats.trades24h\",\n statstraders1m: \"stats.traders1m\",\n statstraders5m: \"stats.traders5m\",\n statstraders1h: \"stats.traders1h\",\n statstraders4h: \"stats.traders4h\",\n statstraders24h: \"stats.traders24h\",\n statsvolumesInUsd1m: \"stats.volumesInUsd1m\",\n statsvolumesInUsd5m: \"stats.volumesInUsd5m\",\n statsvolumesInUsd1h: \"stats.volumesInUsd1h\",\n statsvolumesInUsd4h: \"stats.volumesInUsd4h\",\n statsvolumesInUsd24h: \"stats.volumesInUsd24h\",\n tokenCreatedAt: \"tokenCreatedAt\",\n} as const;\n\nexport type TokenFilter = (typeof TokenFilter)[keyof typeof TokenFilter];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenFilter = {\n has_social_media: \"has_social_media\",\n has_twitter: \"has_twitter\",\n has_telegram: \"has_telegram\",\n has_website: \"has_website\",\n has_tiktok: \"has_tiktok\",\n has_discord: \"has_discord\",\n has_facebook: \"has_facebook\",\n has_github: \"has_github\",\n has_instagram: \"has_instagram\",\n has_linkedin: \"has_linkedin\",\n has_medium: \"has_medium\",\n has_reddit: \"has_reddit\",\n has_youtube: \"has_youtube\",\n has_bitbucket: \"has_bitbucket\",\n} as const;\n\n/**\n * Token holder\n */\nexport interface TokenHolder {\n /** ENTITY.TOKEN_HOLDER.AMOUNT */\n amount: string;\n /** ENTITY.TOKEN_HOLDER.AMOUNT_IN_USD */\n amountInUsd: string;\n /** ENTITY.TOKEN_HOLDER.PERCENTAGE */\n percentage: string;\n /** ENTITY.TOKEN_HOLDER.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Token liquidity snapshot\n */\nexport interface TokenLiquiditySnapshot {\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.CALCULATED_AT */\n calculatedAt: number;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.MAX_LIQUIDITY_IN_NATIVE */\n maxLiquidityInNative: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.MAX_LIQUIDITY_IN_USD */\n maxLiquidityInUsd: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.MAX_LIQUIDITY_POOL_ADDRESS */\n maxLiquidityPoolAddress: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.POOL_COUNT */\n poolCount: number;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.PRICE_NATIVE */\n priceNative: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.PRICE_USD */\n priceUsd: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.SNAPSHOT_TIME */\n snapshotTime: number;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.TOTAL_LIQUIDITY_IN_NATIVE */\n totalLiquidityInNative: string;\n /** ENTITY.TOKEN_LIQUIDITY_SNAPSHOT.TOTAL_LIQUIDITY_IN_USD */\n totalLiquidityInUsd: string;\n}\n\nexport type TokenListSortField = (typeof TokenListSortField)[keyof typeof TokenListSortField];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenListSortField = {\n h24VolumeInUsd: \"h24VolumeInUsd\",\n h24PriceChangeRatio: \"h24PriceChangeRatio\",\n h24Buys: \"h24Buys\",\n h24Sells: \"h24Sells\",\n h24Trades: \"h24Trades\",\n h24Buyers: \"h24Buyers\",\n h24Sellers: \"h24Sellers\",\n h24BuyVolumeInUsd: \"h24BuyVolumeInUsd\",\n h24SellVolumeInUsd: \"h24SellVolumeInUsd\",\n h4VolumeInUsd: \"h4VolumeInUsd\",\n h4PriceChangeRatio: \"h4PriceChangeRatio\",\n h4Buys: \"h4Buys\",\n h4Sells: \"h4Sells\",\n h4Trades: \"h4Trades\",\n h4Buyers: \"h4Buyers\",\n h4Sellers: \"h4Sellers\",\n h4BuyVolumeInUsd: \"h4BuyVolumeInUsd\",\n h4SellVolumeInUsd: \"h4SellVolumeInUsd\",\n h1VolumeInUsd: \"h1VolumeInUsd\",\n h1PriceChangeRatio: \"h1PriceChangeRatio\",\n h1Buys: \"h1Buys\",\n h1Sells: \"h1Sells\",\n h1Trades: \"h1Trades\",\n h1Buyers: \"h1Buyers\",\n h1Sellers: \"h1Sellers\",\n h1BuyVolumeInUsd: \"h1BuyVolumeInUsd\",\n h1SellVolumeInUsd: \"h1SellVolumeInUsd\",\n m30VolumeInUsd: \"m30VolumeInUsd\",\n m30PriceChangeRatio: \"m30PriceChangeRatio\",\n m30Buys: \"m30Buys\",\n m30Sells: \"m30Sells\",\n m30Trades: \"m30Trades\",\n m30Buyers: \"m30Buyers\",\n m30Sellers: \"m30Sellers\",\n m30BuyVolumeInUsd: \"m30BuyVolumeInUsd\",\n m30SellVolumeInUsd: \"m30SellVolumeInUsd\",\n m15VolumeInUsd: \"m15VolumeInUsd\",\n m15PriceChangeRatio: \"m15PriceChangeRatio\",\n m15Buys: \"m15Buys\",\n m15Sells: \"m15Sells\",\n m15Trades: \"m15Trades\",\n m15Buyers: \"m15Buyers\",\n m15Sellers: \"m15Sellers\",\n m15BuyVolumeInUsd: \"m15BuyVolumeInUsd\",\n m15SellVolumeInUsd: \"m15SellVolumeInUsd\",\n m5VolumeInUsd: \"m5VolumeInUsd\",\n m5PriceChangeRatio: \"m5PriceChangeRatio\",\n m5Buys: \"m5Buys\",\n m5Sells: \"m5Sells\",\n m5Trades: \"m5Trades\",\n m5Buyers: \"m5Buyers\",\n m5Sellers: \"m5Sellers\",\n m5BuyVolumeInUsd: \"m5BuyVolumeInUsd\",\n m5SellVolumeInUsd: \"m5SellVolumeInUsd\",\n m1VolumeInUsd: \"m1VolumeInUsd\",\n m1PriceChangeRatio: \"m1PriceChangeRatio\",\n m1Buys: \"m1Buys\",\n m1Sells: \"m1Sells\",\n m1Trades: \"m1Trades\",\n m1Buyers: \"m1Buyers\",\n m1Sellers: \"m1Sellers\",\n m1BuyVolumeInUsd: \"m1BuyVolumeInUsd\",\n m1SellVolumeInUsd: \"m1SellVolumeInUsd\",\n} as const;\n\n/**\n * Token market data\n */\nexport interface TokenMarketData {\n /**\n * ENTITY.TOKEN_MARKET_DATA.BLUECHIP_HOLDINGS_RATIO\n * @nullable\n */\n bluechipHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BLUECHIP_TOTAL_HOLDERS\n * @nullable\n */\n bluechipTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BLUECHIP_TOTAL_HOLDINGS\n * @nullable\n */\n bluechipTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BUNDLE_HOLDINGS_RATIO\n * @nullable\n */\n bundleHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BUNDLE_TOTAL_HOLDERS\n * @nullable\n */\n bundleTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BUNDLE_TOTAL_HOLDINGS\n * @nullable\n */\n bundleTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.CIRCULATING_SUPPLY\n * @nullable\n */\n circulatingSupply?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.COMPLETION_RATIO\n * @nullable\n */\n completionRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.DEV_HOLDINGS_RATIO\n * @nullable\n */\n devHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.DEV_TOTAL_HOLDERS\n * @nullable\n */\n devTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.DEV_TOTAL_HOLDINGS\n * @nullable\n */\n devTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FDV_IN_SOL\n * @nullable\n */\n fdvInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FDV_IN_USD\n * @nullable\n */\n fdvInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FRESH_HOLDINGS_RATIO\n * @nullable\n */\n freshHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FRESH_TOTAL_HOLDERS\n * @nullable\n */\n freshTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FRESH_TOTAL_HOLDINGS\n * @nullable\n */\n freshTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.HOLDERS\n * @nullable\n */\n holders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.INSIDER_HOLDINGS_RATIO\n * @nullable\n */\n insiderHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.INSIDER_TOTAL_HOLDERS\n * @nullable\n */\n insiderTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.INSIDER_TOTAL_HOLDINGS\n * @nullable\n */\n insiderTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.KOL_HOLDINGS_RATIO\n * @nullable\n */\n kolHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.KOL_TOTAL_HOLDERS\n * @nullable\n */\n kolTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.KOL_TOTAL_HOLDINGS\n * @nullable\n */\n kolTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MARKET_CAP_IN_SOL\n * @nullable\n */\n marketCapInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MARKET_CAP_IN_USD\n * @nullable\n */\n marketCapInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MAX_POOL_TVL_IN_SOL\n * @nullable\n */\n maxPoolTvlInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MAX_POOL_TVL_IN_USD\n * @nullable\n */\n maxPoolTvlInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRICE_IN_SOL\n * @nullable\n */\n priceInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRICE_IN_USD\n * @nullable\n */\n priceInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRO_HOLDINGS_RATIO\n * @nullable\n */\n proHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRO_TOTAL_HOLDERS\n * @nullable\n */\n proTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRO_TOTAL_HOLDINGS\n * @nullable\n */\n proTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SANDWISH_HOLDINGS_RATIO\n * @nullable\n */\n sandwishHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SANDWISH_TOTAL_HOLDERS\n * @nullable\n */\n sandwishTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SANDWISH_TOTAL_HOLDINGS\n * @nullable\n */\n sandwishTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SNIPER_HOLDINGS_RATIO\n * @nullable\n */\n sniperHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SNIPER_TOTAL_HOLDERS\n * @nullable\n */\n sniperTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SNIPER_TOTAL_HOLDINGS\n * @nullable\n */\n sniperTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP100_HOLDINGS_RATIO\n * @nullable\n */\n top100HoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP100_TOTAL_HOLDINGS\n * @nullable\n */\n top100TotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP10_HOLDINGS_RATIO\n * @nullable\n */\n top10HoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP10_TOTAL_HOLDINGS\n * @nullable\n */\n top10TotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP50_HOLDINGS_RATIO\n * @nullable\n */\n top50HoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP50_TOTAL_HOLDINGS\n * @nullable\n */\n top50TotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOTAL_SUPPLY\n * @nullable\n */\n totalSupply?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOTAL_TVL_IN_SOL\n * @nullable\n */\n totalTvlInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOTAL_TVL_IN_USD\n * @nullable\n */\n totalTvlInUsd?: string | null;\n}\n\n/**\n * Token metadata\n */\nexport interface TokenMetadata {\n /** ENTITY.TOKEN_METADATA.ADDRESS */\n address: string;\n /** ENTITY.TOKEN_METADATA.CHAIN */\n chain: string;\n /**\n * ENTITY.TOKEN_METADATA.COINGECKO_COIN_ID\n * @nullable\n */\n coingeckoCoinId?: string | null;\n /** ENTITY.TOKEN_METADATA.DECIMALS */\n decimals: string;\n /**\n * ENTITY.TOKEN_METADATA.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.DEV_LAST_TOKEN_CREATED_AT\n * @nullable\n */\n devLastTokenCreatedAt?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.DEV_TOTAL_TOKENS\n * @nullable\n */\n devTotalTokens?: string | null;\n /** ENTITY.TOKEN_METADATA.EXTRA */\n extra?: TokenExtra;\n /**\n * ENTITY.TOKEN_METADATA.IMAGE_URL\n * @nullable\n */\n imageUrl?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.METADATA_ADDRESS\n * @nullable\n */\n metadataAddress?: string | null;\n /** ENTITY.TOKEN_METADATA.NAME */\n name: string;\n /** ENTITY.TOKEN_METADATA.SOCIAL_MEDIAS */\n socialMedias?: TokenSocialMedias;\n /** ENTITY.TOKEN_METADATA.SYMBOL */\n symbol: string;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_AT\n * @nullable\n */\n tokenCreatedAt?: number | null;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_BLOCK_HEIGHT\n * @nullable\n */\n tokenCreatedBlockHeight?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_SLOT\n * @nullable\n */\n tokenCreatedSlot?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_TX_SIGNATURE\n * @nullable\n */\n tokenCreatedTxSignature?: string | null;\n /** ENTITY.TOKEN_METADATA.TOKEN_CREATORS */\n tokenCreators?: TokenCreator[];\n /**\n * ENTITY.TOKEN_METADATA.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.URI\n * @nullable\n */\n uri?: string | null;\n}\n\n/**\n * Token mint/burn event\n */\nexport interface TokenMintBurn {\n /** ENTITY.TOKEN_MINT_BURN.AMOUNT */\n amount: string;\n /** ENTITY.TOKEN_MINT_BURN.BLOCK_HEIGHT */\n blockHeight: number;\n /** ENTITY.TOKEN_MINT_BURN.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.TOKEN_MINT_BURN.MINT_BURN_TYPE */\n mintBurnType: MintBurnType;\n /** ENTITY.TOKEN_MINT_BURN.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOKEN_MINT_BURN.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n}\n\n/**\n * Token search result page — mirrors TS `TokenPage`.\n */\nexport interface TokenPage {\n /** ENTITY.TOKEN_PAGE.DATA */\n data: Token[];\n /**\n * ENTITY.TOKEN_PAGE.END_CURSOR\n * @nullable\n */\n endCursor?: string | null;\n /** ENTITY.TOKEN_PAGE.HAS_NEXT */\n hasNext?: boolean;\n /** ENTITY.TOKEN_PAGE.HAS_PREV */\n hasPrev?: boolean;\n /**\n * ENTITY.TOKEN_PAGE.START_CURSOR\n * @nullable\n */\n startCursor?: string | null;\n}\n\n/**\n * Token price\n */\nexport interface TokenPrice {\n /** Token address */\n address: string;\n /**\n * Price in native token\n * @nullable\n */\n priceInSol?: string | null;\n /** Price in USD */\n priceInUsd: string;\n /** Timestamp */\n timestamp: number;\n}\n\n/**\n * Token social media links\n */\nexport interface TokenSocialMedias {\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.BITBUCKET\n * @nullable\n */\n bitbucket?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.DISCORD\n * @nullable\n */\n discord?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.FACEBOOK\n * @nullable\n */\n facebook?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.GITHUB\n * @nullable\n */\n github?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.INSTAGRAM\n * @nullable\n */\n instagram?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.LINKEDIN\n * @nullable\n */\n linkedin?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.MEDIUM\n * @nullable\n */\n medium?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.REDDIT\n * @nullable\n */\n reddit?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.TELEGRAM\n * @nullable\n */\n telegram?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.TIKTOK\n * @nullable\n */\n tiktok?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.TWITTER\n * @nullable\n */\n twitter?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.WEBSITE\n * @nullable\n */\n website?: string | null;\n /**\n * ENTITY.TOKEN_SOCIAL_MEDIAS.YOUTUBE\n * @nullable\n */\n youtube?: string | null;\n}\n\n/**\n * Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields.\n */\nexport type TokenStatsPeriods = { [key: string]: TokenTradeStatPeriod };\n\n/**\n * Token statistics with nested time period data\n */\nexport interface TokenStats {\n /** ENTITY.TOKEN_STATS.ADDRESS */\n address: string;\n /** Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields. */\n periods: TokenStatsPeriods;\n}\n\n/**\n * Single time window trade statistics period\n */\nexport interface TokenTradeStatPeriod {\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.AVERAGE_PRICE_IN_NATIVE */\n averagePriceInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.AVERAGE_PRICE_IN_USD */\n averagePriceInUsd?: string;\n /**\n * ENTITY.TOKEN_TRADE_STAT_PERIOD.BUY_SELL_RATIO\n * @nullable\n */\n buySellRatio?: string | null;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.BUY_VOLUME */\n buyVolume?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.BUY_VOLUME_IN_NATIVE */\n buyVolumeInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.BUY_VOLUME_IN_USD */\n buyVolumeInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.BUYERS */\n buyers?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.BUYS */\n buys?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.CLOSE_IN_NATIVE */\n closeInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.CLOSE_IN_USD */\n closeInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.CURRENT_LIQUIDITY_IN_USD */\n currentLiquidityInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.DAPP_PROGRAM_COUNT */\n dappProgramCount?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.HIGH_IN_NATIVE */\n highInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.HIGH_IN_USD */\n highInUsd?: string;\n /**\n * ENTITY.TOKEN_TRADE_STAT_PERIOD.LIQUIDITY_CHANGE_RATIO\n * @nullable\n */\n liquidityChangeRatio?: string | null;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.LOW_IN_NATIVE */\n lowInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.LOW_IN_USD */\n lowInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.OPEN_IN_NATIVE */\n openInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.OPEN_IN_USD */\n openInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.POOL_COUNT */\n poolCount?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_BUY_VOLUME */\n prevBuyVolume?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_BUY_VOLUME_IN_NATIVE */\n prevBuyVolumeInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_BUY_VOLUME_IN_USD */\n prevBuyVolumeInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_BUYERS */\n prevBuyers?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_BUYS */\n prevBuys?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_CLOSE_IN_NATIVE */\n prevCloseInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_CLOSE_IN_USD */\n prevCloseInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_DAPP_PROGRAM_COUNT */\n prevDappProgramCount?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_HIGH_IN_NATIVE */\n prevHighInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_HIGH_IN_USD */\n prevHighInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_LIQUIDITY_IN_USD */\n prevLiquidityInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_LOW_IN_NATIVE */\n prevLowInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_LOW_IN_USD */\n prevLowInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_OPEN_IN_NATIVE */\n prevOpenInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_OPEN_IN_USD */\n prevOpenInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_POOL_COUNT */\n prevPoolCount?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_SELL_VOLUME */\n prevSellVolume?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_SELL_VOLUME_IN_NATIVE */\n prevSellVolumeInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_SELL_VOLUME_IN_USD */\n prevSellVolumeInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_SELLERS */\n prevSellers?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_SELLS */\n prevSells?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PREV_TRADES */\n prevTrades?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.PRICE_CHANGE_RATIO_IN_USD */\n priceChangeRatioInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.SELL_VOLUME */\n sellVolume?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.SELL_VOLUME_IN_NATIVE */\n sellVolumeInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.SELL_VOLUME_IN_USD */\n sellVolumeInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.SELLERS */\n sellers?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.SELLS */\n sells?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.TOTAL_VOLUME_IN_NATIVE */\n totalVolumeInNative?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.TOTAL_VOLUME_IN_USD */\n totalVolumeInUsd?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.TRADERS */\n traders?: string;\n /** ENTITY.TOKEN_TRADE_STAT_PERIOD.TRADES */\n trades?: string;\n /**\n * ENTITY.TOKEN_TRADE_STAT_PERIOD.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /**\n * ENTITY.TOKEN_TRADE_STAT_PERIOD.VOLUME_CHANGE_RATIO\n * @nullable\n */\n volumeChangeRatio?: string | null;\n}\n\n/**\n * Token trader info — mirrors TS `TokenTraderDTO`\n */\nexport interface TokenTrader {\n /** Wallet address */\n address: string;\n /**\n * Block timestamp (sniper)\n * @nullable\n */\n blockTimestamp?: string | null;\n /**\n * Onchain account creation time (fresh/dev)\n * @nullable\n */\n onchainCreatedAt?: string | null;\n /**\n * Percentile rank of trade amount in USD (pro/insider)\n * @nullable\n */\n percentileRankTradeAmountInUsd?: string | null;\n /**\n * Percentile rank of trade count (pro)\n * @nullable\n */\n percentileRankTradeCount?: number | null;\n /**\n * Rank trade amount in USD (insider)\n * @nullable\n */\n rankTradeAmountInUsd?: string | null;\n /**\n * Trade amount in native token (pro/insider)\n * @nullable\n */\n tradeAmountInNative?: string | null;\n /**\n * Trade amount in USD (pro/insider)\n * @nullable\n */\n tradeAmountInUsd?: string | null;\n /**\n * Trade count (pro/insider)\n * @nullable\n */\n tradeCount?: number | null;\n /**\n * Transaction signature (sandwish/bundle/sniper)\n * @nullable\n */\n transactionSignature?: string | null;\n}\n\n/**\n * Token trader tag\n */\nexport type TokenTraderTag = (typeof TokenTraderTag)[keyof typeof TokenTraderTag];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TokenTraderTag = {\n fresh: \"fresh\",\n sandwish: \"sandwish\",\n bundle: \"bundle\",\n sniper: \"sniper\",\n dev: \"dev\",\n pro: \"pro\",\n insider: \"insider\",\n kol: \"kol\",\n bluechip: \"bluechip\",\n smart: \"smart\",\n} as const;\n\n/**\n * Token transfer\n */\nexport interface TokenTransfer {\n /** ENTITY.TOKEN_TRANSFER.AMOUNT */\n amount: string;\n /**\n * ENTITY.TOKEN_TRANSFER.AMOUNT_IN_USD\n * @nullable\n */\n amountInUsd?: string | null;\n /** ENTITY.TOKEN_TRANSFER.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.TOKEN_TRANSFER.FROM_ADDRESS */\n fromAddress: string;\n /** ENTITY.TOKEN_TRANSFER.ID */\n id: string;\n /** Transfer status: unknown / succeeded / failed */\n status: string;\n /** ENTITY.TOKEN_TRANSFER.TO_ADDRESS */\n toAddress: string;\n /** ENTITY.TOKEN_TRANSFER.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOKEN_TRANSFER.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** Transfer type: unknown / in / out */\n type: string;\n}\n\n/**\n * Token transfer total count\n */\nexport interface TokenTransferTotal {\n /** ENTITY.TOKEN_TRANSFER_TOTAL.TOTAL */\n total: number;\n}\n\n/**\n * Top trader statistics\n */\nexport interface TopTrader {\n /** ENTITY.TOP_TRADER.BUY_AMOUNT */\n buyAmount: string;\n /** ENTITY.TOP_TRADER.BUY_AMOUNT_IN_NATIVE */\n buyAmountInNative: string;\n /** ENTITY.TOP_TRADER.BUY_AMOUNT_IN_USD */\n buyAmountInUsd: string;\n /** ENTITY.TOP_TRADER.BUY_COUNT */\n buyCount: number;\n /** ENTITY.TOP_TRADER.SELL_AMOUNT */\n sellAmount: string;\n /** ENTITY.TOP_TRADER.SELL_AMOUNT_IN_NATIVE */\n sellAmountInNative: string;\n /** ENTITY.TOP_TRADER.SELL_AMOUNT_IN_USD */\n sellAmountInUsd: string;\n /** ENTITY.TOP_TRADER.SELL_COUNT */\n sellCount: number;\n /** ENTITY.TOP_TRADER.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.TOP_TRADER.TRADE_AMOUNT */\n tradeAmount: string;\n /** ENTITY.TOP_TRADER.TRADE_COUNT */\n tradeCount: number;\n /** ENTITY.TOP_TRADER.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Sort field for top traders query\n */\nexport type TopTraderSortBy = (typeof TopTraderSortBy)[keyof typeof TopTraderSortBy];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TopTraderSortBy = {\n tradeAmount: \"tradeAmount\",\n tradeCount: \"tradeCount\",\n} as const;\n\n/**\n * Trade detail\n */\nexport interface TradeDetail {\n /** Account owner address (trader wallet) */\n accountOwnerAddress: string;\n /** Block height */\n blockHeight: number;\n /** Block timestamp (milliseconds) */\n blockTimestamp: number;\n /** Chain identifier */\n chain: string;\n /**\n * DEX image\n * @nullable\n */\n dexImage?: string | null;\n /**\n * DEX program address\n * @nullable\n */\n dexProgramAddress?: string | null;\n /**\n * DEX protocol family\n * @nullable\n */\n dexProtocolFamily?: string | null;\n /** Pool address */\n poolAddress: string;\n /** Side token address */\n sideTokenAddress: string;\n /** Side token amount */\n sideTokenAmount: string;\n /** Side token amount in native currency */\n sideTokenAmountInNative: string;\n /** Side token amount in USD */\n sideTokenAmountInUsd: string;\n /**\n * Side token image URL\n * @nullable\n */\n sideTokenImageUrl?: string | null;\n /** Side token name */\n sideTokenName: string;\n /** Side token price in native currency */\n sideTokenPriceInNative: string;\n /** Side token price in USD */\n sideTokenPriceInUsd: string;\n /** Side token symbol */\n sideTokenSymbol: string;\n /** Transaction status */\n status: string;\n /** Token address */\n tokenAddress: string;\n /** Token amount */\n tokenAmount: string;\n /** Token amount in native currency */\n tokenAmountInNative: string;\n /** Token amount in USD */\n tokenAmountInUsd: string;\n /**\n * Token image URL\n * @nullable\n */\n tokenImageUrl?: string | null;\n /** Token name */\n tokenName: string;\n /** Token price in native currency */\n tokenPriceInNative: string;\n /** Token price in USD */\n tokenPriceInUsd: string;\n /** Token symbol */\n tokenSymbol: string;\n /** Transaction signature */\n transactionSignature: string;\n /** Trade type (BUY/SELL) */\n type: string;\n}\n\n/**\n * Trade type\n */\nexport type TradeType = (typeof TradeType)[keyof typeof TradeType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TradeType = {\n BUY: \"BUY\",\n SELL: \"SELL\",\n} as const;\n\n/**\n * Trader gainers/losers item — PnL-based ranking\n */\nexport interface TraderGainersLosersItem {\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.ADDRESS */\n address: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.CHAIN */\n chain: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.PNL */\n pnl: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.TRADE_COUNT */\n tradeCount: string;\n /** ENTITY.TRADER_GAINERS_LOSERS_ITEM.VOLUME */\n volume: string;\n}\n\n/**\n * Trader PnL resolution period\n */\nexport type TraderPnlResolution = (typeof TraderPnlResolution)[keyof typeof TraderPnlResolution];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TraderPnlResolution = {\n \"1d\": \"1d\",\n \"7d\": \"7d\",\n \"30d\": \"30d\",\n} as const;\n\n/**\n * Transaction status\n */\nexport type TransactionStatus = (typeof TransactionStatus)[keyof typeof TransactionStatus];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TransactionStatus = {\n UNKNOWN: \"UNKNOWN\",\n SUCCEEDED: \"SUCCEEDED\",\n FAILED: \"FAILED\",\n} as const;\n\nexport type TransferDirection = (typeof TransferDirection)[keyof typeof TransferDirection];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const TransferDirection = {\n sent: \"sent\",\n received: \"received\",\n} as const;\n\nexport interface TransferTotalResponse {\n /** ENTITY.TRANSFER_TOTAL_RESPONSE.TOTAL */\n total: number;\n}\n\n/**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\nexport type UpdateWebhookRequestMetadata = { [key: string]: unknown } | null;\n\n/**\n * Request to update a webhook endpoint\n */\nexport interface UpdateWebhookRequest {\n /**\n * DTO.ENDPOINT.CHANNELS\n * @nullable\n */\n channels?: WebhookChannel[] | null;\n /**\n * DTO.ENDPOINT.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * DTO.ENDPOINT.DISABLED\n * @nullable\n */\n disabled?: boolean | null;\n /** DTO.ENDPOINT.ENDPOINT_ID */\n endpointId: string;\n /**\n * DTO.ENDPOINT.FILTER\n * @nullable\n */\n filter?: string | null;\n /**\n * DTO.ENDPOINT.FILTER_TYPES\n * @nullable\n */\n filterTypes?: string[] | null;\n /**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\n metadata?: UpdateWebhookRequestMetadata;\n /**\n * DTO.ENDPOINT.RATE_LIMIT\n * @minimum 0\n * @nullable\n */\n rateLimit?: number | null;\n /**\n * DTO.ENDPOINT.URL\n * @nullable\n */\n url?: string | null;\n}\n\n/**\n * Wallet balances\n */\nexport interface WalletBalances {\n /** Chain identifier */\n chain: string;\n /**\n * Native token balance\n * @nullable\n */\n nativeBalance?: string | null;\n /**\n * Native balance in USD\n * @nullable\n */\n nativeBalanceInUsd?: string | null;\n /** Token balances */\n tokens: TokenBalance[];\n /**\n * Total value in USD\n * @nullable\n */\n totalValueInUsd?: string | null;\n /** Wallet address */\n walletAddress: string;\n}\n\n/**\n * Wallet first transaction summary\n */\nexport interface WalletFirstTx {\n /** ENTITY.WALLET_FIRST_TX.BALANCE_CHANGE */\n balanceChange: string;\n /** ENTITY.WALLET_FIRST_TX.BLOCK_NUMBER */\n blockNumber: number;\n /** ENTITY.WALLET_FIRST_TX.BLOCK_TIME */\n blockTime: number;\n /** ENTITY.WALLET_FIRST_TX.DECIMALS */\n decimals: number;\n /** ENTITY.WALLET_FIRST_TX.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.WALLET_FIRST_TX.TX_HASH */\n txHash: string;\n}\n\n/**\n * Wallet net worth summary\n */\nexport interface WalletNetWorth {\n /** ENTITY.WALLET_NET_WORTH.CHAIN */\n chain: string;\n /**\n * ENTITY.WALLET_NET_WORTH.TOKEN_COUNT\n * @nullable\n */\n tokenCount?: number | null;\n /**\n * ENTITY.WALLET_NET_WORTH.TOTAL_VALUE_IN_NATIVE\n * @nullable\n */\n totalValueInNative?: string | null;\n /**\n * ENTITY.WALLET_NET_WORTH.TOTAL_VALUE_IN_USD\n * @nullable\n */\n totalValueInUsd?: string | null;\n /** ENTITY.WALLET_NET_WORTH.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Wallet net-worth chart response with pagination.\n */\nexport interface WalletNetWorthChartResponse {\n /** ENTITY.WALLET_NET_WORTH_CHART_RESPONSE.CURRENT_TIMESTAMP */\n currentTimestamp: string;\n /** ENTITY.WALLET_NET_WORTH_CHART_RESPONSE.HISTORY */\n history: NetWorthHistoryItem[];\n /** ENTITY.WALLET_NET_WORTH_CHART_RESPONSE.PAST_TIMESTAMP */\n pastTimestamp: string;\n /** ENTITY.WALLET_NET_WORTH_CHART_RESPONSE.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Paginated wallet net-worth details (mirrors TS WalletNetWorthDetailsPage).\n */\nexport interface WalletNetWorthDetailsPage {\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.DATA */\n data: NetWorthByTokensItem[];\n /**\n * ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.END_CURSOR\n * @nullable\n */\n endCursor?: string | null;\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.HAS_NEXT */\n hasNext?: boolean;\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.HAS_PREV */\n hasPrev?: boolean;\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.NET_WORTH */\n netWorth: string;\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.REQUESTED_TIMESTAMP */\n requestedTimestamp: string;\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.RESOLVED_TIMESTAMP */\n resolvedTimestamp: string;\n /**\n * ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.START_CURSOR\n * @nullable\n */\n startCursor?: string | null;\n /** ENTITY.WALLET_NET_WORTH_DETAILS_PAGE.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * Paginated wallet net-worth page (mirrors TS WalletNetWorthPage).\n */\nexport interface WalletNetWorthPage {\n /** ENTITY.WALLET_NET_WORTH_PAGE.CURRENT_TIMESTAMP */\n currentTimestamp: string;\n /** ENTITY.WALLET_NET_WORTH_PAGE.DATA */\n data: NetWorthByTokensItem[];\n /**\n * ENTITY.WALLET_NET_WORTH_PAGE.END_CURSOR\n * @nullable\n */\n endCursor?: string | null;\n /** ENTITY.WALLET_NET_WORTH_PAGE.HAS_NEXT */\n hasNext?: boolean;\n /** ENTITY.WALLET_NET_WORTH_PAGE.HAS_PREV */\n hasPrev?: boolean;\n /**\n * ENTITY.WALLET_NET_WORTH_PAGE.START_CURSOR\n * @nullable\n */\n startCursor?: string | null;\n /** ENTITY.WALLET_NET_WORTH_PAGE.TOTAL_VALUE_IN_NATIVE */\n totalValueInNative: string;\n /** ENTITY.WALLET_NET_WORTH_PAGE.TOTAL_VALUE_IN_USD */\n totalValueInUsd: string;\n /** ENTITY.WALLET_NET_WORTH_PAGE.WALLET_ADDRESS */\n walletAddress: string;\n}\n\n/**\n * ENTITY.WALLET_NET_WORTH_SUMMARY_RESPONSE.WALLETS\n */\nexport type WalletNetWorthSummaryResponseWallets = { [key: string]: NetWorthSummaryValue };\n\nexport interface WalletNetWorthSummaryResponse {\n /** ENTITY.WALLET_NET_WORTH_SUMMARY_RESPONSE.CURRENT_TIMESTAMP */\n currentTimestamp: string;\n /** ENTITY.WALLET_NET_WORTH_SUMMARY_RESPONSE.WALLETS */\n wallets: WalletNetWorthSummaryResponseWallets;\n}\n\n/**\n * Wallet PnL Summary (aggregated across all tokens for a given resolution)\n */\nexport interface WalletPnlSummary {\n /** ENTITY.WALLET_PNL_SUMMARY.AVG_PROFIT_PER_TRADE_IN_USD */\n avgProfitPerTradeInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.BUY_AMOUNT_IN_USD */\n buyAmountInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.BUYS */\n buys: string;\n /** ENTITY.WALLET_PNL_SUMMARY.LOSSES */\n losses: string;\n /** ENTITY.WALLET_PNL_SUMMARY.REALIZED_PROFIT_IN_USD */\n realizedProfitInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.REALIZED_PROFIT_RATIO */\n realizedProfitRatio: string;\n /** ENTITY.WALLET_PNL_SUMMARY.RESOLUTION */\n resolution: string;\n /** ENTITY.WALLET_PNL_SUMMARY.SELL_AMOUNT_IN_USD */\n sellAmountInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.SELLS */\n sells: string;\n /** ENTITY.WALLET_PNL_SUMMARY.TOKENS */\n tokens: string;\n /** ENTITY.WALLET_PNL_SUMMARY.TOTAL_COST_IN_USD */\n totalCostInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.TOTAL_PROFIT_IN_USD */\n totalProfitInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.TOTAL_PROFIT_RATIO */\n totalProfitRatio: string;\n /** ENTITY.WALLET_PNL_SUMMARY.TOTAL_TRADES */\n totalTrades: string;\n /** ENTITY.WALLET_PNL_SUMMARY.UNREALIZED_PROFIT_IN_USD */\n unrealizedProfitInUsd: string;\n /** ENTITY.WALLET_PNL_SUMMARY.UNREALIZED_PROFIT_RATIO */\n unrealizedProfitRatio: string;\n /**\n * ENTITY.WALLET_PNL_SUMMARY.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /** ENTITY.WALLET_PNL_SUMMARY.WALLET_ADDRESS */\n walletAddress: string;\n /** ENTITY.WALLET_PNL_SUMMARY.WIN_RATE */\n winRate: string;\n /** ENTITY.WALLET_PNL_SUMMARY.WINS */\n wins: string;\n}\n\n/**\n * Wallet transfer\n */\nexport interface WalletTransfer {\n /** ENTITY.WALLET_TRANSFER.AMOUNT */\n amount: string;\n /**\n * ENTITY.WALLET_TRANSFER.AMOUNT_IN_USD\n * @nullable\n */\n amountInUsd?: string | null;\n /** ENTITY.WALLET_TRANSFER.BLOCK_TIMESTAMP */\n blockTimestamp: number;\n /** ENTITY.WALLET_TRANSFER.FROM_ADDRESS */\n fromAddress: string;\n /** ENTITY.WALLET_TRANSFER.ID */\n id: string;\n /** ENTITY.WALLET_TRANSFER.TO_ADDRESS */\n toAddress: string;\n /** ENTITY.WALLET_TRANSFER.TOKEN_ADDRESS */\n tokenAddress: string;\n /** ENTITY.WALLET_TRANSFER.TRANSACTION_SIGNATURE */\n transactionSignature: string;\n /** ENTITY.WALLET_TRANSFER.TRANSFER_TYPE */\n transferType: string;\n}\n\n/**\n * ENTITY.WALLETS_MAP_RESPONSE.WALLETS\n */\nexport type WalletsMapResponseWallets = { [key: string]: WalletFirstTx };\n\nexport interface WalletsMapResponse {\n /** ENTITY.WALLETS_MAP_RESPONSE.WALLETS */\n wallets: WalletsMapResponseWallets;\n}\n\n/**\n * Watchlist entity\n */\nexport interface Watchlist {\n /** List of watchlist items */\n items: WatchlistItem[];\n /** User ID or identifier */\n userId: string;\n}\n\n/**\n * Watchlist item\n */\nexport interface WatchlistItem {\n /** Chain identifier */\n chain: string;\n /** Wallet address being watched */\n walletAddress: string;\n}\n\n/**\n * Webhook event channel\n */\nexport type WebhookChannel = (typeof WebhookChannel)[keyof typeof WebhookChannel];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const WebhookChannel = {\n soltokenmigrated: \"sol.token.migrated\",\n soltokencreated: \"sol.token.created\",\n} as const;\n\n/**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\nexport type WebhookEndpointMetadata = { [key: string]: unknown } | null;\n\n/**\n * Webhook endpoint response\n */\nexport interface WebhookEndpoint {\n /**\n * DTO.ENDPOINT.CHANNELS\n * @nullable\n */\n channels?: WebhookChannel[] | null;\n /**\n * DTO.ENDPOINT.CREATED_AT\n * @nullable\n */\n createdAt?: string | null;\n /**\n * DTO.ENDPOINT.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * DTO.ENDPOINT.DISABLED\n * @nullable\n */\n disabled?: boolean | null;\n /**\n * DTO.ENDPOINT.FILTER\n * @nullable\n */\n filter?: string | null;\n /**\n * DTO.ENDPOINT.FILTER_TYPES\n * @nullable\n */\n filterTypes?: string[] | null;\n /** DTO.ENDPOINT.ID */\n id: string;\n /**\n * DTO.ENDPOINT.METADATA\n * @nullable\n */\n metadata?: WebhookEndpointMetadata;\n /**\n * DTO.ENDPOINT.RATE_LIMIT\n * @minimum 0\n * @nullable\n */\n rateLimit?: number | null;\n /**\n * DTO.ENDPOINT.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /** DTO.ENDPOINT.URL */\n url: string;\n}\n\n/**\n * DTO.DEX.IDENTIFIER\n */\nexport type SwapInputDex = (typeof SwapInputDex)[keyof typeof SwapInputDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapInputDex = {\n jupiter: \"jupiter\",\n kyberswap: \"kyberswap\",\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n moonshot: \"moonshot\",\n candy: \"candy\",\n launchpad: \"launchpad\",\n} as const;\n\n/**\n * DTO.DEX.SWAP.MODE\n */\nexport type SwapInputSwapMode = (typeof SwapInputSwapMode)[keyof typeof SwapInputSwapMode];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapInputSwapMode = {\n ExactIn: \"ExactIn\",\n ExactOut: \"ExactOut\",\n} as const;\n\nexport interface SwapInput {\n /** DTO.DEX.IDENTIFIER */\n dex: SwapInputDex;\n /**\n * DTO.DEX.WALLET\n * @minLength 8\n * @maxLength 64\n */\n userAddress: string;\n /** DTO.DEX.BASE.PRIORITY_FEE */\n priorityFee?: string;\n /** DTO.DEX.SWAP.POOL_ADDRESS */\n poolAddress?: string;\n /** DTO.DEX.SWAP.AMOUNT */\n amount: string;\n /** DTO.DEX.SWAP.MODE */\n swapMode: SwapInputSwapMode;\n /**\n * DTO.DEX.SWAP.SLIPPAGE\n * @minimum 0\n * @maximum 100\n */\n slippage: number;\n /** DTO.DEX.SWAP.INPUT_MINT */\n inputMint?: string;\n /** DTO.DEX.SWAP.OUTPUT_MINT */\n outputMint?: string;\n}\n\nexport interface SwapReply {\n /** DTO.DEX.SWAP.SERIALIZED_TX */\n serializedTx: string;\n /** DTO.DEX.SWAP.ELAPSED_TIME */\n elapsedTime: number;\n}\n\n/**\n * DTO.DEX.IDENTIFIER\n */\nexport type SwapRouteInputDex = (typeof SwapRouteInputDex)[keyof typeof SwapRouteInputDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapRouteInputDex = {\n jupiter: \"jupiter\",\n kyberswap: \"kyberswap\",\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n moonshot: \"moonshot\",\n candy: \"candy\",\n launchpad: \"launchpad\",\n} as const;\n\n/**\n * DTO.DEX.SWAP.MODE\n */\nexport type SwapRouteInputSwapMode =\n (typeof SwapRouteInputSwapMode)[keyof typeof SwapRouteInputSwapMode];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SwapRouteInputSwapMode = {\n ExactIn: \"ExactIn\",\n ExactOut: \"ExactOut\",\n} as const;\n\nexport interface SwapRouteInput {\n /** DTO.DEX.IDENTIFIER */\n dex: SwapRouteInputDex;\n /**\n * DTO.DEX.WALLET\n * @minLength 8\n * @maxLength 64\n */\n userAddress: string;\n /** DTO.DEX.BASE.PRIORITY_FEE */\n priorityFee?: string;\n /** DTO.DEX.SWAP.AMOUNT */\n amount: string;\n /** DTO.DEX.SWAP.MODE */\n swapMode: SwapRouteInputSwapMode;\n /**\n * DTO.DEX.SWAP.SLIPPAGE\n * @minimum 0\n * @maximum 100\n */\n slippage: number;\n /** DTO.DEX.SWAP.INPUT_MINT */\n inputMint?: string;\n /** DTO.DEX.SWAP.OUTPUT_MINT */\n outputMint?: string;\n /** DTO.DEX.SWAP.RECIPIENT_ADDRESS */\n recipientAddress?: string;\n /** DTO.DEX.SWAP.PERMIT */\n permit?: string;\n /** DTO.DEX.SWAP.DEADLINE */\n deadline?: number;\n /** DTO.DEX.BASE.TIP_FEE */\n tipFee?: string;\n /** DTO.DEX.BASE.IS_ANTI_MEV */\n isAntiMev?: boolean;\n /** DTO.DEX.SWAP.MAX_FEE_PER_GAS */\n maxFeePerGas?: string;\n /** DTO.DEX.SWAP.MAX_PRIORITY_FEE_PER_GAS */\n maxPriorityFeePerGas?: string;\n /** DTO.DEX.SWAP.GAS_PRICE */\n gasPrice?: string;\n /** DTO.DEX.SWAP.GAS_LIMIT */\n gasLimit?: string;\n}\n\n/**\n * DTO.DEX.SWAP.ROUTE_INFO\n */\nexport type SwapRouteResponseRouteInfo = { [key: string]: unknown };\n\nexport interface SwapRouteResponse {\n /** DTO.DEX.SWAP.ARGS */\n args: SwapRouteInput;\n /** DTO.DEX.SWAP.SERIALIZED_TX */\n serializedTx: string;\n /** DTO.DEX.SWAP.ROUTE_INFO */\n routeInfo: SwapRouteResponseRouteInfo;\n /** DTO.DEX.SWAP.ELAPSED_TIME */\n elapsedTime: number;\n}\n\nexport interface DexQuoteResponse {\n /** DTO.DEX.QUOTE.AMOUNT_OUT */\n amountOut?: string;\n /** DTO.DEX.QUOTE.MIN_AMOUNT_OUT */\n minAmountOut?: string;\n /** DTO.DEX.QUOTE.CURRENT_PRICE */\n currentPrice?: string;\n /** DTO.DEX.QUOTE.EXECUTION_PRICE */\n executionPrice?: string;\n /** DTO.DEX.QUOTE.PRICE_IMPACT */\n priceImpact?: string;\n /** DTO.DEX.QUOTE.FEE */\n fee?: string;\n}\n\n/**\n * DTO.DEX.IDENTIFIER\n */\nexport type CreateTokenInputDex = (typeof CreateTokenInputDex)[keyof typeof CreateTokenInputDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const CreateTokenInputDex = {\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n moonshot: \"moonshot\",\n candy: \"candy\",\n launchpad: \"launchpad\",\n} as const;\n\n/**\n * DTO.DEX.MINT.EXTRA\n */\nexport type CreateTokenInputExtra = { [key: string]: unknown };\n\nexport interface CreateTokenInput {\n /** DTO.DEX.IDENTIFIER */\n dex: CreateTokenInputDex;\n /**\n * DTO.DEX.WALLET\n * @minLength 8\n * @maxLength 64\n */\n userAddress: string;\n /** DTO.DEX.BASE.PRIORITY_FEE */\n priorityFee?: string;\n /**\n * DTO.DEX.MINT.NAME\n * @minLength 1\n * @maxLength 32\n */\n name: string;\n /**\n * DTO.DEX.MINT.SYMBOL\n * @minLength 1\n * @maxLength 10\n */\n symbol: string;\n /** DTO.DEX.MINT.URI */\n uri?: string;\n /** DTO.DEX.MINT.IMAGE */\n image?: string;\n /** DTO.DEX.MINT.EXTRA */\n extra?: CreateTokenInputExtra;\n}\n\nexport interface CreateTokenReply {\n /** DTO.DEX.CREATE_TOKEN.SERIALIZED_TX */\n serializedTx: string;\n /** DTO.DEX.CREATE_TOKEN.MINT_ADDRESS */\n mintAddress: string;\n}\n\n/**\n * DTO.TRANSACTION.SEND.SUBMIT_TYPE\n */\nexport type SendTxInputSubmitType =\n (typeof SendTxInputSubmitType)[keyof typeof SendTxInputSubmitType];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const SendTxInputSubmitType = {\n default: \"default\",\n priority: \"priority\",\n} as const;\n\n/**\n * DTO.TRANSACTION.SEND.OPTIONS\n */\nexport type SendTxInputOptions = { [key: string]: unknown };\n\nexport interface SendTxInput {\n /** DTO.TRANSACTION.SEND.SIGNED_TX */\n signedTx: string;\n /** DTO.TRANSACTION.SEND.SUBMIT_TYPE */\n submitType?: SendTxInputSubmitType;\n /** DTO.TRANSACTION.SEND.OPTIONS */\n options?: SendTxInputOptions;\n}\n\nexport interface SendTxResponse {\n /** DTO.TRANSACTION.SEND.SIGNATURE */\n signature: string;\n /** DTO.TRANSACTION.SEND.ELAPSED_TIME */\n elapsedTime: number;\n /** DTO.TRANSACTION.SEND.JOB_ID */\n jobId: string;\n}\n\nexport interface GasPriceResponse {\n /** Current gas price in wei (hex string) */\n gasPrice: string;\n /** Chain symbol */\n chain: string;\n}\n\nexport interface EstimateGasLimitInput {\n /** From address */\n from: string;\n /** To address */\n to: string;\n /** Transaction data (hex) */\n data: string;\n /** Value to send (in wei, hex string) */\n value?: string;\n}\n\nexport interface EstimateGasLimitResponse {\n /** Estimated gas limit (hex string) */\n gasLimit: string;\n /** Chain symbol */\n chain: string;\n}\n\n/**\n * DTO.JOB.RESULT\n */\nexport type JobDTOResult = { [key: string]: unknown };\n\nexport interface JobDTO {\n /** DTO.JOB.STATE */\n state: string;\n /** DTO.JOB.RESULT */\n result: JobDTOResult;\n}\n\n/**\n * DTO.JOB.STREAMING.DATA\n */\nexport type JobStreamingDTOData = { [key: string]: unknown };\n\nexport interface JobStreamingDTO {\n /** DTO.JOB.STREAMING.ID */\n id: number;\n /** DTO.JOB.STREAMING.DATA */\n data: JobStreamingDTOData;\n}\n\nexport interface PresignResponseModel {\n /** Presigned upload URL */\n presignUrl: string;\n}\n\nexport interface WatchlistAddResponseModel {\n /** ENTITY.WATCHLIST_ADD_RESPONSE.SUCCESS */\n success: boolean;\n}\n\nexport type ListDexParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.DEX.LIST.CHAINS\n */\n chains?: string[];\n /**\n * DTO.DEX.LIST.DEX_PROGRAM\n */\n dexProgram?: string;\n};\n\nexport type QuoteParams = {\n /**\n * DTO.DEX.QUOTE.DEX\n */\n dex: QuoteDex;\n /**\n * DTO.DEX.QUOTE.AMOUNT\n */\n amount: string;\n /**\n * DTO.DEX.QUOTE.INPUT_MINT\n */\n inputMint: string;\n /**\n * DTO.DEX.QUOTE.OUTPUT_MINT\n */\n outputMint: string;\n /**\n * DTO.DEX.QUOTE.EXACT_IN\n */\n exactIn?: boolean;\n /**\n * DTO.DEX.QUOTE.SLIPPAGE\n */\n slippage: number;\n};\n\nexport type QuoteDex = (typeof QuoteDex)[keyof typeof QuoteDex];\n\n// eslint-disable-next-line @typescript-eslint/no-redeclare\nexport const QuoteDex = {\n raydium: \"raydium\",\n pumpfun: \"pumpfun\",\n} as const;\n\nexport type GetDexpoolSnapshotsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.DEXPOOL.SNAPSHOTS.TIME\n */\n time?: number;\n};\n\nexport type GetFinalStretchTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetHotTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetMigratedTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetNewTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetStocksTokensParams = {\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.RANKING.TAG\n */\n tag?: RankingTag;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY\n */\n rangeFilters?: RangeFilterCondition[];\n /**\n * DTO.TOKEN.FILTER.FILTERS\n */\n filters?: string[];\n /**\n * DTO.TOKEN.FILTER.LAUNCHPAD_PLATFORM\n */\n launchpadPlatform?: string[];\n /**\n * DTO.TOKEN.FILTER.SEARCH_KEYWORDS\n */\n searchKeywords?: string[];\n /**\n * DTO.TOKEN.FILTER.EXCLUDE_KEYWORDS\n */\n excludeKeywords?: string[];\n};\n\nexport type GetRedpacketsParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.RED_PACKET.CREATOR\n */\n creator?: string;\n /**\n * DTO.RED_PACKET.CHAIN\n */\n chain?: ChainSymbol;\n};\n\nexport type GetClaimsByAddressParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetRedpacketsByAddressParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetClaimsParams = {\n /**\n * DTO.RED_PACKET.CURSOR\n */\n cursor?: string;\n /**\n * DTO.RED_PACKET.LIMIT\n */\n limit?: number;\n /**\n * DTO.RED_PACKET.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type SearchParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.SEARCH.CHAINS\n */\n chains?: string[];\n /**\n * DTO.TOKEN.SEARCH.QUERY\n */\n q?: string;\n /**\n * DTO.TOKEN.SEARCH.SORT_DIRECTION\n */\n sort?: SortDirection;\n /**\n * DTO.TOKEN.SEARCH.PROTOCOLS\n */\n protocols?: string[];\n /**\n * DTO.TOKEN.SEARCH.SORT_BY\n */\n sortBy?: SearchSortBy;\n /**\n * DTO.TOKEN.SEARCH.MODE\n */\n mode?: SearchMode;\n};\n\nexport type GetDevTokensParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type ListTokenParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.LIST.SORT_DIRECTION\n */\n sort?: SortDirection;\n /**\n * DTO.TOKEN.LIST.QUERY.SORT_BY\n */\n sortBy?: TokenListSortField;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_VOLUME_IN_USD\n */\n min_h24_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_VOLUME_IN_USD\n */\n max_h24_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_PRICE_CHANGE_RATIO\n */\n min_h24_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_PRICE_CHANGE_RATIO\n */\n max_h24_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_BUYS\n */\n min_h24_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_BUYS\n */\n max_h24_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_SELLS\n */\n min_h24_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_SELLS\n */\n max_h24_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_TRADES\n */\n min_h24_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_TRADES\n */\n max_h24_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_BUYERS\n */\n min_h24_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_BUYERS\n */\n max_h24_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_SELLERS\n */\n min_h24_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_SELLERS\n */\n max_h24_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_BUY_VOLUME_IN_USD\n */\n min_h24_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_BUY_VOLUME_IN_USD\n */\n max_h24_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H24_SELL_VOLUME_IN_USD\n */\n min_h24_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H24_SELL_VOLUME_IN_USD\n */\n max_h24_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_VOLUME_IN_USD\n */\n min_h4_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_VOLUME_IN_USD\n */\n max_h4_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_PRICE_CHANGE_RATIO\n */\n min_h4_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_PRICE_CHANGE_RATIO\n */\n max_h4_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_BUYS\n */\n min_h4_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_BUYS\n */\n max_h4_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_SELLS\n */\n min_h4_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_SELLS\n */\n max_h4_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_TRADES\n */\n min_h4_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_TRADES\n */\n max_h4_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_BUYERS\n */\n min_h4_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_BUYERS\n */\n max_h4_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_SELLERS\n */\n min_h4_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_SELLERS\n */\n max_h4_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_BUY_VOLUME_IN_USD\n */\n min_h4_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_BUY_VOLUME_IN_USD\n */\n max_h4_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H4_SELL_VOLUME_IN_USD\n */\n min_h4_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H4_SELL_VOLUME_IN_USD\n */\n max_h4_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_VOLUME_IN_USD\n */\n min_h1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_VOLUME_IN_USD\n */\n max_h1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_PRICE_CHANGE_RATIO\n */\n min_h1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_PRICE_CHANGE_RATIO\n */\n max_h1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_BUYS\n */\n min_h1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_BUYS\n */\n max_h1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_SELLS\n */\n min_h1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_SELLS\n */\n max_h1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_TRADES\n */\n min_h1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_TRADES\n */\n max_h1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_BUYERS\n */\n min_h1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_BUYERS\n */\n max_h1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_SELLERS\n */\n min_h1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_SELLERS\n */\n max_h1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_BUY_VOLUME_IN_USD\n */\n min_h1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_BUY_VOLUME_IN_USD\n */\n max_h1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_H1_SELL_VOLUME_IN_USD\n */\n min_h1_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_H1_SELL_VOLUME_IN_USD\n */\n max_h1_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_VOLUME_IN_USD\n */\n min_m30_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_VOLUME_IN_USD\n */\n max_m30_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_PRICE_CHANGE_RATIO\n */\n min_m30_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_PRICE_CHANGE_RATIO\n */\n max_m30_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_BUYS\n */\n min_m30_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_BUYS\n */\n max_m30_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_SELLS\n */\n min_m30_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_SELLS\n */\n max_m30_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_TRADES\n */\n min_m30_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_TRADES\n */\n max_m30_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_BUYERS\n */\n min_m30_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_BUYERS\n */\n max_m30_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_SELLERS\n */\n min_m30_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_SELLERS\n */\n max_m30_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_BUY_VOLUME_IN_USD\n */\n min_m30_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_BUY_VOLUME_IN_USD\n */\n max_m30_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M30_SELL_VOLUME_IN_USD\n */\n min_m30_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M30_SELL_VOLUME_IN_USD\n */\n max_m30_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_VOLUME_IN_USD\n */\n min_m15_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_VOLUME_IN_USD\n */\n max_m15_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_PRICE_CHANGE_RATIO\n */\n min_m15_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_PRICE_CHANGE_RATIO\n */\n max_m15_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_BUYS\n */\n min_m15_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_BUYS\n */\n max_m15_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_SELLS\n */\n min_m15_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_SELLS\n */\n max_m15_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_TRADES\n */\n min_m15_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_TRADES\n */\n max_m15_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_BUYERS\n */\n min_m15_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_BUYERS\n */\n max_m15_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_SELLERS\n */\n min_m15_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_SELLERS\n */\n max_m15_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_BUY_VOLUME_IN_USD\n */\n min_m15_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_BUY_VOLUME_IN_USD\n */\n max_m15_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M15_SELL_VOLUME_IN_USD\n */\n min_m15_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M15_SELL_VOLUME_IN_USD\n */\n max_m15_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_VOLUME_IN_USD\n */\n min_m5_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_VOLUME_IN_USD\n */\n max_m5_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_PRICE_CHANGE_RATIO\n */\n min_m5_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_PRICE_CHANGE_RATIO\n */\n max_m5_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_BUYS\n */\n min_m5_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_BUYS\n */\n max_m5_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_SELLS\n */\n min_m5_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_SELLS\n */\n max_m5_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_TRADES\n */\n min_m5_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_TRADES\n */\n max_m5_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_BUYERS\n */\n min_m5_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_BUYERS\n */\n max_m5_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_SELLERS\n */\n min_m5_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_SELLERS\n */\n max_m5_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_BUY_VOLUME_IN_USD\n */\n min_m5_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_BUY_VOLUME_IN_USD\n */\n max_m5_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M5_SELL_VOLUME_IN_USD\n */\n min_m5_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M5_SELL_VOLUME_IN_USD\n */\n max_m5_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_VOLUME_IN_USD\n */\n min_m1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_VOLUME_IN_USD\n */\n max_m1_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_PRICE_CHANGE_RATIO\n */\n min_m1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_PRICE_CHANGE_RATIO\n */\n max_m1_price_change_ratio?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_BUYS\n */\n min_m1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_BUYS\n */\n max_m1_buys?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_SELLS\n */\n min_m1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_SELLS\n */\n max_m1_sells?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_TRADES\n */\n min_m1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_TRADES\n */\n max_m1_trades?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_BUYERS\n */\n min_m1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_BUYERS\n */\n max_m1_buyers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_SELLERS\n */\n min_m1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_SELLERS\n */\n max_m1_sellers?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_BUY_VOLUME_IN_USD\n */\n min_m1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_BUY_VOLUME_IN_USD\n */\n max_m1_buy_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MIN_M1_SELL_VOLUME_IN_USD\n */\n min_m1_sell_volume_in_usd?: string;\n /**\n * DTO.TOKEN.LIST.QUERY.MAX_M1_SELL_VOLUME_IN_USD\n */\n max_m1_sell_volume_in_usd?: string;\n};\n\nexport type GetMarketDataMultiParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetMarketDataMulti200 = {\n [key: string]: {\n /**\n * ENTITY.TOKEN_MARKET_DATA.BLUECHIP_HOLDINGS_RATIO\n * @nullable\n */\n bluechipHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BLUECHIP_TOTAL_HOLDERS\n * @nullable\n */\n bluechipTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BLUECHIP_TOTAL_HOLDINGS\n * @nullable\n */\n bluechipTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BUNDLE_HOLDINGS_RATIO\n * @nullable\n */\n bundleHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BUNDLE_TOTAL_HOLDERS\n * @nullable\n */\n bundleTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.BUNDLE_TOTAL_HOLDINGS\n * @nullable\n */\n bundleTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.CIRCULATING_SUPPLY\n * @nullable\n */\n circulatingSupply?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.COMPLETION_RATIO\n * @nullable\n */\n completionRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.DEV_HOLDINGS_RATIO\n * @nullable\n */\n devHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.DEV_TOTAL_HOLDERS\n * @nullable\n */\n devTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.DEV_TOTAL_HOLDINGS\n * @nullable\n */\n devTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FDV_IN_SOL\n * @nullable\n */\n fdvInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FDV_IN_USD\n * @nullable\n */\n fdvInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FRESH_HOLDINGS_RATIO\n * @nullable\n */\n freshHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FRESH_TOTAL_HOLDERS\n * @nullable\n */\n freshTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.FRESH_TOTAL_HOLDINGS\n * @nullable\n */\n freshTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.HOLDERS\n * @nullable\n */\n holders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.INSIDER_HOLDINGS_RATIO\n * @nullable\n */\n insiderHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.INSIDER_TOTAL_HOLDERS\n * @nullable\n */\n insiderTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.INSIDER_TOTAL_HOLDINGS\n * @nullable\n */\n insiderTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.KOL_HOLDINGS_RATIO\n * @nullable\n */\n kolHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.KOL_TOTAL_HOLDERS\n * @nullable\n */\n kolTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.KOL_TOTAL_HOLDINGS\n * @nullable\n */\n kolTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MARKET_CAP_IN_SOL\n * @nullable\n */\n marketCapInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MARKET_CAP_IN_USD\n * @nullable\n */\n marketCapInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MAX_POOL_TVL_IN_SOL\n * @nullable\n */\n maxPoolTvlInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.MAX_POOL_TVL_IN_USD\n * @nullable\n */\n maxPoolTvlInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRICE_IN_SOL\n * @nullable\n */\n priceInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRICE_IN_USD\n * @nullable\n */\n priceInUsd?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRO_HOLDINGS_RATIO\n * @nullable\n */\n proHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRO_TOTAL_HOLDERS\n * @nullable\n */\n proTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.PRO_TOTAL_HOLDINGS\n * @nullable\n */\n proTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SANDWISH_HOLDINGS_RATIO\n * @nullable\n */\n sandwishHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SANDWISH_TOTAL_HOLDERS\n * @nullable\n */\n sandwishTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SANDWISH_TOTAL_HOLDINGS\n * @nullable\n */\n sandwishTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SNIPER_HOLDINGS_RATIO\n * @nullable\n */\n sniperHoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SNIPER_TOTAL_HOLDERS\n * @nullable\n */\n sniperTotalHolders?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.SNIPER_TOTAL_HOLDINGS\n * @nullable\n */\n sniperTotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP100_HOLDINGS_RATIO\n * @nullable\n */\n top100HoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP100_TOTAL_HOLDINGS\n * @nullable\n */\n top100TotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP10_HOLDINGS_RATIO\n * @nullable\n */\n top10HoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP10_TOTAL_HOLDINGS\n * @nullable\n */\n top10TotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP50_HOLDINGS_RATIO\n * @nullable\n */\n top50HoldingsRatio?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOP50_TOTAL_HOLDINGS\n * @nullable\n */\n top50TotalHoldings?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOTAL_SUPPLY\n * @nullable\n */\n totalSupply?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOTAL_TVL_IN_SOL\n * @nullable\n */\n totalTvlInSol?: string | null;\n /**\n * ENTITY.TOKEN_MARKET_DATA.TOTAL_TVL_IN_USD\n * @nullable\n */\n totalTvlInUsd?: string | null;\n };\n};\n\nexport type GetMetadataMultiParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetMetadataMulti200 = {\n [key: string]: {\n /** ENTITY.TOKEN_METADATA.ADDRESS */\n address: string;\n /** ENTITY.TOKEN_METADATA.CHAIN */\n chain: string;\n /**\n * ENTITY.TOKEN_METADATA.COINGECKO_COIN_ID\n * @nullable\n */\n coingeckoCoinId?: string | null;\n /** ENTITY.TOKEN_METADATA.DECIMALS */\n decimals: string;\n /**\n * ENTITY.TOKEN_METADATA.DESCRIPTION\n * @nullable\n */\n description?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.DEV_LAST_TOKEN_CREATED_AT\n * @nullable\n */\n devLastTokenCreatedAt?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.DEV_TOTAL_TOKENS\n * @nullable\n */\n devTotalTokens?: string | null;\n /** ENTITY.TOKEN_METADATA.EXTRA */\n extra?: TokenExtra;\n /**\n * ENTITY.TOKEN_METADATA.IMAGE_URL\n * @nullable\n */\n imageUrl?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.METADATA_ADDRESS\n * @nullable\n */\n metadataAddress?: string | null;\n /** ENTITY.TOKEN_METADATA.NAME */\n name: string;\n /** ENTITY.TOKEN_METADATA.SOCIAL_MEDIAS */\n socialMedias?: TokenSocialMedias;\n /** ENTITY.TOKEN_METADATA.SYMBOL */\n symbol: string;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_AT\n * @nullable\n */\n tokenCreatedAt?: number | null;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_BLOCK_HEIGHT\n * @nullable\n */\n tokenCreatedBlockHeight?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_SLOT\n * @nullable\n */\n tokenCreatedSlot?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.TOKEN_CREATED_TX_SIGNATURE\n * @nullable\n */\n tokenCreatedTxSignature?: string | null;\n /** ENTITY.TOKEN_METADATA.TOKEN_CREATORS */\n tokenCreators?: TokenCreator[];\n /**\n * ENTITY.TOKEN_METADATA.UPDATED_AT\n * @nullable\n */\n updatedAt?: string | null;\n /**\n * ENTITY.TOKEN_METADATA.URI\n * @nullable\n */\n uri?: string | null;\n };\n};\n\nexport type GetTokensParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n /**\n * DTO.TOKEN.REQUEST.SORT_BY\n */\n sortBy?: TokenField;\n /**\n * DTO.TOKEN.REQUEST.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.TOKEN.REQUEST.FILTER_BY (JSON array of filter conditions)\n */\n filterBy?: string;\n};\n\nexport type GetPairCandlesParams = {\n /**\n * DTO.CANDLE.RESOLUTION\n */\n resolution: Resolution;\n /**\n * DTO.CANDLE.PRICE_TYPE\n */\n priceType?: PriceType;\n /**\n * DTO.CANDLE.FROM\n */\n from?: number;\n /**\n * DTO.CANDLE.TO\n */\n to?: number;\n /**\n * DTO.TOKEN.CANDLE.LIMIT\n */\n limit?: number;\n};\n\nexport type GetPoolCandlesParams = {\n /**\n * DTO.CANDLE.RESOLUTION\n */\n resolution: Resolution;\n /**\n * DTO.CANDLE.PRICE_TYPE\n */\n priceType?: PriceType;\n /**\n * DTO.CANDLE.FROM\n */\n from?: number;\n /**\n * DTO.CANDLE.TO\n */\n to?: number;\n /**\n * DTO.TOKEN.CANDLE.LIMIT\n */\n limit?: number;\n};\n\nexport type GetStatsMultiParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\n/**\n * Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields.\n */\nexport type GetStatsMulti200Periods = { [key: string]: TokenTradeStatPeriod };\n\nexport type GetStatsMulti200 = {\n [key: string]: {\n /** ENTITY.TOKEN_STATS.ADDRESS */\n address: string;\n /** Trade statistics grouped by time period (1m, 5m, 15m, 30m, 1h, 4h, 24h).\nEach period contains full OHLCV data, trade counts, and previous-period comparisons.\nSee `TokenTradeStatPeriod` schema for all fields. */\n periods: GetStatsMulti200Periods;\n };\n};\n\nexport type GetCandlesParams = {\n /**\n * DTO.CANDLE.RESOLUTION\n */\n resolution: Resolution;\n /**\n * DTO.CANDLE.PRICE_TYPE\n */\n priceType?: PriceType;\n /**\n * DTO.CANDLE.FROM\n */\n from?: number;\n /**\n * DTO.CANDLE.TO\n */\n to?: number;\n /**\n * DTO.TOKEN.CANDLE.LIMIT\n */\n limit?: number;\n};\n\nexport type GetHoldersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetHoldersMultiParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n};\n\nexport type GetTokenLiquiditySnapshotsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.LIQUIDITY_SNAPSHOTS.TIME\n */\n time?: number;\n};\n\nexport type GetMintAndBurnParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.MINT_BURN.TYPE\n */\n type?: MintBurnType;\n};\n\nexport type GetPoolsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TOKEN.POOLS.SORT_BY\n */\n sortBy?: PoolSortField;\n /**\n * DTO.TOKEN.POOLS.SORT_DIRECTION\n */\n sortDirection?: SortDirection;\n /**\n * DTO.TOKEN.POOLS.MIN_TVL_IN_SOL\n */\n minTvlInSol?: string;\n /**\n * DTO.TOKEN.POOLS.MAX_TVL_IN_SOL\n */\n maxTvlInSol?: string;\n /**\n * DTO.TOKEN.POOLS.MIN_TVL_IN_USD\n */\n minTvlInUsd?: string;\n /**\n * DTO.TOKEN.POOLS.MAX_TVL_IN_USD\n */\n maxTvlInUsd?: string;\n};\n\nexport type GetPriceByTimeParams = {\n /**\n * DTO.TOKEN.PRICE.TIMESTAMP\n */\n timestamp: number;\n};\n\nexport type GetPricesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTopHoldersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTokenTradersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTokenTransferTotalParams = {\n /**\n * DTO.TOKEN.TRANSFER.QUERY.BEFORE_TIMESTAMP\n */\n beforeTimestamp?: number;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.AFTER_TIMESTAMP\n */\n afterTimestamp?: number;\n};\n\nexport type GetTokenTransfersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.FROM_TIMESTAMP.DESCRIPTION\n */\n fromTimestamp?: number;\n /**\n * GLOBAL.TO_TIMESTAMP.DESCRIPTION\n */\n toTimestamp?: number;\n};\n\nexport type GetTradesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * GLOBAL.WALLETADDRESS.DESCRIPTION\n */\n walletAddress?: string;\n /**\n * GLOBAL.POOLADDRESS.DESCRIPTION\n */\n poolAddress?: string;\n /**\n * DTO.TRADE.BEFORE_TIMESTAMP\n */\n beforeTimestamp?: number;\n /**\n * DTO.TRADE.AFTER_TIMESTAMP\n */\n afterTimestamp?: number;\n /**\n * DTO.TRADE.BEFORE_BLOCK_HEIGHT\n */\n beforeBlockHeight?: number;\n /**\n * DTO.TRADE.AFTER_BLOCK_HEIGHT\n */\n afterBlockHeight?: number;\n /**\n * DTO.TRADE.TRANSACTIONS_SIGNATURE\n */\n transactionsSignature?: string;\n /**\n * DTO.TRADE.TYPE\n */\n type?: TradeType;\n};\n\nexport type GetActivitiesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * GLOBAL.WALLETADDRESS.DESCRIPTION\n */\n walletAddress?: string;\n /**\n * GLOBAL.POOLADDRESS.DESCRIPTION\n */\n poolAddress?: string;\n /**\n * DTO.TRADE.BEFORE_TIMESTAMP\n */\n beforeTimestamp?: number;\n /**\n * DTO.TRADE.AFTER_TIMESTAMP\n */\n afterTimestamp?: number;\n /**\n * DTO.TRADE.BEFORE_BLOCK_HEIGHT\n */\n beforeBlockHeight?: number;\n /**\n * DTO.TRADE.AFTER_BLOCK_HEIGHT\n */\n afterBlockHeight?: number;\n /**\n * DTO.TRADE.TRANSACTIONS_SIGNATURE\n */\n transactionsSignature?: string;\n /**\n * DTO.TRADE.ACTIVITY_TYPE\n */\n type?: ActivityType;\n};\n\nexport type GetTopTradersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress: string;\n /**\n * DTO.TRADE.TIME_FRAME\n */\n timeFrame?: TimeFrame;\n /**\n * DTO.TRADE.SORT_TYPE\n */\n sortType?: SortDirection;\n /**\n * DTO.TRADE.SORT_BY\n */\n sortBy?: TopTraderSortBy;\n};\n\nexport type GetTraderGainersLosersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.TRADER.GAINERS_LOSERS.QUERY.RESOLUTION\n */\n resolution?: TraderPnlResolution;\n /**\n * DTO.TRADER.GAINERS_LOSERS.QUERY.SORT_TYPE\n */\n sortType?: SortDirection;\n};\n\nexport type GetWalletFirstTxParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n};\n\nexport type GetNetWorthSummaryParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n};\n\nexport type GetPnlByWalletParams = {\n /**\n * GLOBAL.WALLETADDRESSES.DESCRIPTION\n */\n walletAddresses: string;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress: string;\n};\n\nexport type GetBalanceUpdatesParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * DTO.WALLET.BALANCE_UPDATES.TIME_FROM\n */\n timeFrom?: number;\n /**\n * DTO.WALLET.BALANCE_UPDATES.TIME_TO\n */\n timeTo?: number;\n /**\n * DTO.WALLET.BALANCE_UPDATES.TYPE\n */\n type?: BalanceTokenType;\n /**\n * DTO.WALLET.BALANCE_UPDATES.CHANGE_TYPE\n */\n changeType?: BalanceChangeType;\n};\n\nexport type GetNetWorthParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetNetWorthChartParams = {\n /**\n * DTO.WALLET.NET_WORTH_CHART.HOURS (1-720, default 24)\n */\n hours?: number;\n};\n\nexport type GetNetWorthDetailsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * DTO.WALLET.NET_WORTH_DETAILS.HOURS (0=realtime, 1-720=historical snapshot, default 0)\n */\n hours?: number;\n};\n\nexport type GetNetWorthByTokensParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetPnlParams = {\n /**\n * DTO.WALLET.PNL_SUMMARY.QUERY.RESOLUTION\n */\n resolution?: PnlResolution;\n};\n\nexport type GetPnlByTokenParams = {\n /**\n * GLOBAL.TOKENADDRESSES.DESCRIPTION\n */\n tokenAddresses: string;\n};\n\nexport type GetPnlDetailsParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetTokensBalanceParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n};\n\nexport type GetWalletTransferTotalParams = {\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.AFTER_TIMESTAMP\n */\n fromTimestamp?: number;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.BEFORE_TIMESTAMP\n */\n toTimestamp?: number;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT\n */\n minTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT\n */\n maxTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT_IN_USD\n */\n minTokenAmountInUsd?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT_IN_USD\n */\n maxTokenAmountInUsd?: string;\n};\n\nexport type GetWalletTransfersParams = {\n /**\n * DTO.PAGE.CURSOR.DESCRIPTION\n */\n cursor?: string;\n /**\n * DTO.PAGE.LIMIT\n */\n limit?: number;\n /**\n * DTO.PAGE.DIRECTION\n */\n direction?: PageDirection;\n /**\n * GLOBAL.TOKENADDRESS.DESCRIPTION\n */\n tokenAddress?: string;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.AFTER_TIMESTAMP\n */\n fromTimestamp?: number;\n /**\n * DTO.TOKEN.TRANSFER.QUERY.BEFORE_TIMESTAMP\n */\n toTimestamp?: number;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT\n */\n minTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT\n */\n maxTokenAmount?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MIN_TOKEN_AMOUNT_IN_USD\n */\n minTokenAmountInUsd?: string;\n /**\n * DTO.WALLET.TRANSFER.QUERY.MAX_TOKEN_AMOUNT_IN_USD\n */\n maxTokenAmountInUsd?: string;\n};\n\nexport type ListEndpointsParams = {\n /**\n * DTO.ENDPOINT.LIMIT\n */\n limit?: number;\n /**\n * DTO.ENDPOINT.ITERATOR\n */\n iterator?: string;\n /**\n * DTO.ENDPOINT.ORDER\n */\n order?: EndpointOrder;\n};\n"],"mappings":"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","names":["WsTokenActivityType","WsChannelType","WsMetricType","WsRankingType","WsDex"]}