@metamask-previews/perps-controller 15.1.0-preview-6b7c25c → 15.1.0-preview-00a181c

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.
Files changed (130) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/PerpsController-method-action-types.cjs.map +1 -1
  3. package/dist/PerpsController-method-action-types.d.cts +20 -1
  4. package/dist/PerpsController-method-action-types.d.cts.map +1 -1
  5. package/dist/PerpsController-method-action-types.d.mts +20 -1
  6. package/dist/PerpsController-method-action-types.d.mts.map +1 -1
  7. package/dist/PerpsController-method-action-types.mjs.map +1 -1
  8. package/dist/PerpsController.cjs +65 -154
  9. package/dist/PerpsController.cjs.map +1 -1
  10. package/dist/PerpsController.d.cts +37 -43
  11. package/dist/PerpsController.d.cts.map +1 -1
  12. package/dist/PerpsController.d.mts +37 -43
  13. package/dist/PerpsController.d.mts.map +1 -1
  14. package/dist/PerpsController.mjs +64 -151
  15. package/dist/PerpsController.mjs.map +1 -1
  16. package/dist/aggregation/SubscriptionMultiplexer.cjs +1 -1
  17. package/dist/aggregation/SubscriptionMultiplexer.cjs.map +1 -1
  18. package/dist/aggregation/SubscriptionMultiplexer.d.cts +1 -1
  19. package/dist/aggregation/SubscriptionMultiplexer.d.mts +1 -1
  20. package/dist/aggregation/SubscriptionMultiplexer.mjs +1 -1
  21. package/dist/aggregation/SubscriptionMultiplexer.mjs.map +1 -1
  22. package/dist/constants/index.cjs +0 -1
  23. package/dist/constants/index.cjs.map +1 -1
  24. package/dist/constants/index.d.cts +0 -1
  25. package/dist/constants/index.d.cts.map +1 -1
  26. package/dist/constants/index.d.mts +0 -1
  27. package/dist/constants/index.d.mts.map +1 -1
  28. package/dist/constants/index.mjs +0 -1
  29. package/dist/constants/index.mjs.map +1 -1
  30. package/dist/constants/perpsConfig.cjs +4 -9
  31. package/dist/constants/perpsConfig.cjs.map +1 -1
  32. package/dist/constants/perpsConfig.d.cts +3 -5
  33. package/dist/constants/perpsConfig.d.cts.map +1 -1
  34. package/dist/constants/perpsConfig.d.mts +3 -5
  35. package/dist/constants/perpsConfig.d.mts.map +1 -1
  36. package/dist/constants/perpsConfig.mjs +4 -9
  37. package/dist/constants/perpsConfig.mjs.map +1 -1
  38. package/dist/index.cjs +146 -175
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +2 -2
  41. package/dist/index.d.cts.map +1 -1
  42. package/dist/index.d.mts +2 -2
  43. package/dist/index.d.mts.map +1 -1
  44. package/dist/index.mjs +0 -1
  45. package/dist/index.mjs.map +1 -1
  46. package/dist/providers/AggregatedPerpsProvider.cjs +8 -2
  47. package/dist/providers/AggregatedPerpsProvider.cjs.map +1 -1
  48. package/dist/providers/AggregatedPerpsProvider.d.cts +3 -2
  49. package/dist/providers/AggregatedPerpsProvider.d.cts.map +1 -1
  50. package/dist/providers/AggregatedPerpsProvider.d.mts +3 -2
  51. package/dist/providers/AggregatedPerpsProvider.d.mts.map +1 -1
  52. package/dist/providers/AggregatedPerpsProvider.mjs +8 -2
  53. package/dist/providers/AggregatedPerpsProvider.mjs.map +1 -1
  54. package/dist/providers/HyperLiquidProvider.cjs +118 -22
  55. package/dist/providers/HyperLiquidProvider.cjs.map +1 -1
  56. package/dist/providers/HyperLiquidProvider.d.cts +31 -0
  57. package/dist/providers/HyperLiquidProvider.d.cts.map +1 -1
  58. package/dist/providers/HyperLiquidProvider.d.mts +31 -0
  59. package/dist/providers/HyperLiquidProvider.d.mts.map +1 -1
  60. package/dist/providers/HyperLiquidProvider.mjs +118 -22
  61. package/dist/providers/HyperLiquidProvider.mjs.map +1 -1
  62. package/dist/providers/LighterProvider.cjs +1 -1
  63. package/dist/providers/LighterProvider.cjs.map +1 -1
  64. package/dist/providers/LighterProvider.mjs +1 -1
  65. package/dist/providers/LighterProvider.mjs.map +1 -1
  66. package/dist/routing/ProviderRouter.cjs +1 -1
  67. package/dist/routing/ProviderRouter.cjs.map +1 -1
  68. package/dist/routing/ProviderRouter.d.cts +1 -1
  69. package/dist/routing/ProviderRouter.d.mts +1 -1
  70. package/dist/routing/ProviderRouter.mjs +1 -1
  71. package/dist/routing/ProviderRouter.mjs.map +1 -1
  72. package/dist/services/HyperLiquidClientService.cjs.map +1 -1
  73. package/dist/services/HyperLiquidClientService.d.cts +26 -16
  74. package/dist/services/HyperLiquidClientService.d.cts.map +1 -1
  75. package/dist/services/HyperLiquidClientService.d.mts +26 -16
  76. package/dist/services/HyperLiquidClientService.d.mts.map +1 -1
  77. package/dist/services/HyperLiquidClientService.mjs.map +1 -1
  78. package/dist/services/HyperLiquidWalletService.cjs +80 -30
  79. package/dist/services/HyperLiquidWalletService.cjs.map +1 -1
  80. package/dist/services/HyperLiquidWalletService.d.cts +48 -22
  81. package/dist/services/HyperLiquidWalletService.d.cts.map +1 -1
  82. package/dist/services/HyperLiquidWalletService.d.mts +48 -22
  83. package/dist/services/HyperLiquidWalletService.d.mts.map +1 -1
  84. package/dist/services/HyperLiquidWalletService.mjs +80 -30
  85. package/dist/services/HyperLiquidWalletService.mjs.map +1 -1
  86. package/dist/services/LighterWalletService.cjs +1 -1
  87. package/dist/services/LighterWalletService.cjs.map +1 -1
  88. package/dist/services/LighterWalletService.d.cts +1 -1
  89. package/dist/services/LighterWalletService.d.mts +1 -1
  90. package/dist/services/LighterWalletService.mjs +1 -1
  91. package/dist/services/LighterWalletService.mjs.map +1 -1
  92. package/dist/types/index.cjs.map +1 -1
  93. package/dist/types/index.d.cts +10 -16
  94. package/dist/types/index.d.cts.map +1 -1
  95. package/dist/types/index.d.mts +10 -16
  96. package/dist/types/index.d.mts.map +1 -1
  97. package/dist/types/index.mjs.map +1 -1
  98. package/dist/utils/lighterAdapter.cjs +1 -2
  99. package/dist/utils/lighterAdapter.cjs.map +1 -1
  100. package/dist/utils/lighterAdapter.d.cts +1 -2
  101. package/dist/utils/lighterAdapter.d.cts.map +1 -1
  102. package/dist/utils/lighterAdapter.d.mts +1 -2
  103. package/dist/utils/lighterAdapter.d.mts.map +1 -1
  104. package/dist/utils/lighterAdapter.mjs +1 -2
  105. package/dist/utils/lighterAdapter.mjs.map +1 -1
  106. package/package.json +2 -8
  107. package/dist/constants/myxConfig.cjs +0 -253
  108. package/dist/constants/myxConfig.cjs.map +0 -1
  109. package/dist/constants/myxConfig.d.cts +0 -145
  110. package/dist/constants/myxConfig.d.cts.map +0 -1
  111. package/dist/constants/myxConfig.d.mts +0 -145
  112. package/dist/constants/myxConfig.d.mts.map +0 -1
  113. package/dist/constants/myxConfig.mjs +0 -243
  114. package/dist/constants/myxConfig.mjs.map +0 -1
  115. package/dist/types/myx-types.cjs +0 -41
  116. package/dist/types/myx-types.cjs.map +0 -1
  117. package/dist/types/myx-types.d.cts +0 -94
  118. package/dist/types/myx-types.d.cts.map +0 -1
  119. package/dist/types/myx-types.d.mts +0 -94
  120. package/dist/types/myx-types.d.mts.map +0 -1
  121. package/dist/types/myx-types.mjs +0 -26
  122. package/dist/types/myx-types.mjs.map +0 -1
  123. package/dist/utils/myxAdapter.cjs +0 -569
  124. package/dist/utils/myxAdapter.cjs.map +0 -1
  125. package/dist/utils/myxAdapter.d.cts +0 -168
  126. package/dist/utils/myxAdapter.d.cts.map +0 -1
  127. package/dist/utils/myxAdapter.d.mts +0 -168
  128. package/dist/utils/myxAdapter.d.mts.map +0 -1
  129. package/dist/utils/myxAdapter.mjs +0 -548
  130. package/dist/utils/myxAdapter.mjs.map +0 -1
@@ -11,27 +11,37 @@ import type { CandleData } from "../types/perps-types.mjs";
11
11
  * Uses CandlePeriod enum for type safety
12
12
  */
13
13
  export type ValidCandleInterval = CandlePeriod;
14
+ /**
15
+ * Params-style EIP-712 typed-data signing request, as passed by the
16
+ * HyperLiquid SDK to wallet adapters (viem local-account shape).
17
+ */
18
+ export type HyperLiquidSignTypedDataParams = {
19
+ domain: {
20
+ name: string;
21
+ version: string;
22
+ chainId: number;
23
+ verifyingContract: Hex;
24
+ };
25
+ types: {
26
+ [key: string]: {
27
+ name: string;
28
+ type: string;
29
+ }[];
30
+ };
31
+ primaryType: string;
32
+ message: Record<string, unknown>;
33
+ };
14
34
  /**
15
35
  * Wallet interface for HyperLiquid SDK operations.
16
36
  * Extracted for reuse across initialize(), toggleTestnet(), and ensureSubscriptionClient() methods.
37
+ *
38
+ * `address` is optional but recommended: the SDK's viem local-account
39
+ * dispatch reads it to determine the signing address (e.g. for agent
40
+ * wallets, whose address differs from the selected master account).
17
41
  */
18
42
  export type HyperLiquidWalletParams = {
19
- signTypedData: (params: {
20
- domain: {
21
- name: string;
22
- version: string;
23
- chainId: number;
24
- verifyingContract: Hex;
25
- };
26
- types: {
27
- [key: string]: {
28
- name: string;
29
- type: string;
30
- }[];
31
- };
32
- primaryType: string;
33
- message: Record<string, unknown>;
34
- }) => Promise<Hex>;
43
+ address?: Hex;
44
+ signTypedData: (params: HyperLiquidSignTypedDataParams) => Promise<Hex>;
35
45
  getChainId?: () => Promise<number>;
36
46
  };
37
47
  export { WebSocketConnectionState } from "../types/index.mjs";
