@chainstream-io/sdk 0.2.8 → 0.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -582,6 +582,35 @@ var StreamApi = class {
582
582
  "subscribePairCandles"
583
583
  );
584
584
  }
585
+ /**
586
+ * Parse token stat data for a specific time window
587
+ * @param data - Raw WebSocket data
588
+ * @param suffix - Time window suffix (e.g., "1m", "5m", "1h", "1W", "1M")
589
+ */
590
+ parseTokenStatWindow(data, suffix) {
591
+ return {
592
+ [`buys${suffix}`]: data[`b${suffix}`],
593
+ [`sells${suffix}`]: data[`s${suffix}`],
594
+ [`buyers${suffix}`]: data[`be${suffix}`],
595
+ [`sellers${suffix}`]: data[`se${suffix}`],
596
+ [`buyVolumeInUsd${suffix}`]: this.formatScientificNotation(data[`bviu${suffix}`]),
597
+ [`sellVolumeInUsd${suffix}`]: this.formatScientificNotation(data[`sviu${suffix}`]),
598
+ [`price${suffix}`]: this.formatScientificNotation(data[`p${suffix}`]),
599
+ [`openInUsd${suffix}`]: this.formatScientificNotation(data[`oiu${suffix}`]),
600
+ [`closeInUsd${suffix}`]: this.formatScientificNotation(data[`ciu${suffix}`]),
601
+ [`volumeChangeRatio${suffix}`]: this.formatScientificNotation(data[`vpc${suffix}`]),
602
+ [`trades${suffix}`]: data[`tr${suffix}`],
603
+ [`dappProgramCount${suffix}`]: data[`dpc${suffix}`],
604
+ [`poolCount${suffix}`]: data[`pc${suffix}`],
605
+ [`liquidityInUsd${suffix}`]: this.formatScientificNotation(data[`liq${suffix}`]),
606
+ [`liquidityChangeRatio${suffix}`]: this.formatScientificNotation(data[`lpc${suffix}`])
607
+ };
608
+ }
609
+ /**
610
+ * Subscribe to token trade statistics
611
+ * Channel: dex-token-stats:{chain}_{tokenAddress}
612
+ * Time windows: 1m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 24h, 1W, 1M
613
+ */
585
614
  subscribeTokenStats({
586
615
  chain,
587
616
  tokenAddress,
@@ -589,76 +618,24 @@ var StreamApi = class {
589
618
  filter
590
619
  }) {
591
620
  const channel = `dex-token-stats:${chain}_${tokenAddress}`;
621
+ const timeWindows = ["1m", "5m", "15m", "30m", "1h", "2h", "4h", "6h", "8h", "24h", "1W", "1M"];
592
622
  return this.subscribe(
593
623
  channel,
594
- (data) => callback({
595
- address: data.a,
596
- timestamp: data.t,
597
- buys1m: data.b1m,
598
- sells1m: data.s1m,
599
- buyers1m: data.be1m,
600
- sellers1m: data.se1m,
601
- buyVolumeInUsd1m: this.formatScientificNotation(data.bviu1m),
602
- sellVolumeInUsd1m: this.formatScientificNotation(data.sviu1m),
603
- price1m: this.formatScientificNotation(data.p1m),
604
- openInUsd1m: this.formatScientificNotation(data.oiu1m),
605
- closeInUsd1m: this.formatScientificNotation(data.ciu1m),
606
- buys5m: data.b5m,
607
- sells5m: data.s5m,
608
- buyers5m: data.be5m,
609
- sellers5m: data.se5m,
610
- buyVolumeInUsd5m: this.formatScientificNotation(data.bviu5m),
611
- sellVolumeInUsd5m: this.formatScientificNotation(data.sviu5m),
612
- price5m: this.formatScientificNotation(data.p5m),
613
- openInUsd5m: this.formatScientificNotation(data.oiu5m),
614
- closeInUsd5m: this.formatScientificNotation(data.ciu5m),
615
- buys15m: data.b15m,
616
- sells15m: data.s15m,
617
- buyers15m: data.be15m,
618
- sellers15m: data.se15m,
619
- buyVolumeInUsd15m: this.formatScientificNotation(data.bviu15m),
620
- sellVolumeInUsd15m: this.formatScientificNotation(data.sviu15m),
621
- price15m: this.formatScientificNotation(data.p15m),
622
- openInUsd15m: this.formatScientificNotation(data.oiu15m),
623
- closeInUsd15m: this.formatScientificNotation(data.ciu15m),
624
- buys30m: data.b30m,
625
- sells30m: data.s30m,
626
- buyers30m: data.be30m,
627
- sellers30m: data.se30m,
628
- buyVolumeInUsd30m: this.formatScientificNotation(data.bviu30m),
629
- sellVolumeInUsd30m: this.formatScientificNotation(data.sviu30m),
630
- price30m: this.formatScientificNotation(data.p30m),
631
- openInUsd30m: this.formatScientificNotation(data.oiu30m),
632
- closeInUsd30m: this.formatScientificNotation(data.ciu30m),
633
- buys1h: data.b1h,
634
- sells1h: data.s1h,
635
- buyers1h: data.be1h,
636
- sellers1h: data.se1h,
637
- buyVolumeInUsd1h: this.formatScientificNotation(data.bviu1h),
638
- sellVolumeInUsd1h: this.formatScientificNotation(data.sviu1h),
639
- price1h: this.formatScientificNotation(data.p1h),
640
- openInUsd1h: this.formatScientificNotation(data.oiu1h),
641
- closeInUsd1h: this.formatScientificNotation(data.ciu1h),
642
- buys4h: data.b4h,
643
- sells4h: data.s4h,
644
- buyers4h: data.be4h,
645
- sellers4h: data.se4h,
646
- buyVolumeInUsd4h: this.formatScientificNotation(data.bviu4h),
647
- sellVolumeInUsd4h: this.formatScientificNotation(data.sviu4h),
648
- price4h: this.formatScientificNotation(data.p4h),
649
- openInUsd4h: this.formatScientificNotation(data.oiu4h),
650
- closeInUsd4h: this.formatScientificNotation(data.ciu4h),
651
- buys24h: data.b24h,
652
- sells24h: data.s24h,
653
- buyers24h: data.be24h,
654
- sellers24h: data.se24h,
655
- buyVolumeInUsd24h: this.formatScientificNotation(data.bviu24h),
656
- sellVolumeInUsd24h: this.formatScientificNotation(data.sviu24h),
657
- price24h: this.formatScientificNotation(data.p24h),
658
- openInUsd24h: this.formatScientificNotation(data.oiu24h),
659
- closeInUsd24h: this.formatScientificNotation(data.ciu24h),
660
- price: this.formatScientificNotation(data.p)
661
- }),
624
+ (data) => {
625
+ const windowData = timeWindows.reduce(
626
+ (acc, suffix) => ({
627
+ ...acc,
628
+ ...this.parseTokenStatWindow(data, suffix)
629
+ }),
630
+ {}
631
+ );
632
+ callback({
633
+ address: data.a,
634
+ timestamp: data.t,
635
+ price: this.formatScientificNotation(data.p),
636
+ ...windowData
637
+ });
638
+ },
662
639
  filter,
663
640
  "subscribeTokenStats"
664
641
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/stream/index.ts","../../src/stream/stream.ts","../../src/stream/stream.fields.ts","../../src/stream/stream.model.ts"],"sourcesContent":["export * from \"./stream.js\";\nexport * from \"./stream.fields.js\";\nexport * from \"./stream.model.js\";\n","import { Centrifuge, ConnectionTokenContext } from \"@chainstream-io/centrifuge\";\nimport { ChainStreamRequestContext } from \"../chainstream.js\";\nimport { Resolution } from \"../openapi-client/index.js\";\nimport {\n WsDexPoolBalance,\n WsNewToken,\n WsTokenMetadata,\n WsTokenHolder,\n WsTokenStat,\n WsTokenLiquidity,\n WsTokenMaxLiquidity,\n WsTokenTotalLiquidity,\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 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 return this.subscribe(\n channel,\n (data: Record<string, unknown>) =>\n callback({\n address: data.a as string,\n timestamp: data.t as number,\n buys1m: data.b1m as number,\n sells1m: data.s1m as number,\n buyers1m: data.be1m as number,\n sellers1m: data.se1m as number,\n buyVolumeInUsd1m: this.formatScientificNotation(data.bviu1m),\n sellVolumeInUsd1m: this.formatScientificNotation(data.sviu1m),\n price1m: this.formatScientificNotation(data.p1m),\n openInUsd1m: this.formatScientificNotation(data.oiu1m),\n closeInUsd1m: this.formatScientificNotation(data.ciu1m),\n\n buys5m: data.b5m as number,\n sells5m: data.s5m as number,\n buyers5m: data.be5m as number,\n sellers5m: data.se5m as number,\n buyVolumeInUsd5m: this.formatScientificNotation(data.bviu5m),\n sellVolumeInUsd5m: this.formatScientificNotation(data.sviu5m),\n price5m: this.formatScientificNotation(data.p5m),\n openInUsd5m: this.formatScientificNotation(data.oiu5m),\n closeInUsd5m: this.formatScientificNotation(data.ciu5m),\n\n buys15m: data.b15m as number,\n sells15m: data.s15m as number,\n buyers15m: data.be15m as number,\n sellers15m: data.se15m as number,\n buyVolumeInUsd15m: this.formatScientificNotation(data.bviu15m),\n sellVolumeInUsd15m: this.formatScientificNotation(data.sviu15m),\n price15m: this.formatScientificNotation(data.p15m),\n openInUsd15m: this.formatScientificNotation(data.oiu15m),\n closeInUsd15m: this.formatScientificNotation(data.ciu15m),\n\n buys30m: data.b30m as number,\n sells30m: data.s30m as number,\n buyers30m: data.be30m as number,\n sellers30m: data.se30m as number,\n buyVolumeInUsd30m: this.formatScientificNotation(data.bviu30m),\n sellVolumeInUsd30m: this.formatScientificNotation(data.sviu30m),\n price30m: this.formatScientificNotation(data.p30m),\n openInUsd30m: this.formatScientificNotation(data.oiu30m),\n closeInUsd30m: this.formatScientificNotation(data.ciu30m),\n\n buys1h: data.b1h as number,\n sells1h: data.s1h as number,\n buyers1h: data.be1h as number,\n sellers1h: data.se1h as number,\n buyVolumeInUsd1h: this.formatScientificNotation(data.bviu1h),\n sellVolumeInUsd1h: this.formatScientificNotation(data.sviu1h),\n price1h: this.formatScientificNotation(data.p1h),\n openInUsd1h: this.formatScientificNotation(data.oiu1h),\n closeInUsd1h: this.formatScientificNotation(data.ciu1h),\n\n buys4h: data.b4h as number,\n sells4h: data.s4h as number,\n buyers4h: data.be4h as number,\n sellers4h: data.se4h as number,\n buyVolumeInUsd4h: this.formatScientificNotation(data.bviu4h),\n sellVolumeInUsd4h: this.formatScientificNotation(data.sviu4h),\n price4h: this.formatScientificNotation(data.p4h),\n openInUsd4h: this.formatScientificNotation(data.oiu4h),\n closeInUsd4h: this.formatScientificNotation(data.ciu4h),\n\n buys24h: data.b24h as number,\n sells24h: data.s24h as number,\n buyers24h: data.be24h as number,\n sellers24h: data.se24h as number,\n buyVolumeInUsd24h: this.formatScientificNotation(data.bviu24h),\n sellVolumeInUsd24h: this.formatScientificNotation(data.sviu24h),\n price24h: this.formatScientificNotation(data.p24h),\n openInUsd24h: this.formatScientificNotation(data.oiu24h),\n closeInUsd24h: this.formatScientificNotation(data.ciu24h),\n\n price: this.formatScientificNotation(data.p),\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 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) {\n result.decimals = data.dec as number;\n }\n\n if (data.lf) {\n const lf = data.lf as Record<string, unknown>;\n result.launchFrom = {};\n if (lf.pa) {\n result.launchFrom.programAddress = lf.pa as string;\n }\n if (lf.pf) {\n result.launchFrom.protocolFamily = lf.pf as string;\n }\n if (lf.pn) {\n result.launchFrom.protocolName = lf.pn as string;\n }\n }\n\n callback(result);\n },\n filter,\n \"subscribeNewToken\",\n );\n }\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(\n data.map(it => ({\n tokenAddress: it.a as string,\n name: it.n as string,\n symbol: it.s as string,\n imageUrl: it.iu as string,\n description: it.de as string,\n socialMedia: (() => {\n const sm = it.sm as Record<string, unknown> | 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 createdAtMs: it.cts as number,\n })),\n ),\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 const lf = t.lf as Record<string, unknown>;\n result.metadata.launchFrom = {};\n if (lf.pa) {\n result.metadata.launchFrom.programAddress = lf.pa as string;\n }\n if (lf.pf) {\n result.metadata.launchFrom.protocolFamily = lf.pf as string;\n }\n if (lf.pn) {\n result.metadata.launchFrom.protocolName = lf.pn as string;\n }\n }\n if (t.mt) {\n const mt = t.mt as Record<string, unknown>;\n result.metadata.migratedTo = {};\n if (mt.pa) {\n result.metadata.migratedTo.programAddress = mt.pa as string;\n }\n if (mt.pf) {\n result.metadata.migratedTo.protocolFamily = mt.pf as string;\n }\n if (mt.pn) {\n result.metadata.migratedTo.protocolName = mt.pn as string;\n }\n }\n if (t.sm) {\n const sm = t.sm as Record<string, unknown>;\n result.metadata.socialMedia = {};\n if (sm.tw) {\n result.metadata.socialMedia.twitter = sm.tw as string;\n }\n if (sm.tg) {\n result.metadata.socialMedia.telegram = sm.tg as string;\n }\n if (sm.w) {\n result.metadata.socialMedia.website = sm.w as string;\n }\n if (sm.tt) {\n result.metadata.socialMedia.tiktok = sm.tt as string;\n }\n if (sm.dc) {\n result.metadata.socialMedia.discord = sm.dc as string;\n }\n if (sm.fb) {\n result.metadata.socialMedia.facebook = sm.fb as string;\n }\n if (sm.gh) {\n result.metadata.socialMedia.github = sm.gh as string;\n }\n if (sm.ig) {\n result.metadata.socialMedia.instagram = sm.ig as string;\n }\n if (sm.li) {\n result.metadata.socialMedia.linkedin = sm.li as string;\n }\n if (sm.md) {\n result.metadata.socialMedia.medium = sm.md as string;\n }\n if (sm.rd) {\n result.metadata.socialMedia.reddit = sm.rd as string;\n }\n if (sm.yt) {\n result.metadata.socialMedia.youtube = sm.yt as string;\n }\n if (sm.bb) {\n result.metadata.socialMedia.bitbucket = sm.bb as string;\n }\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 tokenPriceInUsd: data.tpiu as string,\n timestamp: data.t as number,\n opentime: data.ot as number,\n lasttime: data.lt as number,\n closetime: data.ct as number,\n buyAmount: data.ba as string,\n buyAmountInUsd: data.baiu as string,\n buyCount: data.bs as number,\n buyCount30d: data.bs30d as number,\n buyCount7d: data.bs7d as number,\n sellAmount: data.sa as string,\n sellAmountInUsd: data.saiu as string,\n sellCount: data.ss as number,\n sellCount30d: data.ss30d as number,\n sellCount7d: data.ss7d as number,\n heldDurationTimestamp: data.hdts as number,\n averageBuyPriceInUsd: data.abpiu as string,\n averageSellPriceInUsd: data.aspiu as string,\n unrealizedProfitInUsd: data.upiu as string,\n unrealizedProfitRatio: data.upr as string,\n realizedProfitInUsd: data.rpiu as string,\n realizedProfitRatio: data.rpr as string,\n totalRealizedProfitInUsd: data.trpiu as string,\n totalRealizedProfitRatio: data.trr as string,\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\n subscribeNewToken: {\n tokenAddress: \"a\",\n name: \"n\",\n symbol: \"s\",\n createdAtMs: \"cts\",\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\n subscribeNewTokensMetadata: {\n tokenAddress: \"a\",\n name: \"n\",\n symbol: \"s\",\n imageUrl: \"iu\",\n description: \"de\",\n socialMedia: \"sm\",\n createdAtMs: \"cts\",\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 * @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 // Replace all long field names with short field names\n for (const [longField, shortField] of Object.entries(fieldMappings)) {\n // Handle both cases: with and without meta. prefix\n const patterns = [\n // Pattern 1: fieldName (without meta. prefix)\n new RegExp(`\\\\b${longField}\\\\b`, \"g\"),\n // Pattern 2: meta.fieldName (with meta. prefix)\n new RegExp(`\\\\bmeta\\\\.${longField}\\\\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 COMPLETED = \"completed\",\n GRADUATED = \"graduated\",\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\nexport interface WsTokenStat {\n address: string;\n timestamp: number;\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\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\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\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\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\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\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\n price?: 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 launchFrom?: 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 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 tokenPriceInUsd: string;\n timestamp: number;\n opentime: number;\n lasttime: number;\n closetime: number;\n buyAmount: string;\n buyAmountInUsd: string;\n buyCount: number;\n buyCount30d: number;\n buyCount7d: number;\n sellAmount: string;\n sellAmountInUsd: string;\n sellCount: number;\n sellCount30d: number;\n sellCount7d: number;\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"],"mappings":"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","names":["WsTokenActivityType","WsChannelType","WsMetricType","WsRankingType","WsDex"]}
1
+ {"version":3,"sources":["../../src/stream/index.ts","../../src/stream/stream.ts","../../src/stream/stream.fields.ts","../../src/stream/stream.model.ts"],"sourcesContent":["export * from \"./stream.js\";\nexport * from \"./stream.fields.js\";\nexport * from \"./stream.model.js\";\n","import { Centrifuge, ConnectionTokenContext } from \"@chainstream-io/centrifuge\";\nimport { ChainStreamRequestContext } from \"../chainstream.js\";\nimport { Resolution } from \"../openapi-client/index.js\";\nimport {\n WsDexPoolBalance,\n WsNewToken,\n WsTokenMetadata,\n WsTokenHolder,\n WsTokenStat,\n WsTokenLiquidity,\n WsTokenMaxLiquidity,\n WsTokenTotalLiquidity,\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 * 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 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) {\n result.decimals = data.dec as number;\n }\n\n if (data.lf) {\n const lf = data.lf as Record<string, unknown>;\n result.launchFrom = {};\n if (lf.pa) {\n result.launchFrom.programAddress = lf.pa as string;\n }\n if (lf.pf) {\n result.launchFrom.protocolFamily = lf.pf as string;\n }\n if (lf.pn) {\n result.launchFrom.protocolName = lf.pn as string;\n }\n }\n\n callback(result);\n },\n filter,\n \"subscribeNewToken\",\n );\n }\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(\n data.map(it => ({\n tokenAddress: it.a as string,\n name: it.n as string,\n symbol: it.s as string,\n imageUrl: it.iu as string,\n description: it.de as string,\n socialMedia: (() => {\n const sm = it.sm as Record<string, unknown> | 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 createdAtMs: it.cts as number,\n })),\n ),\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 const lf = t.lf as Record<string, unknown>;\n result.metadata.launchFrom = {};\n if (lf.pa) {\n result.metadata.launchFrom.programAddress = lf.pa as string;\n }\n if (lf.pf) {\n result.metadata.launchFrom.protocolFamily = lf.pf as string;\n }\n if (lf.pn) {\n result.metadata.launchFrom.protocolName = lf.pn as string;\n }\n }\n if (t.mt) {\n const mt = t.mt as Record<string, unknown>;\n result.metadata.migratedTo = {};\n if (mt.pa) {\n result.metadata.migratedTo.programAddress = mt.pa as string;\n }\n if (mt.pf) {\n result.metadata.migratedTo.protocolFamily = mt.pf as string;\n }\n if (mt.pn) {\n result.metadata.migratedTo.protocolName = mt.pn as string;\n }\n }\n if (t.sm) {\n const sm = t.sm as Record<string, unknown>;\n result.metadata.socialMedia = {};\n if (sm.tw) {\n result.metadata.socialMedia.twitter = sm.tw as string;\n }\n if (sm.tg) {\n result.metadata.socialMedia.telegram = sm.tg as string;\n }\n if (sm.w) {\n result.metadata.socialMedia.website = sm.w as string;\n }\n if (sm.tt) {\n result.metadata.socialMedia.tiktok = sm.tt as string;\n }\n if (sm.dc) {\n result.metadata.socialMedia.discord = sm.dc as string;\n }\n if (sm.fb) {\n result.metadata.socialMedia.facebook = sm.fb as string;\n }\n if (sm.gh) {\n result.metadata.socialMedia.github = sm.gh as string;\n }\n if (sm.ig) {\n result.metadata.socialMedia.instagram = sm.ig as string;\n }\n if (sm.li) {\n result.metadata.socialMedia.linkedin = sm.li as string;\n }\n if (sm.md) {\n result.metadata.socialMedia.medium = sm.md as string;\n }\n if (sm.rd) {\n result.metadata.socialMedia.reddit = sm.rd as string;\n }\n if (sm.yt) {\n result.metadata.socialMedia.youtube = sm.yt as string;\n }\n if (sm.bb) {\n result.metadata.socialMedia.bitbucket = sm.bb as string;\n }\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 tokenPriceInUsd: data.tpiu as string,\n timestamp: data.t as number,\n opentime: data.ot as number,\n lasttime: data.lt as number,\n closetime: data.ct as number,\n buyAmount: data.ba as string,\n buyAmountInUsd: data.baiu as string,\n buyCount: data.bs as number,\n buyCount30d: data.bs30d as number,\n buyCount7d: data.bs7d as number,\n sellAmount: data.sa as string,\n sellAmountInUsd: data.saiu as string,\n sellCount: data.ss as number,\n sellCount30d: data.ss30d as number,\n sellCount7d: data.ss7d as number,\n heldDurationTimestamp: data.hdts as number,\n averageBuyPriceInUsd: data.abpiu as string,\n averageSellPriceInUsd: data.aspiu as string,\n unrealizedProfitInUsd: data.upiu as string,\n unrealizedProfitRatio: data.upr as string,\n realizedProfitInUsd: data.rpiu as string,\n realizedProfitRatio: data.rpr as string,\n totalRealizedProfitInUsd: data.trpiu as string,\n totalRealizedProfitRatio: data.trr as string,\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\n subscribeNewToken: {\n tokenAddress: \"a\",\n name: \"n\",\n symbol: \"s\",\n createdAtMs: \"cts\",\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\n subscribeNewTokensMetadata: {\n tokenAddress: \"a\",\n name: \"n\",\n symbol: \"s\",\n imageUrl: \"iu\",\n description: \"de\",\n socialMedia: \"sm\",\n createdAtMs: \"cts\",\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 * @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 // Replace all long field names with short field names\n for (const [longField, shortField] of Object.entries(fieldMappings)) {\n // Handle both cases: with and without meta. prefix\n const patterns = [\n // Pattern 1: fieldName (without meta. prefix)\n new RegExp(`\\\\b${longField}\\\\b`, \"g\"),\n // Pattern 2: meta.fieldName (with meta. prefix)\n new RegExp(`\\\\bmeta\\\\.${longField}\\\\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 COMPLETED = \"completed\",\n GRADUATED = \"graduated\",\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 launchFrom?: 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 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 tokenPriceInUsd: string;\n timestamp: number;\n opentime: number;\n lasttime: number;\n closetime: number;\n buyAmount: string;\n buyAmountInUsd: string;\n buyCount: number;\n buyCount30d: number;\n buyCount7d: number;\n sellAmount: string;\n sellAmountInUsd: string;\n sellCount: number;\n sellCount30d: number;\n sellCount7d: number;\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"],"mappings":"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","names":["WsTokenActivityType","WsChannelType","WsMetricType","WsRankingType","WsDex"]}
@@ -1,4 +1,4 @@
1
- export { S as StreamApi, U as Unsubscribable, r as WsCandle, a as WsChannelType, w as WsDex, j as WsDexPoolBalance, n as WsDexProtocol, b as WsMetricType, h as WsNewToken, s as WsPriceType, x as WsRankingTokenList, v as WsRankingType, q as WsSocialMedia, c as WsTokenActivity, W as WsTokenActivityType, o as WsTokenBondingCurve, e as WsTokenHolder, k as WsTokenLiquidity, l as WsTokenMaxLiquidity, p as WsTokenMetadata, d as WsTokenStat, i as WsTokenSupply, m as WsTokenTotalLiquidity, t as WsTradeActivity, f as WsWalletBalance, g as WsWalletPnl, u as WsWalletTokenPnl } from '../chainstream-KjjsTvPO.cjs';
1
+ export { S as StreamApi, U as Unsubscribable, r as WsCandle, a as WsChannelType, w as WsDex, j as WsDexPoolBalance, n as WsDexProtocol, b as WsMetricType, h as WsNewToken, s as WsPriceType, x as WsRankingTokenList, v as WsRankingType, q as WsSocialMedia, c as WsTokenActivity, W as WsTokenActivityType, o as WsTokenBondingCurve, e as WsTokenHolder, k as WsTokenLiquidity, l as WsTokenMaxLiquidity, p as WsTokenMetadata, d as WsTokenStat, i as WsTokenSupply, m as WsTokenTotalLiquidity, t as WsTradeActivity, f as WsWalletBalance, g as WsWalletPnl, u as WsWalletTokenPnl } from '../chainstream-B9uaC_fe.cjs';
2
2
  import 'axios';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- export { S as StreamApi, U as Unsubscribable, r as WsCandle, a as WsChannelType, w as WsDex, j as WsDexPoolBalance, n as WsDexProtocol, b as WsMetricType, h as WsNewToken, s as WsPriceType, x as WsRankingTokenList, v as WsRankingType, q as WsSocialMedia, c as WsTokenActivity, W as WsTokenActivityType, o as WsTokenBondingCurve, e as WsTokenHolder, k as WsTokenLiquidity, l as WsTokenMaxLiquidity, p as WsTokenMetadata, d as WsTokenStat, i as WsTokenSupply, m as WsTokenTotalLiquidity, t as WsTradeActivity, f as WsWalletBalance, g as WsWalletPnl, u as WsWalletTokenPnl } from '../chainstream-KjjsTvPO.js';
1
+ export { S as StreamApi, U as Unsubscribable, r as WsCandle, a as WsChannelType, w as WsDex, j as WsDexPoolBalance, n as WsDexProtocol, b as WsMetricType, h as WsNewToken, s as WsPriceType, x as WsRankingTokenList, v as WsRankingType, q as WsSocialMedia, c as WsTokenActivity, W as WsTokenActivityType, o as WsTokenBondingCurve, e as WsTokenHolder, k as WsTokenLiquidity, l as WsTokenMaxLiquidity, p as WsTokenMetadata, d as WsTokenStat, i as WsTokenSupply, m as WsTokenTotalLiquidity, t as WsTradeActivity, f as WsWalletBalance, g as WsWalletPnl, u as WsWalletTokenPnl } from '../chainstream-B9uaC_fe.js';
2
2
  import 'axios';
3
3
 
4
4
  /**