@metamask-previews/perps-controller 3.0.0-preview-e61cfa5 → 3.1.0-preview-548bdd1d9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -1
- package/dist/PerpsController-method-action-types.cjs.map +1 -1
- package/dist/PerpsController-method-action-types.d.cts +8 -0
- package/dist/PerpsController-method-action-types.d.cts.map +1 -1
- package/dist/PerpsController-method-action-types.d.mts +8 -0
- package/dist/PerpsController-method-action-types.d.mts.map +1 -1
- package/dist/PerpsController-method-action-types.mjs.map +1 -1
- package/dist/PerpsController.cjs +117 -29
- package/dist/PerpsController.cjs.map +1 -1
- package/dist/PerpsController.d.cts +14 -2
- package/dist/PerpsController.d.cts.map +1 -1
- package/dist/PerpsController.d.mts +14 -2
- package/dist/PerpsController.d.mts.map +1 -1
- package/dist/PerpsController.mjs +118 -30
- package/dist/PerpsController.mjs.map +1 -1
- package/dist/constants/eventNames.cjs +1 -0
- package/dist/constants/eventNames.cjs.map +1 -1
- package/dist/constants/eventNames.d.cts +1 -0
- package/dist/constants/eventNames.d.cts.map +1 -1
- package/dist/constants/eventNames.d.mts +1 -0
- package/dist/constants/eventNames.d.mts.map +1 -1
- package/dist/constants/eventNames.mjs +1 -0
- package/dist/constants/eventNames.mjs.map +1 -1
- package/dist/constants/perpsConfig.cjs +46 -1
- package/dist/constants/perpsConfig.cjs.map +1 -1
- package/dist/constants/perpsConfig.d.cts +35 -0
- package/dist/constants/perpsConfig.d.cts.map +1 -1
- package/dist/constants/perpsConfig.d.mts +35 -0
- package/dist/constants/perpsConfig.d.mts.map +1 -1
- package/dist/constants/perpsConfig.mjs +43 -0
- package/dist/constants/perpsConfig.mjs.map +1 -1
- package/dist/constants/transactionsHistoryConfig.cjs +23 -4
- package/dist/constants/transactionsHistoryConfig.cjs.map +1 -1
- package/dist/constants/transactionsHistoryConfig.d.cts +23 -4
- package/dist/constants/transactionsHistoryConfig.d.cts.map +1 -1
- package/dist/constants/transactionsHistoryConfig.d.mts +23 -4
- package/dist/constants/transactionsHistoryConfig.d.mts.map +1 -1
- package/dist/constants/transactionsHistoryConfig.mjs +23 -4
- package/dist/constants/transactionsHistoryConfig.mjs.map +1 -1
- package/dist/index.cjs +14 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +3 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -1
- package/dist/index.mjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.cjs +83 -27
- package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
- package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
- package/dist/providers/HyperLiquidProvider.mjs +83 -27
- package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.cjs +6 -0
- package/dist/services/HyperLiquidSubscriptionService.cjs.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.cts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.d.mts.map +1 -1
- package/dist/services/HyperLiquidSubscriptionService.mjs +6 -0
- package/dist/services/HyperLiquidSubscriptionService.mjs.map +1 -1
- package/dist/types/index.cjs.map +1 -1
- package/dist/types/index.d.cts +6 -0
- package/dist/types/index.d.cts.map +1 -1
- package/dist/types/index.d.mts +6 -0
- package/dist/types/index.d.mts.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/dist/utils/index.cjs +2 -0
- package/dist/utils/index.cjs.map +1 -1
- package/dist/utils/index.d.cts +2 -0
- package/dist/utils/index.d.cts.map +1 -1
- package/dist/utils/index.d.mts +2 -0
- package/dist/utils/index.d.mts.map +1 -1
- package/dist/utils/index.mjs +2 -0
- package/dist/utils/index.mjs.map +1 -1
- package/dist/utils/perpsDiskPersistence.cjs +252 -0
- package/dist/utils/perpsDiskPersistence.cjs.map +1 -0
- package/dist/utils/perpsDiskPersistence.d.cts +108 -0
- package/dist/utils/perpsDiskPersistence.d.cts.map +1 -0
- package/dist/utils/perpsDiskPersistence.d.mts +108 -0
- package/dist/utils/perpsDiskPersistence.d.mts.map +1 -0
- package/dist/utils/perpsDiskPersistence.mjs +244 -0
- package/dist/utils/perpsDiskPersistence.mjs.map +1 -0
- package/dist/utils/perpsFormatters.cjs +498 -0
- package/dist/utils/perpsFormatters.cjs.map +1 -0
- package/dist/utils/perpsFormatters.d.cts +202 -0
- package/dist/utils/perpsFormatters.d.cts.map +1 -0
- package/dist/utils/perpsFormatters.d.mts +202 -0
- package/dist/utils/perpsFormatters.d.mts.map +1 -0
- package/dist/utils/perpsFormatters.mjs +489 -0
- package/dist/utils/perpsFormatters.mjs.map +1 -0
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HyperLiquidSubscriptionService.mjs","sourceRoot":"","sources":["../../src/services/HyperLiquidSubscriptionService.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipAccountId } from '@metamask/utils';\nimport { hasProperty } from '@metamask/utils';\nimport type {\n ISubscription,\n AllMidsWsEvent,\n WebData2WsEvent,\n WebData3WsEvent,\n UserFillsWsEvent,\n ActiveAssetCtxWsEvent,\n ActiveSpotAssetCtxWsEvent,\n BboWsEvent,\n L2BookResponse,\n AssetCtxsWsEvent,\n FrontendOpenOrdersResponse,\n ClearinghouseStateWsEvent,\n OpenOrdersWsEvent,\n} from '@nktkas/hyperliquid';\n\nimport { TP_SL_CONFIG, PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport { WebSocketConnectionState } from '../types';\nimport type {\n PriceUpdate,\n Position,\n OrderFill,\n Order,\n AccountState,\n SubscribePricesParams,\n SubscribePositionsParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribeAccountParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n OrderBookData,\n OrderBookLevel,\n PerpsPlatformDependencies,\n PerpsLogger,\n} from '../types';\nimport { calculateWeightedReturnOnEquity } from '../utils/accountUtils';\nimport { ensureError } from '../utils/errorUtils';\nimport {\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptAccountStateFromSDK,\n parseAssetName,\n} from '../utils/hyperLiquidAdapter';\nimport { processBboData } from '../utils/hyperLiquidOrderBookProcessor';\nimport { calculateOpenInterestUSD } from '../utils/marketDataTransform';\nimport type { HyperLiquidClientService } from './HyperLiquidClientService';\nimport type { HyperLiquidWalletService } from './HyperLiquidWalletService';\n\n/**\n * Service for managing HyperLiquid WebSocket subscriptions\n * Implements singleton subscription architecture with reference counting\n */\nexport class HyperLiquidSubscriptionService {\n // Service dependencies\n readonly #clientService: HyperLiquidClientService;\n\n readonly #walletService: HyperLiquidWalletService;\n\n // HIP-3 feature flag support\n #hip3Enabled: boolean;\n\n #enabledDexs: string[]; // DEX identification (maps webData3 indices to DEX names)\n\n #allowlistMarkets: string[]; // Market filtering (allowlist)\n\n #blocklistMarkets: string[]; // Market filtering (blocklist)\n\n #discoveredDexNames: string[] = []; // DEX order for mapping webData3 perpDexStates indices\n\n // DEX discovery synchronization - allows subscriptions to wait for HIP-3 DEX discovery\n #dexDiscoveryPromise: Promise<void> | null = null;\n\n #dexDiscoveryResolver: (() => void) | null = null;\n\n // Track DEXs for synchronized position notifications\n // Ensures all DEXs send initial data before notifying subscribers\n #expectedDexs: Set<string> = new Set();\n\n #initializedDexs: Set<string> = new Set();\n\n // Subscriber collections\n readonly #priceSubscribers = new Map<\n string,\n Set<(prices: PriceUpdate[]) => void>\n >();\n\n readonly #positionSubscribers = new Set<(positions: Position[]) => void>();\n\n // Order fill subscribers keyed by accountId (normalized: undefined -> 'default')\n readonly #orderFillSubscribers = new Map<\n string,\n Set<(fills: OrderFill[], isSnapshot?: boolean) => void>\n >();\n\n readonly #orderSubscribers = new Set<(orders: Order[]) => void>();\n\n readonly #accountSubscribers = new Set<(account: AccountState) => void>();\n\n // Track which subscribers want market data\n readonly #marketDataSubscribers = new Map<\n string,\n Set<(prices: PriceUpdate[]) => void>\n >();\n\n // Track which subscribers want top-of-book (best bid/ask) data\n readonly #orderBookSubscribers = new Map<\n string,\n Set<(prices: PriceUpdate[]) => void>\n >();\n\n // Global singleton subscriptions\n #globalAllMidsSubscription?: ISubscription;\n\n #globalAllMidsPromise?: Promise<void>; // Track in-progress subscription\n\n readonly #globalActiveAssetSubscriptions = new Map<string, ISubscription>();\n\n // Track in-progress activeAssetCtx subscription promises to prevent leaks\n // when cleanup fires before the async subscription resolves (#28141)\n readonly #pendingActiveAssetPromises = new Map<\n string,\n Promise<void | undefined>\n >();\n\n readonly #globalBboSubscriptions = new Map<string, ISubscription>();\n\n // Track in-progress BBO subscription promises to prevent leaks (#28141)\n readonly #pendingBboPromises = new Map<string, Promise<void | undefined>>();\n\n // Order fill subscriptions keyed by accountId (normalized: undefined -> 'default')\n readonly #orderFillSubscriptions = new Map<string, ISubscription>();\n\n readonly #symbolSubscriberCounts = new Map<string, number>();\n\n readonly #dexSubscriberCounts = new Map<string, number>(); // Track subscribers per DEX for assetCtxs\n\n // Multi-DEX webData3 subscription for all user data (positions, orders, account, OI caps)\n readonly #webData3Subscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n #webData3SubscriptionPromise?: Promise<void>;\n\n #positionSubscriberCount = 0;\n\n #orderSubscriberCount = 0;\n\n #accountSubscriberCount = 0;\n\n #oiCapSubscriberCount = 0;\n\n // Multi-DEX data caches\n readonly #dexPositionsCache = new Map<string, Position[]>(); // Per-DEX positions\n\n readonly #dexOrdersCache = new Map<string, Order[]>(); // Per-DEX orders\n\n readonly #dexAccountCache = new Map<string, AccountState>(); // Per-DEX account state\n\n #cachedPositions: Position[] | null = null; // Aggregated positions\n\n #cachedOrders: Order[] | null = null; // Aggregated orders\n\n #cachedAccount: AccountState | null = null; // Aggregated account\n\n #ordersCacheInitialized = false; // Track if orders cache has received WebSocket data\n\n #positionsCacheInitialized = false; // Track if positions cache has received WebSocket data\n\n // OI Cap tracking (from webData3.perpDexStates[].perpsAtOpenInterestCap)\n readonly #oiCapSubscribers = new Set<(caps: string[]) => void>();\n\n #cachedOICaps: string[] = [];\n\n #cachedOICapsHash = '';\n\n #oiCapsCacheInitialized = false;\n\n // Global price data cache\n #cachedPriceData: Map<string, PriceUpdate> | null = null;\n\n // Raw allMids WS snapshots keyed by DEX ('' for main DEX)\n readonly #allMidsSnapshots = new Map<string, Record<string, string>>();\n\n // Fills cache for cache-first pattern (similar to price caching)\n #cachedFills: OrderFill[] | null = null;\n\n #fillsCacheInitialized = false;\n\n // HIP-3: assetCtxs subscriptions for multi-DEX market data\n readonly #assetCtxsSubscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n readonly #dexAssetCtxsCache = new Map<string, AssetCtxsWsEvent['ctxs']>(); // Per-DEX asset contexts\n\n readonly #assetCtxsSubscriptionPromises = new Map<string, Promise<void>>(); // Track in-progress subscriptions\n\n readonly #dexAllMidsSubscriptions = new Map<string, ISubscription>();\n\n readonly #dexAllMidsSubscriptionPromises = new Map<string, Promise<void>>();\n\n readonly #clearinghouseStateSubscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n readonly #openOrdersSubscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n // Pending subscription promises to prevent race conditions\n // When multiple calls to ensure*Subscription happen concurrently, this ensures\n // only one subscription is created per DEX (others wait for the pending promise)\n readonly #pendingClearinghouseSubscriptions = new Map<\n string,\n Promise<void>\n >();\n\n readonly #pendingOpenOrdersSubscriptions = new Map<string, Promise<void>>();\n\n // Meta cache per DEX - populated by metaAndAssetCtxs, used by createAssetCtxsSubscription\n // This avoids redundant meta() API calls since metaAndAssetCtxs already returns meta data\n readonly #dexMetaCache = new Map<\n string,\n {\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n }[];\n }\n >();\n\n // Order book data cache\n readonly #orderBookCache = new Map<\n string,\n {\n bestBid?: string;\n bestAsk?: string;\n spread?: string;\n lastUpdated: number;\n }\n >();\n\n // Market data caching for multi-channel consolidation\n readonly #marketDataCache = new Map<\n string,\n {\n prevDayPx?: number;\n funding?: number;\n openInterest?: number;\n volume24h?: number;\n oraclePrice?: number;\n lastUpdated: number;\n }\n >();\n\n // Flag to suppress error logging during intentional disconnect\n // Set in clearAll() and never reset (service instance is discarded after disconnect)\n #isClearing = false;\n\n readonly #restoreRetryTimeouts = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n\n // Platform dependencies for logging\n readonly #deps: PerpsPlatformDependencies;\n\n constructor(\n clientService: HyperLiquidClientService,\n walletService: HyperLiquidWalletService,\n platformDependencies: PerpsPlatformDependencies,\n hip3Enabled?: boolean,\n enabledDexs?: string[],\n allowlistMarkets?: string[],\n blocklistMarkets?: string[],\n ) {\n this.#clientService = clientService;\n this.#walletService = walletService;\n this.#deps = platformDependencies;\n this.#hip3Enabled = hip3Enabled ?? false;\n this.#enabledDexs = enabledDexs ?? [];\n this.#discoveredDexNames = enabledDexs ?? [];\n this.#allowlistMarkets = allowlistMarkets ?? [];\n this.#blocklistMarkets = blocklistMarkets ?? [];\n }\n\n /**\n * Conditionally log an error to Sentry, suppressing during intentional disconnect.\n * When `clearAll()` is called, pending subscription promises reject with\n * `WebSocketRequestError` — these are expected and must not pollute Sentry.\n *\n * @param error - The error to log\n * @param context - Sentry context from #getErrorContext()\n */\n #logErrorUnlessClearing(\n error: Error,\n context: Parameters<PerpsLogger['error']>[1],\n ): void {\n if (this.#isClearing) {\n return;\n }\n this.#deps.logger.error(error, context);\n }\n\n #isTransientAssetCtxsError(error: unknown): boolean {\n const ensuredError = ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n );\n const connectionState = this.#clientService.getConnectionState?.();\n const messageParts = [\n ensuredError.message,\n error instanceof Error ? error.name : '',\n typeof error === 'string' ? error : '',\n String(error),\n ]\n .join(' ')\n .toLowerCase();\n const isReconnectChurn =\n connectionState === WebSocketConnectionState.Connecting ||\n connectionState === WebSocketConnectionState.Disconnected;\n\n return (\n messageParts.includes('websocketrequesterror') ||\n messageParts.includes('unknown error while making a websocket request') ||\n (isReconnectChurn &&\n (messageParts.includes('unknown error (no details provided)') ||\n messageParts.includes('undefined')))\n );\n }\n\n #scheduleRestoreRetry(dex: string, kind: 'assetCtxs' | 'allMids'): void {\n const retryKey = `${kind}:${dex}`;\n if (this.#isClearing || this.#restoreRetryTimeouts.has(retryKey)) {\n return;\n }\n\n const timeoutId = setTimeout(() => {\n this.#restoreRetryTimeouts.delete(retryKey);\n const retryPromise =\n kind === 'assetCtxs'\n ? this.#ensureAssetCtxsSubscription(dex, {\n incrementRefCount: false,\n })\n : this.#ensureDexAllMidsSubscription(dex);\n\n retryPromise.catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.restoreSubscriptions.retry',\n ),\n this.#getErrorContext('restoreSubscriptions.retry', {\n dex,\n kind,\n }),\n );\n });\n }, 1000);\n\n this.#restoreRetryTimeouts.set(retryKey, timeoutId);\n }\n\n /**\n * Get error context for logging with searchable tags and context.\n * Enables Sentry dashboard filtering by feature, provider, and network.\n *\n * @param method - The method name where the error occurred\n * @param extra - Optional additional context fields (merged into searchable context.data)\n * @returns Error options with tags (searchable) and context (searchable)\n * @private\n */\n #getErrorContext(\n method: string,\n extra?: Record<string, unknown>,\n ): {\n tags?: Record<string, string | number>;\n context?: { name: string; data: Record<string, unknown> };\n extras?: Record<string, unknown>;\n } {\n return {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: 'hyperliquid',\n network: this.#clientService.isTestnetMode() ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'HyperLiquidSubscriptionService',\n data: {\n method,\n ...extra,\n },\n },\n };\n }\n\n /**\n * Check if a DEX is enabled in our configuration\n * Used to filter webData3 callback data to only process DEXs we care about\n *\n * @param dex - DEX name (null for main DEX, string for HIP-3)\n * @returns true if this DEX should be processed\n */\n #isDexEnabled(dex: string | null): boolean {\n if (dex === null) {\n return true; // Main DEX always enabled\n }\n if (!this.#hip3Enabled) {\n return false; // HIP-3 disabled entirely\n }\n return this.#enabledDexs.includes(dex);\n }\n\n /**\n * Populate DEX meta cache with pre-fetched meta data\n * Called by Provider after buildAssetMapping to share cached meta,\n * avoiding redundant metaAndAssetCtxs/meta API calls during subscription setup\n *\n * @param dex - DEX key ('' for main DEX, 'xyz'/'flx'/etc for HIP-3)\n * @param meta - Meta response containing universe data\n * @param meta.universe - The array of asset universe entries from the meta response.\n */\n public setDexMetaCache(\n dex: string,\n meta: {\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n }[];\n },\n ): void {\n this.#dexMetaCache.set(dex, meta);\n this.#deps.debugLogger.log(\n '[SubscriptionService] DEX meta cache populated',\n {\n dex: dex || 'main',\n universeSize: meta.universe.length,\n },\n );\n }\n\n /**\n * Cache asset contexts for a specific DEX from API response\n * This allows buildAssetMapping() to populate cache for getMarketDataWithPrices() to use\n *\n * @param dex - DEX name ('' for main perps)\n * @param assetCtxs - Asset contexts from metaAndAssetCtxs response\n */\n public setDexAssetCtxsCache(\n dex: string,\n assetCtxs: AssetCtxsWsEvent['ctxs'],\n ): void {\n this.#dexAssetCtxsCache.set(dex, assetCtxs);\n this.#deps.debugLogger.log(\n '[SubscriptionService] DEX assetCtxs cache populated',\n {\n dex: dex || 'main',\n ctxsCount: assetCtxs.length,\n },\n );\n }\n\n /**\n * Get cached assetCtxs for a DEX\n * Returns the cached asset contexts from WebSocket subscription if available\n *\n * @param dex - DEX key ('' for main DEX, 'xyz'/'flx'/etc for HIP-3)\n * @returns Array of asset contexts or undefined if not cached\n */\n public getDexAssetCtxsCache(\n dex: string,\n ): AssetCtxsWsEvent['ctxs'] | undefined {\n return this.#dexAssetCtxsCache.get(dex);\n }\n\n /**\n * Wait for DEX discovery to complete (with timeout)\n * Used when HIP-3 is enabled but enabledDexs hasn't been populated yet.\n * This allows subscriptions to wait for DEX discovery before creating per-DEX subscriptions.\n *\n * @param timeoutMs - The maximum time in milliseconds to wait for DEX discovery.\n */\n async #waitForDexDiscovery(timeoutMs: number = 5000): Promise<void> {\n // Already have DEXs, no need to wait\n if (this.#enabledDexs.length > 0) {\n return;\n }\n\n // Create promise if not exists\n if (!this.#dexDiscoveryPromise) {\n this.#dexDiscoveryPromise = new Promise<void>((resolve) => {\n this.#dexDiscoveryResolver = resolve;\n });\n }\n\n // Wait with timeout\n let timeoutId: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<void>((_resolve, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error('DEX discovery timeout')),\n timeoutMs,\n );\n });\n\n try {\n await Promise.race([this.#dexDiscoveryPromise, timeoutPromise]);\n } catch {\n this.#deps.debugLogger.log(\n 'DEX discovery wait timed out, proceeding with main DEX only',\n );\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Update feature flags for HIP-3 support\n * Called when provider configuration changes at runtime\n * Note: Market filtering is NOT applied in subscription service - only in Provider\n *\n * @param hip3Enabled - Whether HIP-3 multi-DEX support is enabled.\n * @param enabledDexs - The array of enabled DEX identifiers.\n * @param allowlistMarkets - The array of allowed market patterns.\n * @param blocklistMarkets - The array of blocked market patterns.\n */\n public async updateFeatureFlags(\n hip3Enabled: boolean,\n enabledDexs: string[],\n allowlistMarkets: string[],\n blocklistMarkets: string[],\n ): Promise<void> {\n const previousEnabledDexs = [...this.#enabledDexs];\n const previousAllowlistMarkets = [...this.#allowlistMarkets];\n const previousBlocklistMarkets = [...this.#blocklistMarkets];\n const previousHip3Enabled = this.#hip3Enabled;\n\n this.#hip3Enabled = hip3Enabled;\n this.#enabledDexs = enabledDexs;\n this.#allowlistMarkets = allowlistMarkets;\n this.#blocklistMarkets = blocklistMarkets;\n this.#discoveredDexNames = enabledDexs; // Store DEX order for webData3 index mapping\n\n // Resolve any pending DEX discovery wait now that DEXs are available\n if (this.#dexDiscoveryResolver && enabledDexs.length > 0) {\n this.#dexDiscoveryResolver();\n this.#dexDiscoveryPromise = null;\n this.#dexDiscoveryResolver = null;\n }\n\n this.#deps.debugLogger.log('Feature flags updated:', {\n previousHip3Enabled,\n hip3Enabled,\n previousEnabledDexs,\n enabledDexs,\n previousAllowlistMarkets,\n allowlistMarkets,\n previousBlocklistMarkets,\n blocklistMarkets,\n });\n\n // If equity was just enabled or new DEXs were added\n const newDexs = enabledDexs.filter(\n (dex) => !previousEnabledDexs.includes(dex),\n );\n if (\n (!previousHip3Enabled && hip3Enabled && enabledDexs.length > 0) ||\n newDexs.length > 0\n ) {\n this.#deps.debugLogger.log(\n 'Establishing subscriptions for new DEXs:',\n newDexs,\n );\n\n // Establish assetCtxs subscriptions for new DEXs (for market data)\n const hasMarketDataSubscribers = this.#marketDataSubscribers.size > 0;\n if (hasMarketDataSubscribers) {\n await Promise.all(\n newDexs.map(async (dex) => {\n try {\n await this.#ensureAssetCtxsSubscription(dex);\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.updateFeatureFlags',\n ),\n this.#getErrorContext(\n 'updateFeatureFlags.ensureAssetCtxsSubscription',\n {\n dex,\n },\n ),\n );\n }\n }),\n );\n }\n\n // Establish clearinghouseState/openOrders subscriptions for new DEXs\n // (needed for positions, orders, and account data when using individual subscriptions)\n const hasUserDataSubscribers =\n this.#positionSubscriberCount > 0 ||\n this.#orderSubscriberCount > 0 ||\n this.#accountSubscriberCount > 0;\n\n if (hasUserDataSubscribers && this.#hip3Enabled) {\n try {\n const userAddress =\n await this.#walletService.getUserAddressWithDefault();\n\n await Promise.all(\n newDexs.map(async (dex) => {\n try {\n await this.#ensureClearinghouseStateSubscription(\n userAddress,\n dex,\n );\n await this.#ensureOpenOrdersSubscription(userAddress, dex);\n this.#deps.debugLogger.log(\n `Established user data subscriptions for new DEX: ${dex}`,\n );\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.updateFeatureFlags',\n ),\n this.#getErrorContext(\n 'updateFeatureFlags.ensureUserDataSubscription',\n { dex },\n ),\n );\n }\n }),\n );\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.updateFeatureFlags',\n ),\n this.#getErrorContext('updateFeatureFlags.getUserAddress'),\n );\n }\n }\n }\n }\n\n /**\n * Fast hash function for change detection\n * Uses string concatenation of key fields instead of JSON.stringify()\n * Performance: ~100x faster than JSON.stringify() for typical objects\n * Tracks structural changes (coin, size, entryPrice, leverage, TP/SL prices/counts)\n * and value changes (unrealizedPnl, returnOnEquity, liquidationPrice, marginUsed) for live updates\n *\n * @param positions - The array of positions to hash.\n * @returns A hash string representing the current position state.\n */\n #hashPositions(positions: Position[]): string {\n if (!positions || positions.length === 0) {\n return '0';\n }\n return positions\n .map(\n (pos) =>\n `${pos.symbol}:${pos.size}:${pos.entryPrice}:${pos.leverage.value}:${\n pos.takeProfitPrice ?? ''\n }:${pos.stopLossPrice ?? ''}:${pos.takeProfitCount}:${pos.stopLossCount}:${\n pos.unrealizedPnl\n }:${pos.returnOnEquity}:${pos.liquidationPrice ?? ''}:${pos.marginUsed || ''}`,\n )\n .join('|');\n }\n\n #hashOrders(orders: Order[]): string {\n if (!orders || orders.length === 0) {\n return '0';\n }\n return orders\n .map(\n (ord) =>\n `${ord.symbol}:${ord.side}:${ord.size}:${ord.price}:${ord.orderType}`,\n )\n .join('|');\n }\n\n #hashAccountState(account: AccountState): string {\n return `${account.availableBalance}:${account.totalBalance}:${account.marginUsed}:${account.unrealizedPnl}`;\n }\n\n // Cache hashes to avoid recomputation\n #cachedPositionsHash = '';\n\n #cachedOrdersHash = '';\n\n #cachedAccountHash = '';\n\n /**\n * Extract TP/SL from orders and optionally convert raw SDK orders to Order format.\n * DRY helper used by both webData2 and clearinghouseState callbacks.\n *\n * @param orders - Raw SDK orders from WebSocket event\n * @param positions - Current positions for TP/SL matching\n * @param cachedProcessedOrders - Optional pre-processed orders (skips conversion if provided)\n * @returns Maps for TP/SL prices and counts, plus processed Order array\n */\n #extractTPSLFromOrders(\n orders: FrontendOpenOrdersResponse,\n positions: Position[],\n cachedProcessedOrders?: Order[],\n ): {\n tpslMap: Map<string, { takeProfitPrice?: string; stopLossPrice?: string }>;\n tpslCountMap: Map<\n string,\n { takeProfitCount?: number; stopLossCount?: number }\n >;\n processedOrders: Order[];\n } {\n const tpslMap = new Map<\n string,\n { takeProfitPrice?: string; stopLossPrice?: string }\n >();\n\n const tpslCountMap = new Map<\n string,\n { takeProfitCount?: number; stopLossCount?: number }\n >();\n\n // If cached processed orders provided, extract TP/SL from them directly\n if (cachedProcessedOrders) {\n cachedProcessedOrders.forEach((order) => {\n // Use triggerPrice for TP/SL (trigger condition price), falling back to price\n // This ensures consistency with raw SDK order processing which uses triggerPx\n const tpslPrice = order.triggerPrice ?? order.price;\n if (order.isTrigger && tpslPrice) {\n const isTakeProfit = order.detailedOrderType?.includes('Take Profit');\n const isStop = order.detailedOrderType?.includes('Stop');\n\n const matchingPosition = positions.find(\n (pos) => pos.symbol === order.symbol,\n );\n\n // Determine TP vs SL classification for count and price updates\n // Use order type first, fallback to price-based detection for ambiguous 'Trigger' types\n let classifiedAsTakeProfit = isTakeProfit;\n let classifiedAsStop = isStop;\n\n if (!isTakeProfit && !isStop && matchingPosition) {\n // Fallback: determine based on trigger price vs entry price\n // This handles orders with ambiguous type 'Trigger'\n const triggerPrice = parseFloat(tpslPrice);\n const entryPrice = parseFloat(matchingPosition.entryPrice || '0');\n const isLong = parseFloat(matchingPosition.size) > 0;\n\n if (isLong) {\n if (triggerPrice > entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n } else if (triggerPrice < entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n }\n\n const currentTakeProfitCount =\n tpslCountMap.get(order.symbol)?.takeProfitCount ?? 0;\n const currentStopLossCount =\n tpslCountMap.get(order.symbol)?.stopLossCount ?? 0;\n\n tpslCountMap.set(order.symbol, {\n takeProfitCount: classifiedAsTakeProfit\n ? currentTakeProfitCount + 1\n : currentTakeProfitCount,\n stopLossCount: classifiedAsStop\n ? currentStopLossCount + 1\n : currentStopLossCount,\n });\n\n if (matchingPosition) {\n const existing = tpslMap.get(order.symbol) ?? {};\n if (classifiedAsTakeProfit) {\n existing.takeProfitPrice = tpslPrice;\n } else if (classifiedAsStop) {\n existing.stopLossPrice = tpslPrice;\n }\n tpslMap.set(order.symbol, existing);\n }\n }\n });\n\n return { tpslMap, tpslCountMap, processedOrders: cachedProcessedOrders };\n }\n\n // Process raw SDK orders\n const processedOrders: Order[] = [];\n\n orders.forEach((order) => {\n let position: Position | undefined;\n let positionForCoin: Position | undefined;\n\n const matchPositionToTpsl = (pos: Position): boolean => {\n if (TP_SL_CONFIG.UsePositionBoundTpsl) {\n return (\n pos.symbol === order.coin &&\n order.reduceOnly &&\n order.isPositionTpsl\n );\n }\n\n return (\n pos.symbol === order.coin &&\n Math.abs(parseFloat(order.sz)) >= Math.abs(parseFloat(pos.size))\n );\n };\n\n const matchPositionToCoin = (pos: Position): boolean =>\n pos.symbol === order.coin;\n\n // Process trigger orders for TP/SL extraction\n if (order.triggerPx) {\n const isTakeProfit = order.orderType?.includes('Take Profit');\n const isStop = order.orderType?.includes('Stop');\n\n const { coin } = order;\n position = positions.find(matchPositionToTpsl);\n positionForCoin = positions.find(matchPositionToCoin);\n\n // Determine TP vs SL classification for count and price updates\n // Use order type first, fallback to price-based detection for ambiguous 'Trigger' types\n // This matches the cached order processing logic for consistency\n let classifiedAsTakeProfit = isTakeProfit;\n let classifiedAsStop = isStop;\n\n if (!isTakeProfit && !isStop && position) {\n // Fallback: determine based on trigger price vs entry price\n // This handles orders with ambiguous type 'Trigger'\n const triggerPrice = parseFloat(order.triggerPx);\n const entryPrice = parseFloat(position.entryPrice || '0');\n const isLong = parseFloat(position.size) > 0;\n\n if (isLong) {\n if (triggerPrice > entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n } else if (triggerPrice < entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n }\n\n const currentTakeProfitCount =\n tpslCountMap.get(coin)?.takeProfitCount ?? 0;\n const currentStopLossCount = tpslCountMap.get(coin)?.stopLossCount ?? 0;\n\n tpslCountMap.set(coin, {\n takeProfitCount: classifiedAsTakeProfit\n ? currentTakeProfitCount + 1\n : currentTakeProfitCount,\n stopLossCount: classifiedAsStop\n ? currentStopLossCount + 1\n : currentStopLossCount,\n });\n\n if (position) {\n const existing = tpslMap.get(coin) ?? {};\n\n // Use classified values for price assignment (consistent with count logic)\n if (classifiedAsTakeProfit) {\n existing.takeProfitPrice = order.triggerPx;\n } else if (classifiedAsStop) {\n existing.stopLossPrice = order.triggerPx;\n }\n\n tpslMap.set(coin, existing);\n }\n }\n\n // Convert ALL open orders to Order format\n const convertedOrder = adaptOrderFromSDK(\n order,\n position ?? positionForCoin,\n );\n processedOrders.push(convertedOrder);\n });\n\n return { tpslMap, tpslCountMap, processedOrders };\n }\n\n /**\n * Merge TP/SL data into positions\n * DRY helper used by both webData2 and clearinghouseState callbacks\n *\n * @param positions - Base positions without TP/SL\n * @param tpslMap - Map of coin -> TP/SL prices\n * @param tpslCountMap - Map of coin -> TP/SL counts\n * @returns Positions enhanced with TP/SL data\n */\n #mergeTPSLIntoPositions(\n positions: Position[],\n tpslMap: Map<string, { takeProfitPrice?: string; stopLossPrice?: string }>,\n tpslCountMap: Map<\n string,\n { takeProfitCount?: number; stopLossCount?: number }\n >,\n ): Position[] {\n return positions.map((position) => {\n const tpsl = tpslMap.get(position.symbol) ?? {};\n const tpslCount = tpslCountMap.get(position.symbol) ?? {};\n return {\n ...position,\n takeProfitPrice: tpsl.takeProfitPrice ?? undefined,\n stopLossPrice: tpsl.stopLossPrice ?? undefined,\n takeProfitCount: tpslCount.takeProfitCount ?? 0,\n stopLossCount: tpslCount.stopLossCount ?? 0,\n };\n });\n }\n\n /**\n * Aggregate account states from all cached DEXs\n * Sums balances and creates per-DEX breakdown for multi-DEX portfolio view\n *\n * @returns Aggregated account state with dexBreakdown field\n * @private\n */\n #aggregateAccountStates(): AccountState {\n const subAccountBreakdown: Record<\n string,\n { availableBalance: string; totalBalance: string }\n > = {};\n let totalAvailableBalance = 0;\n let totalBalance = 0;\n let totalMarginUsed = 0;\n let totalUnrealizedPnl = 0;\n\n // Collect account states for weighted ROE calculation\n const accountStatesForROE: {\n unrealizedPnl: string;\n returnOnEquity: string;\n }[] = [];\n\n // Aggregate all cached account states\n Array.from(this.#dexAccountCache.entries()).forEach(\n ([currentDex, state]) => {\n const dexKey = currentDex === '' ? 'main' : currentDex;\n subAccountBreakdown[dexKey] = {\n availableBalance: state.availableBalance,\n totalBalance: state.totalBalance,\n };\n totalAvailableBalance += parseFloat(state.availableBalance);\n totalBalance += parseFloat(state.totalBalance);\n totalMarginUsed += parseFloat(state.marginUsed);\n totalUnrealizedPnl += parseFloat(state.unrealizedPnl);\n\n // Collect data for weighted ROE calculation\n accountStatesForROE.push({\n unrealizedPnl: state.unrealizedPnl,\n returnOnEquity: state.returnOnEquity,\n });\n },\n );\n\n // Use first DEX's account state as base and override aggregated values\n const firstDexAccount =\n this.#dexAccountCache.values().next().value ?? ({} as AccountState);\n\n // Calculate weighted returnOnEquity across all DEXs\n const returnOnEquity = calculateWeightedReturnOnEquity(accountStatesForROE);\n\n return {\n ...firstDexAccount,\n availableBalance: totalAvailableBalance.toString(),\n totalBalance: totalBalance.toString(),\n marginUsed: totalMarginUsed.toString(),\n unrealizedPnl: totalUnrealizedPnl.toString(),\n subAccountBreakdown,\n returnOnEquity,\n };\n }\n\n /**\n * Subscribe to live price updates with singleton subscription architecture\n * Uses allMids for fast price updates and predictedFundings for accurate funding rates\n *\n * @param params - The subscription parameters including symbols and callbacks.\n * @returns A cleanup function to unsubscribe from price updates.\n */\n public async subscribeToPrices(\n params: SubscribePricesParams,\n ): Promise<() => void> {\n const {\n symbols,\n callback,\n includeOrderBook = false,\n includeMarketData = false,\n } = params;\n const unsubscribers: (() => void)[] = [];\n\n symbols.forEach((symbol) => {\n unsubscribers.push(\n this.#createSubscription(this.#priceSubscribers, callback, symbol),\n );\n // Track market data subscribers separately\n if (includeMarketData) {\n unsubscribers.push(\n this.#createSubscription(\n this.#marketDataSubscribers,\n callback,\n symbol,\n ),\n );\n }\n // Track order book subscribers separately\n if (includeOrderBook) {\n unsubscribers.push(\n this.#createSubscription(\n this.#orderBookSubscribers,\n callback,\n symbol,\n ),\n );\n }\n });\n\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n this.#deps.debugLogger.log(\n 'SubscriptionClient not available for price subscription',\n );\n return () => unsubscribers.forEach((fn) => fn());\n }\n\n // Ensure global subscriptions are established\n this.#ensureGlobalAllMidsSubscription();\n\n // Extract unique DEXs from requested symbols\n const dexsNeeded = new Set<string | null>();\n symbols.forEach((symbol) => {\n const { dex } = parseAssetName(symbol);\n dexsNeeded.add(dex);\n });\n\n // Always ensure assetCtxs subscriptions (1 per DEX, lightweight).\n // Provides prevDayPx for percentChange24h even without includeMarketData\n // (e.g., prewarm after reconnection). Uses incrementRefCount: false when\n // not explicitly requested so lifecycle is managed by component subscriptions.\n dexsNeeded.forEach((dex) => {\n const dexName = dex ?? '';\n this.#ensureAssetCtxsSubscription(dexName, {\n incrementRefCount: includeMarketData,\n }).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToPrices',\n ),\n this.#getErrorContext(\n 'subscribeToPrices.ensureAssetCtxsSubscription',\n { dex: dexName },\n ),\n );\n });\n });\n\n // dexAllMids and activeAssetCtx only when market data explicitly requested\n if (includeMarketData) {\n dexsNeeded.forEach((dex) => {\n const dexName = dex ?? '';\n this.#ensureDexAllMidsSubscription(dexName).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToPrices',\n ),\n this.#getErrorContext(\n 'subscribeToPrices.ensureDexAllMidsSubscription',\n { dex: dexName },\n ),\n );\n });\n });\n }\n\n // Note: Funding rates are now cached via assetCtxs WebSocket subscription\n // (ensureAssetCtxsSubscription above), eliminating the need for a separate\n // metaAndAssetCtxs API call here. The WebSocket callback in createAssetCtxsSubscription\n // populates marketDataCache with funding rates as they arrive.\n\n symbols.forEach((symbol) => {\n // Subscribe to activeAssetCtx only when market data is requested\n if (includeMarketData) {\n this.#ensureActiveAssetSubscription(symbol);\n }\n if (includeOrderBook) {\n this.#ensureBboSubscription(symbol);\n }\n });\n\n // Send cached data immediately if available\n symbols.forEach((symbol) => {\n const cachedPrice = this.#cachedPriceData?.get(symbol);\n if (cachedPrice) {\n callback([cachedPrice]);\n }\n });\n\n // Return cleanup function\n return () => {\n unsubscribers.forEach((fn) => fn());\n // Cleanup subscriptions with reference counting\n symbols.forEach((symbol) => {\n if (includeMarketData) {\n this.#cleanupActiveAssetSubscription(symbol);\n }\n if (includeOrderBook) {\n this.#cleanupBboSubscription(symbol);\n }\n });\n\n // Cleanup DEX-level assetCtxs subscriptions\n if (includeMarketData) {\n dexsNeeded.forEach((dex) => {\n const dexName = dex ?? '';\n this.#cleanupAssetCtxsSubscription(dexName);\n });\n }\n };\n }\n\n /**\n * Ensure shared webData3 subscription is active (singleton pattern with multi-DEX support)\n * webData3 provides data for all DEXs (main + HIP-3) in a single subscription\n *\n * @param accountId - Optional CAIP account ID to subscribe for.\n */\n async #ensureSharedWebData3Subscription(\n accountId?: CaipAccountId,\n ): Promise<void> {\n // Establish webData3 subscription (if not exists)\n if (!this.#webData3Subscriptions.has('')) {\n if (this.#webData3SubscriptionPromise) {\n await this.#webData3SubscriptionPromise;\n } else {\n this.#webData3SubscriptionPromise =\n this.#createUserDataSubscription(accountId);\n\n try {\n await this.#webData3SubscriptionPromise;\n } catch (error) {\n this.#webData3SubscriptionPromise = undefined;\n throw error;\n }\n }\n }\n // Note: webData3 includes all DEX data, so no separate HIP-3 subscriptions needed\n }\n\n /**\n * Create WebSocket subscription for user data (positions, orders, account)\n * - Uses webData2 when HIP-3 disabled (main DEX only)\n * - Uses webData3 when HIP-3 enabled (main + HIP-3 DEXs)\n *\n * webData2 provides data for main DEX only\n * webData3 provides perpDexStates[] array containing data for all DEXs:\n * - Index 0: Main DEX (dexName = '')\n * - Index 1+: HIP-3 DEXs in order of enabledDexs array\n *\n * @param accountId - Optional CAIP account ID to subscribe for.\n * @returns A promise that resolves when the operation completes.\n */\n async #createUserDataSubscription(accountId?: CaipAccountId): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n const userAddress =\n await this.#walletService.getUserAddressWithDefault(accountId);\n\n const dexName = ''; // Use empty string as key for single subscription\n\n // Skip if subscription already exists\n if (this.#webData3Subscriptions.has(dexName)) {\n return undefined;\n }\n\n // Wait for DEX discovery if HIP-3 is enabled but DEXs haven't been discovered yet\n // This ensures HIP-3 subscriptions are created together with main DEX\n if (this.#hip3Enabled && this.#enabledDexs.length === 0) {\n this.#deps.debugLogger.log(\n 'Waiting for DEX discovery before creating subscriptions...',\n );\n await this.#waitForDexDiscovery();\n this.#deps.debugLogger.log(\n 'DEX discovery complete, proceeding with subscriptions',\n {\n enabledDexs: this.#enabledDexs,\n },\n );\n }\n\n return new Promise<void>((resolve, reject) => {\n // Choose channel based on HIP-3 master switch\n if (this.#hip3Enabled) {\n // HIP-3 enabled: Use individual subscriptions for positions/orders/account\n // webData3 is only used for OI caps extraction\n\n // Determine which DEXs to subscribe to\n const dexsToSubscribe = [\n '', // Main DEX\n ...this.#enabledDexs.filter((dexId) => this.#isDexEnabled(dexId)),\n ];\n\n // Track expected DEXs for synchronized notifications\n // Clear previous tracking and set new expected DEXs\n this.#expectedDexs = new Set(dexsToSubscribe);\n this.#initializedDexs = new Set();\n\n // Set up individual subscriptions for each DEX\n const subscriptionPromises: Promise<void>[] = [];\n\n for (const currentDexName of dexsToSubscribe) {\n // Set up clearinghouseState subscription for positions + account\n subscriptionPromises.push(\n this.#ensureClearinghouseStateSubscription(\n userAddress,\n currentDexName,\n ),\n );\n\n // Set up openOrders subscription for orders\n subscriptionPromises.push(\n this.#ensureOpenOrdersSubscription(userAddress, currentDexName),\n );\n }\n\n // Also set up webData3 for OI caps only\n const webData3Promise = subscriptionClient\n .webData3({ user: userAddress }, (data: WebData3WsEvent) => {\n try {\n // webData3 is ONLY used for OI caps extraction\n // Positions, orders, and account data come from individual subscriptions\n const allOICaps: string[] = [];\n data.perpDexStates.forEach((dexState, index) => {\n // Map webData3 index to DEX name\n // Index 0 = main DEX (null), Index 1+ = HIP-3 DEXs from discoveredDexNames\n const dexIdentifier =\n index === 0 ? null : this.#discoveredDexNames[index - 1];\n\n // Skip unknown DEXs (not in discoveredDexNames) to prevent main DEX cache corruption\n if (index > 0 && dexIdentifier === undefined) {\n return; // Unknown DEX - skip to prevent misidentifying as main DEX\n }\n\n // Only process DEXs we care about (skip others silently)\n if (!this.#isDexEnabled(dexIdentifier ?? null)) {\n return; // Skip this DEX - not enabled in our configuration\n }\n\n const currentDexName = dexIdentifier ?? '';\n\n const oiCaps = dexState.perpsAtOpenInterestCap ?? [];\n\n // Add DEX prefix for HIP-3 symbols (e.g., \"xyz:TSLA\")\n if (currentDexName) {\n allOICaps.push(\n ...oiCaps.map((symbol) => `${currentDexName}:${symbol}`),\n );\n } else {\n // Main DEX - no prefix needed\n allOICaps.push(...oiCaps);\n }\n });\n\n // Update OI caps cache and notify if changed\n const oiCapsHash = [...allOICaps]\n .sort((a: string, b: string) => a.localeCompare(b))\n .join(',');\n if (oiCapsHash !== this.#cachedOICapsHash) {\n this.#cachedOICaps = allOICaps;\n this.#cachedOICapsHash = oiCapsHash;\n this.#oiCapsCacheInitialized = true;\n\n // Notify all subscribers\n this.#oiCapSubscribers.forEach((callback) =>\n callback(allOICaps),\n );\n }\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('webData3 callback error', {\n user: userAddress,\n hasPerpDexStates: data?.perpDexStates !== undefined,\n perpDexStatesLength: data?.perpDexStates?.length ?? 0,\n }),\n );\n }\n })\n .then((sub) => {\n this.#webData3Subscriptions.set(dexName, sub);\n this.#deps.debugLogger.log(\n `webData3 subscription established for OI caps (main + HIP-3)`,\n );\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('createUserDataSubscription (webData3)', {\n dex: dexName,\n }),\n );\n throw error;\n });\n\n subscriptionPromises.push(webData3Promise);\n\n // Wait for all subscriptions to be established\n Promise.all(subscriptionPromises)\n .then(() => {\n this.#deps.debugLogger.log(\n `HIP-3 user data subscriptions established for ${dexsToSubscribe.length} DEXs`,\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('createUserDataSubscription (HIP-3)', {\n dexs: dexsToSubscribe,\n }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n );\n });\n } else {\n // HIP-3 disabled: Use webData2 (main DEX only)\n subscriptionClient\n .webData2({ user: userAddress }, (data: WebData2WsEvent) => {\n try {\n // webData2 returns clearinghouseState for main DEX only\n const currentDexName = ''; // Main DEX\n\n // Check for removed fields before accessing\n if (!data.clearinghouseState) {\n return;\n }\n\n // Extract and process positions from clearinghouseState\n const positions = data.clearinghouseState.assetPositions\n .filter((assetPos) => assetPos.position.szi !== '0')\n .map((assetPos) => adaptPositionFromSDK(assetPos));\n\n // Extract TP/SL from orders\n const {\n tpslMap,\n tpslCountMap,\n processedOrders: orders,\n } = this.#extractTPSLFromOrders(data.openOrders || [], positions);\n\n // Merge TP/SL data into positions\n const positionsWithTPSL = this.#mergeTPSLIntoPositions(\n positions,\n tpslMap,\n tpslCountMap,\n );\n\n // Extract account data (webData2 provides clearinghouseState)\n const accountState: AccountState = adaptAccountStateFromSDK(\n data.clearinghouseState,\n undefined, // webData2 doesn't include spotState\n );\n\n // Store in caches (main DEX only)\n this.#dexPositionsCache.set(currentDexName, positionsWithTPSL);\n this.#dexOrdersCache.set(currentDexName, orders);\n this.#dexAccountCache.set(currentDexName, accountState);\n\n // OI caps (main DEX only)\n const oiCaps = data.perpsAtOpenInterestCap ?? [];\n const oiCapsHash = [...oiCaps]\n .sort((a: string, b: string) => a.localeCompare(b))\n .join(',');\n if (oiCapsHash !== this.#cachedOICapsHash) {\n this.#cachedOICaps = oiCaps;\n this.#cachedOICapsHash = oiCapsHash;\n this.#oiCapsCacheInitialized = true;\n this.#oiCapSubscribers.forEach((callback) => callback(oiCaps));\n }\n\n // Notify subscribers (no aggregation needed - only main DEX)\n const positionsHash = this.#hashPositions(positionsWithTPSL);\n const ordersHash = this.#hashOrders(orders);\n const accountHash = this.#hashAccountState(accountState);\n\n if (positionsHash !== this.#cachedPositionsHash) {\n this.#cachedPositions = positionsWithTPSL;\n this.#cachedPositionsHash = positionsHash;\n this.#positionsCacheInitialized = true;\n this.#positionSubscribers.forEach((callback) =>\n callback(positionsWithTPSL),\n );\n }\n\n if (ordersHash !== this.#cachedOrdersHash) {\n this.#cachedOrders = orders;\n this.#cachedOrdersHash = ordersHash;\n this.#ordersCacheInitialized = true;\n this.#orderSubscribers.forEach((callback) => callback(orders));\n }\n\n if (accountHash !== this.#cachedAccountHash) {\n this.#cachedAccount = accountState;\n this.#cachedAccountHash = accountHash;\n this.#accountSubscribers.forEach((callback) =>\n callback(accountState),\n );\n }\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('webData2 callback error', {\n user: userAddress,\n dataKeys: data ? Object.keys(data) : 'data is null/undefined',\n hasClearinghouseState: data?.clearinghouseState !== undefined,\n hasOpenOrders: data?.openOrders !== undefined,\n hasPerpsAtOpenInterestCap:\n data?.perpsAtOpenInterestCap !== undefined,\n }),\n );\n }\n })\n .then((subscription) => {\n this.#webData3Subscriptions.set(dexName, subscription);\n this.#deps.debugLogger.log(\n 'webData2 subscription established for main DEX only',\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('createUserDataSubscription (webData2)', {\n dex: dexName,\n }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n );\n });\n }\n });\n }\n\n /**\n * Ensure clearinghouseState subscription exists for a DEX\n * Uses pending promise tracking to prevent race conditions where multiple\n * concurrent calls could create duplicate subscriptions\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n * @returns A promise that resolves when the subscription is established.\n */\n async #ensureClearinghouseStateSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n // Already subscribed\n if (this.#clearinghouseStateSubscriptions.has(dexName)) {\n return;\n }\n\n // Another call is already in progress - wait for it instead of creating duplicate\n const pending = this.#pendingClearinghouseSubscriptions.get(dexName);\n if (pending) {\n this.#deps.debugLogger.log(\n `[ensureClearinghouseStateSubscription] Waiting for pending subscription for DEX: ${dexName || 'main'}`,\n );\n await pending;\n return;\n }\n\n // Create subscription promise and track it\n const subscriptionPromise = this.#createClearinghouseSubscription(\n userAddress,\n dexName,\n );\n this.#pendingClearinghouseSubscriptions.set(dexName, subscriptionPromise);\n\n try {\n await subscriptionPromise;\n } finally {\n this.#pendingClearinghouseSubscriptions.delete(dexName);\n }\n }\n\n /**\n * Create the actual clearinghouseState subscription\n * Separated from ensureClearinghouseStateSubscription to enable promise deduplication\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n */\n async #createClearinghouseSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error('Subscription client not available');\n }\n\n try {\n const subscription = await subscriptionClient.clearinghouseState(\n {\n user: userAddress,\n dex: dexName || undefined, // Empty string -> undefined for main DEX\n },\n (data: ClearinghouseStateWsEvent) => {\n const cacheKey = data.dex || '';\n\n // Update caches and notify subscribers if we have positions/account subscribers\n if (\n this.#positionSubscriberCount > 0 ||\n this.#accountSubscriberCount > 0\n ) {\n // Process positions from clearinghouse state\n const positions = data.clearinghouseState.assetPositions\n .filter((assetPos) => assetPos.position.szi !== '0')\n .map((assetPos) => adaptPositionFromSDK(assetPos));\n\n // Get cached orders to preserve TP/SL data (prevents flickering)\n // Orders are cached by openOrders subscription\n const cachedOrders = this.#dexOrdersCache.get(cacheKey) ?? [];\n\n // Re-extract TP/SL from cached orders for the new positions\n // This ensures TP/SL data persists across clearinghouseState updates\n let positionsWithTPSL = positions;\n if (cachedOrders.length > 0) {\n const { tpslMap, tpslCountMap } = this.#extractTPSLFromOrders(\n [],\n positions,\n cachedOrders,\n );\n\n positionsWithTPSL = this.#mergeTPSLIntoPositions(\n positions,\n tpslMap,\n tpslCountMap,\n );\n }\n\n // Update account state\n const accountState: AccountState = adaptAccountStateFromSDK(\n data.clearinghouseState,\n undefined,\n );\n\n // Update caches\n this.#dexPositionsCache.set(cacheKey, positionsWithTPSL);\n this.#dexAccountCache.set(cacheKey, accountState);\n\n // Mark this DEX as initialized (has sent first data)\n this.#initializedDexs.add(cacheKey);\n\n // Trigger aggregation and notify subscribers\n this.#aggregateAndNotifySubscribers();\n }\n },\n );\n\n this.#clearinghouseStateSubscriptions.set(dexName, subscription);\n this.#deps.debugLogger.log(\n `clearinghouseState subscription established for DEX: ${dexName || 'main'}`,\n );\n } catch (error) {\n // Remove this DEX from expected set so it doesn't block notifications for other DEXs\n this.#expectedDexs.delete(dexName);\n\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createClearinghouseSubscription',\n ),\n this.#getErrorContext('ensureClearinghouseStateSubscription', {\n dex: dexName,\n }),\n );\n throw error;\n }\n }\n\n /**\n * Ensure openOrders subscription exists for a DEX\n * Uses pending promise tracking to prevent race conditions where multiple\n * concurrent calls could create duplicate subscriptions\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n * @returns A promise that resolves when the subscription is established.\n */\n async #ensureOpenOrdersSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n // Already subscribed\n if (this.#openOrdersSubscriptions.has(dexName)) {\n return;\n }\n\n // Another call is already in progress - wait for it instead of creating duplicate\n const pending = this.#pendingOpenOrdersSubscriptions.get(dexName);\n if (pending) {\n this.#deps.debugLogger.log(\n `[ensureOpenOrdersSubscription] Waiting for pending subscription for DEX: ${dexName || 'main'}`,\n );\n await pending;\n return;\n }\n\n // Create subscription promise and track it\n const subscriptionPromise = this.#createOpenOrdersSubscription(\n userAddress,\n dexName,\n );\n this.#pendingOpenOrdersSubscriptions.set(dexName, subscriptionPromise);\n\n try {\n await subscriptionPromise;\n } finally {\n this.#pendingOpenOrdersSubscriptions.delete(dexName);\n }\n }\n\n /**\n * Create the actual openOrders subscription\n * Separated from ensureOpenOrdersSubscription to enable promise deduplication\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n */\n async #createOpenOrdersSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error('Subscription client not available');\n }\n\n try {\n const subscription = await subscriptionClient.openOrders(\n {\n user: userAddress,\n dex: dexName || undefined, // Empty string -> undefined for main DEX\n },\n (data: OpenOrdersWsEvent) => {\n const cacheKey = data.dex || '';\n\n // Update caches and notify subscribers if we have order subscribers\n if (\n this.#orderSubscriberCount > 0 ||\n this.#positionSubscriberCount > 0\n ) {\n // Get cached positions for TP/SL processing\n const cachedPositions = this.#dexPositionsCache.get(cacheKey) ?? [];\n\n // Extract TP/SL and process orders\n const {\n tpslMap,\n tpslCountMap,\n processedOrders: orders,\n } = this.#extractTPSLFromOrders(data.orders, cachedPositions);\n\n // Update orders cache with processed orders\n this.#dexOrdersCache.set(cacheKey, orders);\n\n // Update positions with TP/SL if we have positions\n if (cachedPositions.length > 0) {\n const positionsWithTPSL = this.#mergeTPSLIntoPositions(\n cachedPositions,\n tpslMap,\n tpslCountMap,\n );\n this.#dexPositionsCache.set(cacheKey, positionsWithTPSL);\n }\n\n // Mark this DEX as initialized (has sent first data)\n this.#initializedDexs.add(cacheKey);\n\n // Trigger aggregation and notify subscribers\n this.#aggregateAndNotifySubscribers();\n }\n },\n );\n\n this.#openOrdersSubscriptions.set(dexName, subscription);\n this.#deps.debugLogger.log(\n `openOrders subscription established for DEX: ${dexName || 'main'}`,\n );\n } catch (error) {\n // Remove this DEX from expected set so it doesn't block notifications for other DEXs\n this.#expectedDexs.delete(dexName);\n\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createOpenOrdersSubscription',\n ),\n this.#getErrorContext('ensureOpenOrdersSubscription', {\n dex: dexName,\n }),\n );\n throw error;\n }\n }\n\n /**\n * Aggregate data from all DEX caches and notify subscribers if data changed\n * Used by both webData3 callback and fallback subscription callbacks\n */\n #aggregateAndNotifySubscribers(): void {\n // Wait for all expected DEXs to send initial data before notifying\n // This ensures positions from all DEXs appear simultaneously\n if (this.#expectedDexs.size > 0) {\n const allDexsInitialized = Array.from(this.#expectedDexs).every((dex) =>\n this.#initializedDexs.has(dex),\n );\n if (!allDexsInitialized) {\n this.#deps.debugLogger.log(\n 'Waiting for all DEXs to send initial data',\n {\n expected: Array.from(this.#expectedDexs),\n initialized: Array.from(this.#initializedDexs),\n },\n );\n return; // Don't notify yet - waiting for more DEXs\n }\n }\n\n // Aggregate data from all DEX caches\n // Order: Main DEX (crypto perps) first, then HIP-3 DEXs\n const mainDexPositions = this.#dexPositionsCache.get('') ?? [];\n const hip3DexPositions = Array.from(this.#dexPositionsCache.entries())\n .filter(([key]) => key !== '')\n .flatMap(([, positions]) => positions);\n const aggregatedPositions = [...mainDexPositions, ...hip3DexPositions];\n\n const mainDexOrders = this.#dexOrdersCache.get('') ?? [];\n const hip3DexOrders = Array.from(this.#dexOrdersCache.entries())\n .filter(([key]) => key !== '')\n .flatMap(([, orders]) => orders);\n const aggregatedOrders = [...mainDexOrders, ...hip3DexOrders];\n\n const aggregatedAccount = this.#aggregateAccountStates();\n\n // Check if aggregated data changed using fast hash comparison\n const positionsHash = this.#hashPositions(aggregatedPositions);\n const ordersHash = this.#hashOrders(aggregatedOrders);\n const accountHash = this.#hashAccountState(aggregatedAccount);\n\n const positionsChanged = positionsHash !== this.#cachedPositionsHash;\n const ordersChanged = ordersHash !== this.#cachedOrdersHash;\n const accountChanged = accountHash !== this.#cachedAccountHash;\n\n // Only notify subscribers if aggregated data changed\n if (positionsChanged) {\n this.#cachedPositions = aggregatedPositions;\n this.#cachedPositionsHash = positionsHash;\n this.#positionsCacheInitialized = true; // Mark cache as initialized\n this.#positionSubscribers.forEach((callback) => {\n callback(aggregatedPositions);\n });\n }\n\n if (ordersChanged) {\n this.#cachedOrders = aggregatedOrders;\n this.#cachedOrdersHash = ordersHash;\n this.#ordersCacheInitialized = true; // Mark cache as initialized\n this.#orderSubscribers.forEach((callback) => {\n callback(aggregatedOrders);\n });\n }\n\n if (accountChanged) {\n this.#cachedAccount = aggregatedAccount;\n this.#cachedAccountHash = accountHash;\n this.#accountSubscribers.forEach((callback) => {\n callback(aggregatedAccount);\n });\n }\n }\n\n /**\n * Clean up webData3 subscription when no longer needed\n */\n #cleanupSharedWebData3ISubscription(): void {\n const totalSubscribers =\n this.#positionSubscriberCount +\n this.#orderSubscriberCount +\n this.#accountSubscriberCount +\n this.#oiCapSubscriberCount;\n\n if (totalSubscribers <= 0) {\n // Cleanup webData3 subscription (covers all DEXs)\n if (this.#webData3Subscriptions.size > 0) {\n this.#webData3Subscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupSharedWebData3ISubscription',\n ),\n this.#getErrorContext(\n 'cleanupSharedWebData3ISubscription.webData3',\n {\n dex: dexName,\n },\n ),\n );\n });\n });\n this.#webData3Subscriptions.clear();\n this.#webData3SubscriptionPromise = undefined;\n }\n\n // Cleanup individual subscriptions (clearinghouseState + openOrders)\n if (this.#clearinghouseStateSubscriptions.size > 0) {\n this.#clearinghouseStateSubscriptions.forEach(\n (subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupSharedWebData3ISubscription',\n ),\n this.#getErrorContext(\n 'cleanupSharedWebData3ISubscription.clearinghouseState',\n {\n dex: dexName,\n },\n ),\n );\n });\n },\n );\n this.#clearinghouseStateSubscriptions.clear();\n }\n\n if (this.#openOrdersSubscriptions.size > 0) {\n this.#openOrdersSubscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupSharedWebData3ISubscription',\n ),\n this.#getErrorContext(\n 'cleanupSharedWebData3ISubscription.openOrders',\n {\n dex: dexName,\n },\n ),\n );\n });\n });\n this.#openOrdersSubscriptions.clear();\n }\n\n // Clear pending subscription promises (race condition prevention)\n this.#pendingClearinghouseSubscriptions.clear();\n this.#pendingOpenOrdersSubscriptions.clear();\n\n // Clear subscriber counts\n this.#positionSubscriberCount = 0;\n this.#orderSubscriberCount = 0;\n this.#accountSubscriberCount = 0;\n this.#oiCapSubscriberCount = 0;\n\n // Clear per-DEX caches\n this.#dexPositionsCache.clear();\n this.#dexOrdersCache.clear();\n this.#dexAccountCache.clear();\n\n // Clear DEX tracking for synchronized notifications\n this.#expectedDexs.clear();\n this.#initializedDexs.clear();\n\n // Clear aggregated caches\n this.#cachedPositions = null;\n this.#cachedOrders = null;\n this.#cachedAccount = null;\n this.#ordersCacheInitialized = false; // Reset cache initialization flag\n this.#positionsCacheInitialized = false; // Reset cache initialization flag\n\n // Clear hash caches\n this.#cachedPositionsHash = '';\n this.#cachedOrdersHash = '';\n this.#cachedAccountHash = '';\n\n this.#deps.debugLogger.log(\n 'All multi-DEX subscriptions cleaned up (webData2/3 + individual subscriptions)',\n );\n }\n }\n\n /**\n * Subscribe to live position updates with TP/SL data\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from position updates.\n */\n public subscribeToPositions(params: SubscribePositionsParams): () => void {\n const { callback, accountId } = params;\n const unsubscribe = this.#createSubscription(\n this.#positionSubscribers,\n callback,\n );\n\n // Increment position subscriber count\n this.#positionSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedPositions) {\n callback(this.#cachedPositions);\n }\n\n // Ensure shared subscription is active\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToPositions',\n ),\n this.#getErrorContext('subscribeToPositions'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#positionSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Subscribe to open interest cap updates\n * OI caps are extracted from webData2 subscription (zero additional overhead)\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from OI cap updates.\n */\n public subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n const { callback, accountId } = params;\n\n // Create subscription\n const unsubscribe = this.#createSubscription(\n this.#oiCapSubscribers,\n callback,\n );\n\n // Increment OI cap subscriber count\n this.#oiCapSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedOICaps) {\n callback(this.#cachedOICaps);\n }\n\n // Ensure webData3 subscription is active (OI caps come from webData3)\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.subscribeToOICaps'),\n this.#getErrorContext('subscribeToOICaps'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#oiCapSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Check if OI caps cache has been initialized\n * Useful for preventing UI flashing before first data arrives\n *\n * @returns True if the condition is met.\n */\n public isOICapsCacheInitialized(): boolean {\n return this.#oiCapsCacheInitialized;\n }\n\n /**\n * Subscribe to live order fill updates\n * Shares subscriptions per accountId to avoid duplicate WebSocket connections\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from order fill updates.\n */\n public subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n const { callback, accountId } = params;\n // Normalize accountId: undefined -> 'default' for Map key\n const normalizedAccountId = accountId ?? 'default';\n const unsubscribe = this.#createSubscription(\n this.#orderFillSubscribers,\n callback,\n normalizedAccountId,\n );\n\n // Ensure subscription is established for this accountId\n this.#ensureOrderFillISubscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderFills',\n ),\n this.#getErrorContext('subscribeToOrderFills'),\n );\n });\n\n return () => {\n unsubscribe();\n\n // If no more subscribers for this accountId, clean up subscription\n const subscribers = this.#orderFillSubscribers.get(normalizedAccountId);\n if (!subscribers || subscribers.size === 0) {\n const subscription =\n this.#orderFillSubscriptions.get(normalizedAccountId);\n if (subscription) {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderFills',\n ),\n this.#getErrorContext('subscribeToOrderFills.unsubscribe'),\n );\n });\n this.#orderFillSubscriptions.delete(normalizedAccountId);\n }\n }\n };\n }\n\n /**\n * Ensure order fill subscription is active for the given accountId\n * Shares subscription across all callbacks for the same accountId\n *\n * @param accountId - Optional CAIP account ID to subscribe for.\n * @returns A promise that resolves when the subscription is established.\n */\n async #ensureOrderFillISubscription(\n accountId?: CaipAccountId,\n ): Promise<void> {\n // Normalize accountId: undefined -> 'default' for Map key\n const normalizedAccountId = accountId ?? 'default';\n\n // If subscription already exists, no need to create another\n if (this.#orderFillSubscriptions.has(normalizedAccountId)) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const client = this.#clientService.getSubscriptionClient();\n if (!client) {\n throw new Error('SubscriptionClient not available');\n }\n await this.#ensureOrderFillISubscription(accountId);\n return;\n }\n\n const userAddress =\n await this.#walletService.getUserAddressWithDefault(accountId);\n\n // userFills returns a Promise<ISubscription>, need to await it\n const subscription = await subscriptionClient.userFills(\n { user: userAddress },\n (data: UserFillsWsEvent) => {\n // Build a Map for O(1) lookup instead of O(n) find per fill\n const orderMap = new Map<string, string>();\n if (this.#cachedOrders) {\n for (const order of this.#cachedOrders) {\n if (order.detailedOrderType) {\n orderMap.set(order.orderId, order.detailedOrderType);\n }\n }\n }\n const orderFills: OrderFill[] = data.fills.map((fill) => {\n const oid = fill.oid.toString();\n return {\n orderId: oid,\n symbol: fill.coin,\n side: fill.side,\n size: fill.sz,\n price: fill.px,\n fee: fill.fee,\n timestamp: fill.time,\n pnl: fill.closedPnl,\n direction: fill.dir,\n feeToken: fill.feeToken,\n startPosition: fill.startPosition,\n liquidation: fill.liquidation\n ? {\n liquidatedUser: fill.liquidation.liquidatedUser,\n markPx: fill.liquidation.markPx,\n method: fill.liquidation.method,\n }\n : undefined,\n detailedOrderType: orderMap.get(oid),\n };\n });\n\n // Cache fills for cache-first pattern (similar to price caching)\n // This allows getOrFetchFills() to return cached data without REST API calls\n if (data.isSnapshot) {\n // Snapshot: replace cache with initial historical data, sorted newest first\n this.#cachedFills = [...orderFills]\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, 100);\n this.#fillsCacheInitialized = true;\n } else {\n // Streaming: prepend new fills to existing (newest first)\n this.#cachedFills = [\n ...orderFills,\n ...(this.#cachedFills ?? []),\n ].slice(0, 100);\n }\n\n // Distribute to all callbacks for this accountId\n const subscribers = this.#orderFillSubscribers.get(normalizedAccountId);\n if (subscribers) {\n subscribers.forEach((callback) => {\n callback(orderFills, data.isSnapshot);\n });\n }\n },\n );\n\n this.#orderFillSubscriptions.set(normalizedAccountId, subscription);\n }\n\n /**\n * Subscribe to live order updates\n * Uses the shared webData2 subscription to avoid duplicate connections\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from order updates.\n */\n public subscribeToOrders(params: SubscribeOrdersParams): () => void {\n const { callback, accountId } = params;\n const unsubscribe = this.#createSubscription(\n this.#orderSubscribers,\n callback,\n );\n\n // Increment order subscriber count\n this.#orderSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedOrders) {\n callback(this.#cachedOrders);\n }\n\n // Ensure shared subscription is active\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.subscribeToOrders'),\n this.#getErrorContext('subscribeToOrders'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#orderSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Subscribe to live account updates\n * Uses the shared webData2 subscription to avoid duplicate connections\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from account updates.\n */\n public subscribeToAccount(params: SubscribeAccountParams): () => void {\n const { callback, accountId } = params;\n const unsubscribe = this.#createSubscription(\n this.#accountSubscribers,\n callback,\n );\n\n // Increment account subscriber count\n this.#accountSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedAccount) {\n callback(this.#cachedAccount);\n }\n\n // Ensure shared subscription is active (reuses existing connection)\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.subscribeToAccount'),\n this.#getErrorContext('subscribeToAccount'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#accountSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Check if orders cache has been initialized from WebSocket\n *\n * @returns true if WebSocket has sent at least one update, false otherwise\n */\n public isOrdersCacheInitialized(): boolean {\n return this.#ordersCacheInitialized;\n }\n\n /**\n * Check if positions cache has been initialized from WebSocket\n *\n * @returns true if WebSocket has sent at least one update, false otherwise\n */\n public isPositionsCacheInitialized(): boolean {\n return this.#positionsCacheInitialized;\n }\n\n /**\n * Get cached positions from WebSocket subscription\n *\n * @returns Cached positions array, or null if not initialized\n */\n public getCachedPositions(): Position[] | null {\n return this.#cachedPositions;\n }\n\n /**\n * Get cached orders from WebSocket subscription\n *\n * @returns Cached orders array, or null if not initialized\n */\n public getCachedOrders(): Order[] | null {\n return this.#cachedOrders;\n }\n\n /**\n * Atomically get cached orders if initialized\n * Prevents race condition between checking initialization and getting data\n *\n * @returns Cached orders array if initialized, null otherwise\n */\n public getOrdersCacheIfInitialized(): Order[] | null {\n if (!this.#ordersCacheInitialized) {\n return null;\n }\n return this.#cachedOrders ? [...this.#cachedOrders] : [];\n }\n\n /**\n * Get cached price for a symbol from WebSocket allMids subscription\n * OPTIMIZATION: Use this instead of REST infoClient.allMids() to avoid rate limiting\n *\n * @param symbol - Asset symbol (e.g., 'BTC', 'ETH', 'xyz:TSLA')\n * @returns Price string, or undefined if not cached\n */\n public getCachedPrice(symbol: string): string | undefined {\n return this.#cachedPriceData?.get(symbol)?.price;\n }\n\n public getLastAllMidsSnapshot(dex?: string): Record<string, string> | null {\n const dexKey = dex ?? '';\n const snapshot = this.#allMidsSnapshots.get(dexKey);\n if (!snapshot) {\n return null;\n }\n return { ...snapshot };\n }\n\n /**\n * Get cached fills from WebSocket userFills subscription\n * OPTIMIZATION: Use this instead of REST userFills() to avoid rate limiting\n *\n * @returns Copy of cached fills array, or null if not cached\n */\n public getCachedFills(): OrderFill[] | null {\n return this.#cachedFills ? [...this.#cachedFills] : null;\n }\n\n /**\n * Get cached fills only if the cache has been initialized from WebSocket\n * OPTIMIZATION: Distinguishes between \"not initialized\" (null) and \"initialized but empty\" ([])\n * - Returns null if cache hasn't received WebSocket snapshot yet (caller should use REST)\n * - Returns empty array [] if cache is initialized but user has no fills (caller can skip REST)\n * - Returns fills array if cache has data\n *\n * @returns Fills array or empty array if initialized, null if not yet initialized\n */\n public getFillsCacheIfInitialized(): OrderFill[] | null {\n if (!this.#fillsCacheInitialized) {\n return null;\n }\n return this.#cachedFills ? [...this.#cachedFills] : [];\n }\n\n /**\n * Create subscription with common error handling\n *\n * @param subscribers - The subscriber set or map to register the callback in.\n * @param callback - The callback function to invoke on updates.\n * @param key - Optional key for Map-based subscriber collections.\n * @returns A cleanup function to remove the subscription.\n */\n #createSubscription<TCallback>(\n subscribers: Set<TCallback> | Map<string, Set<TCallback>>,\n callback: TCallback,\n key?: string,\n ): () => void {\n if (subscribers instanceof Map && key) {\n if (!subscribers.has(key)) {\n subscribers.set(key, new Set());\n }\n subscribers.get(key)?.add(callback);\n } else if (subscribers instanceof Set) {\n subscribers.add(callback);\n }\n\n return () => {\n if (subscribers instanceof Map && key) {\n const set = subscribers.get(key);\n set?.delete(callback);\n if (set?.size === 0) {\n subscribers.delete(key);\n }\n } else if (subscribers instanceof Set) {\n subscribers.delete(callback);\n }\n };\n }\n\n /**\n * Helper function to create consolidated price updates with 24h change calculation\n *\n * @param symbol - The trading pair symbol.\n * @param price - The current price string.\n * @returns A consolidated price update object with change data.\n */\n #createPriceUpdate(symbol: string, price: string): PriceUpdate {\n const marketData = this.#marketDataCache.get(symbol);\n const orderBookData = this.#orderBookCache.get(symbol);\n const currentPrice = parseFloat(price);\n\n let percentChange24h: string | undefined;\n if (marketData?.prevDayPx !== undefined) {\n const change =\n ((currentPrice - marketData.prevDayPx) / marketData.prevDayPx) * 100;\n percentChange24h = change.toFixed(2);\n }\n\n // Check if any subscriber for this symbol wants market data\n const hasMarketDataSubscribers =\n this.#marketDataSubscribers.has(symbol) &&\n (this.#marketDataSubscribers.get(symbol)?.size ?? 0) > 0;\n\n const priceUpdate = {\n symbol,\n price, // This is the mid price from allMids\n timestamp: Date.now(),\n percentChange24h,\n // Add mark price from activeAssetCtx\n markPrice: marketData?.oraclePrice\n ? marketData.oraclePrice.toString()\n : undefined,\n // Add order book data if available\n bestBid: orderBookData?.bestBid,\n bestAsk: orderBookData?.bestAsk,\n spread: orderBookData?.spread,\n // Always include funding when available (don't default to 0, preserve undefined)\n funding: marketData?.funding,\n // Add market data only if requested by at least one subscriber\n openInterest: hasMarketDataSubscribers\n ? marketData?.openInterest\n : undefined,\n volume24h: hasMarketDataSubscribers ? marketData?.volume24h : undefined,\n };\n\n return priceUpdate;\n }\n\n /**\n * Ensure global allMids subscription is active (singleton pattern)\n */\n #ensureGlobalAllMidsSubscription(): void {\n // Check both the subscription AND the promise to prevent race conditions\n if (this.#globalAllMidsSubscription ?? this.#globalAllMidsPromise) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n return;\n }\n\n // Track WebSocket metrics\n const wsMetrics = {\n messagesReceived: 0,\n lastMessageTime: Date.now(),\n reconnectCount: 0,\n startTime: Date.now(),\n };\n\n // Store the promise immediately to prevent duplicate calls\n this.#globalAllMidsPromise = subscriptionClient\n .allMids((data: AllMidsWsEvent) => {\n wsMetrics.messagesReceived += 1;\n wsMetrics.lastMessageTime = Date.now();\n\n // Initialize cache if needed\n this.#cachedPriceData ??= new Map<string, PriceUpdate>();\n\n // Store raw snapshot for the main DEX so market fetches can reuse it without REST.\n this.#allMidsSnapshots.set('', data.mids as Record<string, string>);\n\n const subscribedSymbols = new Set<string>();\n\n // Collect all symbols that have subscribers\n for (const [\n symbol,\n subscriberSet,\n ] of this.#priceSubscribers.entries()) {\n if (subscriberSet.size > 0) {\n subscribedSymbols.add(symbol);\n }\n }\n\n // Track if any subscribed symbol was updated\n let hasUpdates = false;\n\n // Only process symbols that are actually subscribed to\n for (const symbol in data.mids) {\n // Skip if nobody is subscribed to this symbol\n if (!subscribedSymbols.has(symbol)) {\n continue;\n }\n\n const price = data.mids[symbol].toString();\n const cachedPrice = this.#cachedPriceData.get(symbol);\n\n // Skip if price hasn't changed\n if (cachedPrice?.price === price) {\n continue;\n }\n\n // Price changed or new symbol - update cache\n const priceUpdate = this.#createPriceUpdate(symbol, price);\n this.#cachedPriceData.set(symbol, priceUpdate);\n hasUpdates = true;\n }\n\n // Only notify subscribers if we actually have updates\n // This prevents unnecessary React re-renders when prices haven't changed\n if (hasUpdates) {\n this.#notifyAllPriceSubscribers();\n }\n })\n .then((sub) => {\n this.#globalAllMidsSubscription = sub;\n this.#deps.debugLogger.log(\n 'HyperLiquid: Global allMids subscription established',\n );\n\n // Notify existing subscribers with any cached data now that subscription is established\n if (this.#cachedPriceData && this.#cachedPriceData.size > 0) {\n this.#notifyAllPriceSubscribers();\n }\n return undefined;\n })\n .catch((error) => {\n // Clear the promise on error so it can be retried\n this.#globalAllMidsPromise = undefined;\n\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.ensureGlobalAllMidsSubscription',\n ),\n this.#getErrorContext('ensureGlobalAllMidsSubscription'),\n );\n });\n }\n\n /**\n * Ensure activeAssetCtx subscription for specific symbol (with reference counting)\n *\n * @param symbol - The trading pair symbol to subscribe to.\n */\n #ensureActiveAssetSubscription(symbol: string): void {\n // Increment subscriber count\n const currentCount = this.#symbolSubscriberCounts.get(symbol) ?? 0;\n this.#symbolSubscriberCounts.set(symbol, currentCount + 1);\n\n // If subscription already exists or is being created, just return\n if (\n this.#globalActiveAssetSubscriptions.has(symbol) ||\n this.#pendingActiveAssetPromises.has(symbol)\n ) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n return;\n }\n\n // Track metrics for this subscription\n const subscriptionMetrics = {\n messagesReceived: 0,\n startTime: Date.now(),\n };\n\n const promise = subscriptionClient\n .activeAssetCtx(\n { coin: symbol },\n (data: ActiveAssetCtxWsEvent | ActiveSpotAssetCtxWsEvent) => {\n subscriptionMetrics.messagesReceived += 1;\n\n if (data.coin === symbol && data.ctx) {\n // Type guard using SDK types: check if this is perps (has funding) or spot (no funding)\n const isPerpsContext = (\n event: ActiveAssetCtxWsEvent | ActiveSpotAssetCtxWsEvent,\n ): event is ActiveAssetCtxWsEvent =>\n hasProperty(event.ctx, 'funding') &&\n hasProperty(event.ctx, 'openInterest') &&\n hasProperty(event.ctx, 'oraclePx');\n\n const { ctx } = data;\n\n // Cache market data for consolidation with price updates\n const ctxPrice = ctx.midPx ?? ctx.markPx;\n const openInterestUSD =\n isPerpsContext(data) && ctxPrice\n ? calculateOpenInterestUSD(data.ctx.openInterest, ctxPrice)\n : NaN;\n const marketData = {\n prevDayPx: ctx.prevDayPx\n ? parseFloat(ctx.prevDayPx.toString())\n : undefined,\n // Cache funding rate from activeAssetCtx for real-time updates\n // SDK defines funding as string (not nullable) in ActiveAssetCtxEvent\n funding: isPerpsContext(data)\n ? parseFloat(data.ctx.funding.toString())\n : undefined,\n openInterest: isNaN(openInterestUSD)\n ? undefined\n : openInterestUSD,\n volume24h: ctx.dayNtlVlm\n ? parseFloat(ctx.dayNtlVlm.toString())\n : undefined,\n oraclePrice: isPerpsContext(data)\n ? parseFloat(data.ctx.oraclePx.toString())\n : undefined,\n lastUpdated: Date.now(),\n };\n\n this.#marketDataCache.set(symbol, marketData);\n\n // Update cached price data with new 24h change if we have current price\n const currentCachedPrice = this.#cachedPriceData?.get(symbol);\n if (currentCachedPrice) {\n const updatedPrice = this.#createPriceUpdate(\n symbol,\n currentCachedPrice.price,\n );\n\n this.#cachedPriceData ??= new Map<string, PriceUpdate>();\n this.#cachedPriceData.set(symbol, updatedPrice);\n this.#notifyAllPriceSubscribers();\n }\n }\n },\n )\n .then((sub) => {\n // Only clear pending ref if this is still the current promise.\n // A rapid away-and-back can replace the pending promise; blindly\n // deleting would remove the *newer* reference (#28141).\n if (this.#pendingActiveAssetPromises.get(symbol) === promise) {\n this.#pendingActiveAssetPromises.delete(symbol);\n }\n // Stale subscription: cleanup was called while pending, a newer\n // subscription already won the race, OR a different pending promise\n // exists (rapid away-and-back before this one resolved). (#28141)\n if (\n (this.#symbolSubscriberCounts.get(symbol) ?? 0) <= 0 ||\n this.#globalActiveAssetSubscriptions.has(symbol) ||\n this.#pendingActiveAssetPromises.has(symbol)\n ) {\n return sub.unsubscribe();\n }\n this.#globalActiveAssetSubscriptions.set(symbol, sub);\n this.#deps.debugLogger.log(\n `HyperLiquid: Market data subscription established for ${symbol}`,\n );\n return undefined;\n })\n .catch((error) => {\n if (this.#pendingActiveAssetPromises.get(symbol) === promise) {\n this.#pendingActiveAssetPromises.delete(symbol);\n }\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.ensureActiveAssetSubscription',\n ),\n this.#getErrorContext('ensureActiveAssetSubscription', { symbol }),\n );\n });\n\n this.#pendingActiveAssetPromises.set(symbol, promise);\n }\n\n /**\n * Cleanup activeAssetCtx subscription when no longer needed\n *\n * @param symbol - The trading pair symbol to clean up.\n */\n #cleanupActiveAssetSubscription(symbol: string): void {\n const currentCount = this.#symbolSubscriberCounts.get(symbol) ?? 0;\n if (currentCount <= 1) {\n // Last subscriber, cleanup subscription\n this.#symbolSubscriberCounts.delete(symbol);\n\n const subscription = this.#globalActiveAssetSubscriptions.get(symbol);\n if (subscription && typeof subscription.unsubscribe === 'function') {\n const unsubscribeResult = Promise.resolve(subscription.unsubscribe());\n\n unsubscribeResult.catch(() => {\n // Ignore errors during cleanup\n });\n this.#globalActiveAssetSubscriptions.delete(symbol);\n } else if (subscription) {\n // Subscription exists but unsubscribe is not a function or doesn't return a Promise\n // Just clean up the reference\n this.#globalActiveAssetSubscriptions.delete(symbol);\n }\n\n // If subscription is still pending (async), the .then() handler in\n // #ensureActiveAssetSubscription will check symbolSubscriberCounts\n // and unsubscribe immediately when it resolves (#28141)\n // Clean up the pending promise reference\n this.#pendingActiveAssetPromises.delete(symbol);\n } else {\n // Still has subscribers, just decrement count\n this.#symbolSubscriberCounts.set(symbol, currentCount - 1);\n }\n }\n\n /**\n * Ensure assetCtxs subscription for specific DEX (HIP-3 support)\n * Uses WebSocket instead of REST polling for market data\n * Implements reference counting to track active subscribers per DEX\n *\n * @param dex - The DEX identifier (empty string for main DEX).\n * @param options - Subscription behavior overrides.\n * @param options.incrementRefCount - Skip incrementing when restoring existing subscribers after reconnect.\n */\n async #ensureAssetCtxsSubscription(\n dex: string,\n options: { incrementRefCount?: boolean } = {},\n ): Promise<void> {\n const dexKey = dex || '';\n const { incrementRefCount = true } = options;\n\n if (incrementRefCount) {\n const currentCount = this.#dexSubscriberCounts.get(dexKey) ?? 0;\n this.#dexSubscriberCounts.set(dexKey, currentCount + 1);\n }\n\n // Return if subscription already exists\n if (this.#assetCtxsSubscriptions.has(dexKey)) {\n return;\n }\n\n let promise = this.#assetCtxsSubscriptionPromises.get(dexKey);\n if (!promise) {\n promise = this.#createAssetCtxsSubscription(dex);\n this.#assetCtxsSubscriptionPromises.set(dexKey, promise);\n }\n\n try {\n await promise;\n } catch (error) {\n if (this.#assetCtxsSubscriptionPromises.get(dexKey) === promise) {\n this.#assetCtxsSubscriptionPromises.delete(dexKey);\n }\n if (incrementRefCount) {\n const currentCount = this.#dexSubscriberCounts.get(dexKey) ?? 0;\n if (currentCount <= 1) {\n this.#dexSubscriberCounts.delete(dexKey);\n } else {\n this.#dexSubscriberCounts.set(dexKey, currentCount - 1);\n }\n }\n throw error;\n }\n }\n\n /**\n * Ensure a per-DEX allMids WS subscription exists (singleton per DEX).\n * Mirrors the assetCtxs subscription dedup pattern and is used only for HIP-3 DEXs.\n *\n * @param dex - The HIP-3 DEX name.\n */\n async #ensureDexAllMidsSubscription(dex: string): Promise<void> {\n if (!dex) {\n return;\n }\n\n if (this.#dexAllMidsSubscriptions.has(dex)) {\n return;\n }\n\n if (this.#dexAllMidsSubscriptionPromises.has(dex)) {\n await this.#dexAllMidsSubscriptionPromises.get(dex);\n return;\n }\n\n const promise = this.#createDexAllMidsSubscription(dex);\n this.#dexAllMidsSubscriptionPromises.set(dex, promise);\n\n try {\n await promise;\n } catch (error) {\n this.#dexAllMidsSubscriptionPromises.delete(dex);\n throw error;\n }\n }\n\n /**\n * Create allMids WS subscription for a specific HIP-3 DEX.\n *\n * @param dex - The HIP-3 DEX name.\n */\n async #createDexAllMidsSubscription(dex: string): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n return new Promise<void>((resolve, reject) => {\n subscriptionClient\n .allMids({ dex }, (data: AllMidsWsEvent) => {\n this.#allMidsSnapshots.set(dex, data.mids as Record<string, string>);\n })\n .then((sub) => {\n // If a newer subscription already won the race, discard this one (#28141)\n if (this.#dexAllMidsSubscriptions.has(dex)) {\n resolve();\n return sub.unsubscribe();\n }\n this.#dexAllMidsSubscriptions.set(dex, sub);\n this.#deps.debugLogger.log(\n `allMids subscription established for DEX: ${dex}`,\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createDexAllMidsSubscription',\n ),\n this.#getErrorContext('createDexAllMidsSubscription', { dex }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createDexAllMidsSubscription',\n ),\n );\n });\n });\n }\n\n /**\n * Create assetCtxs subscription for specific DEX\n * Provides real-time market data for all assets on the DEX\n *\n * Performance: Uses cached meta from dexMetaCache (populated by metaAndAssetCtxs)\n * to avoid redundant meta() API calls during subscription setup\n *\n * @param dex - The DEX identifier (empty string for main DEX).\n */\n async #createAssetCtxsSubscription(dex: string): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n const dexKey = dex || '';\n const dexIdentifier = dex ?? 'main DEX';\n\n // Check cache first - populated by metaAndAssetCtxs in ensureAssetCtxsSubscription\n let perpsMeta = this.#dexMetaCache.get(dexKey);\n\n if (!perpsMeta) {\n // Fallback: fetch meta if not in cache (shouldn't happen in normal flow)\n this.#deps.debugLogger.log(\n `Meta cache miss for ${dexIdentifier}, fetching from API`,\n );\n const infoClient = this.#clientService.getInfoClient();\n const fetchedMeta = await infoClient.meta({ dex: dex || undefined });\n if (fetchedMeta?.universe) {\n perpsMeta = fetchedMeta;\n this.#dexMetaCache.set(dexKey, fetchedMeta);\n }\n }\n\n if (!perpsMeta?.universe) {\n const errorMessage = `No universe data available for ${dexIdentifier}`;\n throw new Error(errorMessage);\n }\n\n // Capture narrowed perpsMeta in a const for use inside closures\n const validatedMeta = perpsMeta;\n\n this.#deps.debugLogger.log(\n `Using ${this.#dexMetaCache.has(dexKey) ? 'cached' : 'fetched'} meta for ${dexIdentifier}`,\n {\n dex,\n universeCount: validatedMeta.universe.length,\n firstAssetSample: validatedMeta.universe[0]?.name,\n },\n );\n\n return new Promise<void>((resolve, reject) => {\n const subscriptionParams = dex ? { dex } : {};\n const handleAssetCtxsUpdate = (data: AssetCtxsWsEvent): void => {\n // Cache asset contexts for this DEX\n this.#dexAssetCtxsCache.set(dexKey, data.ctxs);\n\n // Use cached meta to map ctxs array indices to symbols (no REST API call!)\n validatedMeta.universe.forEach((asset, index) => {\n const ctx = data.ctxs[index];\n if (ctx && hasProperty(ctx, 'funding')) {\n // This is a perps context\n const ctxPrice = ctx.midPx ?? ctx.markPx;\n const openInterestUSD = calculateOpenInterestUSD(\n ctx.openInterest,\n ctxPrice,\n );\n const marketData = {\n prevDayPx: ctx.prevDayPx\n ? parseFloat(ctx.prevDayPx.toString())\n : undefined,\n funding: parseFloat(ctx.funding.toString()),\n openInterest: isNaN(openInterestUSD)\n ? undefined\n : openInterestUSD,\n volume24h: ctx.dayNtlVlm\n ? parseFloat(ctx.dayNtlVlm.toString())\n : undefined,\n oraclePrice: parseFloat(ctx.oraclePx.toString()),\n lastUpdated: Date.now(),\n };\n\n this.#marketDataCache.set(asset.name, marketData);\n\n // HIP-3: Extract price from assetCtx and update cached prices\n const price = ctx.midPx?.toString() ?? ctx.markPx?.toString();\n if (price) {\n // For HIP-3 DEXs, meta() returns asset.name already containing the DEX prefix\n // (e.g., \"xyz:XYZ100\"), so use it directly\n const symbol = asset.name;\n const priceUpdate = this.#createPriceUpdate(symbol, price);\n this.#cachedPriceData ??= new Map<string, PriceUpdate>();\n this.#cachedPriceData.set(symbol, priceUpdate);\n }\n }\n });\n\n // Notify price subscribers with updated market data\n this.#notifyAllPriceSubscribers();\n };\n\n const subscribeWithRetry = async (): Promise<ISubscription> => {\n const maxAttempts = 3;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await subscriptionClient.assetCtxs(\n subscriptionParams,\n handleAssetCtxsUpdate,\n );\n } catch (error) {\n const ensuredError = ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n );\n const isLastAttempt = attempt === maxAttempts;\n if (\n isLastAttempt ||\n !this.#isTransientAssetCtxsError(ensuredError)\n ) {\n throw ensuredError;\n }\n\n const retryDelayMs = attempt * 500;\n this.#deps.debugLogger.log(\n 'Transient assetCtxs subscription failure during reconnect, retrying',\n {\n dex: dexKey || 'main',\n attempt,\n retryDelayMs,\n error: ensuredError.message,\n },\n );\n await new Promise((_resolve) => setTimeout(_resolve, retryDelayMs));\n }\n }\n\n throw new Error(\n `Failed to establish assetCtxs subscription for ${dexIdentifier}`,\n );\n };\n\n subscribeWithRetry()\n .then((sub) => {\n // If a newer subscription already won the race, discard this one (#28141)\n if (this.#assetCtxsSubscriptions.has(dexKey)) {\n resolve();\n return sub.unsubscribe();\n }\n this.#assetCtxsSubscriptions.set(dexKey, sub);\n this.#deps.debugLogger.log(\n `assetCtxs subscription established for ${\n dex ? `DEX: ${dex}` : 'main DEX'\n }`,\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n ),\n this.#getErrorContext('createAssetCtxsSubscription', { dex }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n ),\n );\n });\n });\n }\n\n /**\n * Cleanup assetCtxs subscription for specific DEX with reference counting\n * Only unsubscribes when the last subscriber for this DEX is removed\n *\n * @param dex - The DEX identifier (empty string for main DEX).\n */\n #cleanupAssetCtxsSubscription(dex: string): void {\n const dexKey = dex || '';\n\n // Decrement subscriber count for this DEX\n const currentCount = this.#dexSubscriberCounts.get(dexKey) ?? 0;\n\n if (currentCount <= 1) {\n // Last subscriber - cleanup the subscription\n const subscription = this.#assetCtxsSubscriptions.get(dexKey);\n const allMidsSubscription = dex\n ? this.#dexAllMidsSubscriptions.get(dex)\n : undefined;\n\n if (subscription) {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupAssetCtxsSubscription',\n ),\n this.#getErrorContext('cleanupAssetCtxsSubscription', { dex }),\n );\n });\n }\n\n if (allMidsSubscription) {\n allMidsSubscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupDexAllMidsSubscription',\n ),\n this.#getErrorContext('cleanupDexAllMidsSubscription', { dex }),\n );\n });\n }\n\n this.#assetCtxsSubscriptions.delete(dexKey);\n this.#dexAssetCtxsCache.delete(dexKey);\n this.#assetCtxsSubscriptionPromises.delete(dexKey);\n this.#dexSubscriberCounts.delete(dexKey);\n\n if (dex) {\n this.#dexAllMidsSubscriptions.delete(dex);\n this.#dexAllMidsSubscriptionPromises.delete(dex);\n this.#allMidsSnapshots.delete(dex);\n }\n\n this.#deps.debugLogger.log(\n `Cleaned up assetCtxs subscription for ${\n dex ? `DEX: ${dex}` : 'main DEX'\n }`,\n );\n } else {\n // Still has subscribers - just decrement count\n this.#dexSubscriberCounts.set(dexKey, currentCount - 1);\n }\n }\n\n /**\n * Ensure BBO subscription for specific symbol (singleton)\n *\n * BBO provides best bid/ask without being affected by L2Book aggregation parameters,\n * keeping spread consistent across order book grouping selections (matches Hyperliquid UI).\n *\n * @param symbol - The trading pair symbol to subscribe to BBO for.\n */\n #ensureBboSubscription(symbol: string): void {\n // Skip if subscription already exists or is being created\n if (\n this.#globalBboSubscriptions.has(symbol) ||\n this.#pendingBboPromises.has(symbol)\n ) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n return;\n }\n\n const promise = subscriptionClient\n .bbo({ coin: symbol }, (data: BboWsEvent) => {\n processBboData({\n symbol,\n data,\n orderBookCache: this.#orderBookCache,\n cachedPriceData: this.#cachedPriceData,\n createPriceUpdate: this.#createPriceUpdate.bind(this),\n notifySubscribers: this.#notifyAllPriceSubscribers.bind(this),\n });\n })\n .then((sub) => {\n // Only clear pending ref if this is still the current promise (#28141).\n if (this.#pendingBboPromises.get(symbol) === promise) {\n this.#pendingBboPromises.delete(symbol);\n }\n // Stale subscription: cleanup was called while pending, a newer\n // subscription already won the race, OR a different pending promise\n // exists (rapid away-and-back before this one resolved). (#28141)\n if (\n (this.#orderBookSubscribers.get(symbol)?.size ?? 0) <= 0 ||\n this.#globalBboSubscriptions.has(symbol) ||\n this.#pendingBboPromises.has(symbol)\n ) {\n return sub.unsubscribe();\n }\n this.#globalBboSubscriptions.set(symbol, sub);\n this.#deps.debugLogger.log(\n `HyperLiquid: BBO subscription established for ${symbol}`,\n );\n return undefined;\n })\n .catch((error) => {\n if (this.#pendingBboPromises.get(symbol) === promise) {\n this.#pendingBboPromises.delete(symbol);\n }\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.ensureBboSubscription',\n ),\n this.#getErrorContext('ensureBboSubscription', { symbol }),\n );\n });\n\n this.#pendingBboPromises.set(symbol, promise);\n }\n\n /**\n * Cleanup BBO subscription when no longer needed\n *\n * @param symbol - The trading pair symbol.\n */\n #cleanupBboSubscription(symbol: string): void {\n // If anyone still wants order book (top-of-book) data for this symbol, keep the subscription alive.\n if ((this.#orderBookSubscribers.get(symbol)?.size ?? 0) > 0) {\n return;\n }\n\n const subscription = this.#globalBboSubscriptions.get(symbol);\n if (subscription && typeof subscription.unsubscribe === 'function') {\n const unsubscribeResult = Promise.resolve(subscription.unsubscribe());\n unsubscribeResult.catch(() => {\n // Ignore errors during cleanup\n });\n\n this.#globalBboSubscriptions.delete(symbol);\n this.#orderBookCache.delete(symbol);\n } else if (subscription) {\n // Subscription exists but unsubscribe is not a function or doesn't return a Promise\n // Just clean up the reference\n this.#globalBboSubscriptions.delete(symbol);\n this.#orderBookCache.delete(symbol);\n }\n\n // If subscription is still pending (async), the .then() handler in\n // #ensureBboSubscription will check orderBookSubscribers and\n // unsubscribe immediately when it resolves (#28141)\n this.#pendingBboPromises.delete(symbol);\n }\n\n /**\n * Subscribe to full order book updates with multiple depth levels\n * Creates a dedicated L2Book subscription for the requested symbol\n * and processes data into OrderBookData format for UI consumption\n *\n * @param params - Subscription parameters\n * @returns Cleanup function to unsubscribe\n */\n public subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n const {\n symbol,\n levels = 10,\n nSigFigs = 5,\n mantissa,\n callback,\n onError,\n } = params;\n\n this.#clientService\n .ensureSubscriptionClient(this.#walletService.createWalletAdapter())\n .catch(() => {\n // Handled by getSubscriptionClient check below\n });\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n const error = new Error('Subscription client not available');\n onError?.(error);\n this.#deps.debugLogger.log(\n 'subscribeToOrderBook: Subscription client not available',\n );\n return () => {\n // No-op cleanup\n };\n }\n\n let subscription: ISubscription | undefined;\n let cancelled = false;\n\n subscriptionClient\n .l2Book({ coin: symbol, nSigFigs, mantissa }, (data: L2BookResponse) => {\n if (cancelled || data?.coin !== symbol || !data?.levels) {\n return;\n }\n\n const orderBookData = this.#processOrderBookData(data, levels);\n callback(orderBookData);\n })\n .then(async (sub) => {\n if (cancelled) {\n try {\n await sub.unsubscribe();\n } catch (unsubError: unknown) {\n this.#logErrorUnlessClearing(\n ensureError(\n unsubError,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n this.#getErrorContext('subscribeToOrderBook.cleanup', { symbol }),\n );\n }\n return undefined;\n }\n subscription = sub;\n this.#deps.debugLogger.log(\n `HyperLiquid: Order book subscription established for ${symbol}`,\n );\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n this.#getErrorContext('subscribeToOrderBook', { symbol }),\n );\n onError?.(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n );\n });\n\n return () => {\n cancelled = true;\n if (subscription) {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n this.#getErrorContext('subscribeToOrderBook.unsubscribe', {\n symbol,\n }),\n );\n });\n }\n };\n }\n\n /**\n * Process raw L2Book data into OrderBookData format\n * Calculates cumulative totals, notional values, and spread metrics\n *\n * @param data - Raw L2Book response from WebSocket\n * @param levels - Number of levels to return per side\n * @returns Processed OrderBookData\n */\n #processOrderBookData(data: L2BookResponse, levels: number): OrderBookData {\n const bidsRaw = data?.levels?.[0] ?? [];\n const asksRaw = data?.levels?.[1] ?? [];\n\n // Process bids (buy orders) - highest price first\n let bidCumulativeSize = 0;\n let bidCumulativeNotional = 0;\n const bids: OrderBookLevel[] = bidsRaw.slice(0, levels).map((level) => {\n const price = parseFloat(level.px);\n const size = parseFloat(level.sz);\n const notional = price * size;\n bidCumulativeSize += size;\n bidCumulativeNotional += notional;\n\n return {\n price: level.px,\n size: level.sz,\n total: bidCumulativeSize.toString(),\n notional: notional.toFixed(2),\n totalNotional: bidCumulativeNotional.toFixed(2),\n };\n });\n\n // Process asks (sell orders) - lowest price first\n let askCumulativeSize = 0;\n let askCumulativeNotional = 0;\n const asks: OrderBookLevel[] = asksRaw.slice(0, levels).map((level) => {\n const price = parseFloat(level.px);\n const size = parseFloat(level.sz);\n const notional = price * size;\n askCumulativeSize += size;\n askCumulativeNotional += notional;\n\n return {\n price: level.px,\n size: level.sz,\n total: askCumulativeSize.toString(),\n notional: notional.toFixed(2),\n totalNotional: askCumulativeNotional.toFixed(2),\n };\n });\n\n // Calculate spread and mid price\n const bestBid = bids[0];\n const bestAsk = asks[0];\n const bidPrice = bestBid ? parseFloat(bestBid.price) : 0;\n const askPrice = bestAsk ? parseFloat(bestAsk.price) : 0;\n const spread = askPrice > 0 && bidPrice > 0 ? askPrice - bidPrice : 0;\n const midPrice =\n askPrice > 0 && bidPrice > 0 ? (askPrice + bidPrice) / 2 : 0;\n const spreadPercentage =\n midPrice > 0 ? ((spread / midPrice) * 100).toFixed(4) : '0';\n\n // Calculate max total for depth chart scaling\n const maxTotal = Math.max(bidCumulativeSize, askCumulativeSize).toString();\n\n return {\n bids,\n asks,\n spread: spread.toFixed(5),\n spreadPercentage,\n midPrice: midPrice.toFixed(5),\n lastUpdated: Date.now(),\n maxTotal,\n };\n }\n\n /**\n * Notify all price subscribers with their requested symbols from cache\n * Optimized to batch updates per subscriber\n */\n #notifyAllPriceSubscribers(): void {\n // If no price data exists yet, don't notify\n if (!this.#cachedPriceData) {\n return;\n }\n\n const priceData = this.#cachedPriceData;\n\n // Group updates by subscriber to batch notifications\n const subscriberUpdates = new Map<\n (prices: PriceUpdate[]) => void,\n PriceUpdate[]\n >();\n\n this.#priceSubscribers.forEach((subscriberSet, symbol) => {\n const priceUpdate = priceData.get(symbol);\n if (priceUpdate) {\n subscriberSet.forEach((callback) => {\n if (!subscriberUpdates.has(callback)) {\n subscriberUpdates.set(callback, []);\n }\n const updates = subscriberUpdates.get(callback);\n if (updates) {\n updates.push(priceUpdate);\n }\n });\n }\n });\n\n // Send batched updates to each subscriber\n subscriberUpdates.forEach((updates, callback) => {\n if (updates.length > 0) {\n callback(updates);\n }\n });\n }\n\n /**\n * Restore all active subscriptions after WebSocket reconnection\n * Re-establishes WebSocket subscriptions for all active subscribers\n *\n * IMPORTANT: This method verifies transport readiness before attempting\n * any subscriptions to prevent \"subscribe error: undefined\" errors.\n */\n public async restoreSubscriptions(): Promise<void> {\n // CRITICAL: Verify transport is ready before attempting any subscriptions\n // This prevents race conditions where subscriptions are attempted while\n // the WebSocket is still in CONNECTING state\n try {\n await this.#clientService.ensureTransportReady({ timeoutMs: 5000 });\n } catch (error) {\n this.#deps.debugLogger.log(\n 'Transport not ready during subscription restore, will retry on next reconnect',\n { error: error instanceof Error ? error.message : String(error) },\n );\n return;\n }\n\n // Re-establish global allMids subscription if there are price subscribers\n if (this.#priceSubscribers.size > 0) {\n // Clear existing subscription reference (it's dead after reconnection)\n this.#globalAllMidsSubscription = undefined;\n this.#globalAllMidsPromise = undefined;\n\n // Re-establish the subscription\n this.#ensureGlobalAllMidsSubscription();\n }\n\n // Re-establish order fill subscriptions if there are fill subscribers\n if (this.#orderFillSubscribers.size > 0) {\n // Clear existing subscription references (they're dead after reconnection)\n this.#orderFillSubscriptions.clear();\n\n // Re-establish subscriptions for all accountIds with subscribers\n // Note: normalizedAccountId is 'default' for undefined, need to convert back\n const normalizedAccountIds = Array.from(\n this.#orderFillSubscribers.keys(),\n );\n await Promise.all(\n normalizedAccountIds.map((normalizedAccountId) => {\n // Convert normalized key back to original accountId (undefined if 'default')\n const accountId =\n normalizedAccountId === 'default'\n ? undefined\n : (normalizedAccountId as CaipAccountId);\n return this.#ensureOrderFillISubscription(accountId).catch(() => {\n // Ignore errors during order fill subscription restoration\n });\n }),\n );\n }\n\n // Re-establish user data subscriptions if there are user data subscribers\n if (\n this.#positionSubscribers.size > 0 ||\n this.#orderSubscribers.size > 0 ||\n this.#accountSubscribers.size > 0 ||\n this.#oiCapSubscribers.size > 0\n ) {\n // Clear existing subscription references (they're dead after reconnection)\n this.#webData3Subscriptions.clear();\n this.#webData3SubscriptionPromise = undefined;\n\n // Clear individual subscriptions (clearinghouseState + openOrders) for HIP-3 mode\n this.#clearinghouseStateSubscriptions.clear();\n this.#openOrdersSubscriptions.clear();\n\n // Re-establish the subscription (will use current account)\n // This will set up webData2 for non-HIP-3, or individual subscriptions + webData3 (OI caps only) for HIP-3\n await this.#ensureSharedWebData3Subscription();\n }\n\n // Re-establish activeAsset subscriptions if there are market data subscribers\n if (this.#marketDataSubscribers.size > 0) {\n // Clear existing subscriptions (they're dead after reconnection)\n this.#globalActiveAssetSubscriptions.clear();\n this.#pendingActiveAssetPromises.clear();\n // Clear reference counts to prevent double-counting after reconnection\n this.#symbolSubscriberCounts.clear();\n\n // Re-establish subscriptions for all symbols with market data subscribers\n const symbolsNeedingMarketData = Array.from(\n this.#marketDataSubscribers.keys(),\n );\n symbolsNeedingMarketData.forEach((symbol) => {\n this.#ensureActiveAssetSubscription(symbol);\n });\n }\n\n // Re-establish BBO subscriptions if there are order book subscribers\n if (this.#orderBookSubscribers.size > 0) {\n // Clear existing subscriptions (they're dead after reconnection)\n this.#globalBboSubscriptions.clear();\n this.#pendingBboPromises.clear();\n\n // Re-establish subscriptions for all symbols with order book subscribers\n const symbolsNeedingOrderBook = Array.from(\n this.#orderBookSubscribers.keys(),\n );\n symbolsNeedingOrderBook.forEach((symbol) => {\n this.#ensureBboSubscription(symbol);\n });\n }\n\n // Re-establish assetCtxs subscriptions if there are market data subscribers\n if (this.#marketDataSubscribers.size > 0) {\n // Clear existing subscriptions (they're dead after reconnection)\n this.#assetCtxsSubscriptions.clear();\n this.#assetCtxsSubscriptionPromises.clear();\n this.#dexAllMidsSubscriptions.clear();\n this.#dexAllMidsSubscriptionPromises.clear();\n\n // Re-establish subscriptions for all DEXs with market data subscribers\n const dexsNeeded = new Set<string>();\n this.#marketDataSubscribers.forEach((_subscribers, symbol) => {\n const { dex } = parseAssetName(symbol);\n if (dex) {\n dexsNeeded.add(dex);\n }\n });\n\n // Add main DEX if any main DEX symbols have subscribers\n const hasMainDexSubscribers = Array.from(\n this.#marketDataSubscribers.keys(),\n ).some((symbol) => {\n const { dex } = parseAssetName(symbol);\n return !dex;\n });\n if (hasMainDexSubscribers) {\n dexsNeeded.add('');\n }\n\n const marketDataRestoreOperations = Array.from(dexsNeeded).flatMap(\n (dex) => {\n const operations: {\n dex: string;\n kind: 'assetCtxs' | 'allMids';\n promise: Promise<void>;\n }[] = [\n {\n dex,\n kind: 'assetCtxs',\n promise: this.#ensureAssetCtxsSubscription(dex, {\n incrementRefCount: false,\n }),\n },\n ];\n\n if (dex) {\n operations.push({\n dex,\n kind: 'allMids',\n promise: this.#ensureDexAllMidsSubscription(dex),\n });\n }\n\n return operations;\n },\n );\n\n const marketDataRestoreResults = await Promise.allSettled(\n marketDataRestoreOperations.map(({ promise }) => promise),\n );\n const marketDataRestoreFailures = marketDataRestoreResults.flatMap(\n (result, index) => {\n if (result.status === 'fulfilled') {\n return [];\n }\n\n const operation = marketDataRestoreOperations[index];\n return [\n {\n ...operation,\n error: ensureError(\n result.reason,\n 'HyperLiquidSubscriptionService.restoreSubscriptions',\n ),\n },\n ];\n },\n );\n\n if (marketDataRestoreFailures.length > 0) {\n marketDataRestoreFailures.forEach(({ dex, kind }) => {\n this.#scheduleRestoreRetry(dex, kind);\n });\n\n this.#logErrorUnlessClearing(\n new Error(\n `Failed to restore ${marketDataRestoreFailures.length} market data subscriptions`,\n ),\n this.#getErrorContext('restoreSubscriptions.marketData', {\n failures: marketDataRestoreFailures.map(\n ({ dex, kind, error }) =>\n `${kind}:${dex || 'main'}:${error.message}`,\n ),\n }),\n );\n }\n }\n }\n\n /**\n * Clear all subscriptions and cached data (multi-DEX support)\n */\n public clearAll(): void {\n // Suppress error logging for pending unsubscribe requests during intentional disconnect.\n // The WebSocket will be closed after this, causing pending unsubscribe promises to reject\n // with WebSocketRequestError - these are expected and should not be logged to Sentry.\n this.#isClearing = true;\n\n // Clear all local subscriber collections\n this.#priceSubscribers.clear();\n this.#positionSubscribers.clear();\n this.#orderFillSubscribers.clear();\n this.#orderSubscribers.clear();\n this.#accountSubscribers.clear();\n this.#marketDataSubscribers.clear();\n this.#orderBookSubscribers.clear();\n\n // Clear order fill subscriptions\n this.#orderFillSubscriptions.forEach((subscription) => {\n subscription.unsubscribe().catch(() => {\n // Ignore errors during cleanup\n });\n });\n this.#orderFillSubscriptions.clear();\n\n // Clear cached data\n this.#cachedPriceData = null;\n this.#allMidsSnapshots.clear();\n this.#cachedPositions = null;\n this.#cachedOrders = null;\n this.#cachedAccount = null;\n this.#cachedFills = null;\n this.#ordersCacheInitialized = false; // Reset cache initialization flag\n this.#positionsCacheInitialized = false; // Reset cache initialization flag\n this.#fillsCacheInitialized = false; // Reset fills cache initialization flag\n this.#marketDataCache.clear();\n this.#orderBookCache.clear();\n this.#symbolSubscriberCounts.clear();\n this.#dexSubscriberCounts.clear();\n\n // Clear hash caches\n this.#cachedPositionsHash = '';\n this.#cachedOrdersHash = '';\n this.#cachedAccountHash = '';\n\n // Clear multi-DEX caches\n this.#deps.debugLogger.log(\n 'HyperLiquidSubscriptionService: Clearing per-DEX caches',\n {\n dexPositionsCacheSize: this.#dexPositionsCache.size,\n dexOrdersCacheSize: this.#dexOrdersCache.size,\n dexAccountCacheSize: this.#dexAccountCache.size,\n dexAssetCtxsCacheSize: this.#dexAssetCtxsCache.size,\n dexPositionsCacheKeys: Array.from(this.#dexPositionsCache.keys()),\n dexAssetCtxsCacheKeys: Array.from(this.#dexAssetCtxsCache.keys()),\n },\n );\n\n this.#dexPositionsCache.clear();\n this.#dexOrdersCache.clear();\n this.#dexAccountCache.clear();\n this.#dexAssetCtxsCache.clear();\n\n // Clear subscription references (actual cleanup handled by client service)\n this.#globalAllMidsSubscription = undefined;\n this.#globalAllMidsPromise = undefined;\n this.#globalActiveAssetSubscriptions.clear();\n this.#pendingActiveAssetPromises.clear();\n this.#globalBboSubscriptions.clear();\n this.#pendingBboPromises.clear();\n this.#webData3Subscriptions.clear();\n this.#webData3SubscriptionPromise = undefined;\n\n // HIP-3: Clear assetCtxs subscriptions (clearinghouseState no longer needed with webData3)\n this.#assetCtxsSubscriptions.clear();\n this.#assetCtxsSubscriptionPromises.clear();\n\n // HIP-3: Clear per-DEX allMids subscriptions\n this.#dexAllMidsSubscriptions.clear();\n this.#dexAllMidsSubscriptionPromises.clear();\n\n this.#restoreRetryTimeouts.forEach((timeoutId) => {\n clearTimeout(timeoutId);\n });\n this.#restoreRetryTimeouts.clear();\n\n // Cleanup individual subscriptions (clearinghouseState + openOrders)\n if (this.#clearinghouseStateSubscriptions.size > 0) {\n this.#clearinghouseStateSubscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.clearAll'),\n this.#getErrorContext('clearAll.clearinghouseState', {\n dex: dexName,\n }),\n );\n });\n });\n this.#clearinghouseStateSubscriptions.clear();\n }\n\n if (this.#openOrdersSubscriptions.size > 0) {\n this.#openOrdersSubscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.clearAll'),\n this.#getErrorContext('clearAll.openOrders', {\n dex: dexName,\n }),\n );\n });\n });\n this.#openOrdersSubscriptions.clear();\n }\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: Subscription service cleared (multi-DEX with individual subscriptions)',\n {\n timestamp: new Date().toISOString(),\n },\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"HyperLiquidSubscriptionService.mjs","sourceRoot":"","sources":["../../src/services/HyperLiquidSubscriptionService.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CaipAccountId } from '@metamask/utils';\nimport { hasProperty } from '@metamask/utils';\nimport type {\n ISubscription,\n AllMidsWsEvent,\n WebData2WsEvent,\n WebData3WsEvent,\n UserFillsWsEvent,\n ActiveAssetCtxWsEvent,\n ActiveSpotAssetCtxWsEvent,\n BboWsEvent,\n L2BookResponse,\n AssetCtxsWsEvent,\n FrontendOpenOrdersResponse,\n ClearinghouseStateWsEvent,\n OpenOrdersWsEvent,\n} from '@nktkas/hyperliquid';\n\nimport { TP_SL_CONFIG, PERPS_CONSTANTS } from '../constants/perpsConfig';\nimport { WebSocketConnectionState } from '../types';\nimport type {\n PriceUpdate,\n Position,\n OrderFill,\n Order,\n AccountState,\n SubscribePricesParams,\n SubscribePositionsParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribeAccountParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n OrderBookData,\n OrderBookLevel,\n PerpsPlatformDependencies,\n PerpsLogger,\n} from '../types';\nimport { calculateWeightedReturnOnEquity } from '../utils/accountUtils';\nimport { ensureError } from '../utils/errorUtils';\nimport {\n adaptPositionFromSDK,\n adaptOrderFromSDK,\n adaptAccountStateFromSDK,\n parseAssetName,\n} from '../utils/hyperLiquidAdapter';\nimport { processBboData } from '../utils/hyperLiquidOrderBookProcessor';\nimport { calculateOpenInterestUSD } from '../utils/marketDataTransform';\nimport type { HyperLiquidClientService } from './HyperLiquidClientService';\nimport type { HyperLiquidWalletService } from './HyperLiquidWalletService';\n\n/**\n * Service for managing HyperLiquid WebSocket subscriptions\n * Implements singleton subscription architecture with reference counting\n */\nexport class HyperLiquidSubscriptionService {\n // Service dependencies\n readonly #clientService: HyperLiquidClientService;\n\n readonly #walletService: HyperLiquidWalletService;\n\n // HIP-3 feature flag support\n #hip3Enabled: boolean;\n\n #enabledDexs: string[]; // DEX identification (maps webData3 indices to DEX names)\n\n #allowlistMarkets: string[]; // Market filtering (allowlist)\n\n #blocklistMarkets: string[]; // Market filtering (blocklist)\n\n #discoveredDexNames: string[] = []; // DEX order for mapping webData3 perpDexStates indices\n\n // DEX discovery synchronization - allows subscriptions to wait for HIP-3 DEX discovery\n #dexDiscoveryPromise: Promise<void> | null = null;\n\n #dexDiscoveryResolver: (() => void) | null = null;\n\n // Track DEXs for synchronized position notifications\n // Ensures all DEXs send initial data before notifying subscribers\n #expectedDexs: Set<string> = new Set();\n\n #initializedDexs: Set<string> = new Set();\n\n // Subscriber collections\n readonly #priceSubscribers = new Map<\n string,\n Set<(prices: PriceUpdate[]) => void>\n >();\n\n readonly #positionSubscribers = new Set<(positions: Position[]) => void>();\n\n // Order fill subscribers keyed by accountId (normalized: undefined -> 'default')\n readonly #orderFillSubscribers = new Map<\n string,\n Set<(fills: OrderFill[], isSnapshot?: boolean) => void>\n >();\n\n readonly #orderSubscribers = new Set<(orders: Order[]) => void>();\n\n readonly #accountSubscribers = new Set<(account: AccountState) => void>();\n\n // Track which subscribers want market data\n readonly #marketDataSubscribers = new Map<\n string,\n Set<(prices: PriceUpdate[]) => void>\n >();\n\n // Track which subscribers want top-of-book (best bid/ask) data\n readonly #orderBookSubscribers = new Map<\n string,\n Set<(prices: PriceUpdate[]) => void>\n >();\n\n // Global singleton subscriptions\n #globalAllMidsSubscription?: ISubscription;\n\n #globalAllMidsPromise?: Promise<void>; // Track in-progress subscription\n\n readonly #globalActiveAssetSubscriptions = new Map<string, ISubscription>();\n\n // Track in-progress activeAssetCtx subscription promises to prevent leaks\n // when cleanup fires before the async subscription resolves (#28141)\n readonly #pendingActiveAssetPromises = new Map<\n string,\n Promise<void | undefined>\n >();\n\n readonly #globalBboSubscriptions = new Map<string, ISubscription>();\n\n // Track in-progress BBO subscription promises to prevent leaks (#28141)\n readonly #pendingBboPromises = new Map<string, Promise<void | undefined>>();\n\n // Order fill subscriptions keyed by accountId (normalized: undefined -> 'default')\n readonly #orderFillSubscriptions = new Map<string, ISubscription>();\n\n readonly #symbolSubscriberCounts = new Map<string, number>();\n\n readonly #dexSubscriberCounts = new Map<string, number>(); // Track subscribers per DEX for assetCtxs\n\n // Multi-DEX webData3 subscription for all user data (positions, orders, account, OI caps)\n readonly #webData3Subscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n #webData3SubscriptionPromise?: Promise<void>;\n\n #positionSubscriberCount = 0;\n\n #orderSubscriberCount = 0;\n\n #accountSubscriberCount = 0;\n\n #oiCapSubscriberCount = 0;\n\n // Multi-DEX data caches\n readonly #dexPositionsCache = new Map<string, Position[]>(); // Per-DEX positions\n\n readonly #dexOrdersCache = new Map<string, Order[]>(); // Per-DEX orders\n\n readonly #dexAccountCache = new Map<string, AccountState>(); // Per-DEX account state\n\n #cachedPositions: Position[] | null = null; // Aggregated positions\n\n #cachedOrders: Order[] | null = null; // Aggregated orders\n\n #cachedAccount: AccountState | null = null; // Aggregated account\n\n #ordersCacheInitialized = false; // Track if orders cache has received WebSocket data\n\n #positionsCacheInitialized = false; // Track if positions cache has received WebSocket data\n\n // OI Cap tracking (from webData3.perpDexStates[].perpsAtOpenInterestCap)\n readonly #oiCapSubscribers = new Set<(caps: string[]) => void>();\n\n #cachedOICaps: string[] = [];\n\n #cachedOICapsHash = '';\n\n #oiCapsCacheInitialized = false;\n\n // Global price data cache\n #cachedPriceData: Map<string, PriceUpdate> | null = null;\n\n // Raw allMids WS snapshots keyed by DEX ('' for main DEX)\n readonly #allMidsSnapshots = new Map<string, Record<string, string>>();\n\n // Fills cache for cache-first pattern (similar to price caching)\n #cachedFills: OrderFill[] | null = null;\n\n #fillsCacheInitialized = false;\n\n // HIP-3: assetCtxs subscriptions for multi-DEX market data\n readonly #assetCtxsSubscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n readonly #dexAssetCtxsCache = new Map<string, AssetCtxsWsEvent['ctxs']>(); // Per-DEX asset contexts\n\n readonly #assetCtxsSubscriptionPromises = new Map<string, Promise<void>>(); // Track in-progress subscriptions\n\n readonly #dexAllMidsSubscriptions = new Map<string, ISubscription>();\n\n readonly #dexAllMidsSubscriptionPromises = new Map<string, Promise<void>>();\n\n readonly #clearinghouseStateSubscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n readonly #openOrdersSubscriptions = new Map<string, ISubscription>(); // Key: dex name ('' for main)\n\n // Pending subscription promises to prevent race conditions\n // When multiple calls to ensure*Subscription happen concurrently, this ensures\n // only one subscription is created per DEX (others wait for the pending promise)\n readonly #pendingClearinghouseSubscriptions = new Map<\n string,\n Promise<void>\n >();\n\n readonly #pendingOpenOrdersSubscriptions = new Map<string, Promise<void>>();\n\n // Meta cache per DEX - populated by metaAndAssetCtxs, used by createAssetCtxsSubscription\n // This avoids redundant meta() API calls since metaAndAssetCtxs already returns meta data\n readonly #dexMetaCache = new Map<\n string,\n {\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n }[];\n }\n >();\n\n // Order book data cache\n readonly #orderBookCache = new Map<\n string,\n {\n bestBid?: string;\n bestAsk?: string;\n spread?: string;\n lastUpdated: number;\n }\n >();\n\n // Market data caching for multi-channel consolidation\n readonly #marketDataCache = new Map<\n string,\n {\n prevDayPx?: number;\n funding?: number;\n openInterest?: number;\n volume24h?: number;\n oraclePrice?: number;\n lastUpdated: number;\n }\n >();\n\n // Flag to suppress error logging during intentional disconnect\n // Set in clearAll() and never reset (service instance is discarded after disconnect)\n #isClearing = false;\n\n readonly #restoreRetryTimeouts = new Map<\n string,\n ReturnType<typeof setTimeout>\n >();\n\n // Platform dependencies for logging\n readonly #deps: PerpsPlatformDependencies;\n\n constructor(\n clientService: HyperLiquidClientService,\n walletService: HyperLiquidWalletService,\n platformDependencies: PerpsPlatformDependencies,\n hip3Enabled?: boolean,\n enabledDexs?: string[],\n allowlistMarkets?: string[],\n blocklistMarkets?: string[],\n ) {\n this.#clientService = clientService;\n this.#walletService = walletService;\n this.#deps = platformDependencies;\n this.#hip3Enabled = hip3Enabled ?? false;\n this.#enabledDexs = enabledDexs ?? [];\n this.#discoveredDexNames = enabledDexs ?? [];\n this.#allowlistMarkets = allowlistMarkets ?? [];\n this.#blocklistMarkets = blocklistMarkets ?? [];\n }\n\n /**\n * Conditionally log an error to Sentry, suppressing during intentional disconnect.\n * When `clearAll()` is called, pending subscription promises reject with\n * `WebSocketRequestError` — these are expected and must not pollute Sentry.\n *\n * @param error - The error to log\n * @param context - Sentry context from #getErrorContext()\n */\n #logErrorUnlessClearing(\n error: Error,\n context: Parameters<PerpsLogger['error']>[1],\n ): void {\n if (this.#isClearing) {\n return;\n }\n this.#deps.logger.error(error, context);\n }\n\n #isTransientAssetCtxsError(error: unknown): boolean {\n const ensuredError = ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n );\n const connectionState = this.#clientService.getConnectionState?.();\n const messageParts = [\n ensuredError.message,\n error instanceof Error ? error.name : '',\n typeof error === 'string' ? error : '',\n String(error),\n ]\n .join(' ')\n .toLowerCase();\n const isReconnectChurn =\n connectionState === WebSocketConnectionState.Connecting ||\n connectionState === WebSocketConnectionState.Disconnected;\n\n return (\n messageParts.includes('websocketrequesterror') ||\n messageParts.includes('unknown error while making a websocket request') ||\n (isReconnectChurn &&\n (messageParts.includes('unknown error (no details provided)') ||\n messageParts.includes('undefined')))\n );\n }\n\n #scheduleRestoreRetry(dex: string, kind: 'assetCtxs' | 'allMids'): void {\n const retryKey = `${kind}:${dex}`;\n if (this.#isClearing || this.#restoreRetryTimeouts.has(retryKey)) {\n return;\n }\n\n const timeoutId = setTimeout(() => {\n this.#restoreRetryTimeouts.delete(retryKey);\n const retryPromise =\n kind === 'assetCtxs'\n ? this.#ensureAssetCtxsSubscription(dex, {\n incrementRefCount: false,\n })\n : this.#ensureDexAllMidsSubscription(dex);\n\n retryPromise.catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.restoreSubscriptions.retry',\n ),\n this.#getErrorContext('restoreSubscriptions.retry', {\n dex,\n kind,\n }),\n );\n });\n }, 1000);\n\n this.#restoreRetryTimeouts.set(retryKey, timeoutId);\n }\n\n /**\n * Get error context for logging with searchable tags and context.\n * Enables Sentry dashboard filtering by feature, provider, and network.\n *\n * @param method - The method name where the error occurred\n * @param extra - Optional additional context fields (merged into searchable context.data)\n * @returns Error options with tags (searchable) and context (searchable)\n * @private\n */\n #getErrorContext(\n method: string,\n extra?: Record<string, unknown>,\n ): {\n tags?: Record<string, string | number>;\n context?: { name: string; data: Record<string, unknown> };\n extras?: Record<string, unknown>;\n } {\n return {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: 'hyperliquid',\n network: this.#clientService.isTestnetMode() ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'HyperLiquidSubscriptionService',\n data: {\n method,\n ...extra,\n },\n },\n };\n }\n\n /**\n * Check if a DEX is enabled in our configuration\n * Used to filter webData3 callback data to only process DEXs we care about\n *\n * @param dex - DEX name (null for main DEX, string for HIP-3)\n * @returns true if this DEX should be processed\n */\n #isDexEnabled(dex: string | null): boolean {\n if (dex === null) {\n return true; // Main DEX always enabled\n }\n if (!this.#hip3Enabled) {\n return false; // HIP-3 disabled entirely\n }\n return this.#enabledDexs.includes(dex);\n }\n\n /**\n * Populate DEX meta cache with pre-fetched meta data\n * Called by Provider after buildAssetMapping to share cached meta,\n * avoiding redundant metaAndAssetCtxs/meta API calls during subscription setup\n *\n * @param dex - DEX key ('' for main DEX, 'xyz'/'flx'/etc for HIP-3)\n * @param meta - Meta response containing universe data\n * @param meta.universe - The array of asset universe entries from the meta response.\n */\n public setDexMetaCache(\n dex: string,\n meta: {\n universe: {\n name: string;\n szDecimals: number;\n maxLeverage: number;\n }[];\n },\n ): void {\n this.#dexMetaCache.set(dex, meta);\n this.#deps.debugLogger.log(\n '[SubscriptionService] DEX meta cache populated',\n {\n dex: dex || 'main',\n universeSize: meta.universe.length,\n },\n );\n }\n\n /**\n * Cache asset contexts for a specific DEX from API response\n * This allows buildAssetMapping() to populate cache for getMarketDataWithPrices() to use\n *\n * @param dex - DEX name ('' for main perps)\n * @param assetCtxs - Asset contexts from metaAndAssetCtxs response\n */\n public setDexAssetCtxsCache(\n dex: string,\n assetCtxs: AssetCtxsWsEvent['ctxs'],\n ): void {\n this.#dexAssetCtxsCache.set(dex, assetCtxs);\n this.#deps.debugLogger.log(\n '[SubscriptionService] DEX assetCtxs cache populated',\n {\n dex: dex || 'main',\n ctxsCount: assetCtxs.length,\n },\n );\n }\n\n /**\n * Get cached assetCtxs for a DEX\n * Returns the cached asset contexts from WebSocket subscription if available\n *\n * @param dex - DEX key ('' for main DEX, 'xyz'/'flx'/etc for HIP-3)\n * @returns Array of asset contexts or undefined if not cached\n */\n public getDexAssetCtxsCache(\n dex: string,\n ): AssetCtxsWsEvent['ctxs'] | undefined {\n return this.#dexAssetCtxsCache.get(dex);\n }\n\n /**\n * Wait for DEX discovery to complete (with timeout)\n * Used when HIP-3 is enabled but enabledDexs hasn't been populated yet.\n * This allows subscriptions to wait for DEX discovery before creating per-DEX subscriptions.\n *\n * @param timeoutMs - The maximum time in milliseconds to wait for DEX discovery.\n */\n async #waitForDexDiscovery(timeoutMs: number = 5000): Promise<void> {\n // Already have DEXs, no need to wait\n if (this.#enabledDexs.length > 0) {\n return;\n }\n\n // Create promise if not exists\n if (!this.#dexDiscoveryPromise) {\n this.#dexDiscoveryPromise = new Promise<void>((resolve) => {\n this.#dexDiscoveryResolver = resolve;\n });\n }\n\n // Wait with timeout\n let timeoutId: NodeJS.Timeout | undefined;\n const timeoutPromise = new Promise<void>((_resolve, reject) => {\n timeoutId = setTimeout(\n () => reject(new Error('DEX discovery timeout')),\n timeoutMs,\n );\n });\n\n try {\n await Promise.race([this.#dexDiscoveryPromise, timeoutPromise]);\n } catch {\n this.#deps.debugLogger.log(\n 'DEX discovery wait timed out, proceeding with main DEX only',\n );\n } finally {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n }\n }\n\n /**\n * Update feature flags for HIP-3 support\n * Called when provider configuration changes at runtime\n * Note: Market filtering is NOT applied in subscription service - only in Provider\n *\n * @param hip3Enabled - Whether HIP-3 multi-DEX support is enabled.\n * @param enabledDexs - The array of enabled DEX identifiers.\n * @param allowlistMarkets - The array of allowed market patterns.\n * @param blocklistMarkets - The array of blocked market patterns.\n */\n public async updateFeatureFlags(\n hip3Enabled: boolean,\n enabledDexs: string[],\n allowlistMarkets: string[],\n blocklistMarkets: string[],\n ): Promise<void> {\n const previousEnabledDexs = [...this.#enabledDexs];\n const previousAllowlistMarkets = [...this.#allowlistMarkets];\n const previousBlocklistMarkets = [...this.#blocklistMarkets];\n const previousHip3Enabled = this.#hip3Enabled;\n\n this.#hip3Enabled = hip3Enabled;\n this.#enabledDexs = enabledDexs;\n this.#allowlistMarkets = allowlistMarkets;\n this.#blocklistMarkets = blocklistMarkets;\n this.#discoveredDexNames = enabledDexs; // Store DEX order for webData3 index mapping\n\n // Resolve any pending DEX discovery wait now that DEXs are available\n if (this.#dexDiscoveryResolver && enabledDexs.length > 0) {\n this.#dexDiscoveryResolver();\n this.#dexDiscoveryPromise = null;\n this.#dexDiscoveryResolver = null;\n }\n\n this.#deps.debugLogger.log('Feature flags updated:', {\n previousHip3Enabled,\n hip3Enabled,\n previousEnabledDexs,\n enabledDexs,\n previousAllowlistMarkets,\n allowlistMarkets,\n previousBlocklistMarkets,\n blocklistMarkets,\n });\n\n // If equity was just enabled or new DEXs were added\n const newDexs = enabledDexs.filter(\n (dex) => !previousEnabledDexs.includes(dex),\n );\n if (\n (!previousHip3Enabled && hip3Enabled && enabledDexs.length > 0) ||\n newDexs.length > 0\n ) {\n this.#deps.debugLogger.log(\n 'Establishing subscriptions for new DEXs:',\n newDexs,\n );\n\n // Establish assetCtxs subscriptions for new DEXs (for market data)\n const hasMarketDataSubscribers = this.#marketDataSubscribers.size > 0;\n if (hasMarketDataSubscribers) {\n await Promise.all(\n newDexs.map(async (dex) => {\n try {\n await this.#ensureAssetCtxsSubscription(dex);\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.updateFeatureFlags',\n ),\n this.#getErrorContext(\n 'updateFeatureFlags.ensureAssetCtxsSubscription',\n {\n dex,\n },\n ),\n );\n }\n }),\n );\n }\n\n // Establish clearinghouseState/openOrders subscriptions for new DEXs\n // (needed for positions, orders, and account data when using individual subscriptions)\n const hasUserDataSubscribers =\n this.#positionSubscriberCount > 0 ||\n this.#orderSubscriberCount > 0 ||\n this.#accountSubscriberCount > 0;\n\n if (hasUserDataSubscribers && this.#hip3Enabled) {\n try {\n const userAddress =\n await this.#walletService.getUserAddressWithDefault();\n\n await Promise.all(\n newDexs.map(async (dex) => {\n try {\n await this.#ensureClearinghouseStateSubscription(\n userAddress,\n dex,\n );\n await this.#ensureOpenOrdersSubscription(userAddress, dex);\n this.#deps.debugLogger.log(\n `Established user data subscriptions for new DEX: ${dex}`,\n );\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.updateFeatureFlags',\n ),\n this.#getErrorContext(\n 'updateFeatureFlags.ensureUserDataSubscription',\n { dex },\n ),\n );\n }\n }),\n );\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.updateFeatureFlags',\n ),\n this.#getErrorContext('updateFeatureFlags.getUserAddress'),\n );\n }\n }\n }\n }\n\n /**\n * Fast hash function for change detection\n * Uses string concatenation of key fields instead of JSON.stringify()\n * Performance: ~100x faster than JSON.stringify() for typical objects\n * Tracks structural changes (coin, size, entryPrice, leverage, TP/SL prices/counts)\n * and value changes (unrealizedPnl, returnOnEquity, liquidationPrice, marginUsed) for live updates\n *\n * @param positions - The array of positions to hash.\n * @returns A hash string representing the current position state.\n */\n #hashPositions(positions: Position[]): string {\n if (!positions || positions.length === 0) {\n return '0';\n }\n return positions\n .map(\n (pos) =>\n `${pos.symbol}:${pos.size}:${pos.entryPrice}:${pos.leverage.value}:${\n pos.takeProfitPrice ?? ''\n }:${pos.stopLossPrice ?? ''}:${pos.takeProfitCount}:${pos.stopLossCount}:${\n pos.unrealizedPnl\n }:${pos.returnOnEquity}:${pos.liquidationPrice ?? ''}:${pos.marginUsed || ''}`,\n )\n .join('|');\n }\n\n #hashOrders(orders: Order[]): string {\n if (!orders || orders.length === 0) {\n return '0';\n }\n return orders\n .map(\n (ord) =>\n `${ord.symbol}:${ord.side}:${ord.size}:${ord.price}:${ord.orderType}`,\n )\n .join('|');\n }\n\n #hashAccountState(account: AccountState): string {\n return `${account.availableBalance}:${account.totalBalance}:${account.marginUsed}:${account.unrealizedPnl}`;\n }\n\n // Cache hashes to avoid recomputation\n #cachedPositionsHash = '';\n\n #cachedOrdersHash = '';\n\n #cachedAccountHash = '';\n\n /**\n * Extract TP/SL from orders and optionally convert raw SDK orders to Order format.\n * DRY helper used by both webData2 and clearinghouseState callbacks.\n *\n * @param orders - Raw SDK orders from WebSocket event\n * @param positions - Current positions for TP/SL matching\n * @param cachedProcessedOrders - Optional pre-processed orders (skips conversion if provided)\n * @returns Maps for TP/SL prices and counts, plus processed Order array\n */\n #extractTPSLFromOrders(\n orders: FrontendOpenOrdersResponse,\n positions: Position[],\n cachedProcessedOrders?: Order[],\n ): {\n tpslMap: Map<string, { takeProfitPrice?: string; stopLossPrice?: string }>;\n tpslCountMap: Map<\n string,\n { takeProfitCount?: number; stopLossCount?: number }\n >;\n processedOrders: Order[];\n } {\n const tpslMap = new Map<\n string,\n { takeProfitPrice?: string; stopLossPrice?: string }\n >();\n\n const tpslCountMap = new Map<\n string,\n { takeProfitCount?: number; stopLossCount?: number }\n >();\n\n // If cached processed orders provided, extract TP/SL from them directly\n if (cachedProcessedOrders) {\n cachedProcessedOrders.forEach((order) => {\n // Use triggerPrice for TP/SL (trigger condition price), falling back to price\n // This ensures consistency with raw SDK order processing which uses triggerPx\n const tpslPrice = order.triggerPrice ?? order.price;\n if (order.isTrigger && tpslPrice) {\n // When UsePositionBoundTpsl is enabled, only position-bound TP/SL orders\n // should be shown on positions — skip normalTpsl children of limit orders\n if (\n TP_SL_CONFIG.UsePositionBoundTpsl &&\n order.isPositionTpsl !== true\n ) {\n return;\n }\n\n const isTakeProfit = order.detailedOrderType?.includes('Take Profit');\n const isStop = order.detailedOrderType?.includes('Stop');\n\n const matchingPosition = positions.find(\n (pos) => pos.symbol === order.symbol,\n );\n\n // Determine TP vs SL classification for count and price updates\n // Use order type first, fallback to price-based detection for ambiguous 'Trigger' types\n let classifiedAsTakeProfit = isTakeProfit;\n let classifiedAsStop = isStop;\n\n if (!isTakeProfit && !isStop && matchingPosition) {\n // Fallback: determine based on trigger price vs entry price\n // This handles orders with ambiguous type 'Trigger'\n const triggerPrice = parseFloat(tpslPrice);\n const entryPrice = parseFloat(matchingPosition.entryPrice || '0');\n const isLong = parseFloat(matchingPosition.size) > 0;\n\n if (isLong) {\n if (triggerPrice > entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n } else if (triggerPrice < entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n }\n\n const currentTakeProfitCount =\n tpslCountMap.get(order.symbol)?.takeProfitCount ?? 0;\n const currentStopLossCount =\n tpslCountMap.get(order.symbol)?.stopLossCount ?? 0;\n\n tpslCountMap.set(order.symbol, {\n takeProfitCount: classifiedAsTakeProfit\n ? currentTakeProfitCount + 1\n : currentTakeProfitCount,\n stopLossCount: classifiedAsStop\n ? currentStopLossCount + 1\n : currentStopLossCount,\n });\n\n if (matchingPosition) {\n const existing = tpslMap.get(order.symbol) ?? {};\n if (classifiedAsTakeProfit) {\n existing.takeProfitPrice = tpslPrice;\n } else if (classifiedAsStop) {\n existing.stopLossPrice = tpslPrice;\n }\n tpslMap.set(order.symbol, existing);\n }\n }\n });\n\n return { tpslMap, tpslCountMap, processedOrders: cachedProcessedOrders };\n }\n\n // Process raw SDK orders\n const processedOrders: Order[] = [];\n\n orders.forEach((order) => {\n let position: Position | undefined;\n let positionForCoin: Position | undefined;\n\n const matchPositionToTpsl = (pos: Position): boolean => {\n if (TP_SL_CONFIG.UsePositionBoundTpsl) {\n return (\n pos.symbol === order.coin &&\n order.reduceOnly &&\n order.isPositionTpsl\n );\n }\n\n return (\n pos.symbol === order.coin &&\n Math.abs(parseFloat(order.sz)) >= Math.abs(parseFloat(pos.size))\n );\n };\n\n const matchPositionToCoin = (pos: Position): boolean =>\n pos.symbol === order.coin;\n\n // Process trigger orders for TP/SL extraction\n if (order.triggerPx) {\n const isTakeProfit = order.orderType?.includes('Take Profit');\n const isStop = order.orderType?.includes('Stop');\n\n const { coin } = order;\n position = positions.find(matchPositionToTpsl);\n positionForCoin = positions.find(matchPositionToCoin);\n\n // Determine TP vs SL classification for count and price updates\n // Use order type first, fallback to price-based detection for ambiguous 'Trigger' types\n // This matches the cached order processing logic for consistency\n let classifiedAsTakeProfit = isTakeProfit;\n let classifiedAsStop = isStop;\n\n if (!isTakeProfit && !isStop && position) {\n // Fallback: determine based on trigger price vs entry price\n // This handles orders with ambiguous type 'Trigger'\n const triggerPrice = parseFloat(order.triggerPx);\n const entryPrice = parseFloat(position.entryPrice || '0');\n const isLong = parseFloat(position.size) > 0;\n\n if (isLong) {\n if (triggerPrice > entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n } else if (triggerPrice < entryPrice) {\n classifiedAsTakeProfit = true;\n } else {\n classifiedAsStop = true;\n }\n }\n\n const currentTakeProfitCount =\n tpslCountMap.get(coin)?.takeProfitCount ?? 0;\n const currentStopLossCount = tpslCountMap.get(coin)?.stopLossCount ?? 0;\n\n tpslCountMap.set(coin, {\n takeProfitCount: classifiedAsTakeProfit\n ? currentTakeProfitCount + 1\n : currentTakeProfitCount,\n stopLossCount: classifiedAsStop\n ? currentStopLossCount + 1\n : currentStopLossCount,\n });\n\n if (position) {\n const existing = tpslMap.get(coin) ?? {};\n\n // Use classified values for price assignment (consistent with count logic)\n if (classifiedAsTakeProfit) {\n existing.takeProfitPrice = order.triggerPx;\n } else if (classifiedAsStop) {\n existing.stopLossPrice = order.triggerPx;\n }\n\n tpslMap.set(coin, existing);\n }\n }\n\n // Convert ALL open orders to Order format\n const convertedOrder = adaptOrderFromSDK(\n order,\n position ?? positionForCoin,\n );\n processedOrders.push(convertedOrder);\n });\n\n return { tpslMap, tpslCountMap, processedOrders };\n }\n\n /**\n * Merge TP/SL data into positions\n * DRY helper used by both webData2 and clearinghouseState callbacks\n *\n * @param positions - Base positions without TP/SL\n * @param tpslMap - Map of coin -> TP/SL prices\n * @param tpslCountMap - Map of coin -> TP/SL counts\n * @returns Positions enhanced with TP/SL data\n */\n #mergeTPSLIntoPositions(\n positions: Position[],\n tpslMap: Map<string, { takeProfitPrice?: string; stopLossPrice?: string }>,\n tpslCountMap: Map<\n string,\n { takeProfitCount?: number; stopLossCount?: number }\n >,\n ): Position[] {\n return positions.map((position) => {\n const tpsl = tpslMap.get(position.symbol) ?? {};\n const tpslCount = tpslCountMap.get(position.symbol) ?? {};\n return {\n ...position,\n takeProfitPrice: tpsl.takeProfitPrice ?? undefined,\n stopLossPrice: tpsl.stopLossPrice ?? undefined,\n takeProfitCount: tpslCount.takeProfitCount ?? 0,\n stopLossCount: tpslCount.stopLossCount ?? 0,\n };\n });\n }\n\n /**\n * Aggregate account states from all cached DEXs\n * Sums balances and creates per-DEX breakdown for multi-DEX portfolio view\n *\n * @returns Aggregated account state with dexBreakdown field\n * @private\n */\n #aggregateAccountStates(): AccountState {\n const subAccountBreakdown: Record<\n string,\n { availableBalance: string; totalBalance: string }\n > = {};\n let totalAvailableBalance = 0;\n let totalBalance = 0;\n let totalMarginUsed = 0;\n let totalUnrealizedPnl = 0;\n\n // Collect account states for weighted ROE calculation\n const accountStatesForROE: {\n unrealizedPnl: string;\n returnOnEquity: string;\n }[] = [];\n\n // Aggregate all cached account states\n Array.from(this.#dexAccountCache.entries()).forEach(\n ([currentDex, state]) => {\n const dexKey = currentDex === '' ? 'main' : currentDex;\n subAccountBreakdown[dexKey] = {\n availableBalance: state.availableBalance,\n totalBalance: state.totalBalance,\n };\n totalAvailableBalance += parseFloat(state.availableBalance);\n totalBalance += parseFloat(state.totalBalance);\n totalMarginUsed += parseFloat(state.marginUsed);\n totalUnrealizedPnl += parseFloat(state.unrealizedPnl);\n\n // Collect data for weighted ROE calculation\n accountStatesForROE.push({\n unrealizedPnl: state.unrealizedPnl,\n returnOnEquity: state.returnOnEquity,\n });\n },\n );\n\n // Use first DEX's account state as base and override aggregated values\n const firstDexAccount =\n this.#dexAccountCache.values().next().value ?? ({} as AccountState);\n\n // Calculate weighted returnOnEquity across all DEXs\n const returnOnEquity = calculateWeightedReturnOnEquity(accountStatesForROE);\n\n return {\n ...firstDexAccount,\n availableBalance: totalAvailableBalance.toString(),\n totalBalance: totalBalance.toString(),\n marginUsed: totalMarginUsed.toString(),\n unrealizedPnl: totalUnrealizedPnl.toString(),\n subAccountBreakdown,\n returnOnEquity,\n };\n }\n\n /**\n * Subscribe to live price updates with singleton subscription architecture\n * Uses allMids for fast price updates and predictedFundings for accurate funding rates\n *\n * @param params - The subscription parameters including symbols and callbacks.\n * @returns A cleanup function to unsubscribe from price updates.\n */\n public async subscribeToPrices(\n params: SubscribePricesParams,\n ): Promise<() => void> {\n const {\n symbols,\n callback,\n includeOrderBook = false,\n includeMarketData = false,\n } = params;\n const unsubscribers: (() => void)[] = [];\n\n symbols.forEach((symbol) => {\n unsubscribers.push(\n this.#createSubscription(this.#priceSubscribers, callback, symbol),\n );\n // Track market data subscribers separately\n if (includeMarketData) {\n unsubscribers.push(\n this.#createSubscription(\n this.#marketDataSubscribers,\n callback,\n symbol,\n ),\n );\n }\n // Track order book subscribers separately\n if (includeOrderBook) {\n unsubscribers.push(\n this.#createSubscription(\n this.#orderBookSubscribers,\n callback,\n symbol,\n ),\n );\n }\n });\n\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n this.#deps.debugLogger.log(\n 'SubscriptionClient not available for price subscription',\n );\n return () => unsubscribers.forEach((fn) => fn());\n }\n\n // Ensure global subscriptions are established\n this.#ensureGlobalAllMidsSubscription();\n\n // Extract unique DEXs from requested symbols\n const dexsNeeded = new Set<string | null>();\n symbols.forEach((symbol) => {\n const { dex } = parseAssetName(symbol);\n dexsNeeded.add(dex);\n });\n\n // Always ensure assetCtxs subscriptions (1 per DEX, lightweight).\n // Provides prevDayPx for percentChange24h even without includeMarketData\n // (e.g., prewarm after reconnection). Uses incrementRefCount: false when\n // not explicitly requested so lifecycle is managed by component subscriptions.\n dexsNeeded.forEach((dex) => {\n const dexName = dex ?? '';\n this.#ensureAssetCtxsSubscription(dexName, {\n incrementRefCount: includeMarketData,\n }).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToPrices',\n ),\n this.#getErrorContext(\n 'subscribeToPrices.ensureAssetCtxsSubscription',\n { dex: dexName },\n ),\n );\n });\n });\n\n // dexAllMids and activeAssetCtx only when market data explicitly requested\n if (includeMarketData) {\n dexsNeeded.forEach((dex) => {\n const dexName = dex ?? '';\n this.#ensureDexAllMidsSubscription(dexName).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToPrices',\n ),\n this.#getErrorContext(\n 'subscribeToPrices.ensureDexAllMidsSubscription',\n { dex: dexName },\n ),\n );\n });\n });\n }\n\n // Note: Funding rates are now cached via assetCtxs WebSocket subscription\n // (ensureAssetCtxsSubscription above), eliminating the need for a separate\n // metaAndAssetCtxs API call here. The WebSocket callback in createAssetCtxsSubscription\n // populates marketDataCache with funding rates as they arrive.\n\n symbols.forEach((symbol) => {\n // Subscribe to activeAssetCtx only when market data is requested\n if (includeMarketData) {\n this.#ensureActiveAssetSubscription(symbol);\n }\n if (includeOrderBook) {\n this.#ensureBboSubscription(symbol);\n }\n });\n\n // Send cached data immediately if available\n symbols.forEach((symbol) => {\n const cachedPrice = this.#cachedPriceData?.get(symbol);\n if (cachedPrice) {\n callback([cachedPrice]);\n }\n });\n\n // Return cleanup function\n return () => {\n unsubscribers.forEach((fn) => fn());\n // Cleanup subscriptions with reference counting\n symbols.forEach((symbol) => {\n if (includeMarketData) {\n this.#cleanupActiveAssetSubscription(symbol);\n }\n if (includeOrderBook) {\n this.#cleanupBboSubscription(symbol);\n }\n });\n\n // Cleanup DEX-level assetCtxs subscriptions\n if (includeMarketData) {\n dexsNeeded.forEach((dex) => {\n const dexName = dex ?? '';\n this.#cleanupAssetCtxsSubscription(dexName);\n });\n }\n };\n }\n\n /**\n * Ensure shared webData3 subscription is active (singleton pattern with multi-DEX support)\n * webData3 provides data for all DEXs (main + HIP-3) in a single subscription\n *\n * @param accountId - Optional CAIP account ID to subscribe for.\n */\n async #ensureSharedWebData3Subscription(\n accountId?: CaipAccountId,\n ): Promise<void> {\n // Establish webData3 subscription (if not exists)\n if (!this.#webData3Subscriptions.has('')) {\n if (this.#webData3SubscriptionPromise) {\n await this.#webData3SubscriptionPromise;\n } else {\n this.#webData3SubscriptionPromise =\n this.#createUserDataSubscription(accountId);\n\n try {\n await this.#webData3SubscriptionPromise;\n } catch (error) {\n this.#webData3SubscriptionPromise = undefined;\n throw error;\n }\n }\n }\n // Note: webData3 includes all DEX data, so no separate HIP-3 subscriptions needed\n }\n\n /**\n * Create WebSocket subscription for user data (positions, orders, account)\n * - Uses webData2 when HIP-3 disabled (main DEX only)\n * - Uses webData3 when HIP-3 enabled (main + HIP-3 DEXs)\n *\n * webData2 provides data for main DEX only\n * webData3 provides perpDexStates[] array containing data for all DEXs:\n * - Index 0: Main DEX (dexName = '')\n * - Index 1+: HIP-3 DEXs in order of enabledDexs array\n *\n * @param accountId - Optional CAIP account ID to subscribe for.\n * @returns A promise that resolves when the operation completes.\n */\n async #createUserDataSubscription(accountId?: CaipAccountId): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n const userAddress =\n await this.#walletService.getUserAddressWithDefault(accountId);\n\n const dexName = ''; // Use empty string as key for single subscription\n\n // Skip if subscription already exists\n if (this.#webData3Subscriptions.has(dexName)) {\n return undefined;\n }\n\n // Wait for DEX discovery if HIP-3 is enabled but DEXs haven't been discovered yet\n // This ensures HIP-3 subscriptions are created together with main DEX\n if (this.#hip3Enabled && this.#enabledDexs.length === 0) {\n this.#deps.debugLogger.log(\n 'Waiting for DEX discovery before creating subscriptions...',\n );\n await this.#waitForDexDiscovery();\n this.#deps.debugLogger.log(\n 'DEX discovery complete, proceeding with subscriptions',\n {\n enabledDexs: this.#enabledDexs,\n },\n );\n }\n\n return new Promise<void>((resolve, reject) => {\n // Choose channel based on HIP-3 master switch\n if (this.#hip3Enabled) {\n // HIP-3 enabled: Use individual subscriptions for positions/orders/account\n // webData3 is only used for OI caps extraction\n\n // Determine which DEXs to subscribe to\n const dexsToSubscribe = [\n '', // Main DEX\n ...this.#enabledDexs.filter((dexId) => this.#isDexEnabled(dexId)),\n ];\n\n // Track expected DEXs for synchronized notifications\n // Clear previous tracking and set new expected DEXs\n this.#expectedDexs = new Set(dexsToSubscribe);\n this.#initializedDexs = new Set();\n\n // Set up individual subscriptions for each DEX\n const subscriptionPromises: Promise<void>[] = [];\n\n for (const currentDexName of dexsToSubscribe) {\n // Set up clearinghouseState subscription for positions + account\n subscriptionPromises.push(\n this.#ensureClearinghouseStateSubscription(\n userAddress,\n currentDexName,\n ),\n );\n\n // Set up openOrders subscription for orders\n subscriptionPromises.push(\n this.#ensureOpenOrdersSubscription(userAddress, currentDexName),\n );\n }\n\n // Also set up webData3 for OI caps only\n const webData3Promise = subscriptionClient\n .webData3({ user: userAddress }, (data: WebData3WsEvent) => {\n try {\n // webData3 is ONLY used for OI caps extraction\n // Positions, orders, and account data come from individual subscriptions\n const allOICaps: string[] = [];\n data.perpDexStates.forEach((dexState, index) => {\n // Map webData3 index to DEX name\n // Index 0 = main DEX (null), Index 1+ = HIP-3 DEXs from discoveredDexNames\n const dexIdentifier =\n index === 0 ? null : this.#discoveredDexNames[index - 1];\n\n // Skip unknown DEXs (not in discoveredDexNames) to prevent main DEX cache corruption\n if (index > 0 && dexIdentifier === undefined) {\n return; // Unknown DEX - skip to prevent misidentifying as main DEX\n }\n\n // Only process DEXs we care about (skip others silently)\n if (!this.#isDexEnabled(dexIdentifier ?? null)) {\n return; // Skip this DEX - not enabled in our configuration\n }\n\n const currentDexName = dexIdentifier ?? '';\n\n const oiCaps = dexState.perpsAtOpenInterestCap ?? [];\n\n // Add DEX prefix for HIP-3 symbols (e.g., \"xyz:TSLA\")\n if (currentDexName) {\n allOICaps.push(\n ...oiCaps.map((symbol) => `${currentDexName}:${symbol}`),\n );\n } else {\n // Main DEX - no prefix needed\n allOICaps.push(...oiCaps);\n }\n });\n\n // Update OI caps cache and notify if changed\n const oiCapsHash = [...allOICaps]\n .sort((a: string, b: string) => a.localeCompare(b))\n .join(',');\n if (oiCapsHash !== this.#cachedOICapsHash) {\n this.#cachedOICaps = allOICaps;\n this.#cachedOICapsHash = oiCapsHash;\n this.#oiCapsCacheInitialized = true;\n\n // Notify all subscribers\n this.#oiCapSubscribers.forEach((callback) =>\n callback(allOICaps),\n );\n }\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('webData3 callback error', {\n user: userAddress,\n hasPerpDexStates: data?.perpDexStates !== undefined,\n perpDexStatesLength: data?.perpDexStates?.length ?? 0,\n }),\n );\n }\n })\n .then((sub) => {\n this.#webData3Subscriptions.set(dexName, sub);\n this.#deps.debugLogger.log(\n `webData3 subscription established for OI caps (main + HIP-3)`,\n );\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('createUserDataSubscription (webData3)', {\n dex: dexName,\n }),\n );\n throw error;\n });\n\n subscriptionPromises.push(webData3Promise);\n\n // Wait for all subscriptions to be established\n Promise.all(subscriptionPromises)\n .then(() => {\n this.#deps.debugLogger.log(\n `HIP-3 user data subscriptions established for ${dexsToSubscribe.length} DEXs`,\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('createUserDataSubscription (HIP-3)', {\n dexs: dexsToSubscribe,\n }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n );\n });\n } else {\n // HIP-3 disabled: Use webData2 (main DEX only)\n subscriptionClient\n .webData2({ user: userAddress }, (data: WebData2WsEvent) => {\n try {\n // webData2 returns clearinghouseState for main DEX only\n const currentDexName = ''; // Main DEX\n\n // Check for removed fields before accessing\n if (!data.clearinghouseState) {\n return;\n }\n\n // Extract and process positions from clearinghouseState\n const positions = data.clearinghouseState.assetPositions\n .filter((assetPos) => assetPos.position.szi !== '0')\n .map((assetPos) => adaptPositionFromSDK(assetPos));\n\n // Extract TP/SL from orders\n const {\n tpslMap,\n tpslCountMap,\n processedOrders: orders,\n } = this.#extractTPSLFromOrders(data.openOrders || [], positions);\n\n // Merge TP/SL data into positions\n const positionsWithTPSL = this.#mergeTPSLIntoPositions(\n positions,\n tpslMap,\n tpslCountMap,\n );\n\n // Extract account data (webData2 provides clearinghouseState)\n const accountState: AccountState = adaptAccountStateFromSDK(\n data.clearinghouseState,\n undefined, // webData2 doesn't include spotState\n );\n\n // Store in caches (main DEX only)\n this.#dexPositionsCache.set(currentDexName, positionsWithTPSL);\n this.#dexOrdersCache.set(currentDexName, orders);\n this.#dexAccountCache.set(currentDexName, accountState);\n\n // OI caps (main DEX only)\n const oiCaps = data.perpsAtOpenInterestCap ?? [];\n const oiCapsHash = [...oiCaps]\n .sort((a: string, b: string) => a.localeCompare(b))\n .join(',');\n if (oiCapsHash !== this.#cachedOICapsHash) {\n this.#cachedOICaps = oiCaps;\n this.#cachedOICapsHash = oiCapsHash;\n this.#oiCapsCacheInitialized = true;\n this.#oiCapSubscribers.forEach((callback) => callback(oiCaps));\n }\n\n // Notify subscribers (no aggregation needed - only main DEX)\n const positionsHash = this.#hashPositions(positionsWithTPSL);\n const ordersHash = this.#hashOrders(orders);\n const accountHash = this.#hashAccountState(accountState);\n\n if (positionsHash !== this.#cachedPositionsHash) {\n this.#cachedPositions = positionsWithTPSL;\n this.#cachedPositionsHash = positionsHash;\n this.#positionsCacheInitialized = true;\n this.#positionSubscribers.forEach((callback) =>\n callback(positionsWithTPSL),\n );\n }\n\n if (ordersHash !== this.#cachedOrdersHash) {\n this.#cachedOrders = orders;\n this.#cachedOrdersHash = ordersHash;\n this.#ordersCacheInitialized = true;\n this.#orderSubscribers.forEach((callback) => callback(orders));\n }\n\n if (accountHash !== this.#cachedAccountHash) {\n this.#cachedAccount = accountState;\n this.#cachedAccountHash = accountHash;\n this.#accountSubscribers.forEach((callback) =>\n callback(accountState),\n );\n }\n } catch (error) {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('webData2 callback error', {\n user: userAddress,\n dataKeys: data ? Object.keys(data) : 'data is null/undefined',\n hasClearinghouseState: data?.clearinghouseState !== undefined,\n hasOpenOrders: data?.openOrders !== undefined,\n hasPerpsAtOpenInterestCap:\n data?.perpsAtOpenInterestCap !== undefined,\n }),\n );\n }\n })\n .then((subscription) => {\n this.#webData3Subscriptions.set(dexName, subscription);\n this.#deps.debugLogger.log(\n 'webData2 subscription established for main DEX only',\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n this.#getErrorContext('createUserDataSubscription (webData2)', {\n dex: dexName,\n }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createUserDataSubscription',\n ),\n );\n });\n }\n });\n }\n\n /**\n * Ensure clearinghouseState subscription exists for a DEX\n * Uses pending promise tracking to prevent race conditions where multiple\n * concurrent calls could create duplicate subscriptions\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n * @returns A promise that resolves when the subscription is established.\n */\n async #ensureClearinghouseStateSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n // Already subscribed\n if (this.#clearinghouseStateSubscriptions.has(dexName)) {\n return;\n }\n\n // Another call is already in progress - wait for it instead of creating duplicate\n const pending = this.#pendingClearinghouseSubscriptions.get(dexName);\n if (pending) {\n this.#deps.debugLogger.log(\n `[ensureClearinghouseStateSubscription] Waiting for pending subscription for DEX: ${dexName || 'main'}`,\n );\n await pending;\n return;\n }\n\n // Create subscription promise and track it\n const subscriptionPromise = this.#createClearinghouseSubscription(\n userAddress,\n dexName,\n );\n this.#pendingClearinghouseSubscriptions.set(dexName, subscriptionPromise);\n\n try {\n await subscriptionPromise;\n } finally {\n this.#pendingClearinghouseSubscriptions.delete(dexName);\n }\n }\n\n /**\n * Create the actual clearinghouseState subscription\n * Separated from ensureClearinghouseStateSubscription to enable promise deduplication\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n */\n async #createClearinghouseSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error('Subscription client not available');\n }\n\n try {\n const subscription = await subscriptionClient.clearinghouseState(\n {\n user: userAddress,\n dex: dexName || undefined, // Empty string -> undefined for main DEX\n },\n (data: ClearinghouseStateWsEvent) => {\n const cacheKey = data.dex || '';\n\n // Update caches and notify subscribers if we have positions/account subscribers\n if (\n this.#positionSubscriberCount > 0 ||\n this.#accountSubscriberCount > 0\n ) {\n // Process positions from clearinghouse state\n const positions = data.clearinghouseState.assetPositions\n .filter((assetPos) => assetPos.position.szi !== '0')\n .map((assetPos) => adaptPositionFromSDK(assetPos));\n\n // Get cached orders to preserve TP/SL data (prevents flickering)\n // Orders are cached by openOrders subscription\n const cachedOrders = this.#dexOrdersCache.get(cacheKey) ?? [];\n\n // Re-extract TP/SL from cached orders for the new positions\n // This ensures TP/SL data persists across clearinghouseState updates\n let positionsWithTPSL = positions;\n if (cachedOrders.length > 0) {\n const { tpslMap, tpslCountMap } = this.#extractTPSLFromOrders(\n [],\n positions,\n cachedOrders,\n );\n\n positionsWithTPSL = this.#mergeTPSLIntoPositions(\n positions,\n tpslMap,\n tpslCountMap,\n );\n }\n\n // Update account state\n const accountState: AccountState = adaptAccountStateFromSDK(\n data.clearinghouseState,\n undefined,\n );\n\n // Update caches\n this.#dexPositionsCache.set(cacheKey, positionsWithTPSL);\n this.#dexAccountCache.set(cacheKey, accountState);\n\n // Mark this DEX as initialized (has sent first data)\n this.#initializedDexs.add(cacheKey);\n\n // Trigger aggregation and notify subscribers\n this.#aggregateAndNotifySubscribers();\n }\n },\n );\n\n this.#clearinghouseStateSubscriptions.set(dexName, subscription);\n this.#deps.debugLogger.log(\n `clearinghouseState subscription established for DEX: ${dexName || 'main'}`,\n );\n } catch (error) {\n // Remove this DEX from expected set so it doesn't block notifications for other DEXs\n this.#expectedDexs.delete(dexName);\n\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createClearinghouseSubscription',\n ),\n this.#getErrorContext('ensureClearinghouseStateSubscription', {\n dex: dexName,\n }),\n );\n throw error;\n }\n }\n\n /**\n * Ensure openOrders subscription exists for a DEX\n * Uses pending promise tracking to prevent race conditions where multiple\n * concurrent calls could create duplicate subscriptions\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n * @returns A promise that resolves when the subscription is established.\n */\n async #ensureOpenOrdersSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n // Already subscribed\n if (this.#openOrdersSubscriptions.has(dexName)) {\n return;\n }\n\n // Another call is already in progress - wait for it instead of creating duplicate\n const pending = this.#pendingOpenOrdersSubscriptions.get(dexName);\n if (pending) {\n this.#deps.debugLogger.log(\n `[ensureOpenOrdersSubscription] Waiting for pending subscription for DEX: ${dexName || 'main'}`,\n );\n await pending;\n return;\n }\n\n // Create subscription promise and track it\n const subscriptionPromise = this.#createOpenOrdersSubscription(\n userAddress,\n dexName,\n );\n this.#pendingOpenOrdersSubscriptions.set(dexName, subscriptionPromise);\n\n try {\n await subscriptionPromise;\n } finally {\n this.#pendingOpenOrdersSubscriptions.delete(dexName);\n }\n }\n\n /**\n * Create the actual openOrders subscription\n * Separated from ensureOpenOrdersSubscription to enable promise deduplication\n *\n * @param userAddress - The user's wallet address.\n * @param dexName - The DEX identifier (empty string for main DEX).\n */\n async #createOpenOrdersSubscription(\n userAddress: string,\n dexName: string,\n ): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error('Subscription client not available');\n }\n\n try {\n const subscription = await subscriptionClient.openOrders(\n {\n user: userAddress,\n dex: dexName || undefined, // Empty string -> undefined for main DEX\n },\n (data: OpenOrdersWsEvent) => {\n const cacheKey = data.dex || '';\n\n // Update caches and notify subscribers if we have order subscribers\n if (\n this.#orderSubscriberCount > 0 ||\n this.#positionSubscriberCount > 0\n ) {\n // Get cached positions for TP/SL processing\n const cachedPositions = this.#dexPositionsCache.get(cacheKey) ?? [];\n\n // Extract TP/SL and process orders\n const {\n tpslMap,\n tpslCountMap,\n processedOrders: orders,\n } = this.#extractTPSLFromOrders(data.orders, cachedPositions);\n\n // Update orders cache with processed orders\n this.#dexOrdersCache.set(cacheKey, orders);\n\n // Update positions with TP/SL if we have positions\n if (cachedPositions.length > 0) {\n const positionsWithTPSL = this.#mergeTPSLIntoPositions(\n cachedPositions,\n tpslMap,\n tpslCountMap,\n );\n this.#dexPositionsCache.set(cacheKey, positionsWithTPSL);\n }\n\n // Mark this DEX as initialized (has sent first data)\n this.#initializedDexs.add(cacheKey);\n\n // Trigger aggregation and notify subscribers\n this.#aggregateAndNotifySubscribers();\n }\n },\n );\n\n this.#openOrdersSubscriptions.set(dexName, subscription);\n this.#deps.debugLogger.log(\n `openOrders subscription established for DEX: ${dexName || 'main'}`,\n );\n } catch (error) {\n // Remove this DEX from expected set so it doesn't block notifications for other DEXs\n this.#expectedDexs.delete(dexName);\n\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createOpenOrdersSubscription',\n ),\n this.#getErrorContext('ensureOpenOrdersSubscription', {\n dex: dexName,\n }),\n );\n throw error;\n }\n }\n\n /**\n * Aggregate data from all DEX caches and notify subscribers if data changed\n * Used by both webData3 callback and fallback subscription callbacks\n */\n #aggregateAndNotifySubscribers(): void {\n // Wait for all expected DEXs to send initial data before notifying\n // This ensures positions from all DEXs appear simultaneously\n if (this.#expectedDexs.size > 0) {\n const allDexsInitialized = Array.from(this.#expectedDexs).every((dex) =>\n this.#initializedDexs.has(dex),\n );\n if (!allDexsInitialized) {\n this.#deps.debugLogger.log(\n 'Waiting for all DEXs to send initial data',\n {\n expected: Array.from(this.#expectedDexs),\n initialized: Array.from(this.#initializedDexs),\n },\n );\n return; // Don't notify yet - waiting for more DEXs\n }\n }\n\n // Aggregate data from all DEX caches\n // Order: Main DEX (crypto perps) first, then HIP-3 DEXs\n const mainDexPositions = this.#dexPositionsCache.get('') ?? [];\n const hip3DexPositions = Array.from(this.#dexPositionsCache.entries())\n .filter(([key]) => key !== '')\n .flatMap(([, positions]) => positions);\n const aggregatedPositions = [...mainDexPositions, ...hip3DexPositions];\n\n const mainDexOrders = this.#dexOrdersCache.get('') ?? [];\n const hip3DexOrders = Array.from(this.#dexOrdersCache.entries())\n .filter(([key]) => key !== '')\n .flatMap(([, orders]) => orders);\n const aggregatedOrders = [...mainDexOrders, ...hip3DexOrders];\n\n const aggregatedAccount = this.#aggregateAccountStates();\n\n // Check if aggregated data changed using fast hash comparison\n const positionsHash = this.#hashPositions(aggregatedPositions);\n const ordersHash = this.#hashOrders(aggregatedOrders);\n const accountHash = this.#hashAccountState(aggregatedAccount);\n\n const positionsChanged = positionsHash !== this.#cachedPositionsHash;\n const ordersChanged = ordersHash !== this.#cachedOrdersHash;\n const accountChanged = accountHash !== this.#cachedAccountHash;\n\n // Only notify subscribers if aggregated data changed\n if (positionsChanged) {\n this.#cachedPositions = aggregatedPositions;\n this.#cachedPositionsHash = positionsHash;\n this.#positionsCacheInitialized = true; // Mark cache as initialized\n this.#positionSubscribers.forEach((callback) => {\n callback(aggregatedPositions);\n });\n }\n\n if (ordersChanged) {\n this.#cachedOrders = aggregatedOrders;\n this.#cachedOrdersHash = ordersHash;\n this.#ordersCacheInitialized = true; // Mark cache as initialized\n this.#orderSubscribers.forEach((callback) => {\n callback(aggregatedOrders);\n });\n }\n\n if (accountChanged) {\n this.#cachedAccount = aggregatedAccount;\n this.#cachedAccountHash = accountHash;\n this.#accountSubscribers.forEach((callback) => {\n callback(aggregatedAccount);\n });\n }\n }\n\n /**\n * Clean up webData3 subscription when no longer needed\n */\n #cleanupSharedWebData3ISubscription(): void {\n const totalSubscribers =\n this.#positionSubscriberCount +\n this.#orderSubscriberCount +\n this.#accountSubscriberCount +\n this.#oiCapSubscriberCount;\n\n if (totalSubscribers <= 0) {\n // Cleanup webData3 subscription (covers all DEXs)\n if (this.#webData3Subscriptions.size > 0) {\n this.#webData3Subscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupSharedWebData3ISubscription',\n ),\n this.#getErrorContext(\n 'cleanupSharedWebData3ISubscription.webData3',\n {\n dex: dexName,\n },\n ),\n );\n });\n });\n this.#webData3Subscriptions.clear();\n this.#webData3SubscriptionPromise = undefined;\n }\n\n // Cleanup individual subscriptions (clearinghouseState + openOrders)\n if (this.#clearinghouseStateSubscriptions.size > 0) {\n this.#clearinghouseStateSubscriptions.forEach(\n (subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupSharedWebData3ISubscription',\n ),\n this.#getErrorContext(\n 'cleanupSharedWebData3ISubscription.clearinghouseState',\n {\n dex: dexName,\n },\n ),\n );\n });\n },\n );\n this.#clearinghouseStateSubscriptions.clear();\n }\n\n if (this.#openOrdersSubscriptions.size > 0) {\n this.#openOrdersSubscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupSharedWebData3ISubscription',\n ),\n this.#getErrorContext(\n 'cleanupSharedWebData3ISubscription.openOrders',\n {\n dex: dexName,\n },\n ),\n );\n });\n });\n this.#openOrdersSubscriptions.clear();\n }\n\n // Clear pending subscription promises (race condition prevention)\n this.#pendingClearinghouseSubscriptions.clear();\n this.#pendingOpenOrdersSubscriptions.clear();\n\n // Clear subscriber counts\n this.#positionSubscriberCount = 0;\n this.#orderSubscriberCount = 0;\n this.#accountSubscriberCount = 0;\n this.#oiCapSubscriberCount = 0;\n\n // Clear per-DEX caches\n this.#dexPositionsCache.clear();\n this.#dexOrdersCache.clear();\n this.#dexAccountCache.clear();\n\n // Clear DEX tracking for synchronized notifications\n this.#expectedDexs.clear();\n this.#initializedDexs.clear();\n\n // Clear aggregated caches\n this.#cachedPositions = null;\n this.#cachedOrders = null;\n this.#cachedAccount = null;\n this.#ordersCacheInitialized = false; // Reset cache initialization flag\n this.#positionsCacheInitialized = false; // Reset cache initialization flag\n\n // Clear hash caches\n this.#cachedPositionsHash = '';\n this.#cachedOrdersHash = '';\n this.#cachedAccountHash = '';\n\n this.#deps.debugLogger.log(\n 'All multi-DEX subscriptions cleaned up (webData2/3 + individual subscriptions)',\n );\n }\n }\n\n /**\n * Subscribe to live position updates with TP/SL data\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from position updates.\n */\n public subscribeToPositions(params: SubscribePositionsParams): () => void {\n const { callback, accountId } = params;\n const unsubscribe = this.#createSubscription(\n this.#positionSubscribers,\n callback,\n );\n\n // Increment position subscriber count\n this.#positionSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedPositions) {\n callback(this.#cachedPositions);\n }\n\n // Ensure shared subscription is active\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToPositions',\n ),\n this.#getErrorContext('subscribeToPositions'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#positionSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Subscribe to open interest cap updates\n * OI caps are extracted from webData2 subscription (zero additional overhead)\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from OI cap updates.\n */\n public subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n const { callback, accountId } = params;\n\n // Create subscription\n const unsubscribe = this.#createSubscription(\n this.#oiCapSubscribers,\n callback,\n );\n\n // Increment OI cap subscriber count\n this.#oiCapSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedOICaps) {\n callback(this.#cachedOICaps);\n }\n\n // Ensure webData3 subscription is active (OI caps come from webData3)\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.subscribeToOICaps'),\n this.#getErrorContext('subscribeToOICaps'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#oiCapSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Check if OI caps cache has been initialized\n * Useful for preventing UI flashing before first data arrives\n *\n * @returns True if the condition is met.\n */\n public isOICapsCacheInitialized(): boolean {\n return this.#oiCapsCacheInitialized;\n }\n\n /**\n * Subscribe to live order fill updates\n * Shares subscriptions per accountId to avoid duplicate WebSocket connections\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from order fill updates.\n */\n public subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n const { callback, accountId } = params;\n // Normalize accountId: undefined -> 'default' for Map key\n const normalizedAccountId = accountId ?? 'default';\n const unsubscribe = this.#createSubscription(\n this.#orderFillSubscribers,\n callback,\n normalizedAccountId,\n );\n\n // Ensure subscription is established for this accountId\n this.#ensureOrderFillISubscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderFills',\n ),\n this.#getErrorContext('subscribeToOrderFills'),\n );\n });\n\n return () => {\n unsubscribe();\n\n // If no more subscribers for this accountId, clean up subscription\n const subscribers = this.#orderFillSubscribers.get(normalizedAccountId);\n if (!subscribers || subscribers.size === 0) {\n const subscription =\n this.#orderFillSubscriptions.get(normalizedAccountId);\n if (subscription) {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderFills',\n ),\n this.#getErrorContext('subscribeToOrderFills.unsubscribe'),\n );\n });\n this.#orderFillSubscriptions.delete(normalizedAccountId);\n }\n }\n };\n }\n\n /**\n * Ensure order fill subscription is active for the given accountId\n * Shares subscription across all callbacks for the same accountId\n *\n * @param accountId - Optional CAIP account ID to subscribe for.\n * @returns A promise that resolves when the subscription is established.\n */\n async #ensureOrderFillISubscription(\n accountId?: CaipAccountId,\n ): Promise<void> {\n // Normalize accountId: undefined -> 'default' for Map key\n const normalizedAccountId = accountId ?? 'default';\n\n // If subscription already exists, no need to create another\n if (this.#orderFillSubscriptions.has(normalizedAccountId)) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const client = this.#clientService.getSubscriptionClient();\n if (!client) {\n throw new Error('SubscriptionClient not available');\n }\n await this.#ensureOrderFillISubscription(accountId);\n return;\n }\n\n const userAddress =\n await this.#walletService.getUserAddressWithDefault(accountId);\n\n // userFills returns a Promise<ISubscription>, need to await it\n const subscription = await subscriptionClient.userFills(\n { user: userAddress },\n (data: UserFillsWsEvent) => {\n // Build a Map for O(1) lookup instead of O(n) find per fill\n const orderMap = new Map<string, string>();\n if (this.#cachedOrders) {\n for (const order of this.#cachedOrders) {\n if (order.detailedOrderType) {\n orderMap.set(order.orderId, order.detailedOrderType);\n }\n }\n }\n const orderFills: OrderFill[] = data.fills.map((fill) => {\n const oid = fill.oid.toString();\n return {\n orderId: oid,\n symbol: fill.coin,\n side: fill.side,\n size: fill.sz,\n price: fill.px,\n fee: fill.fee,\n timestamp: fill.time,\n pnl: fill.closedPnl,\n direction: fill.dir,\n feeToken: fill.feeToken,\n startPosition: fill.startPosition,\n liquidation: fill.liquidation\n ? {\n liquidatedUser: fill.liquidation.liquidatedUser,\n markPx: fill.liquidation.markPx,\n method: fill.liquidation.method,\n }\n : undefined,\n detailedOrderType: orderMap.get(oid),\n };\n });\n\n // Cache fills for cache-first pattern (similar to price caching)\n // This allows getOrFetchFills() to return cached data without REST API calls\n if (data.isSnapshot) {\n // Snapshot: replace cache with initial historical data, sorted newest first\n this.#cachedFills = [...orderFills]\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, 100);\n this.#fillsCacheInitialized = true;\n } else {\n // Streaming: prepend new fills to existing (newest first)\n this.#cachedFills = [\n ...orderFills,\n ...(this.#cachedFills ?? []),\n ].slice(0, 100);\n }\n\n // Distribute to all callbacks for this accountId\n const subscribers = this.#orderFillSubscribers.get(normalizedAccountId);\n if (subscribers) {\n subscribers.forEach((callback) => {\n callback(orderFills, data.isSnapshot);\n });\n }\n },\n );\n\n this.#orderFillSubscriptions.set(normalizedAccountId, subscription);\n }\n\n /**\n * Subscribe to live order updates\n * Uses the shared webData2 subscription to avoid duplicate connections\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from order updates.\n */\n public subscribeToOrders(params: SubscribeOrdersParams): () => void {\n const { callback, accountId } = params;\n const unsubscribe = this.#createSubscription(\n this.#orderSubscribers,\n callback,\n );\n\n // Increment order subscriber count\n this.#orderSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedOrders) {\n callback(this.#cachedOrders);\n }\n\n // Ensure shared subscription is active\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.subscribeToOrders'),\n this.#getErrorContext('subscribeToOrders'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#orderSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Subscribe to live account updates\n * Uses the shared webData2 subscription to avoid duplicate connections\n *\n * @param params - The subscription parameters including callback and account ID.\n * @returns A cleanup function to unsubscribe from account updates.\n */\n public subscribeToAccount(params: SubscribeAccountParams): () => void {\n const { callback, accountId } = params;\n const unsubscribe = this.#createSubscription(\n this.#accountSubscribers,\n callback,\n );\n\n // Increment account subscriber count\n this.#accountSubscriberCount += 1;\n\n // Immediately provide cached data if available\n if (this.#cachedAccount) {\n callback(this.#cachedAccount);\n }\n\n // Ensure shared subscription is active (reuses existing connection)\n this.#ensureSharedWebData3Subscription(accountId).catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.subscribeToAccount'),\n this.#getErrorContext('subscribeToAccount'),\n );\n });\n\n return () => {\n unsubscribe();\n this.#accountSubscriberCount -= 1;\n this.#cleanupSharedWebData3ISubscription();\n };\n }\n\n /**\n * Check if orders cache has been initialized from WebSocket\n *\n * @returns true if WebSocket has sent at least one update, false otherwise\n */\n public isOrdersCacheInitialized(): boolean {\n return this.#ordersCacheInitialized;\n }\n\n /**\n * Check if positions cache has been initialized from WebSocket\n *\n * @returns true if WebSocket has sent at least one update, false otherwise\n */\n public isPositionsCacheInitialized(): boolean {\n return this.#positionsCacheInitialized;\n }\n\n /**\n * Get cached positions from WebSocket subscription\n *\n * @returns Cached positions array, or null if not initialized\n */\n public getCachedPositions(): Position[] | null {\n return this.#cachedPositions;\n }\n\n /**\n * Get cached orders from WebSocket subscription\n *\n * @returns Cached orders array, or null if not initialized\n */\n public getCachedOrders(): Order[] | null {\n return this.#cachedOrders;\n }\n\n /**\n * Atomically get cached orders if initialized\n * Prevents race condition between checking initialization and getting data\n *\n * @returns Cached orders array if initialized, null otherwise\n */\n public getOrdersCacheIfInitialized(): Order[] | null {\n if (!this.#ordersCacheInitialized) {\n return null;\n }\n return this.#cachedOrders ? [...this.#cachedOrders] : [];\n }\n\n /**\n * Get cached price for a symbol from WebSocket allMids subscription\n * OPTIMIZATION: Use this instead of REST infoClient.allMids() to avoid rate limiting\n *\n * @param symbol - Asset symbol (e.g., 'BTC', 'ETH', 'xyz:TSLA')\n * @returns Price string, or undefined if not cached\n */\n public getCachedPrice(symbol: string): string | undefined {\n return this.#cachedPriceData?.get(symbol)?.price;\n }\n\n public getLastAllMidsSnapshot(dex?: string): Record<string, string> | null {\n const dexKey = dex ?? '';\n const snapshot = this.#allMidsSnapshots.get(dexKey);\n if (!snapshot) {\n return null;\n }\n return { ...snapshot };\n }\n\n /**\n * Get cached fills from WebSocket userFills subscription\n * OPTIMIZATION: Use this instead of REST userFills() to avoid rate limiting\n *\n * @returns Copy of cached fills array, or null if not cached\n */\n public getCachedFills(): OrderFill[] | null {\n return this.#cachedFills ? [...this.#cachedFills] : null;\n }\n\n /**\n * Get cached fills only if the cache has been initialized from WebSocket\n * OPTIMIZATION: Distinguishes between \"not initialized\" (null) and \"initialized but empty\" ([])\n * - Returns null if cache hasn't received WebSocket snapshot yet (caller should use REST)\n * - Returns empty array [] if cache is initialized but user has no fills (caller can skip REST)\n * - Returns fills array if cache has data\n *\n * @returns Fills array or empty array if initialized, null if not yet initialized\n */\n public getFillsCacheIfInitialized(): OrderFill[] | null {\n if (!this.#fillsCacheInitialized) {\n return null;\n }\n return this.#cachedFills ? [...this.#cachedFills] : [];\n }\n\n /**\n * Create subscription with common error handling\n *\n * @param subscribers - The subscriber set or map to register the callback in.\n * @param callback - The callback function to invoke on updates.\n * @param key - Optional key for Map-based subscriber collections.\n * @returns A cleanup function to remove the subscription.\n */\n #createSubscription<TCallback>(\n subscribers: Set<TCallback> | Map<string, Set<TCallback>>,\n callback: TCallback,\n key?: string,\n ): () => void {\n if (subscribers instanceof Map && key) {\n if (!subscribers.has(key)) {\n subscribers.set(key, new Set());\n }\n subscribers.get(key)?.add(callback);\n } else if (subscribers instanceof Set) {\n subscribers.add(callback);\n }\n\n return () => {\n if (subscribers instanceof Map && key) {\n const set = subscribers.get(key);\n set?.delete(callback);\n if (set?.size === 0) {\n subscribers.delete(key);\n }\n } else if (subscribers instanceof Set) {\n subscribers.delete(callback);\n }\n };\n }\n\n /**\n * Helper function to create consolidated price updates with 24h change calculation\n *\n * @param symbol - The trading pair symbol.\n * @param price - The current price string.\n * @returns A consolidated price update object with change data.\n */\n #createPriceUpdate(symbol: string, price: string): PriceUpdate {\n const marketData = this.#marketDataCache.get(symbol);\n const orderBookData = this.#orderBookCache.get(symbol);\n const currentPrice = parseFloat(price);\n\n let percentChange24h: string | undefined;\n if (marketData?.prevDayPx !== undefined) {\n const change =\n ((currentPrice - marketData.prevDayPx) / marketData.prevDayPx) * 100;\n percentChange24h = change.toFixed(2);\n }\n\n // Check if any subscriber for this symbol wants market data\n const hasMarketDataSubscribers =\n this.#marketDataSubscribers.has(symbol) &&\n (this.#marketDataSubscribers.get(symbol)?.size ?? 0) > 0;\n\n const priceUpdate = {\n symbol,\n price, // This is the mid price from allMids\n timestamp: Date.now(),\n percentChange24h,\n // Add mark price from activeAssetCtx\n markPrice: marketData?.oraclePrice\n ? marketData.oraclePrice.toString()\n : undefined,\n // Add order book data if available\n bestBid: orderBookData?.bestBid,\n bestAsk: orderBookData?.bestAsk,\n spread: orderBookData?.spread,\n // Always include funding when available (don't default to 0, preserve undefined)\n funding: marketData?.funding,\n // Add market data only if requested by at least one subscriber\n openInterest: hasMarketDataSubscribers\n ? marketData?.openInterest\n : undefined,\n volume24h: hasMarketDataSubscribers ? marketData?.volume24h : undefined,\n };\n\n return priceUpdate;\n }\n\n /**\n * Ensure global allMids subscription is active (singleton pattern)\n */\n #ensureGlobalAllMidsSubscription(): void {\n // Check both the subscription AND the promise to prevent race conditions\n if (this.#globalAllMidsSubscription ?? this.#globalAllMidsPromise) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n return;\n }\n\n // Track WebSocket metrics\n const wsMetrics = {\n messagesReceived: 0,\n lastMessageTime: Date.now(),\n reconnectCount: 0,\n startTime: Date.now(),\n };\n\n // Store the promise immediately to prevent duplicate calls\n this.#globalAllMidsPromise = subscriptionClient\n .allMids((data: AllMidsWsEvent) => {\n wsMetrics.messagesReceived += 1;\n wsMetrics.lastMessageTime = Date.now();\n\n // Initialize cache if needed\n this.#cachedPriceData ??= new Map<string, PriceUpdate>();\n\n // Store raw snapshot for the main DEX so market fetches can reuse it without REST.\n this.#allMidsSnapshots.set('', data.mids as Record<string, string>);\n\n const subscribedSymbols = new Set<string>();\n\n // Collect all symbols that have subscribers\n for (const [\n symbol,\n subscriberSet,\n ] of this.#priceSubscribers.entries()) {\n if (subscriberSet.size > 0) {\n subscribedSymbols.add(symbol);\n }\n }\n\n // Track if any subscribed symbol was updated\n let hasUpdates = false;\n\n // Only process symbols that are actually subscribed to\n for (const symbol in data.mids) {\n // Skip if nobody is subscribed to this symbol\n if (!subscribedSymbols.has(symbol)) {\n continue;\n }\n\n const price = data.mids[symbol].toString();\n const cachedPrice = this.#cachedPriceData.get(symbol);\n\n // Skip if price hasn't changed\n if (cachedPrice?.price === price) {\n continue;\n }\n\n // Price changed or new symbol - update cache\n const priceUpdate = this.#createPriceUpdate(symbol, price);\n this.#cachedPriceData.set(symbol, priceUpdate);\n hasUpdates = true;\n }\n\n // Only notify subscribers if we actually have updates\n // This prevents unnecessary React re-renders when prices haven't changed\n if (hasUpdates) {\n this.#notifyAllPriceSubscribers();\n }\n })\n .then((sub) => {\n this.#globalAllMidsSubscription = sub;\n this.#deps.debugLogger.log(\n 'HyperLiquid: Global allMids subscription established',\n );\n\n // Notify existing subscribers with any cached data now that subscription is established\n if (this.#cachedPriceData && this.#cachedPriceData.size > 0) {\n this.#notifyAllPriceSubscribers();\n }\n return undefined;\n })\n .catch((error) => {\n // Clear the promise on error so it can be retried\n this.#globalAllMidsPromise = undefined;\n\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.ensureGlobalAllMidsSubscription',\n ),\n this.#getErrorContext('ensureGlobalAllMidsSubscription'),\n );\n });\n }\n\n /**\n * Ensure activeAssetCtx subscription for specific symbol (with reference counting)\n *\n * @param symbol - The trading pair symbol to subscribe to.\n */\n #ensureActiveAssetSubscription(symbol: string): void {\n // Increment subscriber count\n const currentCount = this.#symbolSubscriberCounts.get(symbol) ?? 0;\n this.#symbolSubscriberCounts.set(symbol, currentCount + 1);\n\n // If subscription already exists or is being created, just return\n if (\n this.#globalActiveAssetSubscriptions.has(symbol) ||\n this.#pendingActiveAssetPromises.has(symbol)\n ) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n return;\n }\n\n // Track metrics for this subscription\n const subscriptionMetrics = {\n messagesReceived: 0,\n startTime: Date.now(),\n };\n\n const promise = subscriptionClient\n .activeAssetCtx(\n { coin: symbol },\n (data: ActiveAssetCtxWsEvent | ActiveSpotAssetCtxWsEvent) => {\n subscriptionMetrics.messagesReceived += 1;\n\n if (data.coin === symbol && data.ctx) {\n // Type guard using SDK types: check if this is perps (has funding) or spot (no funding)\n const isPerpsContext = (\n event: ActiveAssetCtxWsEvent | ActiveSpotAssetCtxWsEvent,\n ): event is ActiveAssetCtxWsEvent =>\n hasProperty(event.ctx, 'funding') &&\n hasProperty(event.ctx, 'openInterest') &&\n hasProperty(event.ctx, 'oraclePx');\n\n const { ctx } = data;\n\n // Cache market data for consolidation with price updates\n const ctxPrice = ctx.midPx ?? ctx.markPx;\n const openInterestUSD =\n isPerpsContext(data) && ctxPrice\n ? calculateOpenInterestUSD(data.ctx.openInterest, ctxPrice)\n : NaN;\n const marketData = {\n prevDayPx: ctx.prevDayPx\n ? parseFloat(ctx.prevDayPx.toString())\n : undefined,\n // Cache funding rate from activeAssetCtx for real-time updates\n // SDK defines funding as string (not nullable) in ActiveAssetCtxEvent\n funding: isPerpsContext(data)\n ? parseFloat(data.ctx.funding.toString())\n : undefined,\n openInterest: isNaN(openInterestUSD)\n ? undefined\n : openInterestUSD,\n volume24h: ctx.dayNtlVlm\n ? parseFloat(ctx.dayNtlVlm.toString())\n : undefined,\n oraclePrice: isPerpsContext(data)\n ? parseFloat(data.ctx.oraclePx.toString())\n : undefined,\n lastUpdated: Date.now(),\n };\n\n this.#marketDataCache.set(symbol, marketData);\n\n // Update cached price data with new 24h change if we have current price\n const currentCachedPrice = this.#cachedPriceData?.get(symbol);\n if (currentCachedPrice) {\n const updatedPrice = this.#createPriceUpdate(\n symbol,\n currentCachedPrice.price,\n );\n\n this.#cachedPriceData ??= new Map<string, PriceUpdate>();\n this.#cachedPriceData.set(symbol, updatedPrice);\n this.#notifyAllPriceSubscribers();\n }\n }\n },\n )\n .then((sub) => {\n // Only clear pending ref if this is still the current promise.\n // A rapid away-and-back can replace the pending promise; blindly\n // deleting would remove the *newer* reference (#28141).\n if (this.#pendingActiveAssetPromises.get(symbol) === promise) {\n this.#pendingActiveAssetPromises.delete(symbol);\n }\n // Stale subscription: cleanup was called while pending, a newer\n // subscription already won the race, OR a different pending promise\n // exists (rapid away-and-back before this one resolved). (#28141)\n if (\n (this.#symbolSubscriberCounts.get(symbol) ?? 0) <= 0 ||\n this.#globalActiveAssetSubscriptions.has(symbol) ||\n this.#pendingActiveAssetPromises.has(symbol)\n ) {\n return sub.unsubscribe();\n }\n this.#globalActiveAssetSubscriptions.set(symbol, sub);\n this.#deps.debugLogger.log(\n `HyperLiquid: Market data subscription established for ${symbol}`,\n );\n return undefined;\n })\n .catch((error) => {\n if (this.#pendingActiveAssetPromises.get(symbol) === promise) {\n this.#pendingActiveAssetPromises.delete(symbol);\n }\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.ensureActiveAssetSubscription',\n ),\n this.#getErrorContext('ensureActiveAssetSubscription', { symbol }),\n );\n });\n\n this.#pendingActiveAssetPromises.set(symbol, promise);\n }\n\n /**\n * Cleanup activeAssetCtx subscription when no longer needed\n *\n * @param symbol - The trading pair symbol to clean up.\n */\n #cleanupActiveAssetSubscription(symbol: string): void {\n const currentCount = this.#symbolSubscriberCounts.get(symbol) ?? 0;\n if (currentCount <= 1) {\n // Last subscriber, cleanup subscription\n this.#symbolSubscriberCounts.delete(symbol);\n\n const subscription = this.#globalActiveAssetSubscriptions.get(symbol);\n if (subscription && typeof subscription.unsubscribe === 'function') {\n const unsubscribeResult = Promise.resolve(subscription.unsubscribe());\n\n unsubscribeResult.catch(() => {\n // Ignore errors during cleanup\n });\n this.#globalActiveAssetSubscriptions.delete(symbol);\n } else if (subscription) {\n // Subscription exists but unsubscribe is not a function or doesn't return a Promise\n // Just clean up the reference\n this.#globalActiveAssetSubscriptions.delete(symbol);\n }\n\n // If subscription is still pending (async), the .then() handler in\n // #ensureActiveAssetSubscription will check symbolSubscriberCounts\n // and unsubscribe immediately when it resolves (#28141)\n // Clean up the pending promise reference\n this.#pendingActiveAssetPromises.delete(symbol);\n } else {\n // Still has subscribers, just decrement count\n this.#symbolSubscriberCounts.set(symbol, currentCount - 1);\n }\n }\n\n /**\n * Ensure assetCtxs subscription for specific DEX (HIP-3 support)\n * Uses WebSocket instead of REST polling for market data\n * Implements reference counting to track active subscribers per DEX\n *\n * @param dex - The DEX identifier (empty string for main DEX).\n * @param options - Subscription behavior overrides.\n * @param options.incrementRefCount - Skip incrementing when restoring existing subscribers after reconnect.\n */\n async #ensureAssetCtxsSubscription(\n dex: string,\n options: { incrementRefCount?: boolean } = {},\n ): Promise<void> {\n const dexKey = dex || '';\n const { incrementRefCount = true } = options;\n\n if (incrementRefCount) {\n const currentCount = this.#dexSubscriberCounts.get(dexKey) ?? 0;\n this.#dexSubscriberCounts.set(dexKey, currentCount + 1);\n }\n\n // Return if subscription already exists\n if (this.#assetCtxsSubscriptions.has(dexKey)) {\n return;\n }\n\n let promise = this.#assetCtxsSubscriptionPromises.get(dexKey);\n if (!promise) {\n promise = this.#createAssetCtxsSubscription(dex);\n this.#assetCtxsSubscriptionPromises.set(dexKey, promise);\n }\n\n try {\n await promise;\n } catch (error) {\n if (this.#assetCtxsSubscriptionPromises.get(dexKey) === promise) {\n this.#assetCtxsSubscriptionPromises.delete(dexKey);\n }\n if (incrementRefCount) {\n const currentCount = this.#dexSubscriberCounts.get(dexKey) ?? 0;\n if (currentCount <= 1) {\n this.#dexSubscriberCounts.delete(dexKey);\n } else {\n this.#dexSubscriberCounts.set(dexKey, currentCount - 1);\n }\n }\n throw error;\n }\n }\n\n /**\n * Ensure a per-DEX allMids WS subscription exists (singleton per DEX).\n * Mirrors the assetCtxs subscription dedup pattern and is used only for HIP-3 DEXs.\n *\n * @param dex - The HIP-3 DEX name.\n */\n async #ensureDexAllMidsSubscription(dex: string): Promise<void> {\n if (!dex) {\n return;\n }\n\n if (this.#dexAllMidsSubscriptions.has(dex)) {\n return;\n }\n\n if (this.#dexAllMidsSubscriptionPromises.has(dex)) {\n await this.#dexAllMidsSubscriptionPromises.get(dex);\n return;\n }\n\n const promise = this.#createDexAllMidsSubscription(dex);\n this.#dexAllMidsSubscriptionPromises.set(dex, promise);\n\n try {\n await promise;\n } catch (error) {\n this.#dexAllMidsSubscriptionPromises.delete(dex);\n throw error;\n }\n }\n\n /**\n * Create allMids WS subscription for a specific HIP-3 DEX.\n *\n * @param dex - The HIP-3 DEX name.\n */\n async #createDexAllMidsSubscription(dex: string): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n return new Promise<void>((resolve, reject) => {\n subscriptionClient\n .allMids({ dex }, (data: AllMidsWsEvent) => {\n this.#allMidsSnapshots.set(dex, data.mids as Record<string, string>);\n })\n .then((sub) => {\n // If a newer subscription already won the race, discard this one (#28141)\n if (this.#dexAllMidsSubscriptions.has(dex)) {\n resolve();\n return sub.unsubscribe();\n }\n this.#dexAllMidsSubscriptions.set(dex, sub);\n this.#deps.debugLogger.log(\n `allMids subscription established for DEX: ${dex}`,\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createDexAllMidsSubscription',\n ),\n this.#getErrorContext('createDexAllMidsSubscription', { dex }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createDexAllMidsSubscription',\n ),\n );\n });\n });\n }\n\n /**\n * Create assetCtxs subscription for specific DEX\n * Provides real-time market data for all assets on the DEX\n *\n * Performance: Uses cached meta from dexMetaCache (populated by metaAndAssetCtxs)\n * to avoid redundant meta() API calls during subscription setup\n *\n * @param dex - The DEX identifier (empty string for main DEX).\n */\n async #createAssetCtxsSubscription(dex: string): Promise<void> {\n await this.#clientService.ensureSubscriptionClient(\n this.#walletService.createWalletAdapter(),\n );\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n const dexKey = dex || '';\n const dexIdentifier = dex ?? 'main DEX';\n\n // Check cache first - populated by metaAndAssetCtxs in ensureAssetCtxsSubscription\n let perpsMeta = this.#dexMetaCache.get(dexKey);\n\n if (!perpsMeta) {\n // Fallback: fetch meta if not in cache (shouldn't happen in normal flow)\n this.#deps.debugLogger.log(\n `Meta cache miss for ${dexIdentifier}, fetching from API`,\n );\n const infoClient = this.#clientService.getInfoClient();\n const fetchedMeta = await infoClient.meta({ dex: dex || undefined });\n if (fetchedMeta?.universe) {\n perpsMeta = fetchedMeta;\n this.#dexMetaCache.set(dexKey, fetchedMeta);\n }\n }\n\n if (!perpsMeta?.universe) {\n const errorMessage = `No universe data available for ${dexIdentifier}`;\n throw new Error(errorMessage);\n }\n\n // Capture narrowed perpsMeta in a const for use inside closures\n const validatedMeta = perpsMeta;\n\n this.#deps.debugLogger.log(\n `Using ${this.#dexMetaCache.has(dexKey) ? 'cached' : 'fetched'} meta for ${dexIdentifier}`,\n {\n dex,\n universeCount: validatedMeta.universe.length,\n firstAssetSample: validatedMeta.universe[0]?.name,\n },\n );\n\n return new Promise<void>((resolve, reject) => {\n const subscriptionParams = dex ? { dex } : {};\n const handleAssetCtxsUpdate = (data: AssetCtxsWsEvent): void => {\n // Cache asset contexts for this DEX\n this.#dexAssetCtxsCache.set(dexKey, data.ctxs);\n\n // Use cached meta to map ctxs array indices to symbols (no REST API call!)\n validatedMeta.universe.forEach((asset, index) => {\n const ctx = data.ctxs[index];\n if (ctx && hasProperty(ctx, 'funding')) {\n // This is a perps context\n const ctxPrice = ctx.midPx ?? ctx.markPx;\n const openInterestUSD = calculateOpenInterestUSD(\n ctx.openInterest,\n ctxPrice,\n );\n const marketData = {\n prevDayPx: ctx.prevDayPx\n ? parseFloat(ctx.prevDayPx.toString())\n : undefined,\n funding: parseFloat(ctx.funding.toString()),\n openInterest: isNaN(openInterestUSD)\n ? undefined\n : openInterestUSD,\n volume24h: ctx.dayNtlVlm\n ? parseFloat(ctx.dayNtlVlm.toString())\n : undefined,\n oraclePrice: parseFloat(ctx.oraclePx.toString()),\n lastUpdated: Date.now(),\n };\n\n this.#marketDataCache.set(asset.name, marketData);\n\n // HIP-3: Extract price from assetCtx and update cached prices\n const price = ctx.midPx?.toString() ?? ctx.markPx?.toString();\n if (price) {\n // For HIP-3 DEXs, meta() returns asset.name already containing the DEX prefix\n // (e.g., \"xyz:XYZ100\"), so use it directly\n const symbol = asset.name;\n const priceUpdate = this.#createPriceUpdate(symbol, price);\n this.#cachedPriceData ??= new Map<string, PriceUpdate>();\n this.#cachedPriceData.set(symbol, priceUpdate);\n }\n }\n });\n\n // Notify price subscribers with updated market data\n this.#notifyAllPriceSubscribers();\n };\n\n const subscribeWithRetry = async (): Promise<ISubscription> => {\n const maxAttempts = 3;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await subscriptionClient.assetCtxs(\n subscriptionParams,\n handleAssetCtxsUpdate,\n );\n } catch (error) {\n const ensuredError = ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n );\n const isLastAttempt = attempt === maxAttempts;\n if (\n isLastAttempt ||\n !this.#isTransientAssetCtxsError(ensuredError)\n ) {\n throw ensuredError;\n }\n\n const retryDelayMs = attempt * 500;\n this.#deps.debugLogger.log(\n 'Transient assetCtxs subscription failure during reconnect, retrying',\n {\n dex: dexKey || 'main',\n attempt,\n retryDelayMs,\n error: ensuredError.message,\n },\n );\n await new Promise((_resolve) => setTimeout(_resolve, retryDelayMs));\n }\n }\n\n throw new Error(\n `Failed to establish assetCtxs subscription for ${dexIdentifier}`,\n );\n };\n\n subscribeWithRetry()\n .then((sub) => {\n // If a newer subscription already won the race, discard this one (#28141)\n if (this.#assetCtxsSubscriptions.has(dexKey)) {\n resolve();\n return sub.unsubscribe();\n }\n this.#assetCtxsSubscriptions.set(dexKey, sub);\n this.#deps.debugLogger.log(\n `assetCtxs subscription established for ${\n dex ? `DEX: ${dex}` : 'main DEX'\n }`,\n );\n resolve();\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n ),\n this.#getErrorContext('createAssetCtxsSubscription', { dex }),\n );\n reject(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.createAssetCtxsSubscription',\n ),\n );\n });\n });\n }\n\n /**\n * Cleanup assetCtxs subscription for specific DEX with reference counting\n * Only unsubscribes when the last subscriber for this DEX is removed\n *\n * @param dex - The DEX identifier (empty string for main DEX).\n */\n #cleanupAssetCtxsSubscription(dex: string): void {\n const dexKey = dex || '';\n\n // Decrement subscriber count for this DEX\n const currentCount = this.#dexSubscriberCounts.get(dexKey) ?? 0;\n\n if (currentCount <= 1) {\n // Last subscriber - cleanup the subscription\n const subscription = this.#assetCtxsSubscriptions.get(dexKey);\n const allMidsSubscription = dex\n ? this.#dexAllMidsSubscriptions.get(dex)\n : undefined;\n\n if (subscription) {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupAssetCtxsSubscription',\n ),\n this.#getErrorContext('cleanupAssetCtxsSubscription', { dex }),\n );\n });\n }\n\n if (allMidsSubscription) {\n allMidsSubscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.cleanupDexAllMidsSubscription',\n ),\n this.#getErrorContext('cleanupDexAllMidsSubscription', { dex }),\n );\n });\n }\n\n this.#assetCtxsSubscriptions.delete(dexKey);\n this.#dexAssetCtxsCache.delete(dexKey);\n this.#assetCtxsSubscriptionPromises.delete(dexKey);\n this.#dexSubscriberCounts.delete(dexKey);\n\n if (dex) {\n this.#dexAllMidsSubscriptions.delete(dex);\n this.#dexAllMidsSubscriptionPromises.delete(dex);\n this.#allMidsSnapshots.delete(dex);\n }\n\n this.#deps.debugLogger.log(\n `Cleaned up assetCtxs subscription for ${\n dex ? `DEX: ${dex}` : 'main DEX'\n }`,\n );\n } else {\n // Still has subscribers - just decrement count\n this.#dexSubscriberCounts.set(dexKey, currentCount - 1);\n }\n }\n\n /**\n * Ensure BBO subscription for specific symbol (singleton)\n *\n * BBO provides best bid/ask without being affected by L2Book aggregation parameters,\n * keeping spread consistent across order book grouping selections (matches Hyperliquid UI).\n *\n * @param symbol - The trading pair symbol to subscribe to BBO for.\n */\n #ensureBboSubscription(symbol: string): void {\n // Skip if subscription already exists or is being created\n if (\n this.#globalBboSubscriptions.has(symbol) ||\n this.#pendingBboPromises.has(symbol)\n ) {\n return;\n }\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n return;\n }\n\n const promise = subscriptionClient\n .bbo({ coin: symbol }, (data: BboWsEvent) => {\n processBboData({\n symbol,\n data,\n orderBookCache: this.#orderBookCache,\n cachedPriceData: this.#cachedPriceData,\n createPriceUpdate: this.#createPriceUpdate.bind(this),\n notifySubscribers: this.#notifyAllPriceSubscribers.bind(this),\n });\n })\n .then((sub) => {\n // Only clear pending ref if this is still the current promise (#28141).\n if (this.#pendingBboPromises.get(symbol) === promise) {\n this.#pendingBboPromises.delete(symbol);\n }\n // Stale subscription: cleanup was called while pending, a newer\n // subscription already won the race, OR a different pending promise\n // exists (rapid away-and-back before this one resolved). (#28141)\n if (\n (this.#orderBookSubscribers.get(symbol)?.size ?? 0) <= 0 ||\n this.#globalBboSubscriptions.has(symbol) ||\n this.#pendingBboPromises.has(symbol)\n ) {\n return sub.unsubscribe();\n }\n this.#globalBboSubscriptions.set(symbol, sub);\n this.#deps.debugLogger.log(\n `HyperLiquid: BBO subscription established for ${symbol}`,\n );\n return undefined;\n })\n .catch((error) => {\n if (this.#pendingBboPromises.get(symbol) === promise) {\n this.#pendingBboPromises.delete(symbol);\n }\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.ensureBboSubscription',\n ),\n this.#getErrorContext('ensureBboSubscription', { symbol }),\n );\n });\n\n this.#pendingBboPromises.set(symbol, promise);\n }\n\n /**\n * Cleanup BBO subscription when no longer needed\n *\n * @param symbol - The trading pair symbol.\n */\n #cleanupBboSubscription(symbol: string): void {\n // If anyone still wants order book (top-of-book) data for this symbol, keep the subscription alive.\n if ((this.#orderBookSubscribers.get(symbol)?.size ?? 0) > 0) {\n return;\n }\n\n const subscription = this.#globalBboSubscriptions.get(symbol);\n if (subscription && typeof subscription.unsubscribe === 'function') {\n const unsubscribeResult = Promise.resolve(subscription.unsubscribe());\n unsubscribeResult.catch(() => {\n // Ignore errors during cleanup\n });\n\n this.#globalBboSubscriptions.delete(symbol);\n this.#orderBookCache.delete(symbol);\n } else if (subscription) {\n // Subscription exists but unsubscribe is not a function or doesn't return a Promise\n // Just clean up the reference\n this.#globalBboSubscriptions.delete(symbol);\n this.#orderBookCache.delete(symbol);\n }\n\n // If subscription is still pending (async), the .then() handler in\n // #ensureBboSubscription will check orderBookSubscribers and\n // unsubscribe immediately when it resolves (#28141)\n this.#pendingBboPromises.delete(symbol);\n }\n\n /**\n * Subscribe to full order book updates with multiple depth levels\n * Creates a dedicated L2Book subscription for the requested symbol\n * and processes data into OrderBookData format for UI consumption\n *\n * @param params - Subscription parameters\n * @returns Cleanup function to unsubscribe\n */\n public subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n const {\n symbol,\n levels = 10,\n nSigFigs = 5,\n mantissa,\n callback,\n onError,\n } = params;\n\n this.#clientService\n .ensureSubscriptionClient(this.#walletService.createWalletAdapter())\n .catch(() => {\n // Handled by getSubscriptionClient check below\n });\n\n const subscriptionClient = this.#clientService.getSubscriptionClient();\n if (!subscriptionClient) {\n const error = new Error('Subscription client not available');\n onError?.(error);\n this.#deps.debugLogger.log(\n 'subscribeToOrderBook: Subscription client not available',\n );\n return () => {\n // No-op cleanup\n };\n }\n\n let subscription: ISubscription | undefined;\n let cancelled = false;\n\n subscriptionClient\n .l2Book({ coin: symbol, nSigFigs, mantissa }, (data: L2BookResponse) => {\n if (cancelled || data?.coin !== symbol || !data?.levels) {\n return;\n }\n\n const orderBookData = this.#processOrderBookData(data, levels);\n callback(orderBookData);\n })\n .then(async (sub) => {\n if (cancelled) {\n try {\n await sub.unsubscribe();\n } catch (unsubError: unknown) {\n this.#logErrorUnlessClearing(\n ensureError(\n unsubError,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n this.#getErrorContext('subscribeToOrderBook.cleanup', { symbol }),\n );\n }\n return undefined;\n }\n subscription = sub;\n this.#deps.debugLogger.log(\n `HyperLiquid: Order book subscription established for ${symbol}`,\n );\n return undefined;\n })\n .catch((error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n this.#getErrorContext('subscribeToOrderBook', { symbol }),\n );\n onError?.(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n );\n });\n\n return () => {\n cancelled = true;\n if (subscription) {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(\n error,\n 'HyperLiquidSubscriptionService.subscribeToOrderBook',\n ),\n this.#getErrorContext('subscribeToOrderBook.unsubscribe', {\n symbol,\n }),\n );\n });\n }\n };\n }\n\n /**\n * Process raw L2Book data into OrderBookData format\n * Calculates cumulative totals, notional values, and spread metrics\n *\n * @param data - Raw L2Book response from WebSocket\n * @param levels - Number of levels to return per side\n * @returns Processed OrderBookData\n */\n #processOrderBookData(data: L2BookResponse, levels: number): OrderBookData {\n const bidsRaw = data?.levels?.[0] ?? [];\n const asksRaw = data?.levels?.[1] ?? [];\n\n // Process bids (buy orders) - highest price first\n let bidCumulativeSize = 0;\n let bidCumulativeNotional = 0;\n const bids: OrderBookLevel[] = bidsRaw.slice(0, levels).map((level) => {\n const price = parseFloat(level.px);\n const size = parseFloat(level.sz);\n const notional = price * size;\n bidCumulativeSize += size;\n bidCumulativeNotional += notional;\n\n return {\n price: level.px,\n size: level.sz,\n total: bidCumulativeSize.toString(),\n notional: notional.toFixed(2),\n totalNotional: bidCumulativeNotional.toFixed(2),\n };\n });\n\n // Process asks (sell orders) - lowest price first\n let askCumulativeSize = 0;\n let askCumulativeNotional = 0;\n const asks: OrderBookLevel[] = asksRaw.slice(0, levels).map((level) => {\n const price = parseFloat(level.px);\n const size = parseFloat(level.sz);\n const notional = price * size;\n askCumulativeSize += size;\n askCumulativeNotional += notional;\n\n return {\n price: level.px,\n size: level.sz,\n total: askCumulativeSize.toString(),\n notional: notional.toFixed(2),\n totalNotional: askCumulativeNotional.toFixed(2),\n };\n });\n\n // Calculate spread and mid price\n const bestBid = bids[0];\n const bestAsk = asks[0];\n const bidPrice = bestBid ? parseFloat(bestBid.price) : 0;\n const askPrice = bestAsk ? parseFloat(bestAsk.price) : 0;\n const spread = askPrice > 0 && bidPrice > 0 ? askPrice - bidPrice : 0;\n const midPrice =\n askPrice > 0 && bidPrice > 0 ? (askPrice + bidPrice) / 2 : 0;\n const spreadPercentage =\n midPrice > 0 ? ((spread / midPrice) * 100).toFixed(4) : '0';\n\n // Calculate max total for depth chart scaling\n const maxTotal = Math.max(bidCumulativeSize, askCumulativeSize).toString();\n\n return {\n bids,\n asks,\n spread: spread.toFixed(5),\n spreadPercentage,\n midPrice: midPrice.toFixed(5),\n lastUpdated: Date.now(),\n maxTotal,\n };\n }\n\n /**\n * Notify all price subscribers with their requested symbols from cache\n * Optimized to batch updates per subscriber\n */\n #notifyAllPriceSubscribers(): void {\n // If no price data exists yet, don't notify\n if (!this.#cachedPriceData) {\n return;\n }\n\n const priceData = this.#cachedPriceData;\n\n // Group updates by subscriber to batch notifications\n const subscriberUpdates = new Map<\n (prices: PriceUpdate[]) => void,\n PriceUpdate[]\n >();\n\n this.#priceSubscribers.forEach((subscriberSet, symbol) => {\n const priceUpdate = priceData.get(symbol);\n if (priceUpdate) {\n subscriberSet.forEach((callback) => {\n if (!subscriberUpdates.has(callback)) {\n subscriberUpdates.set(callback, []);\n }\n const updates = subscriberUpdates.get(callback);\n if (updates) {\n updates.push(priceUpdate);\n }\n });\n }\n });\n\n // Send batched updates to each subscriber\n subscriberUpdates.forEach((updates, callback) => {\n if (updates.length > 0) {\n callback(updates);\n }\n });\n }\n\n /**\n * Restore all active subscriptions after WebSocket reconnection\n * Re-establishes WebSocket subscriptions for all active subscribers\n *\n * IMPORTANT: This method verifies transport readiness before attempting\n * any subscriptions to prevent \"subscribe error: undefined\" errors.\n */\n public async restoreSubscriptions(): Promise<void> {\n // CRITICAL: Verify transport is ready before attempting any subscriptions\n // This prevents race conditions where subscriptions are attempted while\n // the WebSocket is still in CONNECTING state\n try {\n await this.#clientService.ensureTransportReady({ timeoutMs: 5000 });\n } catch (error) {\n this.#deps.debugLogger.log(\n 'Transport not ready during subscription restore, will retry on next reconnect',\n { error: error instanceof Error ? error.message : String(error) },\n );\n return;\n }\n\n // Re-establish global allMids subscription if there are price subscribers\n if (this.#priceSubscribers.size > 0) {\n // Clear existing subscription reference (it's dead after reconnection)\n this.#globalAllMidsSubscription = undefined;\n this.#globalAllMidsPromise = undefined;\n\n // Re-establish the subscription\n this.#ensureGlobalAllMidsSubscription();\n }\n\n // Re-establish order fill subscriptions if there are fill subscribers\n if (this.#orderFillSubscribers.size > 0) {\n // Clear existing subscription references (they're dead after reconnection)\n this.#orderFillSubscriptions.clear();\n\n // Re-establish subscriptions for all accountIds with subscribers\n // Note: normalizedAccountId is 'default' for undefined, need to convert back\n const normalizedAccountIds = Array.from(\n this.#orderFillSubscribers.keys(),\n );\n await Promise.all(\n normalizedAccountIds.map((normalizedAccountId) => {\n // Convert normalized key back to original accountId (undefined if 'default')\n const accountId =\n normalizedAccountId === 'default'\n ? undefined\n : (normalizedAccountId as CaipAccountId);\n return this.#ensureOrderFillISubscription(accountId).catch(() => {\n // Ignore errors during order fill subscription restoration\n });\n }),\n );\n }\n\n // Re-establish user data subscriptions if there are user data subscribers\n if (\n this.#positionSubscribers.size > 0 ||\n this.#orderSubscribers.size > 0 ||\n this.#accountSubscribers.size > 0 ||\n this.#oiCapSubscribers.size > 0\n ) {\n // Clear existing subscription references (they're dead after reconnection)\n this.#webData3Subscriptions.clear();\n this.#webData3SubscriptionPromise = undefined;\n\n // Clear individual subscriptions (clearinghouseState + openOrders) for HIP-3 mode\n this.#clearinghouseStateSubscriptions.clear();\n this.#openOrdersSubscriptions.clear();\n\n // Re-establish the subscription (will use current account)\n // This will set up webData2 for non-HIP-3, or individual subscriptions + webData3 (OI caps only) for HIP-3\n await this.#ensureSharedWebData3Subscription();\n }\n\n // Re-establish activeAsset subscriptions if there are market data subscribers\n if (this.#marketDataSubscribers.size > 0) {\n // Clear existing subscriptions (they're dead after reconnection)\n this.#globalActiveAssetSubscriptions.clear();\n this.#pendingActiveAssetPromises.clear();\n // Clear reference counts to prevent double-counting after reconnection\n this.#symbolSubscriberCounts.clear();\n\n // Re-establish subscriptions for all symbols with market data subscribers\n const symbolsNeedingMarketData = Array.from(\n this.#marketDataSubscribers.keys(),\n );\n symbolsNeedingMarketData.forEach((symbol) => {\n this.#ensureActiveAssetSubscription(symbol);\n });\n }\n\n // Re-establish BBO subscriptions if there are order book subscribers\n if (this.#orderBookSubscribers.size > 0) {\n // Clear existing subscriptions (they're dead after reconnection)\n this.#globalBboSubscriptions.clear();\n this.#pendingBboPromises.clear();\n\n // Re-establish subscriptions for all symbols with order book subscribers\n const symbolsNeedingOrderBook = Array.from(\n this.#orderBookSubscribers.keys(),\n );\n symbolsNeedingOrderBook.forEach((symbol) => {\n this.#ensureBboSubscription(symbol);\n });\n }\n\n // Re-establish assetCtxs subscriptions if there are market data subscribers\n if (this.#marketDataSubscribers.size > 0) {\n // Clear existing subscriptions (they're dead after reconnection)\n this.#assetCtxsSubscriptions.clear();\n this.#assetCtxsSubscriptionPromises.clear();\n this.#dexAllMidsSubscriptions.clear();\n this.#dexAllMidsSubscriptionPromises.clear();\n\n // Re-establish subscriptions for all DEXs with market data subscribers\n const dexsNeeded = new Set<string>();\n this.#marketDataSubscribers.forEach((_subscribers, symbol) => {\n const { dex } = parseAssetName(symbol);\n if (dex) {\n dexsNeeded.add(dex);\n }\n });\n\n // Add main DEX if any main DEX symbols have subscribers\n const hasMainDexSubscribers = Array.from(\n this.#marketDataSubscribers.keys(),\n ).some((symbol) => {\n const { dex } = parseAssetName(symbol);\n return !dex;\n });\n if (hasMainDexSubscribers) {\n dexsNeeded.add('');\n }\n\n const marketDataRestoreOperations = Array.from(dexsNeeded).flatMap(\n (dex) => {\n const operations: {\n dex: string;\n kind: 'assetCtxs' | 'allMids';\n promise: Promise<void>;\n }[] = [\n {\n dex,\n kind: 'assetCtxs',\n promise: this.#ensureAssetCtxsSubscription(dex, {\n incrementRefCount: false,\n }),\n },\n ];\n\n if (dex) {\n operations.push({\n dex,\n kind: 'allMids',\n promise: this.#ensureDexAllMidsSubscription(dex),\n });\n }\n\n return operations;\n },\n );\n\n const marketDataRestoreResults = await Promise.allSettled(\n marketDataRestoreOperations.map(({ promise }) => promise),\n );\n const marketDataRestoreFailures = marketDataRestoreResults.flatMap(\n (result, index) => {\n if (result.status === 'fulfilled') {\n return [];\n }\n\n const operation = marketDataRestoreOperations[index];\n return [\n {\n ...operation,\n error: ensureError(\n result.reason,\n 'HyperLiquidSubscriptionService.restoreSubscriptions',\n ),\n },\n ];\n },\n );\n\n if (marketDataRestoreFailures.length > 0) {\n marketDataRestoreFailures.forEach(({ dex, kind }) => {\n this.#scheduleRestoreRetry(dex, kind);\n });\n\n this.#logErrorUnlessClearing(\n new Error(\n `Failed to restore ${marketDataRestoreFailures.length} market data subscriptions`,\n ),\n this.#getErrorContext('restoreSubscriptions.marketData', {\n failures: marketDataRestoreFailures.map(\n ({ dex, kind, error }) =>\n `${kind}:${dex || 'main'}:${error.message}`,\n ),\n }),\n );\n }\n }\n }\n\n /**\n * Clear all subscriptions and cached data (multi-DEX support)\n */\n public clearAll(): void {\n // Suppress error logging for pending unsubscribe requests during intentional disconnect.\n // The WebSocket will be closed after this, causing pending unsubscribe promises to reject\n // with WebSocketRequestError - these are expected and should not be logged to Sentry.\n this.#isClearing = true;\n\n // Clear all local subscriber collections\n this.#priceSubscribers.clear();\n this.#positionSubscribers.clear();\n this.#orderFillSubscribers.clear();\n this.#orderSubscribers.clear();\n this.#accountSubscribers.clear();\n this.#marketDataSubscribers.clear();\n this.#orderBookSubscribers.clear();\n\n // Clear order fill subscriptions\n this.#orderFillSubscriptions.forEach((subscription) => {\n subscription.unsubscribe().catch(() => {\n // Ignore errors during cleanup\n });\n });\n this.#orderFillSubscriptions.clear();\n\n // Clear cached data\n this.#cachedPriceData = null;\n this.#allMidsSnapshots.clear();\n this.#cachedPositions = null;\n this.#cachedOrders = null;\n this.#cachedAccount = null;\n this.#cachedFills = null;\n this.#ordersCacheInitialized = false; // Reset cache initialization flag\n this.#positionsCacheInitialized = false; // Reset cache initialization flag\n this.#fillsCacheInitialized = false; // Reset fills cache initialization flag\n this.#marketDataCache.clear();\n this.#orderBookCache.clear();\n this.#symbolSubscriberCounts.clear();\n this.#dexSubscriberCounts.clear();\n\n // Clear hash caches\n this.#cachedPositionsHash = '';\n this.#cachedOrdersHash = '';\n this.#cachedAccountHash = '';\n\n // Clear multi-DEX caches\n this.#deps.debugLogger.log(\n 'HyperLiquidSubscriptionService: Clearing per-DEX caches',\n {\n dexPositionsCacheSize: this.#dexPositionsCache.size,\n dexOrdersCacheSize: this.#dexOrdersCache.size,\n dexAccountCacheSize: this.#dexAccountCache.size,\n dexAssetCtxsCacheSize: this.#dexAssetCtxsCache.size,\n dexPositionsCacheKeys: Array.from(this.#dexPositionsCache.keys()),\n dexAssetCtxsCacheKeys: Array.from(this.#dexAssetCtxsCache.keys()),\n },\n );\n\n this.#dexPositionsCache.clear();\n this.#dexOrdersCache.clear();\n this.#dexAccountCache.clear();\n this.#dexAssetCtxsCache.clear();\n\n // Clear subscription references (actual cleanup handled by client service)\n this.#globalAllMidsSubscription = undefined;\n this.#globalAllMidsPromise = undefined;\n this.#globalActiveAssetSubscriptions.clear();\n this.#pendingActiveAssetPromises.clear();\n this.#globalBboSubscriptions.clear();\n this.#pendingBboPromises.clear();\n this.#webData3Subscriptions.clear();\n this.#webData3SubscriptionPromise = undefined;\n\n // HIP-3: Clear assetCtxs subscriptions (clearinghouseState no longer needed with webData3)\n this.#assetCtxsSubscriptions.clear();\n this.#assetCtxsSubscriptionPromises.clear();\n\n // HIP-3: Clear per-DEX allMids subscriptions\n this.#dexAllMidsSubscriptions.clear();\n this.#dexAllMidsSubscriptionPromises.clear();\n\n this.#restoreRetryTimeouts.forEach((timeoutId) => {\n clearTimeout(timeoutId);\n });\n this.#restoreRetryTimeouts.clear();\n\n // Cleanup individual subscriptions (clearinghouseState + openOrders)\n if (this.#clearinghouseStateSubscriptions.size > 0) {\n this.#clearinghouseStateSubscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.clearAll'),\n this.#getErrorContext('clearAll.clearinghouseState', {\n dex: dexName,\n }),\n );\n });\n });\n this.#clearinghouseStateSubscriptions.clear();\n }\n\n if (this.#openOrdersSubscriptions.size > 0) {\n this.#openOrdersSubscriptions.forEach((subscription, dexName) => {\n subscription.unsubscribe().catch((error: Error) => {\n this.#logErrorUnlessClearing(\n ensureError(error, 'HyperLiquidSubscriptionService.clearAll'),\n this.#getErrorContext('clearAll.openOrders', {\n dex: dexName,\n }),\n );\n });\n });\n this.#openOrdersSubscriptions.clear();\n }\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: Subscription service cleared (multi-DEX with individual subscriptions)',\n {\n timestamp: new Date().toISOString(),\n },\n );\n }\n}\n"]}
|