@@ -1 +1 @@
1
- {"version":3,"file":"HyperLiquidClientService.d.mts","sourceRoot":"","sources":["../../src/services/HyperLiquidClientService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HyperLiquidClientService.d.mts","sourceRoot":"","sources":["../../src/services/HyperLiquidClientService.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"HyperLiquidClientService.mjs","sourceRoot":"","sources":["../../src/services/HyperLiquidClientService.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hex } from '@metamask/utils';\nimport {\n ExchangeClient,\n HttpTransport,\n InfoClient,\n SubscriptionClient,\n WebSocketTransport,\n} from '@nktkas/hyperliquid';\nimport type { HistoricalOrdersResponse } from '@nktkas/hyperliquid';\n\nimport {\n CandlePeriod,\n calculateCandleCount,\n} from '../constants/chartConfig.js';\nimport { HYPERLIQUID_TRANSPORT_CONFIG } from '../constants/hyperLiquidConfig.js';\nimport {\n PERFORMANCE_CONFIG,\n PERPS_CONSTANTS,\n} from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport type { HyperLiquidNetwork } from '../types/config.js';\nimport { WebSocketConnectionState } from '../types/index.js';\nimport type {\n SubscribeCandlesParams,\n PerpsPlatformDependencies,\n} from '../types/index.js';\nimport type { CandleData } from '../types/perps-types.js';\nimport { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest.js';\nimport { ensureError, isAbortError } from '../utils/errorUtils.js';\nimport { getPerpsConnectionAttemptContext } from '../utils/perpsConnectionAttemptContext.js';\n\n/**\n * Maximum number of reconnection attempts before giving up.\n */\nconst maxReconnectionAttempts = 10;\n\n/**\n * Valid time intervals for historical candle data\n * Uses CandlePeriod enum for type safety\n */\nexport type ValidCandleInterval = CandlePeriod;\n\n/**\n * Wallet interface for HyperLiquid SDK operations.\n * Extracted for reuse across initialize(), toggleTestnet(), and ensureSubscriptionClient() methods.\n */\nexport type HyperLiquidWalletParams = {\n signTypedData: (params: {\n domain: {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: Hex;\n };\n types: {\n [key: string]: { name: string; type: string }[];\n };\n primaryType: string;\n message: Record<string, unknown>;\n }) => Promise<Hex>;\n getChainId?: () => Promise<number>;\n};\n\n// WebSocketConnectionState is now imported from controllers/types\n// Re-export for backward compatibility with existing consumers\nexport { WebSocketConnectionState } from '../types/index.js';\n\n/**\n * Service for managing HyperLiquid SDK clients\n * Handles initialization, transport creation, and client lifecycle\n */\nexport class HyperLiquidClientService {\n #exchangeClient?: ExchangeClient;\n\n #infoClient?: InfoClient; // WebSocket transport (default)\n\n #infoClientHttp?: InfoClient; // HTTP transport (fallback)\n\n #subscriptionClient?: SubscriptionClient<{\n transport: WebSocketTransport;\n }>;\n\n #wsTransport?: WebSocketTransport;\n\n #httpTransport?: HttpTransport;\n\n #walletParams?: HyperLiquidWalletParams;\n\n #isTestnet: boolean;\n\n #connectionState: WebSocketConnectionState =\n WebSocketConnectionState.Disconnected;\n\n // Monotonic identifier for the current WebSocket connection.\n //\n // Incremented on every raw socket `close`, which covers SDK-internal\n // automatic reconnects as well as manual teardown — the SDK reconnects\n // underneath us without notifying callers, and `terminate` only fires once\n // retries are exhausted. Consumers stamp cached per-connection data with the\n // epoch that produced it and compare on read, so anything carried over from a\n // previous socket is rejected without any explicit invalidation step.\n //\n // Starts at 1 so a stamp of 0 (or an unstamped default) never matches.\n #connectionEpoch = 1;\n\n #disconnectionPromise: Promise<void> | null = null;\n\n // Callback for SDK terminate event (fired when all reconnection attempts exhausted)\n #onTerminateCallback: ((error: Error) => void) | null = null;\n\n #onReconnectCallback?: () => Promise<void>;\n\n // Reconnection attempt counter\n #reconnectionAttempt = 0;\n\n // Connection state change listeners for event-based notifications\n readonly #connectionStateListeners: Set<\n (state: WebSocketConnectionState, reconnectionAttempt: number) => void\n > = new Set();\n\n // Timeout reference for reconnection retry, tracked to enable cancellation on disconnect\n #reconnectionRetryTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Platform dependencies for logging\n readonly #deps: PerpsPlatformDependencies;\n\n constructor(\n deps: PerpsPlatformDependencies,\n options: { isTestnet?: boolean } = {},\n ) {\n this.#deps = deps;\n this.#isTestnet = options.isTestnet ?? false;\n }\n\n /**\n * Initialize all HyperLiquid SDK clients\n *\n * IMPORTANT: This method awaits transport.ready() to ensure the WebSocket is\n * in OPEN state before marking initialization complete. This prevents race\n * conditions where subscriptions are attempted before the WebSocket handshake\n * completes (which would cause \"subscribe error: undefined\" errors).\n *\n * @param wallet - The wallet parameters for signing typed data.\n */\n public async initialize(wallet: HyperLiquidWalletParams): Promise<void> {\n const network = this.#isTestnet ? 'testnet' : 'mainnet';\n const attemptContext = getPerpsConnectionAttemptContext();\n\n try {\n this.#updateConnectionState(WebSocketConnectionState.Connecting);\n this.#walletParams = wallet;\n this.#createTransports();\n\n // Ensure transports are created\n if (!this.#httpTransport || !this.#wsTransport) {\n throw new Error('Failed to create transports');\n }\n\n this.#createAllClients(wallet);\n\n // Wait for WebSocket to actually be ready before setting CONNECTED\n // This ensures we have a real connection, not just client objects\n await this.#wsTransport.ready();\n\n this.#updateConnectionState(WebSocketConnectionState.Connected);\n\n this.#deps.debugLogger.log('HyperLiquid SDK clients initialized', {\n testnet: this.#isTestnet,\n timestamp: new Date().toISOString(),\n connectionState: this.#connectionState,\n note: 'Using WebSocket for InfoClient (default), HTTP fallback available',\n });\n } catch (error) {\n // Cleanup on failure to prevent leaks and ensure isInitialized() returns false\n // Clear clients first, then transports\n this.#subscriptionClient = undefined;\n this.#infoClient = undefined;\n this.#infoClientHttp = undefined;\n this.#exchangeClient = undefined;\n\n // Close WebSocket transport to release resources and event listeners\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n } catch {\n // Ignore cleanup errors\n }\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n }\n this.#httpTransport = undefined;\n\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.initialize',\n );\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n\n if (attemptContext?.suppressError) {\n this.#deps.debugLogger.log(\n 'HyperLiquid initialize failed during suppressed startup attempt',\n {\n error: errorInstance.message,\n network,\n source: attemptContext.source,\n },\n );\n } else {\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network,\n },\n context: {\n name: 'sdk_initialization',\n data: {\n operation: 'initialize',\n isTestnet: this.#isTestnet,\n source: attemptContext?.source ?? 'unspecified',\n },\n },\n });\n }\n\n throw error;\n }\n }\n\n /**\n * Create HTTP and WebSocket transports\n * - HTTP for InfoClient and ExchangeClient (request/response operations)\n * - WebSocket for SubscriptionClient (real-time pub/sub)\n *\n * Both transports use SDK's built-in endpoint resolution via isTestnet flag\n *\n * @returns The created WebSocket transport instance.\n */\n #createTransports(): WebSocketTransport {\n // Prevent duplicate transport creation and listener accumulation\n // This guards against re-entry if initialize() is called multiple times\n // (e.g., after a failed initialization attempt that didn't properly clean up)\n if (this.#wsTransport && this.#httpTransport) {\n this.#deps.debugLogger.log(\n 'HyperLiquid: Transports already exist, skipping creation',\n );\n return this.#wsTransport;\n }\n\n this.#deps.debugLogger.log('HyperLiquid: Creating transports', {\n isTestnet: this.#isTestnet,\n timestamp: new Date().toISOString(),\n note: 'SDK will auto-select endpoints based on isTestnet flag',\n });\n\n // HTTP transport for request/response operations (InfoClient, ExchangeClient)\n // SDK automatically selects: mainnet (https://api.hyperliquid.xyz) or testnet (https://api.hyperliquid-testnet.xyz)\n this.#httpTransport = new HttpTransport({\n isTestnet: this.#isTestnet,\n timeout: HYPERLIQUID_TRANSPORT_CONFIG.timeout,\n });\n\n // WebSocket transport for real-time subscriptions (SubscriptionClient)\n // SDK automatically selects: mainnet (wss://api.hyperliquid.xyz/ws) or testnet (wss://api.hyperliquid-testnet.xyz/ws)\n this.#wsTransport = new WebSocketTransport({\n isTestnet: this.#isTestnet,\n ...HYPERLIQUID_TRANSPORT_CONFIG,\n reconnect: HYPERLIQUID_TRANSPORT_CONFIG.reconnect,\n });\n\n // Retire the connection epoch whenever the raw socket closes.\n //\n // This is the only signal that covers an SDK-internal automatic reconnect:\n // the SDK reopens the socket underneath us without notifying callers, and\n // `terminate` fires only once reconnection attempts are exhausted. rews\n // listeners survive reconnections, so attaching once here observes every\n // subsequent close. Data cached against the old epoch stops matching from\n // this moment, with no invalidation call to place correctly.\n //\n // The listener is bound to the transport it was attached to. A retired\n // transport can still emit `close` after it has been replaced — teardown is\n // asynchronous — and acting on that would retire the CURRENT connection's\n // epoch, discarding live positions for no reason. Replacing a transport\n // retires the outgoing epoch explicitly (see #retireConnectionEpoch), so\n // ignoring these late events loses nothing.\n const owningTransport = this.#wsTransport;\n this.#wsTransport.socket.addEventListener('close', () => {\n if (this.#wsTransport !== owningTransport) {\n this.#deps.debugLogger.log(\n 'HyperLiquid: ignoring close from a retired WebSocket transport',\n { connectionEpoch: this.#connectionEpoch },\n );\n return;\n }\n\n this.#connectionEpoch += 1;\n this.#deps.debugLogger.log(\n 'HyperLiquid: WebSocket closed, epoch retired',\n {\n connectionEpoch: this.#connectionEpoch,\n },\n );\n });\n\n // Listen for WebSocket termination (fired when SDK exhausts all reconnection attempts)\n this.#wsTransport.socket.addEventListener('terminate', (event: Event) => {\n const customEvent = event as CustomEvent;\n this.#deps.debugLogger.log('HyperLiquid: WebSocket terminated', {\n reason: customEvent.detail?.code,\n timestamp: new Date().toISOString(),\n });\n\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n\n if (this.#onTerminateCallback) {\n const error =\n customEvent.detail instanceof Error\n ? customEvent.detail\n : new Error(\n `WebSocket terminated: ${customEvent.detail?.code ?? 'unknown'}`,\n );\n this.#onTerminateCallback(error);\n }\n });\n\n return this.#wsTransport;\n }\n\n /**\n * Create all SDK clients using the current transports.\n * Shared by initialize() and #handleConnectionDrop() to avoid drift.\n *\n * @param wallet - Optional wallet params. Uses stored #walletParams when omitted (reconnection path).\n */\n #createAllClients(wallet?: HyperLiquidWalletParams): void {\n if (!this.#wsTransport || !this.#httpTransport) {\n throw new Error('Transports must be created before clients');\n }\n\n this.#infoClient = new InfoClient({ transport: this.#wsTransport });\n this.#subscriptionClient = new SubscriptionClient({\n transport: this.#wsTransport,\n });\n this.#createHttpClients(wallet);\n }\n\n /**\n * Create the HTTP-backed SDK clients.\n *\n * @param wallet - Optional wallet params. Uses stored #walletParams when omitted.\n */\n #createHttpClients(wallet?: HyperLiquidWalletParams): void {\n const effectiveWallet = wallet ?? this.#walletParams;\n\n if (!this.#httpTransport) {\n throw new Error('HTTP transport must be created before clients');\n }\n\n this.#infoClientHttp = new InfoClient({ transport: this.#httpTransport });\n\n if (effectiveWallet) {\n this.#exchangeClient = new ExchangeClient({\n wallet: effectiveWallet as any, // eslint-disable-line @typescript-eslint/no-explicit-any -- Type widening for SDK compatibility\n transport: this.#httpTransport,\n });\n } else {\n this.#exchangeClient = undefined;\n }\n }\n\n /**\n * Toggle testnet mode and reinitialize clients\n *\n * @param wallet - The wallet parameters for signing typed data.\n * @returns The new network name after toggling.\n */\n public async toggleTestnet(\n wallet: HyperLiquidWalletParams,\n ): Promise<HyperLiquidNetwork> {\n this.#isTestnet = !this.#isTestnet;\n await this.initialize(wallet);\n return this.#isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Check if clients are properly initialized\n *\n * @returns True if all SDK clients are initialized.\n */\n public isInitialized(): boolean {\n return Boolean(\n this.#exchangeClient &&\n this.#infoClient &&\n this.#infoClientHttp &&\n this.#subscriptionClient,\n );\n }\n\n /**\n * Ensure clients are initialized, throw if not\n */\n public ensureInitialized(): void {\n if (!this.isInitialized()) {\n throw new Error(PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED);\n }\n }\n\n /**\n * Recreate subscription client if needed (for reconnection scenarios)\n *\n * @param wallet - The wallet parameters for signing typed data.\n */\n public async ensureSubscriptionClient(\n wallet: HyperLiquidWalletParams,\n ): Promise<void> {\n if (!this.#subscriptionClient) {\n // A reconnect publishes its WebSocket clients only after transport.ready().\n // Do not start a competing initialize() while that attempt or its retry\n // backoff is active; callers will observe an unavailable subscription\n // client until the reconnect completes and restores tracked subscriptions.\n if (this.#isReconnecting || this.#reconnectionRetryTimeout) {\n return;\n }\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: Recreating subscription client after disconnect',\n );\n\n if (\n this.#walletParams &&\n this.#connectionState === WebSocketConnectionState.Disconnected\n ) {\n await this.reconnect();\n } else {\n await this.initialize(wallet);\n }\n }\n }\n\n /**\n * Get the exchange client\n *\n * @returns The initialized ExchangeClient instance.\n */\n public getExchangeClient(): ExchangeClient {\n if (!this.#exchangeClient) {\n this.ensureInitialized();\n throw new Error(PERPS_ERROR_CODES.EXCHANGE_CLIENT_NOT_AVAILABLE);\n }\n return this.#exchangeClient;\n }\n\n /**\n * Get the info client\n *\n * @param options - The options for selecting the transport.\n * @param options.useHttp - Force HTTP transport instead of WebSocket (default: false).\n * @returns InfoClient instance with the selected transport.\n */\n public getInfoClient(options?: { useHttp?: boolean }): InfoClient {\n if (options?.useHttp) {\n if (!this.#infoClientHttp) {\n this.ensureInitialized();\n throw new Error(PERPS_ERROR_CODES.INFO_CLIENT_NOT_AVAILABLE);\n }\n return this.#infoClientHttp;\n }\n\n this.ensureInitialized();\n if (!this.#infoClient) {\n throw new Error(PERPS_ERROR_CODES.INFO_CLIENT_NOT_AVAILABLE);\n }\n return this.#infoClient;\n }\n\n /**\n * Get the subscription client\n *\n * @returns The SubscriptionClient instance, or undefined if not initialized.\n */\n public getSubscriptionClient():\n | SubscriptionClient<{ transport: WebSocketTransport }>\n | undefined {\n if (!this.#subscriptionClient) {\n this.#deps.debugLogger.log('SubscriptionClient not initialized');\n return undefined;\n }\n return this.#subscriptionClient;\n }\n\n /**\n * Ensures the WebSocket transport is in OPEN state and ready for subscriptions.\n * This MUST be called before any subscription operations to prevent race conditions.\n *\n * The SDK's `transport.ready()` method:\n * - Returns immediately if WebSocket is already in OPEN state\n * - Waits for the \"open\" event if WebSocket is in CONNECTING state\n * - Supports AbortSignal for timeout/cancellation\n *\n * @param options - The options for transport readiness check.\n * @param options.timeoutMs - Maximum time to wait for transport ready (default 5000ms).\n * @throws Error if transport not ready within timeout or subscription client unavailable.\n */\n public async ensureTransportReady(\n options: { timeoutMs?: number } = {},\n ): Promise<void> {\n const { timeoutMs = 5000 } = options;\n const subscriptionClient = this.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () =>\n controller.abort(\n new Error(`WebSocket transport ready timeout after ${timeoutMs}ms`),\n ),\n timeoutMs,\n );\n\n try {\n await subscriptionClient.config_.transport.ready(controller.signal);\n } catch (error) {\n if (controller.signal.aborted) {\n throw new Error(\n `WebSocket transport ready timeout after ${timeoutMs}ms`,\n );\n }\n throw ensureError(error, 'HyperLiquidClientService.ensureTransportReady');\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get current network state\n *\n * @returns The current HyperLiquid network (mainnet or testnet).\n */\n public getNetwork(): HyperLiquidNetwork {\n return this.#isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Check if running on testnet\n *\n * @returns True if the service is in testnet mode.\n */\n public isTestnetMode(): boolean {\n return this.#isTestnet;\n }\n\n /**\n * Update testnet mode\n *\n * @param isTestnet - Whether to enable testnet mode.\n */\n public setTestnetMode(isTestnet: boolean): void {\n this.#isTestnet = isTestnet;\n }\n\n /**\n * Fetch historical candle data using the HyperLiquid SDK\n *\n * @param options - The candle fetch configuration.\n * @param options.symbol - The asset symbol (e.g., \"BTC\", \"ETH\").\n * @param options.interval - The candle interval (e.g., \"1m\", \"5m\", \"15m\", \"1h\", \"1d\").\n * @param options.limit - Number of candles to fetch (default: 100).\n * @param options.endTime - End timestamp in milliseconds (default: now).\n * @param options.signal - Optional AbortSignal to cancel the fetch.\n * @returns The historical candle data, or null if no data is available.\n */\n public async fetchHistoricalCandles(options: {\n symbol: string;\n interval: ValidCandleInterval;\n limit?: number;\n endTime?: number;\n signal?: AbortSignal;\n }): Promise<CandleData | null> {\n const { symbol, interval, limit = 100, endTime, signal } = options;\n\n if (signal?.aborted) {\n const abortError = new Error('Aborted');\n abortError.name = 'AbortError';\n throw abortError;\n }\n\n // Explicit endTime is a paging call — the caller owns that exact window\n // and expects a fresh page. Coalescing per-millisecond endTimes produces\n // keys that never dedupe and never evict (TTL-miss sweep only fires on\n // re-access with the same key), so route paging straight to the SDK and\n // only coalesce the live-snapshot path where all callers share 'now'.\n if (endTime !== undefined) {\n return this.#runCandleSnapshotFetch({\n symbol,\n interval,\n limit,\n endTime,\n signal,\n });\n }\n\n // Live snapshot: coalesce across rapid market switches (pass 1 → pass 2\n // of the 10-market stress loop) so callers share one snapshot per\n // (symbol, interval).\n // Signal is intentionally dropped inside the coalesced fetch — the HL\n // SDK charges weight for any request already sent, and dropping a\n // per-caller abort lets the next caller reuse the in-flight/cached\n // result instead of re-firing the REST. The WS stream keeps live\n // candles fresh, so reusing the first-caller snapshot for up to the\n // TTL is acceptable.\n const cacheKey = [\n 'candleSnapshot',\n this.#isTestnet ? 'testnet' : 'mainnet',\n symbol,\n interval,\n limit,\n ].join('|');\n\n return coalescePerpsRestRequest<CandleData | null>(\n cacheKey,\n () => this.#runCandleSnapshotFetch({ symbol, interval, limit }),\n { ttlMs: PERFORMANCE_CONFIG.PerpsCandleCoalesceTtlMs },\n );\n }\n\n async #runCandleSnapshotFetch(options: {\n symbol: string;\n interval: ValidCandleInterval;\n limit: number;\n endTime?: number;\n signal?: AbortSignal;\n }): Promise<CandleData | null> {\n const { symbol, interval, limit, endTime, signal } = options;\n try {\n const now = endTime ?? Date.now();\n const intervalMs = this.#getIntervalMilliseconds(interval);\n const startTime = now - limit * intervalMs;\n\n // Use HTTP transport for historical candle snapshots (request/response).\n // This avoids the WebSocket abort race condition that causes 429s\n // during rapid market switching on extension (#TAT-2954).\n const infoClient = this.getInfoClient({ useHttp: true });\n const request = {\n coin: symbol, // Map to HyperLiquid SDK's 'coin' parameter\n interval,\n startTime,\n endTime: now,\n };\n const data = signal\n ? await infoClient.candleSnapshot(request, signal)\n : await infoClient.candleSnapshot(request);\n\n if (Array.isArray(data) && data.length > 0) {\n const candles = data.map((candle) => ({\n time: candle.t, // open time\n open: candle.o.toString(),\n high: candle.h.toString(),\n low: candle.l.toString(),\n close: candle.c.toString(),\n volume: candle.v.toString(),\n }));\n\n return {\n symbol,\n interval,\n candles,\n };\n }\n\n return {\n symbol,\n interval,\n candles: [],\n };\n } catch (error) {\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.fetchHistoricalCandles',\n );\n\n if (isAbortError(error)) {\n throw error;\n }\n\n // Log to Sentry: prevents initial chart data load\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'historical_candles_api',\n data: {\n operation: 'fetchHistoricalCandles',\n symbol,\n interval,\n limit,\n hasEndTime: endTime !== undefined,\n },\n },\n });\n\n throw error;\n }\n }\n\n /**\n * Fetch the user's historical orders via the HyperLiquid SDK, coalesced\n * across concurrent callers and cached for {@link PERFORMANCE_CONFIG.PerpsRestCoalesceTtlMs}.\n *\n * Both getOrders (service layer) and the getUserFills enrichment sidecar\n * (fills→order-type resolution for TP/SL pills in activity) hit the same\n * `historicalOrders` info-post. Routing both through this wrapper means the\n * enrichment path rides the same cache as an explicit activity-page fetch,\n * so rapid market switching never fires redundant HL traffic.\n *\n * Pass `forceRefresh: true` to bypass the coalesce cache end-to-end\n * (hooks → controller → MarketDataService → provider → this method), which\n * is required for pull-to-refresh to fetch fresh data from the network.\n *\n * @param userAddress - The user's 0x address to query.\n * @param options - Optional cache-control options.\n * @param options.forceRefresh - When true, bypasses the coalesce cache.\n * @returns Array of historical orders, empty array on SDK null.\n */\n public async fetchHistoricalOrders(\n userAddress: Hex,\n options?: { forceRefresh?: boolean },\n ): Promise<HistoricalOrdersResponse> {\n this.ensureInitialized();\n\n const cacheKey = [\n 'historicalOrders',\n this.#isTestnet ? 'testnet' : 'mainnet',\n userAddress.toLowerCase(),\n ].join('|');\n\n return coalescePerpsRestRequest<HistoricalOrdersResponse>(\n cacheKey,\n () => this.#runHistoricalOrdersFetch(userAddress),\n { forceRefresh: options?.forceRefresh },\n );\n }\n\n async #runHistoricalOrdersFetch(\n userAddress: Hex,\n ): Promise<HistoricalOrdersResponse> {\n const infoClient = this.getInfoClient();\n const result = await infoClient.historicalOrders({ user: userAddress });\n return result ?? [];\n }\n\n /**\n * Subscribe to candle updates via WebSocket\n *\n * @param root0 - The subscription parameters.\n * @param root0.symbol - The asset symbol (e.g., \"BTC\", \"ETH\").\n * @param root0.interval - The candle interval (e.g., \"1m\", \"5m\", \"15m\").\n * @param root0.duration - Optional time duration for calculating initial fetch size.\n * @param root0.callback - Function called with updated candle data.\n * @param root0.onError - Optional function called if subscription initialization fails.\n * @returns Cleanup function to unsubscribe.\n */\n public subscribeToCandles({\n symbol,\n interval,\n duration,\n callback,\n onError,\n }: SubscribeCandlesParams): () => void {\n this.ensureInitialized();\n\n const subscriptionClient = this.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error(PERPS_ERROR_CODES.SUBSCRIPTION_CLIENT_NOT_AVAILABLE);\n }\n\n let currentCandleData: CandleData | null = null;\n let wsUnsubscribe: (() => void) | null = null;\n let isUnsubscribed = false;\n let hasUnsubscribeStarted = false;\n // Store the subscription promise to enable cleanup even when pending\n // This fixes a race condition where component unmounts before subscription resolves\n type CandleSubscription = Awaited<\n ReturnType<typeof subscriptionClient.candle>\n >;\n let subscriptionPromise: Promise<CandleSubscription> | null = null;\n\n const unsubscribeFromCandles = (subscription: CandleSubscription): void => {\n if (hasUnsubscribeStarted) {\n return;\n }\n hasUnsubscribeStarted = true;\n\n const logUnsubscribeError = (error: unknown): void => {\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.subscribeToCandles',\n );\n\n if (errorInstance.message.startsWith('Already unsubscribed')) {\n return;\n }\n\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'websocket_unsubscription',\n data: {\n operation: 'subscribeToCandles',\n symbol,\n interval,\n phase: 'ws_unsubscription',\n },\n },\n });\n };\n\n try {\n Promise.resolve(subscription.unsubscribe()).catch(logUnsubscribeError);\n } catch (error) {\n logUnsubscribeError(error);\n }\n };\n\n // AbortController to cancel in-flight REST calls (candleSnapshot) on cleanup.\n // Prevents rate limit exhaustion when rapidly switching markets (#28141).\n const abortController = new AbortController();\n\n // Calculate initial fetch size dynamically based on duration and interval\n // Match main branch behavior: up to 500 candles initially\n const initialLimit = duration\n ? Math.min(calculateCandleCount(duration, interval), 500)\n : 100; // Default to 100 if no duration provided\n\n // 1. Fetch initial historical data, then subscribe to WebSocket updates\n // Using an async IIFE to avoid nested promises and callback-in-promise issues\n const initAndSubscribe = async (): Promise<void> => {\n try {\n const initialData = await this.fetchHistoricalCandles({\n symbol,\n interval,\n limit: initialLimit,\n signal: abortController.signal,\n });\n\n // Don't proceed if already unsubscribed\n if (isUnsubscribed) {\n return;\n }\n\n currentCandleData = initialData;\n if (currentCandleData) {\n callback(currentCandleData);\n }\n\n // 2. Subscribe to WebSocket for new candles\n // HyperLiquid SDK uses 'coin' terminology\n // Store the promise so cleanup can wait for it if needed\n subscriptionPromise = subscriptionClient.candle(\n { coin: symbol, interval }, // Map to HyperLiquid SDK's 'coin' parameter\n (candleEvent) => {\n // Don't process events if already unsubscribed\n if (isUnsubscribed) {\n return;\n }\n\n // Transform SDK CandleEvent to our Candle format\n const newCandle = {\n time: candleEvent.t,\n open: candleEvent.o.toString(),\n high: candleEvent.h.toString(),\n low: candleEvent.l.toString(),\n close: candleEvent.c.toString(),\n volume: candleEvent.v.toString(),\n };\n\n if (currentCandleData) {\n // Check if this is an update to the last candle or a new candle\n const { candles } = currentCandleData;\n const lastCandle = candles[candles.length - 1];\n\n if (lastCandle?.time === newCandle.time) {\n // Update existing candle (live candle update)\n // Create new array with updated last element to trigger React re-render\n currentCandleData = {\n ...currentCandleData,\n candles: [...candles.slice(0, -1), newCandle],\n };\n } else {\n // New candle (completed candle)\n // Create new array with added element to trigger React re-render\n currentCandleData = {\n ...currentCandleData,\n candles: [...candles, newCandle],\n };\n }\n } else {\n currentCandleData = {\n symbol,\n interval,\n candles: [newCandle],\n };\n }\n\n callback(currentCandleData);\n },\n );\n\n // Store cleanup function when subscription resolves\n try {\n const sub = await subscriptionPromise;\n wsUnsubscribe = (): void => unsubscribeFromCandles(sub);\n // If already unsubscribed while waiting, clean up immediately\n if (isUnsubscribed) {\n wsUnsubscribe();\n wsUnsubscribe = null;\n }\n } catch (error) {\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.subscribeToCandles',\n );\n\n // Log to Sentry: WebSocket subscription failure prevents live updates\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'websocket_subscription',\n data: {\n operation: 'subscribeToCandles',\n symbol,\n interval,\n phase: 'ws_subscription',\n },\n },\n });\n\n // Notify caller of error\n onError?.(errorInstance);\n }\n } catch (error) {\n // Skip logging and notification for intentional abort (user navigated away)\n if (abortController.signal.aborted) {\n return;\n }\n\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.subscribeToCandles',\n );\n\n // Log to Sentry: initial fetch failure blocks chart completely\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'initial_candles_fetch',\n data: {\n operation: 'subscribeToCandles',\n symbol,\n interval,\n phase: 'initial_fetch',\n initialLimit,\n },\n },\n });\n\n // Notify caller of error\n onError?.(errorInstance);\n }\n };\n\n // Fire-and-forget the async initialization\n initAndSubscribe().catch(() => {\n // Error already handled inside initAndSubscribe\n });\n\n // Return cleanup function\n return () => {\n isUnsubscribed = true;\n // Cancel any in-flight REST calls (candleSnapshot) to conserve rate limit budget (#28141)\n abortController.abort();\n if (wsUnsubscribe) {\n // Subscription already resolved - unsubscribe directly\n wsUnsubscribe();\n wsUnsubscribe = null;\n } else if (subscriptionPromise) {\n // Subscription promise still pending - wait for it and clean up\n // This prevents WebSocket subscription leaks when component unmounts\n // before the subscription promise resolves\n subscriptionPromise\n .then((sub) => unsubscribeFromCandles(sub))\n .catch(() => {\n // Ignore errors during cleanup - subscription may have failed\n });\n subscriptionPromise = null;\n }\n };\n }\n\n /**\n * Convert interval string to milliseconds\n *\n * @param interval - The candle period interval to convert.\n * @returns The interval duration in milliseconds.\n */\n #getIntervalMilliseconds(interval: CandlePeriod): number {\n const intervalMap: Record<CandlePeriod, number> = {\n [CandlePeriod.OneMinute]: 1 * 60 * 1000,\n [CandlePeriod.ThreeMinutes]: 3 * 60 * 1000,\n [CandlePeriod.FiveMinutes]: 5 * 60 * 1000,\n [CandlePeriod.FifteenMinutes]: 15 * 60 * 1000,\n [CandlePeriod.ThirtyMinutes]: 30 * 60 * 1000,\n [CandlePeriod.OneHour]: 60 * 60 * 1000,\n [CandlePeriod.TwoHours]: 2 * 60 * 60 * 1000,\n [CandlePeriod.FourHours]: 4 * 60 * 60 * 1000,\n [CandlePeriod.EightHours]: 8 * 60 * 60 * 1000,\n [CandlePeriod.TwelveHours]: 12 * 60 * 60 * 1000,\n [CandlePeriod.OneDay]: 24 * 60 * 60 * 1000,\n [CandlePeriod.ThreeDays]: 3 * 24 * 60 * 60 * 1000,\n [CandlePeriod.OneWeek]: 7 * 24 * 60 * 60 * 1000,\n [CandlePeriod.OneMonth]: 30 * 24 * 60 * 60 * 1000, // Approximate\n };\n\n return intervalMap[interval];\n }\n\n /**\n * Disconnect and cleanup all clients\n *\n * @returns A promise that resolves when disconnection is complete.\n */\n public async disconnect(): Promise<void> {\n // Await existing promise if already disconnecting\n if (this.#disconnectionPromise) {\n await this.#disconnectionPromise;\n return;\n }\n\n // If already disconnected, return immediately\n if (this.#connectionState === WebSocketConnectionState.Disconnected) {\n return;\n }\n\n // Create and store the disconnection promise\n this.#disconnectionPromise = this.#performDisconnection();\n\n try {\n await this.#disconnectionPromise;\n } finally {\n this.#disconnectionPromise = null;\n }\n }\n\n async #performDisconnection(): Promise<void> {\n try {\n this.#updateConnectionState(WebSocketConnectionState.Disconnecting);\n\n this.#deps.debugLogger.log('HyperLiquid: Disconnecting SDK clients', {\n isTestnet: this.#isTestnet,\n timestamp: new Date().toISOString(),\n connectionState: this.#connectionState,\n });\n\n // Clear callbacks\n this.#onReconnectCallback = undefined;\n this.#onTerminateCallback = null;\n\n // Cancel any pending reconnection retry timeout\n if (this.#reconnectionRetryTimeout) {\n clearTimeout(this.#reconnectionRetryTimeout);\n this.#reconnectionRetryTimeout = null;\n }\n\n // Clear connection state listeners to prevent stale callbacks\n this.#connectionStateListeners.clear();\n\n // Reset reconnection flag to allow future manual retries\n // This prevents a race condition where disconnecting during an active\n // reconnection attempt could leave the flag stuck, blocking subsequent retries\n this.#isReconnecting = false;\n\n // Close WebSocket transport only (HTTP is stateless)\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n this.#deps.debugLogger.log(\n 'HyperLiquid: Closed WebSocket transport',\n {\n timestamp: new Date().toISOString(),\n },\n );\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'HyperLiquidClientService.performDisconnection'),\n {\n tags: { feature: PERPS_CONSTANTS.FeatureName },\n context: {\n name: 'HyperLiquidClientService.performDisconnection',\n data: { action: 'close_transport' },\n },\n },\n );\n }\n }\n\n // Clear client references\n this.#subscriptionClient = undefined;\n this.#exchangeClient = undefined;\n this.#infoClient = undefined;\n this.#infoClientHttp = undefined;\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n this.#httpTransport = undefined;\n\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: SDK clients fully disconnected',\n {\n timestamp: new Date().toISOString(),\n connectionState: this.#connectionState,\n },\n );\n } catch (error) {\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n this.#deps.logger.error(\n ensureError(error, 'HyperLiquidClientService.performDisconnection'),\n {\n tags: { feature: PERPS_CONSTANTS.FeatureName },\n context: {\n name: 'HyperLiquidClientService.performDisconnection',\n data: { action: 'outer_catch' },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Get current WebSocket connection state\n *\n * @returns The current WebSocket connection state.\n */\n public getConnectionState(): WebSocketConnectionState {\n return this.#connectionState;\n }\n\n /**\n * Get the identifier of the current WebSocket connection.\n *\n * The value changes whenever the raw socket closes — including an SDK-internal\n * automatic reconnect, which is otherwise invisible to callers. Stamp cached\n * per-connection data with the epoch that produced it and compare on read:\n * anything carried across a reconnect stops matching on its own, so there is\n * no invalidation hook that can be attached at the wrong lifecycle point.\n *\n * @returns The current connection epoch. Never 0, so an unstamped default\n * cannot be mistaken for a live connection.\n */\n public getConnectionEpoch(): number {\n return this.#connectionEpoch;\n }\n\n /**\n * Retire the current connection epoch.\n *\n * Called when the WebSocket transport is discarded, so a replacement starts on\n * a fresh epoch and everything cached against the old connection stops\n * matching. The socket's own `close` listener cannot be relied on here: it may\n * fire after the transport has already been replaced, at which point it is\n * ignored precisely so it cannot retire the new connection's epoch.\n *\n * Retiring twice for one connection is harmless — the epoch is an identity,\n * not a count — so callers do not need to know whether `close` already fired.\n */\n #retireConnectionEpoch(): void {\n this.#connectionEpoch += 1;\n this.#deps.debugLogger.log('HyperLiquid: connection epoch retired', {\n connectionEpoch: this.#connectionEpoch,\n });\n }\n\n /**\n * Check if WebSocket is fully disconnected\n *\n * @returns True if the WebSocket is in disconnected state.\n */\n public isDisconnected(): boolean {\n return this.#connectionState === WebSocketConnectionState.Disconnected;\n }\n\n /**\n * Set callback to be invoked when reconnection is needed\n * This allows the service to notify external components (like PerpsConnectionManager)\n * when a connection drop is detected\n *\n * @param callback - The async callback to invoke when reconnection is needed.\n */\n public setOnReconnectCallback(callback: () => Promise<void>): void {\n this.#onReconnectCallback = callback;\n }\n\n /**\n * Set callback for WebSocket termination events\n * Called when the SDK exhausts all reconnection attempts\n *\n * @param callback - The callback to invoke on termination, or null to clear.\n */\n public setOnTerminateCallback(\n callback: ((error: Error) => void) | null,\n ): void {\n this.#onTerminateCallback = callback;\n }\n\n /**\n * Subscribe to connection state changes.\n * The listener will be called immediately with the current state and whenever the state changes.\n *\n * @param listener - Callback function that receives the new connection state and reconnection attempt\n * @returns Unsubscribe function to remove the listener\n */\n public subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n this.#connectionStateListeners.add(listener);\n\n // Immediately notify with current state\n // Wrap in try-catch to match notifyConnectionStateListeners behavior\n // This ensures the unsubscribe function is always returned even if listener throws\n try {\n listener(this.#connectionState, this.#reconnectionAttempt);\n } catch {\n // Ignore errors in listeners to prevent breaking subscription mechanism\n // If listener throws, it will be removed when unsubscribe is called\n }\n\n // Return unsubscribe function\n return () => {\n this.#connectionStateListeners.delete(listener);\n };\n }\n\n /**\n * Update connection state and notify all listeners\n * Always notifies if state changes OR if we're in CONNECTING state (to update attempt count)\n *\n * @param newState - The new WebSocket connection state.\n */\n #updateConnectionState(newState: WebSocketConnectionState): void {\n const previousState = this.#connectionState;\n const stateChanged = previousState !== newState;\n const isReconnectionAttempt =\n newState === WebSocketConnectionState.Connecting &&\n this.#reconnectionAttempt > 0;\n\n this.#connectionState = newState;\n\n // Reset reconnection attempt counter when successfully connected\n if (newState === WebSocketConnectionState.Connected) {\n this.#reconnectionAttempt = 0;\n }\n\n // Notify if state changed OR if this is a reconnection attempt (to update attempt count)\n if (stateChanged || isReconnectionAttempt) {\n this.#notifyConnectionStateListeners();\n }\n }\n\n /**\n * Notify all connection state listeners of the current state\n */\n #notifyConnectionStateListeners(): void {\n this.#connectionStateListeners.forEach((listener) => {\n try {\n listener(this.#connectionState, this.#reconnectionAttempt);\n } catch {\n // Ignore errors in listeners to prevent breaking other listeners\n }\n });\n }\n\n // Flag to prevent concurrent reconnection attempts\n #isReconnecting = false;\n\n /**\n * Manually trigger a reconnection attempt.\n * This is exposed for UI retry buttons when user wants to force reconnection.\n * Resets the reconnection attempt counter to allow retrying after max attempts.\n */\n public async reconnect(): Promise<void> {\n this.#deps.debugLogger.log(\n '[HyperLiquidClientService] reconnect() called',\n {\n previousAttempt: this.#reconnectionAttempt,\n currentState: this.#connectionState,\n },\n );\n // Reset attempt counter when user manually triggers retry\n this.#reconnectionAttempt = 0;\n await this.#handleConnectionDrop();\n this.#deps.debugLogger.log(\n '[HyperLiquidClientService] reconnect() completed',\n {\n newState: this.#connectionState,\n },\n );\n }\n\n /**\n * Handle detected connection drop\n * Recreates WebSocket transport and notifies callback to restore subscriptions\n * Will give up after maxReconnectionAttempts and mark status as disconnected\n */\n async #handleConnectionDrop(): Promise<void> {\n // Prevent multiple simultaneous reconnection attempts\n if (this.#isReconnecting) {\n return;\n }\n\n this.#isReconnecting = true;\n\n // Increment reconnection attempt counter\n this.#reconnectionAttempt += 1;\n\n // Check if we've exceeded max retry attempts\n if (this.#reconnectionAttempt > maxReconnectionAttempts) {\n this.#isReconnecting = false;\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n return;\n }\n\n try {\n this.#updateConnectionState(WebSocketConnectionState.Connecting);\n\n // Close existing WebSocket transport and clear references\n // so createTransports() will create fresh ones\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n } catch {\n // Ignore errors during close - transport may already be dead\n }\n }\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n this.#httpTransport = undefined;\n\n // WebSocket clients are unavailable throughout the reconnect. HTTP\n // clients remain usable while the new socket is staged and verified.\n this.#subscriptionClient = undefined;\n this.#infoClient = undefined;\n\n // Recreate transports (both WS and HTTP)\n const newWsTransport = this.#createTransports();\n\n const newInfoClient = new InfoClient({ transport: newWsTransport });\n const newSubscriptionClient = new SubscriptionClient({\n transport: newWsTransport,\n });\n this.#createHttpClients();\n\n await newWsTransport.ready();\n\n // Publish WebSocket clients only after the transport is usable. This\n // keeps isInitialized() false and blocks WS-backed access during a\n // failed or in-flight reconnect without disabling HTTP-backed trading.\n this.#infoClient = newInfoClient;\n this.#subscriptionClient = newSubscriptionClient;\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: Transport ready, restoring subscriptions',\n { timestamp: new Date().toISOString() },\n );\n\n // NOW safe to restore subscriptions\n if (this.#onReconnectCallback) {\n await this.#onReconnectCallback();\n }\n\n // Cancel any pending retry timeout from previous failed attempts\n if (this.#reconnectionRetryTimeout) {\n clearTimeout(this.#reconnectionRetryTimeout);\n this.#reconnectionRetryTimeout = null;\n }\n\n this.#updateConnectionState(WebSocketConnectionState.Connected);\n this.#isReconnecting = false;\n } catch {\n // The staged WebSocket clients were never published. Keep the HTTP\n // clients alive so exchange writes and explicit HTTP info reads remain\n // available while the WebSocket retry loop continues.\n this.#subscriptionClient = undefined;\n this.#infoClient = undefined;\n\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n } catch {\n // Ignore cleanup errors - transport may already be dead\n }\n }\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n\n // Reset flag before scheduling retry so the next attempt can proceed\n this.#isReconnecting = false;\n\n // Check if we've exceeded max retry attempts\n if (this.#reconnectionAttempt >= maxReconnectionAttempts) {\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n return;\n }\n\n // Reconnection failed - schedule a retry after a delay\n // Store timeout reference so it can be cancelled on intentional disconnect\n this.#reconnectionRetryTimeout = setTimeout(() => {\n this.#reconnectionRetryTimeout = null; // Clear reference after execution\n // Only retry if we haven't been intentionally disconnected\n // and no manual reconnect() is already in progress\n // Note: State may be CONNECTING or DISCONNECTED (if terminate event fired during reconnect)\n if (\n (this.#connectionState === WebSocketConnectionState.Connecting ||\n this.#connectionState === WebSocketConnectionState.Disconnected) &&\n !this.#disconnectionPromise &&\n !this.#isReconnecting\n ) {\n this.#handleConnectionDrop().catch(() => {\n // Error already handled inside #handleConnectionDrop\n });\n }\n }, PERPS_CONSTANTS.ReconnectionRetryDelayMs);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"HyperLiquidClientService.mjs","sourceRoot":"","sources":["../../src/services/HyperLiquidClientService.ts"],"names":[],"mappings":"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","sourcesContent":["import { Hex } from '@metamask/utils';\nimport {\n ExchangeClient,\n HttpTransport,\n InfoClient,\n SubscriptionClient,\n WebSocketTransport,\n} from '@nktkas/hyperliquid';\nimport type { HistoricalOrdersResponse } from '@nktkas/hyperliquid';\n\nimport {\n CandlePeriod,\n calculateCandleCount,\n} from '../constants/chartConfig.js';\nimport { HYPERLIQUID_TRANSPORT_CONFIG } from '../constants/hyperLiquidConfig.js';\nimport {\n PERFORMANCE_CONFIG,\n PERPS_CONSTANTS,\n} from '../constants/perpsConfig.js';\nimport { PERPS_ERROR_CODES } from '../perpsErrorCodes.js';\nimport type { HyperLiquidNetwork } from '../types/config.js';\nimport { WebSocketConnectionState } from '../types/index.js';\nimport type {\n SubscribeCandlesParams,\n PerpsPlatformDependencies,\n} from '../types/index.js';\nimport type { CandleData } from '../types/perps-types.js';\nimport { coalescePerpsRestRequest } from '../utils/coalescePerpsRestRequest.js';\nimport { ensureError, isAbortError } from '../utils/errorUtils.js';\nimport { getPerpsConnectionAttemptContext } from '../utils/perpsConnectionAttemptContext.js';\n\n/**\n * Maximum number of reconnection attempts before giving up.\n */\nconst maxReconnectionAttempts = 10;\n\n/**\n * Valid time intervals for historical candle data\n * Uses CandlePeriod enum for type safety\n */\nexport type ValidCandleInterval = CandlePeriod;\n\n/**\n * Params-style EIP-712 typed-data signing request, as passed by the\n * HyperLiquid SDK to wallet adapters (viem local-account shape).\n */\nexport type HyperLiquidSignTypedDataParams = {\n domain: {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: Hex;\n };\n types: {\n [key: string]: { name: string; type: string }[];\n };\n primaryType: string;\n message: Record<string, unknown>;\n};\n\n/**\n * Wallet interface for HyperLiquid SDK operations.\n * Extracted for reuse across initialize(), toggleTestnet(), and ensureSubscriptionClient() methods.\n *\n * `address` is optional but recommended: the SDK's viem local-account\n * dispatch reads it to determine the signing address (e.g. for agent\n * wallets, whose address differs from the selected master account).\n */\nexport type HyperLiquidWalletParams = {\n address?: Hex;\n signTypedData: (params: HyperLiquidSignTypedDataParams) => Promise<Hex>;\n getChainId?: () => Promise<number>;\n};\n\n// WebSocketConnectionState is now imported from controllers/types\n// Re-export for backward compatibility with existing consumers\nexport { WebSocketConnectionState } from '../types/index.js';\n\n/**\n * Service for managing HyperLiquid SDK clients\n * Handles initialization, transport creation, and client lifecycle\n */\nexport class HyperLiquidClientService {\n #exchangeClient?: ExchangeClient;\n\n #infoClient?: InfoClient; // WebSocket transport (default)\n\n #infoClientHttp?: InfoClient; // HTTP transport (fallback)\n\n #subscriptionClient?: SubscriptionClient<{\n transport: WebSocketTransport;\n }>;\n\n #wsTransport?: WebSocketTransport;\n\n #httpTransport?: HttpTransport;\n\n #walletParams?: HyperLiquidWalletParams;\n\n #isTestnet: boolean;\n\n #connectionState: WebSocketConnectionState =\n WebSocketConnectionState.Disconnected;\n\n // Monotonic identifier for the current WebSocket connection.\n //\n // Incremented on every raw socket `close`, which covers SDK-internal\n // automatic reconnects as well as manual teardown — the SDK reconnects\n // underneath us without notifying callers, and `terminate` only fires once\n // retries are exhausted. Consumers stamp cached per-connection data with the\n // epoch that produced it and compare on read, so anything carried over from a\n // previous socket is rejected without any explicit invalidation step.\n //\n // Starts at 1 so a stamp of 0 (or an unstamped default) never matches.\n #connectionEpoch = 1;\n\n #disconnectionPromise: Promise<void> | null = null;\n\n // Callback for SDK terminate event (fired when all reconnection attempts exhausted)\n #onTerminateCallback: ((error: Error) => void) | null = null;\n\n #onReconnectCallback?: () => Promise<void>;\n\n // Reconnection attempt counter\n #reconnectionAttempt = 0;\n\n // Connection state change listeners for event-based notifications\n readonly #connectionStateListeners: Set<\n (state: WebSocketConnectionState, reconnectionAttempt: number) => void\n > = new Set();\n\n // Timeout reference for reconnection retry, tracked to enable cancellation on disconnect\n #reconnectionRetryTimeout: ReturnType<typeof setTimeout> | null = null;\n\n // Platform dependencies for logging\n readonly #deps: PerpsPlatformDependencies;\n\n constructor(\n deps: PerpsPlatformDependencies,\n options: { isTestnet?: boolean } = {},\n ) {\n this.#deps = deps;\n this.#isTestnet = options.isTestnet ?? false;\n }\n\n /**\n * Initialize all HyperLiquid SDK clients\n *\n * IMPORTANT: This method awaits transport.ready() to ensure the WebSocket is\n * in OPEN state before marking initialization complete. This prevents race\n * conditions where subscriptions are attempted before the WebSocket handshake\n * completes (which would cause \"subscribe error: undefined\" errors).\n *\n * @param wallet - The wallet parameters for signing typed data.\n */\n public async initialize(wallet: HyperLiquidWalletParams): Promise<void> {\n const network = this.#isTestnet ? 'testnet' : 'mainnet';\n const attemptContext = getPerpsConnectionAttemptContext();\n\n try {\n this.#updateConnectionState(WebSocketConnectionState.Connecting);\n this.#walletParams = wallet;\n this.#createTransports();\n\n // Ensure transports are created\n if (!this.#httpTransport || !this.#wsTransport) {\n throw new Error('Failed to create transports');\n }\n\n this.#createAllClients(wallet);\n\n // Wait for WebSocket to actually be ready before setting CONNECTED\n // This ensures we have a real connection, not just client objects\n await this.#wsTransport.ready();\n\n this.#updateConnectionState(WebSocketConnectionState.Connected);\n\n this.#deps.debugLogger.log('HyperLiquid SDK clients initialized', {\n testnet: this.#isTestnet,\n timestamp: new Date().toISOString(),\n connectionState: this.#connectionState,\n note: 'Using WebSocket for InfoClient (default), HTTP fallback available',\n });\n } catch (error) {\n // Cleanup on failure to prevent leaks and ensure isInitialized() returns false\n // Clear clients first, then transports\n this.#subscriptionClient = undefined;\n this.#infoClient = undefined;\n this.#infoClientHttp = undefined;\n this.#exchangeClient = undefined;\n\n // Close WebSocket transport to release resources and event listeners\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n } catch {\n // Ignore cleanup errors\n }\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n }\n this.#httpTransport = undefined;\n\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.initialize',\n );\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n\n if (attemptContext?.suppressError) {\n this.#deps.debugLogger.log(\n 'HyperLiquid initialize failed during suppressed startup attempt',\n {\n error: errorInstance.message,\n network,\n source: attemptContext.source,\n },\n );\n } else {\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network,\n },\n context: {\n name: 'sdk_initialization',\n data: {\n operation: 'initialize',\n isTestnet: this.#isTestnet,\n source: attemptContext?.source ?? 'unspecified',\n },\n },\n });\n }\n\n throw error;\n }\n }\n\n /**\n * Create HTTP and WebSocket transports\n * - HTTP for InfoClient and ExchangeClient (request/response operations)\n * - WebSocket for SubscriptionClient (real-time pub/sub)\n *\n * Both transports use SDK's built-in endpoint resolution via isTestnet flag\n *\n * @returns The created WebSocket transport instance.\n */\n #createTransports(): WebSocketTransport {\n // Prevent duplicate transport creation and listener accumulation\n // This guards against re-entry if initialize() is called multiple times\n // (e.g., after a failed initialization attempt that didn't properly clean up)\n if (this.#wsTransport && this.#httpTransport) {\n this.#deps.debugLogger.log(\n 'HyperLiquid: Transports already exist, skipping creation',\n );\n return this.#wsTransport;\n }\n\n this.#deps.debugLogger.log('HyperLiquid: Creating transports', {\n isTestnet: this.#isTestnet,\n timestamp: new Date().toISOString(),\n note: 'SDK will auto-select endpoints based on isTestnet flag',\n });\n\n // HTTP transport for request/response operations (InfoClient, ExchangeClient)\n // SDK automatically selects: mainnet (https://api.hyperliquid.xyz) or testnet (https://api.hyperliquid-testnet.xyz)\n this.#httpTransport = new HttpTransport({\n isTestnet: this.#isTestnet,\n timeout: HYPERLIQUID_TRANSPORT_CONFIG.timeout,\n });\n\n // WebSocket transport for real-time subscriptions (SubscriptionClient)\n // SDK automatically selects: mainnet (wss://api.hyperliquid.xyz/ws) or testnet (wss://api.hyperliquid-testnet.xyz/ws)\n this.#wsTransport = new WebSocketTransport({\n isTestnet: this.#isTestnet,\n ...HYPERLIQUID_TRANSPORT_CONFIG,\n reconnect: HYPERLIQUID_TRANSPORT_CONFIG.reconnect,\n });\n\n // Retire the connection epoch whenever the raw socket closes.\n //\n // This is the only signal that covers an SDK-internal automatic reconnect:\n // the SDK reopens the socket underneath us without notifying callers, and\n // `terminate` fires only once reconnection attempts are exhausted. rews\n // listeners survive reconnections, so attaching once here observes every\n // subsequent close. Data cached against the old epoch stops matching from\n // this moment, with no invalidation call to place correctly.\n //\n // The listener is bound to the transport it was attached to. A retired\n // transport can still emit `close` after it has been replaced — teardown is\n // asynchronous — and acting on that would retire the CURRENT connection's\n // epoch, discarding live positions for no reason. Replacing a transport\n // retires the outgoing epoch explicitly (see #retireConnectionEpoch), so\n // ignoring these late events loses nothing.\n const owningTransport = this.#wsTransport;\n this.#wsTransport.socket.addEventListener('close', () => {\n if (this.#wsTransport !== owningTransport) {\n this.#deps.debugLogger.log(\n 'HyperLiquid: ignoring close from a retired WebSocket transport',\n { connectionEpoch: this.#connectionEpoch },\n );\n return;\n }\n\n this.#connectionEpoch += 1;\n this.#deps.debugLogger.log(\n 'HyperLiquid: WebSocket closed, epoch retired',\n {\n connectionEpoch: this.#connectionEpoch,\n },\n );\n });\n\n // Listen for WebSocket termination (fired when SDK exhausts all reconnection attempts)\n this.#wsTransport.socket.addEventListener('terminate', (event: Event) => {\n const customEvent = event as CustomEvent;\n this.#deps.debugLogger.log('HyperLiquid: WebSocket terminated', {\n reason: customEvent.detail?.code,\n timestamp: new Date().toISOString(),\n });\n\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n\n if (this.#onTerminateCallback) {\n const error =\n customEvent.detail instanceof Error\n ? customEvent.detail\n : new Error(\n `WebSocket terminated: ${customEvent.detail?.code ?? 'unknown'}`,\n );\n this.#onTerminateCallback(error);\n }\n });\n\n return this.#wsTransport;\n }\n\n /**\n * Create all SDK clients using the current transports.\n * Shared by initialize() and #handleConnectionDrop() to avoid drift.\n *\n * @param wallet - Optional wallet params. Uses stored #walletParams when omitted (reconnection path).\n */\n #createAllClients(wallet?: HyperLiquidWalletParams): void {\n if (!this.#wsTransport || !this.#httpTransport) {\n throw new Error('Transports must be created before clients');\n }\n\n this.#infoClient = new InfoClient({ transport: this.#wsTransport });\n this.#subscriptionClient = new SubscriptionClient({\n transport: this.#wsTransport,\n });\n this.#createHttpClients(wallet);\n }\n\n /**\n * Create the HTTP-backed SDK clients.\n *\n * @param wallet - Optional wallet params. Uses stored #walletParams when omitted.\n */\n #createHttpClients(wallet?: HyperLiquidWalletParams): void {\n const effectiveWallet = wallet ?? this.#walletParams;\n\n if (!this.#httpTransport) {\n throw new Error('HTTP transport must be created before clients');\n }\n\n this.#infoClientHttp = new InfoClient({ transport: this.#httpTransport });\n\n if (effectiveWallet) {\n this.#exchangeClient = new ExchangeClient({\n wallet: effectiveWallet as any, // eslint-disable-line @typescript-eslint/no-explicit-any -- Type widening for SDK compatibility\n transport: this.#httpTransport,\n });\n } else {\n this.#exchangeClient = undefined;\n }\n }\n\n /**\n * Toggle testnet mode and reinitialize clients\n *\n * @param wallet - The wallet parameters for signing typed data.\n * @returns The new network name after toggling.\n */\n public async toggleTestnet(\n wallet: HyperLiquidWalletParams,\n ): Promise<HyperLiquidNetwork> {\n this.#isTestnet = !this.#isTestnet;\n await this.initialize(wallet);\n return this.#isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Check if clients are properly initialized\n *\n * @returns True if all SDK clients are initialized.\n */\n public isInitialized(): boolean {\n return Boolean(\n this.#exchangeClient &&\n this.#infoClient &&\n this.#infoClientHttp &&\n this.#subscriptionClient,\n );\n }\n\n /**\n * Ensure clients are initialized, throw if not\n */\n public ensureInitialized(): void {\n if (!this.isInitialized()) {\n throw new Error(PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED);\n }\n }\n\n /**\n * Recreate subscription client if needed (for reconnection scenarios)\n *\n * @param wallet - The wallet parameters for signing typed data.\n */\n public async ensureSubscriptionClient(\n wallet: HyperLiquidWalletParams,\n ): Promise<void> {\n if (!this.#subscriptionClient) {\n // A reconnect publishes its WebSocket clients only after transport.ready().\n // Do not start a competing initialize() while that attempt or its retry\n // backoff is active; callers will observe an unavailable subscription\n // client until the reconnect completes and restores tracked subscriptions.\n if (this.#isReconnecting || this.#reconnectionRetryTimeout) {\n return;\n }\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: Recreating subscription client after disconnect',\n );\n\n if (\n this.#walletParams &&\n this.#connectionState === WebSocketConnectionState.Disconnected\n ) {\n await this.reconnect();\n } else {\n await this.initialize(wallet);\n }\n }\n }\n\n /**\n * Get the exchange client\n *\n * @returns The initialized ExchangeClient instance.\n */\n public getExchangeClient(): ExchangeClient {\n if (!this.#exchangeClient) {\n this.ensureInitialized();\n throw new Error(PERPS_ERROR_CODES.EXCHANGE_CLIENT_NOT_AVAILABLE);\n }\n return this.#exchangeClient;\n }\n\n /**\n * Get the info client\n *\n * @param options - The options for selecting the transport.\n * @param options.useHttp - Force HTTP transport instead of WebSocket (default: false).\n * @returns InfoClient instance with the selected transport.\n */\n public getInfoClient(options?: { useHttp?: boolean }): InfoClient {\n if (options?.useHttp) {\n if (!this.#infoClientHttp) {\n this.ensureInitialized();\n throw new Error(PERPS_ERROR_CODES.INFO_CLIENT_NOT_AVAILABLE);\n }\n return this.#infoClientHttp;\n }\n\n this.ensureInitialized();\n if (!this.#infoClient) {\n throw new Error(PERPS_ERROR_CODES.INFO_CLIENT_NOT_AVAILABLE);\n }\n return this.#infoClient;\n }\n\n /**\n * Get the subscription client\n *\n * @returns The SubscriptionClient instance, or undefined if not initialized.\n */\n public getSubscriptionClient():\n | SubscriptionClient<{ transport: WebSocketTransport }>\n | undefined {\n if (!this.#subscriptionClient) {\n this.#deps.debugLogger.log('SubscriptionClient not initialized');\n return undefined;\n }\n return this.#subscriptionClient;\n }\n\n /**\n * Ensures the WebSocket transport is in OPEN state and ready for subscriptions.\n * This MUST be called before any subscription operations to prevent race conditions.\n *\n * The SDK's `transport.ready()` method:\n * - Returns immediately if WebSocket is already in OPEN state\n * - Waits for the \"open\" event if WebSocket is in CONNECTING state\n * - Supports AbortSignal for timeout/cancellation\n *\n * @param options - The options for transport readiness check.\n * @param options.timeoutMs - Maximum time to wait for transport ready (default 5000ms).\n * @throws Error if transport not ready within timeout or subscription client unavailable.\n */\n public async ensureTransportReady(\n options: { timeoutMs?: number } = {},\n ): Promise<void> {\n const { timeoutMs = 5000 } = options;\n const subscriptionClient = this.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error('Subscription client not initialized');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(\n () =>\n controller.abort(\n new Error(`WebSocket transport ready timeout after ${timeoutMs}ms`),\n ),\n timeoutMs,\n );\n\n try {\n await subscriptionClient.config_.transport.ready(controller.signal);\n } catch (error) {\n if (controller.signal.aborted) {\n throw new Error(\n `WebSocket transport ready timeout after ${timeoutMs}ms`,\n );\n }\n throw ensureError(error, 'HyperLiquidClientService.ensureTransportReady');\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Get current network state\n *\n * @returns The current HyperLiquid network (mainnet or testnet).\n */\n public getNetwork(): HyperLiquidNetwork {\n return this.#isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Check if running on testnet\n *\n * @returns True if the service is in testnet mode.\n */\n public isTestnetMode(): boolean {\n return this.#isTestnet;\n }\n\n /**\n * Update testnet mode\n *\n * @param isTestnet - Whether to enable testnet mode.\n */\n public setTestnetMode(isTestnet: boolean): void {\n this.#isTestnet = isTestnet;\n }\n\n /**\n * Fetch historical candle data using the HyperLiquid SDK\n *\n * @param options - The candle fetch configuration.\n * @param options.symbol - The asset symbol (e.g., \"BTC\", \"ETH\").\n * @param options.interval - The candle interval (e.g., \"1m\", \"5m\", \"15m\", \"1h\", \"1d\").\n * @param options.limit - Number of candles to fetch (default: 100).\n * @param options.endTime - End timestamp in milliseconds (default: now).\n * @param options.signal - Optional AbortSignal to cancel the fetch.\n * @returns The historical candle data, or null if no data is available.\n */\n public async fetchHistoricalCandles(options: {\n symbol: string;\n interval: ValidCandleInterval;\n limit?: number;\n endTime?: number;\n signal?: AbortSignal;\n }): Promise<CandleData | null> {\n const { symbol, interval, limit = 100, endTime, signal } = options;\n\n if (signal?.aborted) {\n const abortError = new Error('Aborted');\n abortError.name = 'AbortError';\n throw abortError;\n }\n\n // Explicit endTime is a paging call — the caller owns that exact window\n // and expects a fresh page. Coalescing per-millisecond endTimes produces\n // keys that never dedupe and never evict (TTL-miss sweep only fires on\n // re-access with the same key), so route paging straight to the SDK and\n // only coalesce the live-snapshot path where all callers share 'now'.\n if (endTime !== undefined) {\n return this.#runCandleSnapshotFetch({\n symbol,\n interval,\n limit,\n endTime,\n signal,\n });\n }\n\n // Live snapshot: coalesce across rapid market switches (pass 1 → pass 2\n // of the 10-market stress loop) so callers share one snapshot per\n // (symbol, interval).\n // Signal is intentionally dropped inside the coalesced fetch — the HL\n // SDK charges weight for any request already sent, and dropping a\n // per-caller abort lets the next caller reuse the in-flight/cached\n // result instead of re-firing the REST. The WS stream keeps live\n // candles fresh, so reusing the first-caller snapshot for up to the\n // TTL is acceptable.\n const cacheKey = [\n 'candleSnapshot',\n this.#isTestnet ? 'testnet' : 'mainnet',\n symbol,\n interval,\n limit,\n ].join('|');\n\n return coalescePerpsRestRequest<CandleData | null>(\n cacheKey,\n () => this.#runCandleSnapshotFetch({ symbol, interval, limit }),\n { ttlMs: PERFORMANCE_CONFIG.PerpsCandleCoalesceTtlMs },\n );\n }\n\n async #runCandleSnapshotFetch(options: {\n symbol: string;\n interval: ValidCandleInterval;\n limit: number;\n endTime?: number;\n signal?: AbortSignal;\n }): Promise<CandleData | null> {\n const { symbol, interval, limit, endTime, signal } = options;\n try {\n const now = endTime ?? Date.now();\n const intervalMs = this.#getIntervalMilliseconds(interval);\n const startTime = now - limit * intervalMs;\n\n // Use HTTP transport for historical candle snapshots (request/response).\n // This avoids the WebSocket abort race condition that causes 429s\n // during rapid market switching on extension (#TAT-2954).\n const infoClient = this.getInfoClient({ useHttp: true });\n const request = {\n coin: symbol, // Map to HyperLiquid SDK's 'coin' parameter\n interval,\n startTime,\n endTime: now,\n };\n const data = signal\n ? await infoClient.candleSnapshot(request, signal)\n : await infoClient.candleSnapshot(request);\n\n if (Array.isArray(data) && data.length > 0) {\n const candles = data.map((candle) => ({\n time: candle.t, // open time\n open: candle.o.toString(),\n high: candle.h.toString(),\n low: candle.l.toString(),\n close: candle.c.toString(),\n volume: candle.v.toString(),\n }));\n\n return {\n symbol,\n interval,\n candles,\n };\n }\n\n return {\n symbol,\n interval,\n candles: [],\n };\n } catch (error) {\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.fetchHistoricalCandles',\n );\n\n if (isAbortError(error)) {\n throw error;\n }\n\n // Log to Sentry: prevents initial chart data load\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'historical_candles_api',\n data: {\n operation: 'fetchHistoricalCandles',\n symbol,\n interval,\n limit,\n hasEndTime: endTime !== undefined,\n },\n },\n });\n\n throw error;\n }\n }\n\n /**\n * Fetch the user's historical orders via the HyperLiquid SDK, coalesced\n * across concurrent callers and cached for {@link PERFORMANCE_CONFIG.PerpsRestCoalesceTtlMs}.\n *\n * Both getOrders (service layer) and the getUserFills enrichment sidecar\n * (fills→order-type resolution for TP/SL pills in activity) hit the same\n * `historicalOrders` info-post. Routing both through this wrapper means the\n * enrichment path rides the same cache as an explicit activity-page fetch,\n * so rapid market switching never fires redundant HL traffic.\n *\n * Pass `forceRefresh: true` to bypass the coalesce cache end-to-end\n * (hooks → controller → MarketDataService → provider → this method), which\n * is required for pull-to-refresh to fetch fresh data from the network.\n *\n * @param userAddress - The user's 0x address to query.\n * @param options - Optional cache-control options.\n * @param options.forceRefresh - When true, bypasses the coalesce cache.\n * @returns Array of historical orders, empty array on SDK null.\n */\n public async fetchHistoricalOrders(\n userAddress: Hex,\n options?: { forceRefresh?: boolean },\n ): Promise<HistoricalOrdersResponse> {\n this.ensureInitialized();\n\n const cacheKey = [\n 'historicalOrders',\n this.#isTestnet ? 'testnet' : 'mainnet',\n userAddress.toLowerCase(),\n ].join('|');\n\n return coalescePerpsRestRequest<HistoricalOrdersResponse>(\n cacheKey,\n () => this.#runHistoricalOrdersFetch(userAddress),\n { forceRefresh: options?.forceRefresh },\n );\n }\n\n async #runHistoricalOrdersFetch(\n userAddress: Hex,\n ): Promise<HistoricalOrdersResponse> {\n const infoClient = this.getInfoClient();\n const result = await infoClient.historicalOrders({ user: userAddress });\n return result ?? [];\n }\n\n /**\n * Subscribe to candle updates via WebSocket\n *\n * @param root0 - The subscription parameters.\n * @param root0.symbol - The asset symbol (e.g., \"BTC\", \"ETH\").\n * @param root0.interval - The candle interval (e.g., \"1m\", \"5m\", \"15m\").\n * @param root0.duration - Optional time duration for calculating initial fetch size.\n * @param root0.callback - Function called with updated candle data.\n * @param root0.onError - Optional function called if subscription initialization fails.\n * @returns Cleanup function to unsubscribe.\n */\n public subscribeToCandles({\n symbol,\n interval,\n duration,\n callback,\n onError,\n }: SubscribeCandlesParams): () => void {\n this.ensureInitialized();\n\n const subscriptionClient = this.getSubscriptionClient();\n if (!subscriptionClient) {\n throw new Error(PERPS_ERROR_CODES.SUBSCRIPTION_CLIENT_NOT_AVAILABLE);\n }\n\n let currentCandleData: CandleData | null = null;\n let wsUnsubscribe: (() => void) | null = null;\n let isUnsubscribed = false;\n let hasUnsubscribeStarted = false;\n // Store the subscription promise to enable cleanup even when pending\n // This fixes a race condition where component unmounts before subscription resolves\n type CandleSubscription = Awaited<\n ReturnType<typeof subscriptionClient.candle>\n >;\n let subscriptionPromise: Promise<CandleSubscription> | null = null;\n\n const unsubscribeFromCandles = (subscription: CandleSubscription): void => {\n if (hasUnsubscribeStarted) {\n return;\n }\n hasUnsubscribeStarted = true;\n\n const logUnsubscribeError = (error: unknown): void => {\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.subscribeToCandles',\n );\n\n if (errorInstance.message.startsWith('Already unsubscribed')) {\n return;\n }\n\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'websocket_unsubscription',\n data: {\n operation: 'subscribeToCandles',\n symbol,\n interval,\n phase: 'ws_unsubscription',\n },\n },\n });\n };\n\n try {\n Promise.resolve(subscription.unsubscribe()).catch(logUnsubscribeError);\n } catch (error) {\n logUnsubscribeError(error);\n }\n };\n\n // AbortController to cancel in-flight REST calls (candleSnapshot) on cleanup.\n // Prevents rate limit exhaustion when rapidly switching markets (#28141).\n const abortController = new AbortController();\n\n // Calculate initial fetch size dynamically based on duration and interval\n // Match main branch behavior: up to 500 candles initially\n const initialLimit = duration\n ? Math.min(calculateCandleCount(duration, interval), 500)\n : 100; // Default to 100 if no duration provided\n\n // 1. Fetch initial historical data, then subscribe to WebSocket updates\n // Using an async IIFE to avoid nested promises and callback-in-promise issues\n const initAndSubscribe = async (): Promise<void> => {\n try {\n const initialData = await this.fetchHistoricalCandles({\n symbol,\n interval,\n limit: initialLimit,\n signal: abortController.signal,\n });\n\n // Don't proceed if already unsubscribed\n if (isUnsubscribed) {\n return;\n }\n\n currentCandleData = initialData;\n if (currentCandleData) {\n callback(currentCandleData);\n }\n\n // 2. Subscribe to WebSocket for new candles\n // HyperLiquid SDK uses 'coin' terminology\n // Store the promise so cleanup can wait for it if needed\n subscriptionPromise = subscriptionClient.candle(\n { coin: symbol, interval }, // Map to HyperLiquid SDK's 'coin' parameter\n (candleEvent) => {\n // Don't process events if already unsubscribed\n if (isUnsubscribed) {\n return;\n }\n\n // Transform SDK CandleEvent to our Candle format\n const newCandle = {\n time: candleEvent.t,\n open: candleEvent.o.toString(),\n high: candleEvent.h.toString(),\n low: candleEvent.l.toString(),\n close: candleEvent.c.toString(),\n volume: candleEvent.v.toString(),\n };\n\n if (currentCandleData) {\n // Check if this is an update to the last candle or a new candle\n const { candles } = currentCandleData;\n const lastCandle = candles[candles.length - 1];\n\n if (lastCandle?.time === newCandle.time) {\n // Update existing candle (live candle update)\n // Create new array with updated last element to trigger React re-render\n currentCandleData = {\n ...currentCandleData,\n candles: [...candles.slice(0, -1), newCandle],\n };\n } else {\n // New candle (completed candle)\n // Create new array with added element to trigger React re-render\n currentCandleData = {\n ...currentCandleData,\n candles: [...candles, newCandle],\n };\n }\n } else {\n currentCandleData = {\n symbol,\n interval,\n candles: [newCandle],\n };\n }\n\n callback(currentCandleData);\n },\n );\n\n // Store cleanup function when subscription resolves\n try {\n const sub = await subscriptionPromise;\n wsUnsubscribe = (): void => unsubscribeFromCandles(sub);\n // If already unsubscribed while waiting, clean up immediately\n if (isUnsubscribed) {\n wsUnsubscribe();\n wsUnsubscribe = null;\n }\n } catch (error) {\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.subscribeToCandles',\n );\n\n // Log to Sentry: WebSocket subscription failure prevents live updates\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'websocket_subscription',\n data: {\n operation: 'subscribeToCandles',\n symbol,\n interval,\n phase: 'ws_subscription',\n },\n },\n });\n\n // Notify caller of error\n onError?.(errorInstance);\n }\n } catch (error) {\n // Skip logging and notification for intentional abort (user navigated away)\n if (abortController.signal.aborted) {\n return;\n }\n\n const errorInstance = ensureError(\n error,\n 'HyperLiquidClientService.subscribeToCandles',\n );\n\n // Log to Sentry: initial fetch failure blocks chart completely\n this.#deps.logger.error(errorInstance, {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n service: 'HyperLiquidClientService',\n network: this.#isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'initial_candles_fetch',\n data: {\n operation: 'subscribeToCandles',\n symbol,\n interval,\n phase: 'initial_fetch',\n initialLimit,\n },\n },\n });\n\n // Notify caller of error\n onError?.(errorInstance);\n }\n };\n\n // Fire-and-forget the async initialization\n initAndSubscribe().catch(() => {\n // Error already handled inside initAndSubscribe\n });\n\n // Return cleanup function\n return () => {\n isUnsubscribed = true;\n // Cancel any in-flight REST calls (candleSnapshot) to conserve rate limit budget (#28141)\n abortController.abort();\n if (wsUnsubscribe) {\n // Subscription already resolved - unsubscribe directly\n wsUnsubscribe();\n wsUnsubscribe = null;\n } else if (subscriptionPromise) {\n // Subscription promise still pending - wait for it and clean up\n // This prevents WebSocket subscription leaks when component unmounts\n // before the subscription promise resolves\n subscriptionPromise\n .then((sub) => unsubscribeFromCandles(sub))\n .catch(() => {\n // Ignore errors during cleanup - subscription may have failed\n });\n subscriptionPromise = null;\n }\n };\n }\n\n /**\n * Convert interval string to milliseconds\n *\n * @param interval - The candle period interval to convert.\n * @returns The interval duration in milliseconds.\n */\n #getIntervalMilliseconds(interval: CandlePeriod): number {\n const intervalMap: Record<CandlePeriod, number> = {\n [CandlePeriod.OneMinute]: 1 * 60 * 1000,\n [CandlePeriod.ThreeMinutes]: 3 * 60 * 1000,\n [CandlePeriod.FiveMinutes]: 5 * 60 * 1000,\n [CandlePeriod.FifteenMinutes]: 15 * 60 * 1000,\n [CandlePeriod.ThirtyMinutes]: 30 * 60 * 1000,\n [CandlePeriod.OneHour]: 60 * 60 * 1000,\n [CandlePeriod.TwoHours]: 2 * 60 * 60 * 1000,\n [CandlePeriod.FourHours]: 4 * 60 * 60 * 1000,\n [CandlePeriod.EightHours]: 8 * 60 * 60 * 1000,\n [CandlePeriod.TwelveHours]: 12 * 60 * 60 * 1000,\n [CandlePeriod.OneDay]: 24 * 60 * 60 * 1000,\n [CandlePeriod.ThreeDays]: 3 * 24 * 60 * 60 * 1000,\n [CandlePeriod.OneWeek]: 7 * 24 * 60 * 60 * 1000,\n [CandlePeriod.OneMonth]: 30 * 24 * 60 * 60 * 1000, // Approximate\n };\n\n return intervalMap[interval];\n }\n\n /**\n * Disconnect and cleanup all clients\n *\n * @returns A promise that resolves when disconnection is complete.\n */\n public async disconnect(): Promise<void> {\n // Await existing promise if already disconnecting\n if (this.#disconnectionPromise) {\n await this.#disconnectionPromise;\n return;\n }\n\n // If already disconnected, return immediately\n if (this.#connectionState === WebSocketConnectionState.Disconnected) {\n return;\n }\n\n // Create and store the disconnection promise\n this.#disconnectionPromise = this.#performDisconnection();\n\n try {\n await this.#disconnectionPromise;\n } finally {\n this.#disconnectionPromise = null;\n }\n }\n\n async #performDisconnection(): Promise<void> {\n try {\n this.#updateConnectionState(WebSocketConnectionState.Disconnecting);\n\n this.#deps.debugLogger.log('HyperLiquid: Disconnecting SDK clients', {\n isTestnet: this.#isTestnet,\n timestamp: new Date().toISOString(),\n connectionState: this.#connectionState,\n });\n\n // Clear callbacks\n this.#onReconnectCallback = undefined;\n this.#onTerminateCallback = null;\n\n // Cancel any pending reconnection retry timeout\n if (this.#reconnectionRetryTimeout) {\n clearTimeout(this.#reconnectionRetryTimeout);\n this.#reconnectionRetryTimeout = null;\n }\n\n // Clear connection state listeners to prevent stale callbacks\n this.#connectionStateListeners.clear();\n\n // Reset reconnection flag to allow future manual retries\n // This prevents a race condition where disconnecting during an active\n // reconnection attempt could leave the flag stuck, blocking subsequent retries\n this.#isReconnecting = false;\n\n // Close WebSocket transport only (HTTP is stateless)\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n this.#deps.debugLogger.log(\n 'HyperLiquid: Closed WebSocket transport',\n {\n timestamp: new Date().toISOString(),\n },\n );\n } catch (error) {\n this.#deps.logger.error(\n ensureError(error, 'HyperLiquidClientService.performDisconnection'),\n {\n tags: { feature: PERPS_CONSTANTS.FeatureName },\n context: {\n name: 'HyperLiquidClientService.performDisconnection',\n data: { action: 'close_transport' },\n },\n },\n );\n }\n }\n\n // Clear client references\n this.#subscriptionClient = undefined;\n this.#exchangeClient = undefined;\n this.#infoClient = undefined;\n this.#infoClientHttp = undefined;\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n this.#httpTransport = undefined;\n\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: SDK clients fully disconnected',\n {\n timestamp: new Date().toISOString(),\n connectionState: this.#connectionState,\n },\n );\n } catch (error) {\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n this.#deps.logger.error(\n ensureError(error, 'HyperLiquidClientService.performDisconnection'),\n {\n tags: { feature: PERPS_CONSTANTS.FeatureName },\n context: {\n name: 'HyperLiquidClientService.performDisconnection',\n data: { action: 'outer_catch' },\n },\n },\n );\n throw error;\n }\n }\n\n /**\n * Get current WebSocket connection state\n *\n * @returns The current WebSocket connection state.\n */\n public getConnectionState(): WebSocketConnectionState {\n return this.#connectionState;\n }\n\n /**\n * Get the identifier of the current WebSocket connection.\n *\n * The value changes whenever the raw socket closes — including an SDK-internal\n * automatic reconnect, which is otherwise invisible to callers. Stamp cached\n * per-connection data with the epoch that produced it and compare on read:\n * anything carried across a reconnect stops matching on its own, so there is\n * no invalidation hook that can be attached at the wrong lifecycle point.\n *\n * @returns The current connection epoch. Never 0, so an unstamped default\n * cannot be mistaken for a live connection.\n */\n public getConnectionEpoch(): number {\n return this.#connectionEpoch;\n }\n\n /**\n * Retire the current connection epoch.\n *\n * Called when the WebSocket transport is discarded, so a replacement starts on\n * a fresh epoch and everything cached against the old connection stops\n * matching. The socket's own `close` listener cannot be relied on here: it may\n * fire after the transport has already been replaced, at which point it is\n * ignored precisely so it cannot retire the new connection's epoch.\n *\n * Retiring twice for one connection is harmless — the epoch is an identity,\n * not a count — so callers do not need to know whether `close` already fired.\n */\n #retireConnectionEpoch(): void {\n this.#connectionEpoch += 1;\n this.#deps.debugLogger.log('HyperLiquid: connection epoch retired', {\n connectionEpoch: this.#connectionEpoch,\n });\n }\n\n /**\n * Check if WebSocket is fully disconnected\n *\n * @returns True if the WebSocket is in disconnected state.\n */\n public isDisconnected(): boolean {\n return this.#connectionState === WebSocketConnectionState.Disconnected;\n }\n\n /**\n * Set callback to be invoked when reconnection is needed\n * This allows the service to notify external components (like PerpsConnectionManager)\n * when a connection drop is detected\n *\n * @param callback - The async callback to invoke when reconnection is needed.\n */\n public setOnReconnectCallback(callback: () => Promise<void>): void {\n this.#onReconnectCallback = callback;\n }\n\n /**\n * Set callback for WebSocket termination events\n * Called when the SDK exhausts all reconnection attempts\n *\n * @param callback - The callback to invoke on termination, or null to clear.\n */\n public setOnTerminateCallback(\n callback: ((error: Error) => void) | null,\n ): void {\n this.#onTerminateCallback = callback;\n }\n\n /**\n * Subscribe to connection state changes.\n * The listener will be called immediately with the current state and whenever the state changes.\n *\n * @param listener - Callback function that receives the new connection state and reconnection attempt\n * @returns Unsubscribe function to remove the listener\n */\n public subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n this.#connectionStateListeners.add(listener);\n\n // Immediately notify with current state\n // Wrap in try-catch to match notifyConnectionStateListeners behavior\n // This ensures the unsubscribe function is always returned even if listener throws\n try {\n listener(this.#connectionState, this.#reconnectionAttempt);\n } catch {\n // Ignore errors in listeners to prevent breaking subscription mechanism\n // If listener throws, it will be removed when unsubscribe is called\n }\n\n // Return unsubscribe function\n return () => {\n this.#connectionStateListeners.delete(listener);\n };\n }\n\n /**\n * Update connection state and notify all listeners\n * Always notifies if state changes OR if we're in CONNECTING state (to update attempt count)\n *\n * @param newState - The new WebSocket connection state.\n */\n #updateConnectionState(newState: WebSocketConnectionState): void {\n const previousState = this.#connectionState;\n const stateChanged = previousState !== newState;\n const isReconnectionAttempt =\n newState === WebSocketConnectionState.Connecting &&\n this.#reconnectionAttempt > 0;\n\n this.#connectionState = newState;\n\n // Reset reconnection attempt counter when successfully connected\n if (newState === WebSocketConnectionState.Connected) {\n this.#reconnectionAttempt = 0;\n }\n\n // Notify if state changed OR if this is a reconnection attempt (to update attempt count)\n if (stateChanged || isReconnectionAttempt) {\n this.#notifyConnectionStateListeners();\n }\n }\n\n /**\n * Notify all connection state listeners of the current state\n */\n #notifyConnectionStateListeners(): void {\n this.#connectionStateListeners.forEach((listener) => {\n try {\n listener(this.#connectionState, this.#reconnectionAttempt);\n } catch {\n // Ignore errors in listeners to prevent breaking other listeners\n }\n });\n }\n\n // Flag to prevent concurrent reconnection attempts\n #isReconnecting = false;\n\n /**\n * Manually trigger a reconnection attempt.\n * This is exposed for UI retry buttons when user wants to force reconnection.\n * Resets the reconnection attempt counter to allow retrying after max attempts.\n */\n public async reconnect(): Promise<void> {\n this.#deps.debugLogger.log(\n '[HyperLiquidClientService] reconnect() called',\n {\n previousAttempt: this.#reconnectionAttempt,\n currentState: this.#connectionState,\n },\n );\n // Reset attempt counter when user manually triggers retry\n this.#reconnectionAttempt = 0;\n await this.#handleConnectionDrop();\n this.#deps.debugLogger.log(\n '[HyperLiquidClientService] reconnect() completed',\n {\n newState: this.#connectionState,\n },\n );\n }\n\n /**\n * Handle detected connection drop\n * Recreates WebSocket transport and notifies callback to restore subscriptions\n * Will give up after maxReconnectionAttempts and mark status as disconnected\n */\n async #handleConnectionDrop(): Promise<void> {\n // Prevent multiple simultaneous reconnection attempts\n if (this.#isReconnecting) {\n return;\n }\n\n this.#isReconnecting = true;\n\n // Increment reconnection attempt counter\n this.#reconnectionAttempt += 1;\n\n // Check if we've exceeded max retry attempts\n if (this.#reconnectionAttempt > maxReconnectionAttempts) {\n this.#isReconnecting = false;\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n return;\n }\n\n try {\n this.#updateConnectionState(WebSocketConnectionState.Connecting);\n\n // Close existing WebSocket transport and clear references\n // so createTransports() will create fresh ones\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n } catch {\n // Ignore errors during close - transport may already be dead\n }\n }\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n this.#httpTransport = undefined;\n\n // WebSocket clients are unavailable throughout the reconnect. HTTP\n // clients remain usable while the new socket is staged and verified.\n this.#subscriptionClient = undefined;\n this.#infoClient = undefined;\n\n // Recreate transports (both WS and HTTP)\n const newWsTransport = this.#createTransports();\n\n const newInfoClient = new InfoClient({ transport: newWsTransport });\n const newSubscriptionClient = new SubscriptionClient({\n transport: newWsTransport,\n });\n this.#createHttpClients();\n\n await newWsTransport.ready();\n\n // Publish WebSocket clients only after the transport is usable. This\n // keeps isInitialized() false and blocks WS-backed access during a\n // failed or in-flight reconnect without disabling HTTP-backed trading.\n this.#infoClient = newInfoClient;\n this.#subscriptionClient = newSubscriptionClient;\n\n this.#deps.debugLogger.log(\n 'HyperLiquid: Transport ready, restoring subscriptions',\n { timestamp: new Date().toISOString() },\n );\n\n // NOW safe to restore subscriptions\n if (this.#onReconnectCallback) {\n await this.#onReconnectCallback();\n }\n\n // Cancel any pending retry timeout from previous failed attempts\n if (this.#reconnectionRetryTimeout) {\n clearTimeout(this.#reconnectionRetryTimeout);\n this.#reconnectionRetryTimeout = null;\n }\n\n this.#updateConnectionState(WebSocketConnectionState.Connected);\n this.#isReconnecting = false;\n } catch {\n // The staged WebSocket clients were never published. Keep the HTTP\n // clients alive so exchange writes and explicit HTTP info reads remain\n // available while the WebSocket retry loop continues.\n this.#subscriptionClient = undefined;\n this.#infoClient = undefined;\n\n if (this.#wsTransport) {\n try {\n this.#wsTransport.close();\n } catch {\n // Ignore cleanup errors - transport may already be dead\n }\n }\n this.#wsTransport = undefined;\n // The transport is gone: retire its epoch so a replacement starts fresh\n // and anything cached against the old connection stops matching.\n this.#retireConnectionEpoch();\n\n // Reset flag before scheduling retry so the next attempt can proceed\n this.#isReconnecting = false;\n\n // Check if we've exceeded max retry attempts\n if (this.#reconnectionAttempt >= maxReconnectionAttempts) {\n this.#updateConnectionState(WebSocketConnectionState.Disconnected);\n return;\n }\n\n // Reconnection failed - schedule a retry after a delay\n // Store timeout reference so it can be cancelled on intentional disconnect\n this.#reconnectionRetryTimeout = setTimeout(() => {\n this.#reconnectionRetryTimeout = null; // Clear reference after execution\n // Only retry if we haven't been intentionally disconnected\n // and no manual reconnect() is already in progress\n // Note: State may be CONNECTING or DISCONNECTED (if terminate event fired during reconnect)\n if (\n (this.#connectionState === WebSocketConnectionState.Connecting ||\n this.#connectionState === WebSocketConnectionState.Disconnected) &&\n !this.#disconnectionPromise &&\n !this.#isReconnecting\n ) {\n this.#handleConnectionDrop().catch(() => {\n // Error already handled inside #handleConnectionDrop\n });\n }\n }, PERPS_CONSTANTS.ReconnectionRetryDelayMs);\n }\n }\n}\n"]}
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _HyperLiquidWalletService_instances, _HyperLiquidWalletService_isTestnet, _HyperLiquidWalletService_deps, _HyperLiquidWalletService_messenger, _HyperLiquidWalletService_signTypedMessage;
13
+ var _HyperLiquidWalletService_instances, _HyperLiquidWalletService_isTestnet, _HyperLiquidWalletService_deps, _HyperLiquidWalletService_messenger, _HyperLiquidWalletService_signTypedMessage, _HyperLiquidWalletService_signWithMaster, _HyperLiquidWalletService_isL1AgentAction;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.HyperLiquidWalletService = void 0;
16
16
  const utils_1 = require("@metamask/utils");
@@ -64,8 +64,53 @@ class HyperLiquidWalletService {
64
64
  return Boolean(keyringType && HARDWARE_KEYRING_TYPES.has(keyringType));
65
65
  }
66
66
  /**
67
- * Create wallet adapter that implements AbstractViemJsonRpcAccount interface
68
- * Required by @nktkas/hyperliquid SDK for signing transactions
67
+ * Create a wallet adapter backed by a local agent signer.
68
+ *
69
+ * The returned adapter keeps the params-style `signTypedData` shape the SDK
70
+ * already accepts (viem local account), but routes by typed-data shape:
71
+ * L1 (phantom-agent) actions — primaryType `Agent` over the `Exchange`
72
+ * domain — are signed directly by the injected local signer with no keyring
73
+ * contact; user-signed actions (`approveBuilderFee`, `userSetAbstraction`,
74
+ * `sendAsset`, `withdraw3`, … over the `HyperliquidSignTransaction` domain)
75
+ * are master-account authorizations and fall through to the master keyring
76
+ * signing path, so hardware users get the normal device prompt. The SDK's
77
+ * viem adapters inject an `EIP712Domain` entry into `types` before calling
78
+ * params-style wallets; ethers-style signers reject that entry, so it is
79
+ * stripped before delegating to the agent signer (the master path passes
80
+ * `types` through unchanged, matching the pre-seam master adapter).
81
+ *
82
+ * @param agentSigner - The local agent signer to delegate L1 actions to.
83
+ * @returns The agent wallet adapter.
84
+ */
85
+ createAgentWalletAdapter(agentSigner) {
86
+ return {
87
+ // The agent address is returned for identity purposes: the SDK only uses
88
+ // it for local lock/nonce keying (`getWalletAddress`), never inside the
89
+ // signed payload — HyperLiquid recovers the signer from the signature.
90
+ address: agentSigner.address,
91
+ signTypedData: async (params) => {
92
+ if (__classPrivateFieldGet(this, _HyperLiquidWalletService_instances, "m", _HyperLiquidWalletService_isL1AgentAction).call(this, params.primaryType, params.domain?.name)) {
93
+ const { EIP712Domain: _eip712Domain, ...types } = params.types;
94
+ __classPrivateFieldGet(this, _HyperLiquidWalletService_deps, "f").debugLogger.log('HyperLiquidWalletService: Signing typed data (agent mode)', {
95
+ address: agentSigner.address,
96
+ primaryType: params.primaryType,
97
+ });
98
+ return (await agentSigner.signTypedData(params.domain, types, params.message));
99
+ }
100
+ // User-signed action: master-account authorization, must be signed
101
+ // by the master wallet (device prompt on hardware).
102
+ return __classPrivateFieldGet(this, _HyperLiquidWalletService_instances, "m", _HyperLiquidWalletService_signWithMaster).call(this, params);
103
+ },
104
+ getChainId: async () => parseInt((0, hyperLiquidConfig_js_1.getChainId)(__classPrivateFieldGet(this, _HyperLiquidWalletService_isTestnet, "f")), 10),
105
+ };
106
+ }
107
+ /**
108
+ * Create the master-keyring wallet adapter for the HyperLiquid SDK.
109
+ *
110
+ * This factory is synchronous and always signs via the selected master
111
+ * account. Agent wallets are built separately with
112
+ * {@link createAgentWalletAdapter}; the provider selects which adapter the
113
+ * SDK clients use.
69
114
  *
70
115
  * @returns The wallet adapter with address, signTypedData, and getChainId methods.
71
116
  */
@@ -78,33 +123,7 @@ class HyperLiquidWalletService {
78
123
  const address = evmAccount.address;
79
124
  return {
80
125
  address,
81
- signTypedData: async (params) => {
82
- // Get FRESH account on every sign to handle account switches
83
- // This prevents race conditions where wallet adapter was created with old account
84
- const currentEvmAccount = (0, accountUtils_js_1.getSelectedEvmAccountFromMessenger)(__classPrivateFieldGet(this, _HyperLiquidWalletService_messenger, "f"));
85
- if (!currentEvmAccount?.address) {
86
- throw new Error(perpsErrorCodes_js_1.PERPS_ERROR_CODES.NO_ACCOUNT_SELECTED);
87
- }
88
- const currentAddress = currentEvmAccount.address;
89
- // Construct EIP-712 typed data
90
- const typedData = {
91
- domain: params.domain,
92
- types: params.types,
93
- primaryType: params.primaryType,
94
- message: params.message,
95
- };
96
- __classPrivateFieldGet(this, _HyperLiquidWalletService_deps, "f").debugLogger.log('HyperLiquidWalletService: Signing typed data', {
97
- address: currentAddress,
98
- primaryType: params.primaryType,
99
- domain: params.domain,
100
- });
101
- // Use messenger to sign typed data
102
- const signature = await __classPrivateFieldGet(this, _HyperLiquidWalletService_instances, "m", _HyperLiquidWalletService_signTypedMessage).call(this, {
103
- from: currentAddress,
104
- data: typedData,
105
- });
106
- return signature;
107
- },
126
+ signTypedData: async (params) => __classPrivateFieldGet(this, _HyperLiquidWalletService_instances, "m", _HyperLiquidWalletService_signWithMaster).call(this, params),
108
127
  getChainId: async () => parseInt((0, hyperLiquidConfig_js_1.getChainId)(__classPrivateFieldGet(this, _HyperLiquidWalletService_isTestnet, "f")), 10),
109
128
  };
110
129
  }
@@ -182,5 +201,36 @@ async function _HyperLiquidWalletService_signTypedMessage(msgParams) {
182
201
  msgParams,
183
202
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
184
203
  'V4');
204
+ }, _HyperLiquidWalletService_signWithMaster =
205
+ /**
206
+ * Sign typed data with the master account via the keyring, resolving the
207
+ * selected account fresh so account switches cannot race the adapter.
208
+ *
209
+ * @param params - The typed-data signing request the SDK passed to the adapter.
210
+ * @returns The signature string.
211
+ */
212
+ async function _HyperLiquidWalletService_signWithMaster(params) {
213
+ const currentEvmAccount = (0, accountUtils_js_1.getSelectedEvmAccountFromMessenger)(__classPrivateFieldGet(this, _HyperLiquidWalletService_messenger, "f"));
214
+ if (!currentEvmAccount?.address) {
215
+ throw new Error(perpsErrorCodes_js_1.PERPS_ERROR_CODES.NO_ACCOUNT_SELECTED);
216
+ }
217
+ const currentAddress = currentEvmAccount.address;
218
+ __classPrivateFieldGet(this, _HyperLiquidWalletService_deps, "f").debugLogger.log('HyperLiquidWalletService: Signing typed data (master fallback)', {
219
+ address: currentAddress,
220
+ primaryType: params.primaryType,
221
+ domain: params.domain,
222
+ });
223
+ const signature = await __classPrivateFieldGet(this, _HyperLiquidWalletService_instances, "m", _HyperLiquidWalletService_signTypedMessage).call(this, {
224
+ from: currentAddress,
225
+ data: {
226
+ domain: params.domain,
227
+ types: params.types,
228
+ primaryType: params.primaryType,
229
+ message: params.message,
230
+ },
231
+ });
232
+ return signature;
233
+ }, _HyperLiquidWalletService_isL1AgentAction = function _HyperLiquidWalletService_isL1AgentAction(primaryType, domainName) {
234
+ return primaryType === 'Agent' || domainName === 'Exchange';
185
235
  };
186
236
  //# sourceMappingURL=HyperLiquidWalletService.cjs.map