@metamask-previews/perps-controller 19.0.0-preview-c2be02bd4 → 19.0.0-preview-0305ce0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +46 -0
- package/dist/PerpsController.d.ts.map +1 -1
- package/dist/PerpsController.js +4 -1
- package/dist/PerpsController.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/services/MarketDataService.js +6 -6
- package/dist/services/MarketDataService.js.map +1 -1
- package/dist/services/RewardsIntegrationService.d.ts +13 -8
- package/dist/services/RewardsIntegrationService.d.ts.map +1 -1
- package/dist/services/RewardsIntegrationService.js +83 -20
- package/dist/services/RewardsIntegrationService.js.map +1 -1
- package/dist/services/TradingService.d.ts.map +1 -1
- package/dist/services/TradingService.js +13 -8
- package/dist/services/TradingService.js.map +1 -1
- package/dist/types/index.d.ts +49 -8
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/subscriptionFeeWaiver.d.ts +2 -1
- package/dist/utils/subscriptionFeeWaiver.d.ts.map +1 -1
- package/dist/utils/subscriptionFeeWaiver.js +9 -4
- package/dist/utils/subscriptionFeeWaiver.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PerpsController.js","sourceRoot":"","sources":["../src/PerpsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NotificationPreferences,\n PerpsWatchlistMarkets,\n} from '@metamask/authenticated-user-storage';\nimport {\n BaseController,\n ControllerGetStateAction,\n ControllerStateChangedEvent,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport type { StateChangeListener } from '@metamask/base-controller';\nimport { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CandlePeriod,\n VISIBLE_CANDLE_COUNT_CONFIG,\n} from './constants/chartConfig.js';\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from './constants/eventNames.js';\nimport {\n canonicalizeHyperLiquidDexes,\n MAINNET_HIP3_CONFIG,\n TESTNET_HIP3_CONFIG,\n USDC_SYMBOL,\n} from './constants/hyperLiquidConfig.js';\nimport { PerpsMeasurementName } from './constants/performanceMetrics.js';\nimport type {\n SortOptionId,\n OrderBookPreferences,\n ProLayoutPreferences,\n PerpsMode,\n} from './constants/perpsConfig.js';\nimport {\n PERPS_CONSTANTS,\n MARKET_SORTING_CONFIG,\n buildProviderCacheKey,\n MAX_SLIPPAGE_BOUNDS,\n DEFAULT_PERPS_MODE,\n DEFAULT_ORDER_BOOK_PREFERENCES,\n DEFAULT_PRO_LAYOUT_PREFERENCES,\n DEFAULT_SELECTED_ORDER_TYPE,\n} from './constants/perpsConfig.js';\nimport type { PerpsControllerMethodActions } from './PerpsController-method-action-types.js';\nimport { PERPS_ERROR_CODES } from './perpsErrorCodes.js';\nimport { AggregatedPerpsProvider } from './providers/AggregatedPerpsProvider.js';\nimport { HyperLiquidProvider } from './providers/HyperLiquidProvider.js';\nimport { AccountService } from './services/AccountService.js';\nimport { isMainAccountSignerReady } from './services/accountSigner.js';\nimport { AgentBindings } from './services/agentSigner.js';\nimport { DataLakeService } from './services/DataLakeService.js';\nimport { DepositService } from './services/DepositService.js';\nimport { EligibilityService } from './services/EligibilityService.js';\nimport { FeatureFlagConfigurationService } from './services/FeatureFlagConfigurationService.js';\nimport { MarketDataService } from './services/MarketDataService.js';\nimport { isProviderOnTestnet } from './services/providerNetwork.js';\nimport { RewardsIntegrationService } from './services/RewardsIntegrationService.js';\nimport type { ServiceContext } from './services/ServiceContext.js';\nimport { TerminalMarketService } from './services/TerminalMarketService.js';\nimport { TradingService } from './services/TradingService.js';\n// PerpsStreamChannelKey removed: using string for channel keys (PerpsStreamManager.pauseChannel takes string)\nimport {\n WebSocketConnectionState,\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n isVersionGatedFeatureFlag,\n MARKET_CATEGORIES,\n // Platform dependencies interface for core migration (bundles all platform-specific deps)\n} from './types/index.js';\nimport type {\n AccountState,\n AssetRoute,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ChaseOrder,\n ChaseOrderMaxDistanceReached,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n DepositWithConfirmationParams,\n EditOrderParams,\n FeeCalculationParams,\n FeeCalculationResult,\n FlipPositionParams,\n Funding,\n GetAccountStateParams,\n GetAvailableDexsParams,\n GetFundingParams,\n GetMarketDataWithPricesParams,\n GetMarketsParams,\n GetOrderCapabilitiesParams,\n GetMarginModeLockParams,\n GetScalePriceLadderParams,\n GetOrderFillsParams,\n GetOrdersParams,\n GetPositionsParams,\n PerpsProvider,\n LiquidationPriceParams,\n LiveDataConfig,\n MaintenanceMarginParams,\n PositionModifyPreviewParams,\n PositionModifyPreviewResult,\n MarginMode,\n MarginResult,\n MarketInfo,\n Order,\n OrderCapabilitiesUnavailableReason,\n MarginModeLockUnavailableReason,\n OrderDirection,\n OrderFill,\n OrderParams,\n OrderResult,\n PerpsControllerConfig,\n PerpsMarketData,\n PerpsOrderCapabilities,\n PerpsMarginModeLock,\n PerpsScalePriceLadder,\n ScalePriceLadderUnavailableReason,\n PerpsPendingManualRecovery,\n PerpsRecoveredDispatch,\n Position,\n SubscribeAccountParams,\n SubscribeCandlesParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribeTwapOrdersParams,\n SubscribePositionsParams,\n SubscribePricesParams,\n ReadyToTradeResult,\n SwitchProviderResult,\n ToggleTestnetResult,\n TwapOrder,\n UpdateMarginParams,\n UpdatePositionTPSLParams,\n WithdrawParams,\n WithdrawResult,\n GetHistoricalPortfolioParams,\n HistoricalPortfolioResult,\n OrderType,\n PerpsAgentAccount,\n PerpsAgentSigner,\n PerpsPlatformDependencies,\n PerpsLogger,\n PerpsActiveProviderMode,\n PerpsAnalyticsProperties,\n PerpsAttributionContext,\n PerpsProviderType,\n PerpsUserDataSnapshot,\n PerpsSelectedPaymentToken,\n PerpsRemoteFeatureFlagState,\n PerpsTransactionParams,\n PerpsAddTransactionOptions,\n MarketTypeFilter,\n} from './types/index.js';\nimport type { SortDirection } from './types/index.js';\nimport type {\n LighterAuthConfig,\n LighterSignerBridge,\n} from './types/lighter-types.js';\nimport type {\n PerpsControllerAllowedActions,\n PerpsControllerAllowedEvents,\n} from './types/messenger.js';\nimport type { CandleData } from './types/perps-types.js';\nimport {\n LastTransactionResult,\n TransactionStatus,\n} from './types/transactionTypes.js';\nimport { getSelectedEvmAccountFromMessenger } from './utils/accountUtils.js';\nimport { ensureError } from './utils/errorUtils.js';\nimport { parseAssetName } from './utils/hyperLiquidAdapter.js';\nimport {\n clonePerpsMarketData,\n compileMarketPattern,\n shouldIncludeMarket,\n} from './utils/marketUtils.js';\nimport type { CompiledMarketPattern } from './utils/marketUtils.js';\nimport { isStrategyOrderType } from './utils/orderTypes.js';\nimport {\n hydrateFromDiskSync,\n persistMarketEntriesToDisk,\n persistUserEntriesToDisk,\n} from './utils/perpsDiskPersistence.js';\nimport type { DiskCacheUserEntry } from './utils/perpsDiskPersistence.js';\nimport { wait } from './utils/wait.js';\n\n/** Derived type for logger options from PerpsLogger interface */\ntype PerpsLoggerOptions = Parameters<PerpsLogger['error']>[1];\n\nfunction cloneUserDataSnapshot(\n snapshot: PerpsUserDataSnapshot,\n): PerpsUserDataSnapshot {\n return {\n positions: snapshot.positions.map((position) => ({\n ...position,\n leverage: { ...position.leverage },\n cumulativeFunding: { ...position.cumulativeFunding },\n ...(position.takeProfitOrders && {\n takeProfitOrders: position.takeProfitOrders.map((order) => ({\n ...order,\n })),\n }),\n ...(position.stopLossOrders && {\n stopLossOrders: position.stopLossOrders.map((order) => ({\n ...order,\n })),\n }),\n })),\n orders: snapshot.orders.map((order) => ({ ...order })),\n accountState: {\n ...snapshot.accountState,\n ...(snapshot.accountState.subAccountBreakdown && {\n subAccountBreakdown: Object.fromEntries(\n Object.entries(snapshot.accountState.subAccountBreakdown).map(\n ([dex, balances]) => [dex, { ...balances }],\n ),\n ),\n }),\n },\n identity: {\n ...snapshot.identity,\n dexes: [...snapshot.identity.dexes],\n },\n };\n}\n\n/**\n * Maps an active provider mode to the corresponding exchange key used in the\n * AUS {@link PerpsWatchlistMarkets} schema.\n *\n * Returns `null` for modes that are not yet represented in the AUS schema\n * (e.g. `'aggregated'`), which signals callers to skip remote sync and fall\n * back to local state only. Add new entries here as additional DEX providers\n * gain AUS watchlist support.\n *\n * @param activeProvider - The current active provider mode from controller state.\n * @returns The matching `PerpsWatchlistMarkets` key, or `null` if unsupported.\n */\nexport function resolveWatchlistExchangeKey(\n activeProvider: PerpsActiveProviderMode,\n): keyof PerpsWatchlistMarkets | null {\n const map: Partial<\n Record<PerpsActiveProviderMode, keyof PerpsWatchlistMarkets>\n > = {\n hyperliquid: 'hyperliquid',\n };\n return map[activeProvider] ?? null;\n}\n\n// PaymentToken: minimal interface for deposit flow (replaces mobile-only AssetType)\n\n/**\n * Minimal payment token stored in PerpsController state.\n * Only required fields for identification, Perps balance detection, and analytics.\n */\nexport type SelectedPaymentTokenSnapshot = {\n description?: string;\n address: string;\n chainId: string;\n symbol?: string;\n};\n\n// Re-export error codes from separate file to avoid circular dependencies\nexport { PERPS_ERROR_CODES, type PerpsErrorCode } from './perpsErrorCodes.js';\n\n/**\n * Initialization state enum for state machine tracking\n */\nexport enum InitializationState {\n Uninitialized = 'uninitialized',\n Initializing = 'initializing',\n Initialized = 'initialized',\n Failed = 'failed',\n}\n\n// Re-exported so consumers can keep importing these from the controller entry\n// point; the canonical definitions live in the dependency-free constants module.\nexport {\n PerpsMode,\n DEFAULT_ORDER_BOOK_PREFERENCES,\n DEFAULT_PERPS_MODE,\n DEFAULT_PRO_LAYOUT_PREFERENCES,\n DEFAULT_SELECTED_ORDER_TYPE,\n} from './constants/perpsConfig.js';\nexport type {\n OrderBookListCurrency,\n OrderBookListMetric,\n OrderBookPreferences,\n ProLayoutPreferences,\n ProOrdersSideFilter,\n ProOrdersSortDirection,\n ProOrdersSortField,\n ProPositionsSideFilter,\n ProPositionsSortDirection,\n ProPositionsSortField,\n} from './constants/perpsConfig.js';\n\n/**\n * State shape for PerpsController\n */\nexport type PerpsControllerState = {\n // Active provider\n activeProvider: PerpsActiveProviderMode;\n isTestnet: boolean; // Dev toggle for testnet\n\n // Initialization state machine\n initializationState: InitializationState;\n initializationError: string | null;\n initializationAttempts: number;\n\n // Account data (persisted) - using HyperLiquid property names\n accountState: AccountState | null;\n\n // Perps balances per provider for portfolio display (historical data)\n perpsBalances: {\n [provider: string]: {\n totalBalance: string; // Current total account value (cash + positions) in USD\n unrealizedPnl: string; // Current P&L from open positions in USD\n accountValue1dAgo: string; // Account value 24h ago for daily change calculation in USD\n lastUpdated: number; // Timestamp of last update\n };\n };\n\n // Simple deposit state (transient, for UI feedback)\n depositInProgress: boolean;\n // Internal transaction id for the deposit transaction\n // We use this to fetch the bridge quotes and get the estimated time.\n lastDepositTransactionId: string | null;\n lastDepositResult: LastTransactionResult | null;\n\n // Simple withdrawal state (transient, for UI feedback)\n // Note: withdrawInProgress is now derived from withdrawalRequests having pending/bridging entries\n withdrawInProgress: boolean;\n lastWithdrawResult: LastTransactionResult | null;\n\n // FIFO guard for withdrawal completion matching.\n // Timestamp is persisted — survives app restarts so the hook skips\n // already-processed history entries even after relaunch.\n // TxHashes array is NOT persisted — it tracks completions within a\n // single session to prevent re-matching (direct completions,\n // same-millisecond API completions). Resets naturally on app restart;\n // the timestamp guard provides cross-restart protection.\n lastCompletedWithdrawalTimestamp: number | null;\n lastCompletedWithdrawalTxHashes: string[];\n\n // Withdrawal request tracking (persistent, for transaction history)\n withdrawalRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this withdrawal\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Withdrawal progress tracking (persistent across navigation)\n withdrawalProgress: {\n progress: number; // 0-100\n lastUpdated: number; // timestamp\n activeWithdrawalId: string | null; // ID of the withdrawal being tracked\n };\n\n // Deposit request tracking (persistent, for transaction history)\n depositRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this deposit\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Eligibility (Geo-Blocking)\n isEligible: boolean;\n\n // Tutorial/First time user tracking (per network)\n isFirstTimeUser: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Notification tracking\n hasPlacedFirstOrder: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Watchlist markets tracking (per network)\n watchlistMarkets: {\n testnet: string[]; // Array of watchlist market symbols for testnet\n mainnet: string[]; // Array of watchlist market symbols for mainnet\n };\n\n // Recently viewed markets tracking (per network, persisted)\n // Entries are ordered newest-first. TTL filtering and the 10-item cap\n // are applied on read in getRecentlyViewedMarkets / selectRecentlyViewedMarkets.\n recentlyViewedMarkets: {\n testnet: { symbol: string; viewedAt: number }[];\n mainnet: { symbol: string; viewedAt: number }[];\n };\n\n // Trade configurations per market (per network)\n tradeConfigurations: {\n testnet: {\n [marketSymbol: string]: {\n leverage?: number; // Last used leverage for this market\n orderBookGrouping?: number; // Persisted price grouping for order book\n marginMode?: MarginMode; // Last Isolated/Cross pick for this market\n // Pending trade configuration (temporary, expires after 30 seconds)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n reduceOnly?: boolean; // Whether the order may only reduce a position\n direction?: OrderDirection; // Long vs short\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n mainnet: {\n [marketSymbol: string]: {\n leverage?: number;\n orderBookGrouping?: number; // Persisted price grouping for order book\n marginMode?: MarginMode; // Last Isolated/Cross pick for this market\n // Pending trade configuration (temporary, expires after 30 seconds)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n reduceOnly?: boolean; // Whether the order may only reduce a position\n direction?: OrderDirection; // Long vs short\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n };\n\n // Max slippage tolerance in basis points (e.g. 300 = 3%). Global user preference.\n maxSlippageBps?: number;\n\n // Market filter preferences (network-independent) - includes both sorting and filtering options\n marketFilterPreferences: {\n optionId: SortOptionId;\n direction: SortDirection;\n };\n\n // Pro-mode layout preferences (network-independent). Flat object that\n // persists across markets (unlike the per-market tradeConfigurations).\n proLayoutPreferences: ProLayoutPreferences;\n\n // Pro order-book display preferences (network-independent).\n orderBookPreferences: OrderBookPreferences;\n\n // Last selected order type, shared across markets and networks.\n selectedOrderType: OrderType;\n\n // Number of candles visible in Lite and Pro chart viewports.\n visibleCandleCount: number;\n\n // Perps interface mode (lite/pro), network-independent global preference.\n mode: PerpsMode;\n\n // Error handling\n lastError: string | null;\n lastUpdateTimestamp: number;\n\n // HIP-3 Configuration Version (incremented when HIP-3 remote flags change)\n // Used to trigger reconnection and cache invalidation in ConnectionManager\n hip3ConfigVersion: number;\n\n // Selected payment token for Perps order/deposit flow (null = Perps balance). Stored as Json (minimal shape: description, address, chainId).\n selectedPaymentToken: Json | null;\n\n // Cached market data from background preloading (REST snapshots, not WebSocket)\n // Keyed by \"providerId:network\" (e.g. 'hyperliquid:mainnet', 'lighter:testnet')\n cachedMarketDataByProvider: Record<\n string,\n {\n data: PerpsMarketData[];\n timestamp: number;\n sourceExpiresAt?: number;\n hip3ConfigVersion?: number;\n dexes?: string[];\n }\n >;\n\n // Cached user data from background preloading (REST snapshots, not WebSocket)\n // Keyed by \"providerId:network\". The entry carries the selected address and\n // exact HyperLiquid configuration identity, both validated before reads.\n cachedUserDataByProvider: Record<\n string,\n {\n positions: Position[];\n orders: Order[];\n accountState: AccountState | null;\n timestamp: number;\n address: string;\n hip3ConfigVersion?: number;\n dexes?: string[];\n }\n >;\n};\n\n/**\n * Get default PerpsController state\n *\n * To change the active provider, modify the `activeProvider` value below:\n * - 'hyperliquid': HyperLiquid provider (default, production)\n * - 'aggregated': Multi-provider aggregation mode\n *\n * @returns The default perps controller state.\n */\nexport const getDefaultPerpsControllerState = (): PerpsControllerState => ({\n activeProvider: 'hyperliquid',\n isTestnet: false, // Default to mainnet\n initializationState: InitializationState.Uninitialized,\n initializationError: null,\n initializationAttempts: 0,\n accountState: null,\n perpsBalances: {},\n depositInProgress: false,\n lastDepositResult: null,\n withdrawInProgress: false,\n lastDepositTransactionId: null,\n lastWithdrawResult: null,\n lastCompletedWithdrawalTimestamp: null,\n lastCompletedWithdrawalTxHashes: [],\n withdrawalRequests: [],\n withdrawalProgress: {\n progress: 0,\n lastUpdated: 0,\n activeWithdrawalId: null,\n },\n depositRequests: [],\n lastError: null,\n lastUpdateTimestamp: 0,\n isEligible: false,\n isFirstTimeUser: {\n testnet: true,\n mainnet: true,\n },\n hasPlacedFirstOrder: {\n testnet: false,\n mainnet: false,\n },\n watchlistMarkets: {\n testnet: [],\n mainnet: [],\n },\n recentlyViewedMarkets: {\n testnet: [],\n mainnet: [],\n },\n tradeConfigurations: {\n testnet: {},\n mainnet: {},\n },\n marketFilterPreferences: {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n },\n proLayoutPreferences: { ...DEFAULT_PRO_LAYOUT_PREFERENCES },\n orderBookPreferences: { ...DEFAULT_ORDER_BOOK_PREFERENCES },\n selectedOrderType: DEFAULT_SELECTED_ORDER_TYPE,\n visibleCandleCount: VISIBLE_CANDLE_COUNT_CONFIG.Default,\n mode: DEFAULT_PERPS_MODE,\n hip3ConfigVersion: 0,\n selectedPaymentToken: null,\n cachedMarketDataByProvider: {},\n cachedUserDataByProvider: {},\n});\n\n/**\n * State metadata for the PerpsController\n */\nconst metadata: StateMetadata<PerpsControllerState> = {\n accountState: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n perpsBalances: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isTestnet: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n activeProvider: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationError: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationAttempts: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n depositInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositTransactionId: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastWithdrawResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastCompletedWithdrawalTimestamp: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastCompletedWithdrawalTxHashes: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalProgress: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n depositRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastError: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n lastUpdateTimestamp: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n isEligible: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isFirstTimeUser: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hasPlacedFirstOrder: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n watchlistMarkets: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n recentlyViewedMarkets: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tradeConfigurations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n maxSlippageBps: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n marketFilterPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n proLayoutPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n orderBookPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n selectedOrderType: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n visibleCandleCount: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n mode: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hip3ConfigVersion: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n selectedPaymentToken: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedMarketDataByProvider: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedUserDataByProvider: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nexport type PerpsControllerChaseOrderMaxDistanceReachedEvent = {\n type: 'PerpsController:chaseOrderMaxDistanceReached';\n payload: [ChaseOrderMaxDistanceReached];\n};\n\n/** PerpsController events. */\nexport type PerpsControllerEvents =\n | ControllerStateChangeEvent<'PerpsController', PerpsControllerState>\n | ControllerStateChangedEvent<'PerpsController', PerpsControllerState>\n | PerpsControllerChaseOrderMaxDistanceReachedEvent;\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link PerpsController}.\n */\nexport type PerpsControllerGetStateAction = ControllerGetStateAction<\n 'PerpsController',\n PerpsControllerState\n>;\n\n/**\n * PerpsController actions\n */\nexport type PerpsControllerActions =\n | PerpsControllerGetStateAction\n | PerpsControllerMethodActions;\n\n/**\n * PerpsController messenger constraints.\n * Includes both PerpsController's own actions/events and\n * allowed actions/events from external controllers.\n */\nexport type PerpsControllerMessenger = Messenger<\n 'PerpsController',\n PerpsControllerActions | PerpsControllerAllowedActions,\n PerpsControllerEvents | PerpsControllerAllowedEvents\n>;\n\n/**\n * PerpsController options\n */\nexport type PerpsControllerOptions = {\n messenger: PerpsControllerMessenger;\n state?: Partial<PerpsControllerState>;\n clientConfig?: PerpsControllerConfig;\n /**\n * Platform-specific dependencies (required)\n * Provides logging, metrics, tracing, stream management, and rewards.\n * Cross-controller communication uses the messenger pattern.\n * Must be provided by the platform (mobile/extension) at instantiation time.\n */\n infrastructure: PerpsPlatformDependencies;\n /**\n * When true, defers the initial eligibility (geolocation) check until\n * `startEligibilityMonitoring()` is called. This prevents the eager\n * geolocation fetch from firing during wallet onboarding (privacy compliance).\n */\n deferEligibilityCheck?: boolean;\n};\n\ntype BlockedRegionList = {\n list: string[];\n source: 'remote' | 'fallback';\n};\n\ntype UserSnapshotContext = {\n provider: PerpsProvider;\n standaloneProvider: HyperLiquidProvider | null;\n address: string;\n isTestnet: boolean;\n hip3ConfigVersion: number;\n expectedDexes: string[];\n isCurrent: () => boolean;\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'approveSubscriptionBuilderFee',\n 'calculateFees',\n 'calculateLiquidationPrice',\n 'calculateMaintenanceMargin',\n 'cancelOrder',\n 'cancelOrders',\n 'clearAgentSigners',\n 'clearAttributionContext',\n 'clearDepositResult',\n 'clearPendingTradeConfiguration',\n 'clearPendingTransactionRequests',\n 'clearWithdrawResult',\n 'closePosition',\n 'closePositions',\n 'completeWithdrawalFromHistory',\n 'depositWithConfirmation',\n 'depositWithOrder',\n 'disconnect',\n 'editOrder',\n 'fetchHistoricalCandles',\n 'flipPosition',\n 'getAccountState',\n 'getActiveProvider',\n 'getActiveProviderOrNull',\n 'getAttributionContext',\n 'getAvailableDexs',\n 'getBlockExplorerUrl',\n 'getCachedMarketDataForActiveProvider',\n 'getCachedUserDataForActiveProvider',\n 'getChaseOrders',\n 'getTwapOrders',\n 'getUserDataSnapshot',\n 'getCurrentNetwork',\n 'getFunding',\n 'getHistoricalPortfolio',\n 'getMarketCategories',\n 'getMarketDataWithPrices',\n 'getMarketFilterPreferences',\n 'getMarkets',\n 'getMarginMode',\n 'getMaxLeverage',\n 'getOpenOrders',\n 'getOrderBookGrouping',\n 'getOrderBookPreferences',\n 'getOrderCapabilities',\n 'getMarginModeLock',\n 'getScalePriceLadder',\n 'getOrderFills',\n 'getOrders',\n 'getPendingManualRecoveries',\n 'getPendingTradeConfiguration',\n 'getPositions',\n 'getSelectedOrderType',\n 'getRecoveredDispatches',\n 'acknowledgeRecoveredDispatch',\n 'getTradeConfiguration',\n 'getRecentlyViewedMarkets',\n 'getVisibleCandleCount',\n 'getWatchlistMarkets',\n 'getWebSocketConnectionState',\n 'getWithdrawalProgress',\n 'getWithdrawalRoutes',\n 'init',\n 'invalidateSubscriptionBenefits',\n 'isCurrentlyReinitializing',\n 'isFirstTimeUserOnCurrentNetwork',\n 'isWatchlistMarket',\n 'markFirstOrderCompleted',\n 'markTutorialCompleted',\n 'placeOrder',\n 'prepareTradingWallet',\n 'previewPositionModify',\n 'reconnect',\n 'recordMarketViewed',\n 'refreshEligibility',\n 'resetFirstTimeUserState',\n 'resetSelectedPaymentToken',\n 'getMaxSlippage',\n 'setMaxSlippage',\n 'setOrderBookPreferences',\n 'getProLayoutPreferences',\n 'setProLayoutPreferences',\n 'setPerpsMode',\n 'setSelectedOrderType',\n 'saveMarginMode',\n 'saveMarketFilterPreferences',\n 'saveOrderBookGrouping',\n 'savePendingTradeConfiguration',\n 'saveTradeConfiguration',\n 'setAgentSigner',\n 'setAttributionContext',\n 'setLiveDataConfig',\n 'setSelectedPaymentToken',\n 'setVisibleCandleCount',\n 'startEligibilityMonitoring',\n 'startMarketDataPreload',\n 'stopEligibilityMonitoring',\n 'stopMarketDataPreload',\n 'subscribeToAccount',\n 'subscribeToCandles',\n 'subscribeToConnectionState',\n 'subscribeToOICaps',\n 'subscribeToOrderBook',\n 'subscribeToOrderFills',\n 'subscribeToOrders',\n 'subscribeToPositions',\n 'subscribeToPrices',\n 'subscribeToTwapOrders',\n 'suspendChaseOrders',\n 'switchProvider',\n 'toggleTestnet',\n 'toggleWatchlistMarket',\n 'updateMargin',\n 'updatePositionTPSL',\n 'updateWithdrawalProgress',\n 'updateWithdrawalStatus',\n 'validateClosePosition',\n 'validateOrder',\n 'validateWithdrawal',\n 'withdraw',\n] as const;\n\n/**\n * PerpsController - Protocol-agnostic perpetuals trading controller\n *\n * Provides a unified interface for perpetual futures trading across multiple protocols.\n * Features dual data flow architecture:\n * - Trading actions use Redux for persistence and optimistic updates\n * - Live data uses direct callbacks for maximum performance\n */\nexport class PerpsController extends BaseController<\n 'PerpsController',\n PerpsControllerState,\n PerpsControllerMessenger\n> {\n protected providers: Map<PerpsProviderType, PerpsProvider>;\n\n protected isInitialized = false;\n\n #initializationPromise: Promise<void> | null = null;\n\n // Actions that saw a disconnect wait here for the client's follow-up init().\n readonly #initializationStartWaiters = new Set<() => void>();\n\n #isReinitializing = false;\n\n #reinitializationOperationPromise: Promise<void> | null = null;\n\n #disconnectOperationPromise: Promise<void> | null = null;\n\n #lighterRegistrationPromise: Promise<void> | null = null;\n\n protected blockedRegionList: BlockedRegionList = {\n list: [],\n source: 'fallback',\n };\n\n /**\n * Version counter for blocked region list.\n * Used to prevent race conditions where stale eligibility checks\n * (started with fallback config) overwrite results from newer checks\n * (started with remote config).\n */\n #blockedRegionListVersion = 0;\n\n // Store HIP-3 configuration (mutable for runtime updates from remote flags)\n #hip3Enabled: boolean;\n\n #hip3AllowlistMarkets: string[];\n\n #hip3BlocklistMarkets: string[];\n\n #hip3ConfigSource: 'remote' | 'fallback' = 'fallback';\n\n // Optional client override for the max market-vs-oracle price deviation before a\n // market is reported untradable (PriceUpdate.isTradable). Protocol-agnostic: passed\n // through to each provider, which applies its own default when this is undefined.\n readonly #priceDeviationLimit?: number;\n\n /**\n * Transient UTM / discovery attribution context.\n * Held in-memory only (never persisted in PerpsControllerState) and merged\n * into analytics event properties via {@link mergeAttributionContext}.\n */\n #attributionContext: PerpsAttributionContext = {};\n\n /**\n * Check if the Lighter provider is enabled.\n *\n * Local override (`providerCredentials.lighter.enabled`) wins; otherwise\n * the remote `perpsLighterProviderEnabled` feature flag decides — but only\n * for clients that wired the venue signer bridge. A remote flag must not\n * be able to register a trading provider the client never mounted a\n * signer for (the gates would otherwise split between core and client).\n *\n * @returns True if the condition is met.\n */\n #isLighterProviderEnabled(): boolean {\n const lighter = this.#options.clientConfig?.providerCredentials?.lighter;\n\n if (lighter?.enabled) {\n return true;\n }\n if (!lighter?.signerBridge) {\n return false;\n }\n\n try {\n const remoteState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const remoteFlag =\n remoteState.remoteFeatureFlags?.perpsLighterProviderEnabled;\n\n if (isVersionGatedFeatureFlag(remoteFlag)) {\n const validated =\n this.#options.infrastructure.featureFlags.validateVersionGated(\n remoteFlag,\n );\n return validated ?? false;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * Active provider instance for routing operations.\n * When activeProvider is 'hyperliquid' or 'lighter': points to specific provider directly\n * When activeProvider is 'aggregated': points to AggregatedPerpsProvider wrapper\n */\n protected activeProviderInstance: PerpsProvider | null = null;\n\n /**\n * Cached standalone provider for pre-initialization discovery queries.\n * Avoids creating a new HyperLiquidProvider (and potentially leaking WebSocket\n * connections) on every standalone call from the preload cycle.\n */\n #standaloneProvider: HyperLiquidProvider | null = null;\n\n #handlersRegistered = false;\n\n // HyperLiquid agent bindings made through setAgentSigner, kept across\n // provider instances; they answer before the host's getAgentSigner.\n readonly #agentBindings: AgentBindings;\n\n #standaloneProviderIsTestnet: boolean | null = null;\n\n #standaloneProviderHip3Version: number | null = null;\n\n readonly #standaloneProviderOperations = new Map<\n PerpsProvider,\n Set<Promise<unknown>>\n >();\n\n #eligibilityCheckDeferred: boolean;\n\n /**\n * Serial promise queue for all AUS watchlist operations (hydration and\n * individual toggles). Chaining every operation onto this field ensures\n * that:\n *\n * - A toggle that fires immediately after init() always runs *after* the\n * init hydration finishes (Bug 3).\n * - Concurrent toggles are serialised so the last PUT reflects all changes\n * rather than racing with each other (Bug 4).\n *\n * Errors from individual operations are swallowed inside the queue so that\n * a failed operation does not stall subsequent ones.\n */\n #ausQueue: Promise<void> = Promise.resolve();\n\n #userDiskWrite: Promise<void> = Promise.resolve();\n\n // Store options for dependency injection (allows core package to inject platform-specific services)\n readonly #options: PerpsControllerOptions;\n\n // Service instances (instantiated with platform dependencies)\n readonly #tradingService: TradingService;\n\n readonly #marketDataService: MarketDataService;\n\n readonly #accountService: AccountService;\n\n readonly #eligibilityService: EligibilityService;\n\n readonly #dataLakeService: DataLakeService;\n\n readonly #depositService: DepositService;\n\n readonly #featureFlagConfigurationService: FeatureFlagConfigurationService;\n\n readonly #rewardsIntegrationService: RewardsIntegrationService;\n\n readonly #publishChaseOrderMaxDistanceReached = (\n event: ChaseOrderMaxDistanceReached,\n ): void => {\n this.messenger.publish(\n 'PerpsController:chaseOrderMaxDistanceReached',\n event,\n );\n };\n\n constructor({\n messenger,\n state = {},\n clientConfig = {},\n infrastructure,\n deferEligibilityCheck = false,\n }: PerpsControllerOptions) {\n super({\n name: 'PerpsController',\n metadata,\n messenger,\n state: { ...getDefaultPerpsControllerState(), ...state },\n });\n\n this.#eligibilityCheckDeferred = deferEligibilityCheck;\n\n // Store options for dependency injection\n this.#options = {\n messenger,\n state,\n clientConfig,\n infrastructure,\n };\n this.#agentBindings = new AgentBindings(\n clientConfig?.providerCredentials?.hyperliquid?.getAgentSigner,\n );\n\n // Instantiate services with platform dependencies\n // Services that need cross-controller access receive the messenger\n this.#tradingService = new TradingService(infrastructure);\n this.#marketDataService = new MarketDataService({\n ...infrastructure,\n terminalMarketService:\n infrastructure.terminalMarketService ??\n (infrastructure.terminalApi?.marketDataUrl ||\n infrastructure.terminalApiUrl ||\n infrastructure.terminalApi?.globalSnapshotUrl\n ? new TerminalMarketService(infrastructure)\n : undefined),\n });\n this.#accountService = new AccountService(infrastructure, messenger);\n this.#eligibilityService = new EligibilityService(infrastructure);\n this.#dataLakeService = new DataLakeService(infrastructure, messenger);\n this.#depositService = new DepositService(infrastructure, messenger);\n this.#featureFlagConfigurationService = new FeatureFlagConfigurationService(\n infrastructure,\n );\n this.#rewardsIntegrationService = new RewardsIntegrationService(\n infrastructure,\n messenger,\n );\n\n // Set HIP-3 fallback configuration from client (will be updated if remote flags available)\n this.#hip3Enabled = clientConfig.fallbackHip3Enabled ?? false;\n this.#hip3AllowlistMarkets = [\n ...(clientConfig.fallbackHip3AllowlistMarkets ?? []),\n ];\n this.#hip3BlocklistMarkets = [\n ...(clientConfig.fallbackHip3BlocklistMarkets ?? []),\n ];\n this.#priceDeviationLimit = clientConfig.fallbackPriceDeviationLimit;\n\n // Immediately set the fallback region list since RemoteFeatureFlagController is empty by default and takes a moment to populate.\n this.setBlockedRegionList(\n clientConfig.fallbackBlockedRegions ?? [],\n 'fallback',\n );\n\n /**\n * Immediately read current state to catch any flags already loaded\n * This is necessary to avoid race conditions where the RemoteFeatureFlagController fetches flags\n * before the PerpsController initializes its RemoteFeatureFlagController subscription.\n *\n * We still subscribe in case the RemoteFeatureFlagController is not yet populated and updates later.\n */\n try {\n const currentRemoteFeatureFlagState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n this.refreshEligibilityOnFeatureFlagChange(currentRemoteFeatureFlagState);\n } catch (error) {\n // If we can't read the remote feature flags at construction time, we'll rely on:\n // 1. The fallback blocked regions already set above\n // 2. The subscription to catch updates when RemoteFeatureFlagController is ready\n this.#logError(\n ensureError(error, 'PerpsController.constructor'),\n this.#getErrorContext('constructor', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n\n // Subscribe for the full controller lifetime — intentionally not stored;\n // geo-blocking and HIP-3 flag propagation must remain active across\n // disconnect → reconnect cycles and must never be torn down.\n this.messenger.subscribe(\n 'RemoteFeatureFlagController:stateChange',\n this.refreshEligibilityOnFeatureFlagChange.bind(this),\n );\n\n // Also subscribed for the controller lifetime: the subscription profile\n // must learn the new trading address after every account switch, and the\n // preload-scoped account handler is torn down on disconnect, so it cannot\n // carry this.\n const forgetRegisteredTradingAddresses = (): void => {\n this.#rewardsIntegrationService.resetRegisteredTradingAddresses();\n // Clearing alone only guarantees the *next preview* re-registers. An\n // order submitted straight after a switch, with no preview in between,\n // would otherwise be attributed to nothing, so the new address announces\n // itself here. Fire-and-forget: attribution plumbing must not block or\n // fail an account switch.\n const switchedAccount = getSelectedEvmAccountFromMessenger(\n this.messenger,\n );\n if (switchedAccount) {\n this.#rewardsIntegrationService\n .registerTradingAddress(switchedAccount.address, {\n isTestnet: this.state.isTestnet,\n })\n .catch(() => {\n /* never blocks an account switch */\n });\n }\n };\n this.messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n forgetRegisteredTradingAddresses,\n );\n this.messenger.subscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n forgetRegisteredTradingAddresses,\n );\n\n this.providers = new Map();\n\n // Migrate old persisted data without accountAddress\n this.#migrateRequestsIfNeeded();\n\n // Eagerly hydrate in-memory caches from disk so hooks see data on first render.\n // Must happen at construction time — before any React component mounts.\n this.#hydrateCacheFromDiskSync();\n this.#options.infrastructure.performance.onControllerConstructed?.(\n this.#options.infrastructure.performance.now(),\n );\n }\n\n // ============================================================================\n // Infrastructure Access Methods\n // These methods provide access to platform-specific infrastructure via dependency injection.\n // Infrastructure is required and must be provided at instantiation time.\n // ============================================================================\n\n /**\n * Log an error using injected infrastructure logger\n *\n * @param error - The error that occurred.\n * @param options - The configuration options.\n */\n #logError(error: Error, options?: PerpsLoggerOptions): void {\n this.#options.infrastructure.logger.error(error, options);\n }\n\n /**\n * Log debug message using injected infrastructure debugLogger\n *\n * @param args - The function arguments.\n */\n #debugLog(\n ...args: (string | number | boolean | object | null | undefined)[]\n ): void {\n this.#options.infrastructure.debugLogger.log(...args);\n }\n\n /**\n * Resolve the provider ids that should participate in aggregated cache reads.\n *\n * Providers can still be registering when the first render happens, so we\n * also look at cache keys to recover disk-hydrated provider snapshots before\n * `init()` finishes populating `this.providers`.\n *\n * @param cacheKeys - Cache keys currently present in the relevant cache map.\n * @returns Provider ids that should be included in aggregated reads.\n */\n #getAggregatedCacheProviderIds(cacheKeys: string[]): string[] {\n const providerIds = new Set<string>();\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n for (const [providerId] of this.providers) {\n providerIds.add(providerId);\n }\n\n for (const key of cacheKeys) {\n const [providerId, network] = key.split(':');\n if (\n !providerId ||\n network !== currentNetwork ||\n providerId === 'aggregated'\n ) {\n continue;\n }\n\n if (\n providerId === 'hyperliquid' ||\n (providerId === 'lighter' && this.#isLighterProviderEnabled()) ||\n this.providers.has(providerId as PerpsProviderType)\n ) {\n providerIds.add(providerId);\n }\n }\n\n return Array.from(providerIds);\n }\n\n /**\n * Read cached market data for the currently active provider (or aggregated).\n * Returns null when no valid cache exists or when cache has expired.\n *\n * @param options - Optional settings.\n * @param options.skipTTL - When true, bypass the 5-minute TTL check.\n * Used during initial render so disk-hydrated structural data (with\n * placeholder prices) is returned regardless of age.\n * @returns The cached market data array, or null if no valid cache.\n */\n getCachedMarketDataForActiveProvider(options?: {\n skipTTL?: boolean;\n }): PerpsMarketData[] | null {\n const { activeProvider } = this.state;\n const cache = this.state.cachedMarketDataByProvider;\n\n if (activeProvider === 'aggregated') {\n // Assemble from all registered provider entries\n const assembled: PerpsMarketData[] = [];\n for (const providerId of this.#getAggregatedCacheProviderIds(\n Object.keys(cache),\n )) {\n const key = buildProviderCacheKey(providerId, this.state.isTestnet);\n const entry = cache[key];\n if (!entry || entry.data.length === 0) {\n continue;\n }\n if (!this.#isMarketCacheEntryCurrent(providerId, entry, options)) {\n continue;\n }\n assembled.push(...clonePerpsMarketData(entry.data));\n }\n if (assembled.length === 0) {\n return null;\n }\n return assembled;\n }\n\n // Single provider mode\n const key = buildProviderCacheKey(activeProvider, this.state.isTestnet);\n const entry = cache[key];\n if (!entry || entry.data.length === 0) {\n return null;\n }\n if (!this.#isMarketCacheEntryCurrent(activeProvider, entry, options)) {\n return null;\n }\n return clonePerpsMarketData(entry.data);\n }\n\n #isMarketCacheEntryCurrent(\n providerId: string,\n entry: PerpsControllerState['cachedMarketDataByProvider'][string],\n options?: { skipTTL?: boolean },\n ): boolean {\n if (entry.sourceExpiresAt !== undefined) {\n const expectedDexes = this.#getStaticSnapshotDexes();\n return (\n providerId === 'hyperliquid' &&\n Date.now() < entry.sourceExpiresAt &&\n entry.hip3ConfigVersion === this.state.hip3ConfigVersion &&\n expectedDexes !== undefined &&\n Array.isArray(entry.dexes) &&\n entry.dexes.length === expectedDexes.length &&\n entry.dexes.every((dex, index) => dex === expectedDexes[index])\n );\n }\n return (\n options?.skipTTL === true ||\n Date.now() - entry.timestamp <= PerpsController.#preloadGuardMs * 10\n );\n }\n\n /**\n * Read cached user data for the currently active provider (or aggregated).\n * Returns null when no valid cache exists, cache has expired, or address\n * does not match the currently selected EVM account.\n *\n * @param options - Optional settings.\n * @param options.skipTTL - When true, bypass the 60s staleness check.\n * Used during initial render so disk-hydrated user data (positions/orders)\n * is returned regardless of age, avoiding a skeleton flash.\n * @returns The cached user data, or null if no valid cache.\n */\n getCachedUserDataForActiveProvider(options?: { skipTTL?: boolean }): {\n positions: Position[];\n orders: Order[];\n accountState: AccountState | null;\n } | null {\n const { activeProvider } = this.state;\n const cache = this.state.cachedUserDataByProvider;\n const staleCutoff = PerpsController.#preloadGuardMs * 2; // 60s\n\n // Get current user address for validation\n let currentAddress: string | null = null;\n try {\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n currentAddress = evmAccount?.address ?? null;\n } catch {\n // Account identity is required before account-scoped data can be trusted.\n }\n\n if (!currentAddress) {\n return null;\n }\n const selectedAddress = currentAddress;\n\n const skipTTL = options?.skipTTL ?? false;\n\n const isValidEntry = (\n providerId: string,\n entry:\n | PerpsControllerState['cachedUserDataByProvider'][string]\n | undefined,\n ): entry is PerpsControllerState['cachedUserDataByProvider'][string] => {\n if (!entry) {\n return false;\n }\n if (!skipTTL && Date.now() - entry.timestamp >= staleCutoff) {\n return false;\n }\n if (\n !this.#isUserCacheIdentityCurrent(providerId, entry, selectedAddress)\n ) {\n return false;\n }\n return true;\n };\n\n if (activeProvider === 'aggregated') {\n // Assemble from all registered provider entries\n const allPositions: Position[] = [];\n const allOrders: Order[] = [];\n let defaultAccountState: AccountState | null = null;\n let hasValidEntry = false;\n\n for (const providerId of this.#getAggregatedCacheProviderIds(\n Object.keys(cache),\n )) {\n const providerNetworkKey = buildProviderCacheKey(\n providerId,\n this.state.isTestnet,\n );\n const entry = cache[providerNetworkKey];\n if (!isValidEntry(providerId, entry)) {\n continue;\n }\n hasValidEntry = true;\n allPositions.push(...entry.positions);\n allOrders.push(...entry.orders);\n // AccountState from default provider (hyperliquid)\n if (providerId === 'hyperliquid') {\n defaultAccountState = entry.accountState;\n }\n }\n\n if (!hasValidEntry) {\n return null;\n }\n\n return {\n positions: allPositions,\n orders: allOrders,\n accountState: defaultAccountState,\n };\n }\n\n // Single provider mode\n const providerNetworkKey = buildProviderCacheKey(\n activeProvider,\n this.state.isTestnet,\n );\n const entry = cache[providerNetworkKey];\n if (!entry || !isValidEntry(activeProvider, entry)) {\n return null;\n }\n\n return {\n positions: entry.positions,\n orders: entry.orders,\n accountState: entry.accountState,\n };\n }\n\n #isUserCacheIdentityCurrent(\n providerId: string,\n entry: PerpsControllerState['cachedUserDataByProvider'][string],\n address: string,\n ): boolean {\n if (entry.address.toLowerCase() !== address.toLowerCase()) {\n return false;\n }\n if (providerId !== 'hyperliquid') {\n return true;\n }\n\n const expectedDexes = this.#getStaticSnapshotDexes();\n return (\n entry.hip3ConfigVersion === this.state.hip3ConfigVersion &&\n expectedDexes !== undefined &&\n Array.isArray(entry.dexes) &&\n entry.dexes.length === expectedDexes.length &&\n entry.dexes.every((dex, index) => dex === expectedDexes[index])\n );\n }\n\n /**\n * Fetch, validate, and atomically cache a complete user-data snapshot.\n * This remains callable after mount so consumers can seed their live channel\n * from one coherent positions/orders/account result.\n *\n * @returns The accepted user-data snapshot.\n */\n async getUserDataSnapshot(): Promise<PerpsUserDataSnapshot> {\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n if (!evmAccount?.address) {\n throw new Error('Cannot fetch user data snapshot without an EVM account');\n }\n if (this.state.activeProvider !== 'hyperliquid') {\n throw new Error('User data snapshots require Hyperliquid provider mode');\n }\n\n const capturedActiveProvider = this.activeProviderInstance;\n const standaloneProvider = capturedActiveProvider\n ? null\n : this.#getOrCreateStandaloneProvider();\n const provider = capturedActiveProvider ?? standaloneProvider;\n if (!provider) {\n throw new Error('Cannot create standalone Hyperliquid provider');\n }\n const { address } = evmAccount;\n const { isTestnet, hip3ConfigVersion } = this.state;\n const lifecycleGeneration = this.#lifecycleGeneration;\n const network = isTestnet ? 'testnet' : 'mainnet';\n const expectedDexes = this.#getStaticSnapshotDexes();\n if (!expectedDexes) {\n throw new Error('User data snapshot DEX identity is not static');\n }\n const isCurrent = (): boolean => {\n let currentAddress: string | undefined;\n try {\n currentAddress = getSelectedEvmAccountFromMessenger(\n this.messenger,\n )?.address;\n } catch {\n return false;\n }\n\n return (\n this.#lifecycleGeneration === lifecycleGeneration &&\n this.state.activeProvider === 'hyperliquid' &&\n (!capturedActiveProvider ||\n this.activeProviderInstance === capturedActiveProvider) &&\n this.state.isTestnet === isTestnet &&\n this.state.hip3ConfigVersion === hip3ConfigVersion &&\n currentAddress?.toLowerCase() === address.toLowerCase()\n );\n };\n\n const context: UserSnapshotContext = {\n provider,\n standaloneProvider,\n address,\n isTestnet,\n hip3ConfigVersion,\n expectedDexes,\n isCurrent,\n };\n const requestKey = [\n 'hyperliquid',\n network,\n address.toLowerCase(),\n hip3ConfigVersion,\n ...expectedDexes,\n ].join('|');\n const existingRequest = this.#userSnapshotRequests.get(requestKey);\n if (existingRequest?.provider === provider) {\n return existingRequest.promise;\n }\n\n const request = this.#fetchAndCacheUserDataSnapshot(context);\n this.#userSnapshotRequests.set(requestKey, { provider, promise: request });\n try {\n return await request;\n } finally {\n if (this.#userSnapshotRequests.get(requestKey)?.promise === request) {\n this.#userSnapshotRequests.delete(requestKey);\n }\n }\n }\n\n async #fetchAndCacheUserDataSnapshot(\n context: UserSnapshotContext,\n ): Promise<PerpsUserDataSnapshot> {\n const {\n provider,\n standaloneProvider,\n address,\n isTestnet,\n hip3ConfigVersion,\n expectedDexes,\n isCurrent,\n } = context;\n if (!isCurrent()) {\n throw new Error('User data snapshot context changed');\n }\n if (!provider.getUserDataSnapshot) {\n throw new Error('Provider has no atomic snapshot API');\n }\n const identity = {\n provider: 'hyperliquid' as const,\n network: isTestnet ? ('testnet' as const) : ('mainnet' as const),\n hip3ConfigVersion,\n dexes: expectedDexes,\n };\n const snapshotRequest = provider.getUserDataSnapshot({\n userAddress: address,\n identity,\n });\n const snapshot = standaloneProvider\n ? await this.#trackStandaloneProviderOperation(\n standaloneProvider,\n snapshotRequest,\n )\n : await snapshotRequest;\n\n if (!isCurrent()) {\n throw new Error('User data snapshot context changed');\n }\n\n const snapshotIdentity = snapshot.identity;\n const hasCompleteBundle =\n Array.isArray(snapshot.positions) &&\n Array.isArray(snapshot.orders) &&\n snapshot.accountState !== null &&\n typeof snapshot.accountState === 'object';\n const hasExactIdentity =\n snapshotIdentity.provider === identity.provider &&\n snapshotIdentity.network === identity.network &&\n snapshotIdentity.hip3ConfigVersion === identity.hip3ConfigVersion &&\n snapshotIdentity.address.toLowerCase() === address.toLowerCase() &&\n snapshotIdentity.dexes.length === expectedDexes.length &&\n snapshotIdentity.dexes.every(\n (dex, index) => dex === expectedDexes[index],\n );\n if (!hasCompleteBundle || !hasExactIdentity) {\n throw new Error('User data snapshot is incomplete or mismatched');\n }\n\n if (!isCurrent()) {\n throw new Error('User data snapshot context changed');\n }\n\n const cachedSnapshot = cloneUserDataSnapshot(snapshot);\n const result = cloneUserDataSnapshot(snapshot);\n const timestamp = Date.now();\n const providerNetworkKey = buildProviderCacheKey('hyperliquid', isTestnet);\n this.update((state) => {\n state.cachedUserDataByProvider[providerNetworkKey] = {\n positions: cachedSnapshot.positions,\n orders: cachedSnapshot.orders,\n accountState: cachedSnapshot.accountState,\n timestamp,\n address,\n hip3ConfigVersion,\n dexes: expectedDexes,\n };\n });\n this.#persistUserCacheToDisk();\n this.#debugLog('PerpsController: user cache snapshot written', {\n writtenKey: providerNetworkKey,\n availableKeys: Object.keys(this.state.cachedUserDataByProvider).sort(),\n positionCount: cachedSnapshot.positions.length,\n orderCount: cachedSnapshot.orders.length,\n });\n\n return result;\n }\n\n /**\n * Returns a cached standalone HyperLiquidProvider for pre-initialization\n * discovery queries. Creates a new instance on first call or when the\n * isTestnet / hip3ConfigVersion has changed since the last creation.\n *\n * @returns A HyperLiquidProvider suitable for standalone REST calls.\n */\n #getOrCreateStandaloneProvider(): HyperLiquidProvider {\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion ?? 0;\n\n if (\n this.#standaloneProvider &&\n this.#standaloneProviderIsTestnet === currentIsTestnet &&\n this.#standaloneProviderHip3Version === currentHip3Version\n ) {\n return this.#standaloneProvider;\n }\n\n // Stale or missing — retire the old provider after active operations finish.\n if (this.#standaloneProvider) {\n const old = this.#standaloneProvider;\n this.#standaloneProvider = null;\n this.#standaloneProviderIsTestnet = null;\n this.#standaloneProviderHip3Version = null;\n this.#retireStandaloneProvider(old).catch(() => {\n /* best-effort */\n });\n }\n\n this.#standaloneProvider = new HyperLiquidProvider({\n isTestnet: currentIsTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n priceDeviationLimit: this.#priceDeviationLimit,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n builderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressTestnet,\n builderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressMainnet,\n subscriptionBuilderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressTestnet,\n subscriptionBuilderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressMainnet,\n onChaseOrderMaxDistanceReached: this.#publishChaseOrderMaxDistanceReached,\n });\n this.#standaloneProviderIsTestnet = currentIsTestnet;\n this.#standaloneProviderHip3Version = currentHip3Version;\n\n return this.#standaloneProvider;\n }\n\n #trackStandaloneProviderOperation<Result>(\n provider: PerpsProvider,\n operation: Promise<Result>,\n ): Promise<Result> {\n const operations =\n this.#standaloneProviderOperations.get(provider) ?? new Set();\n this.#standaloneProviderOperations.set(provider, operations);\n\n const trackedOperation = operation.finally(() => {\n operations.delete(trackedOperation);\n if (operations.size === 0) {\n this.#standaloneProviderOperations.delete(provider);\n }\n });\n operations.add(trackedOperation);\n\n return trackedOperation;\n }\n\n async #retireStandaloneProvider(\n provider: HyperLiquidProvider,\n ): Promise<void> {\n const operations = this.#standaloneProviderOperations.get(provider);\n if (operations?.size) {\n await Promise.allSettled([...operations]);\n }\n try {\n await provider.disconnect();\n } catch {\n /* best-effort */\n } finally {\n this.#standaloneProviderOperations.delete(provider);\n }\n }\n\n /**\n * Disconnect and discard the cached standalone provider (if any).\n * Best-effort — errors are silently caught.\n */\n async #cleanupStandaloneProvider(): Promise<void> {\n const provider = this.#standaloneProvider;\n if (!provider) {\n return;\n }\n this.#standaloneProvider = null;\n this.#standaloneProviderIsTestnet = null;\n this.#standaloneProviderHip3Version = null;\n await this.#retireStandaloneProvider(provider);\n }\n\n /**\n * Test-observable accessor for whether a standalone provider is cached.\n *\n * @returns True if a standalone provider instance exists.\n */\n protected hasStandaloneProvider(): boolean {\n return this.#standaloneProvider !== null;\n }\n\n /**\n * Get metrics instance from platform dependencies\n *\n * @returns The platform metrics instance.\n */\n #getMetrics(): PerpsPlatformDependencies['metrics'] {\n return this.#options.infrastructure.metrics;\n }\n\n // ============================================================================\n // Messenger-based Controller Access\n // These methods use the messenger pattern for inter-controller communication\n // ============================================================================\n\n /**\n * Find network client ID for a given chain via messenger\n *\n * @param chainId - The chain identifier.\n * @returns The resulting string value.\n */\n #findNetworkClientIdForChain(chainId: string): string | undefined {\n return this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId as `0x${string}`,\n );\n }\n\n /**\n * Submit a transaction via messenger (shows confirmation screen)\n *\n * @param txParams - The transaction parameters.\n * @param txParams.from - The sender address.\n * @param txParams.to - The recipient address.\n * @param txParams.value - The transaction value.\n * @param txParams.data - The transaction data payload.\n * @param txParams.gas - The gas limit.\n * @param options - The configuration options.\n * @param options.networkClientId - The network client identifier.\n * @param options.origin - The transaction origin.\n * @param options.type - The transaction type.\n * @param options.skipInitialGasEstimate - Whether to skip initial gas estimation.\n * @returns The transaction result containing a hash promise and transaction metadata.\n */\n async #submitTransaction(\n txParams: PerpsTransactionParams,\n options: PerpsAddTransactionOptions,\n ): Promise<{\n result: Promise<string>;\n transactionMeta: { id: string; hash?: string };\n }> {\n // Cast needed: PerpsController uses loose string types for txParams/options\n // while TransactionController uses strict branded types (TransactionParams, AddTransactionOptions)\n return this.messenger.call(\n 'TransactionController:addTransaction',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n txParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { ...(options as any), isInternal: true },\n );\n }\n\n /**\n * Clean up old withdrawal/deposit requests that don't have accountAddress\n * These are from before the accountAddress field was added and can't be displayed\n * in the UI (which filters by account), so we discard them.\n * Also drop persisted failed withdrawals — failures are surfaced via lastWithdrawResult only.\n */\n #migrateRequestsIfNeeded(): void {\n this.update((state) => {\n // Remove withdrawal requests without accountAddress - they can't be attributed to any account\n state.withdrawalRequests = state.withdrawalRequests.filter(\n (req) => Boolean(req.accountAddress) && req.status !== 'failed',\n );\n\n // Remove deposit requests without accountAddress - they can't be attributed to any account\n state.depositRequests = state.depositRequests.filter((req) =>\n Boolean(req.accountAddress),\n );\n });\n }\n\n protected setBlockedRegionList(\n list: string[],\n source: 'remote' | 'fallback',\n ): void {\n this.#featureFlagConfigurationService.setBlockedRegions({\n list,\n source,\n context: this.#createServiceContext('setBlockedRegionList', {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n newList: string[],\n newSource: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list: newList, source: newSource };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n }),\n });\n }\n\n /**\n * Respond to RemoteFeatureFlagController state changes\n * Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.\n * Uses fallback configuration when remote feature flag is undefined.\n * Note: Initial eligibility is set in the constructor if fallback regions are provided.\n *\n * @param remoteFeatureFlagControllerState - State from RemoteFeatureFlagController.\n */\n protected refreshEligibilityOnFeatureFlagChange(\n remoteFeatureFlagControllerState: PerpsRemoteFeatureFlagState,\n ): void {\n this.#featureFlagConfigurationService.refreshEligibility({\n remoteFeatureFlagControllerState,\n context: this.#createServiceContext(\n 'refreshEligibilityOnFeatureFlagChange',\n {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n list: string[],\n source: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list, source };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n getHip3Config: () => ({\n enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n source: this.#hip3ConfigSource,\n }),\n setHip3Config: (config) => {\n if (config.enabled !== undefined) {\n this.#hip3Enabled = config.enabled;\n }\n if (config.allowlistMarkets !== undefined) {\n this.#hip3AllowlistMarkets = [...config.allowlistMarkets];\n }\n if (config.blocklistMarkets !== undefined) {\n this.#hip3BlocklistMarkets = [...config.blocklistMarkets];\n }\n if (config.source !== undefined) {\n this.#hip3ConfigSource = config.source;\n }\n },\n incrementHip3ConfigVersion: () => {\n const newVersion = (this.state.hip3ConfigVersion || 0) + 1;\n this.update((state) => {\n state.hip3ConfigVersion = newVersion;\n });\n return newVersion;\n },\n },\n ),\n });\n }\n\n /**\n * Execute an operation while temporarily pausing specified stream channels\n * to prevent WebSocket updates from triggering UI re-renders during operations.\n *\n * WebSocket connections remain alive but updates are not emitted to subscribers.\n * This prevents race conditions where UI re-renders fetch stale data during operations.\n *\n * @param operation - The async operation to execute\n * @param channels - Array of stream channel names to pause\n * @returns The result of the operation\n * @example\n * ```typescript\n * // Cancel orders without stream interference\n * await this.#withStreamPause(\n * async () => this.provider.cancelOrders({ cancelAll: true }),\n * ['orders']\n * );\n *\n * // Close positions and pause multiple streams\n * await this.#withStreamPause(\n * async () => this.provider.closePositions(positions),\n * ['positions', 'account', 'orders']\n * );\n * ```\n */\n async #withStreamPause<TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ): Promise<TResult> {\n const pausedChannels: string[] = [];\n const { streamManager } = this.#options.infrastructure;\n\n // Pause emission on specified channels (WebSocket stays connected)\n // Track which channels successfully paused to ensure proper cleanup\n for (const channel of channels) {\n try {\n streamManager.pauseChannel(channel);\n pausedChannels.push(channel);\n } catch (error) {\n // Log error to Sentry but continue pausing remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'pause',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n\n try {\n // Execute operation without stream interference\n return await operation();\n } finally {\n // Resume only channels that were successfully paused\n for (const channel of pausedChannels) {\n try {\n streamManager.resumeChannel(channel);\n } catch (error) {\n // Log error to Sentry but continue resuming remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'resume',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n }\n }\n\n /**\n * Initialize the PerpsController providers\n * Must be called before using any other methods\n * Prevents double initialization with promise caching\n *\n * @returns A promise that resolves when the operation completes.\n */\n async init(): Promise<void> {\n while (true) {\n const pendingDisconnect = this.#disconnectOperationPromise;\n if (pendingDisconnect) {\n await pendingDisconnect;\n continue;\n }\n\n const pendingReinitialization = this.#reinitializationOperationPromise;\n if (pendingReinitialization) {\n await pendingReinitialization;\n continue;\n }\n\n return this.#initWithoutDisconnectWait();\n }\n }\n\n /**\n * Initialize without waiting for disconnect. Reinitialization operations use\n * this after they have claimed the controller lifecycle.\n *\n * @returns A promise that resolves when initialization finishes.\n */\n async #initWithoutDisconnectWait(): Promise<void> {\n if (!this.#handlersRegistered) {\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n this.#handlersRegistered = true;\n }\n\n if (this.isInitialized) {\n return undefined;\n }\n\n if (this.#initializationPromise) {\n return this.#initializationPromise;\n }\n\n this.#initializationPromise = this.#performInitialization();\n this.#initializationStartWaiters.forEach((notifyStarted) =>\n notifyStarted(),\n );\n return this.#initializationPromise;\n }\n\n /**\n * Resolve once a new initialization starts, or after the timeout.\n *\n * @param timeoutMs - Longest time to wait for init() to be called.\n * @returns A promise that resolves when init starts or the timeout elapses.\n */\n async #waitForInitializationStart(timeoutMs: number): Promise<void> {\n let notifyStarted = (): void => undefined;\n const started = new Promise<void>((resolve) => {\n notifyStarted = resolve;\n });\n this.#initializationStartWaiters.add(notifyStarted);\n const timeout = setTimeout(notifyStarted, timeoutMs);\n try {\n await started;\n } finally {\n clearTimeout(timeout);\n this.#initializationStartWaiters.delete(notifyStarted);\n }\n }\n\n /**\n * Track a network or provider reinitialization so disconnect can serialize\n * behind the whole operation, including work before and after init().\n *\n * @returns A callback that releases the lifecycle operation.\n */\n #beginReinitialization(): () => void {\n this.#isReinitializing = true;\n let resolveOperation = (): void => undefined;\n const operation = new Promise<void>((resolve) => {\n resolveOperation = resolve;\n });\n this.#reinitializationOperationPromise = operation;\n\n return (): void => {\n this.#isReinitializing = false;\n resolveOperation();\n if (this.#reinitializationOperationPromise === operation) {\n this.#reinitializationOperationPromise = null;\n }\n };\n }\n\n /**\n * Actual initialization implementation with retry logic\n */\n async #performInitialization(): Promise<void> {\n const maxAttempts = 3;\n const baseDelay = 1000;\n\n this.update((state) => {\n state.initializationState = InitializationState.Initializing;\n state.initializationError = null;\n state.initializationAttempts = 0;\n });\n\n this.#debugLog('PerpsController: Initializing providers', {\n currentNetwork: this.state.isTestnet ? 'testnet' : 'mainnet',\n existingProviders: Array.from(this.providers.keys()),\n timestamp: new Date().toISOString(),\n });\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n this.update((state) => {\n state.initializationAttempts = attempt;\n });\n\n // Disconnect existing providers to close WebSocket connections\n const existingProviders = Array.from(this.providers.values());\n if (existingProviders.length > 0) {\n this.#debugLog('PerpsController: Disconnecting existing providers', {\n count: existingProviders.length,\n timestamp: new Date().toISOString(),\n });\n await Promise.all(\n existingProviders.map((provider) => provider.disconnect()),\n );\n }\n this.providers.clear();\n await this.#cleanupStandaloneProvider();\n\n this.#createProviders();\n\n // Await the Lighter dynamic import (if started) so Lighter is in the\n // providers map before we assign the active provider. Runs concurrently\n // with the WebSocket readiness delay for zero additional latency.\n await Promise.all([\n wait(PERPS_CONSTANTS.ReconnectionCleanupDelayMs),\n this.#lighterRegistrationPromise,\n ]);\n this.#lighterRegistrationPromise = null;\n\n this.#assignActiveProvider();\n\n this.isInitialized = true;\n this.update((state) => {\n state.initializationState = InitializationState.Initialized;\n state.initializationError = null;\n });\n\n this.#debugLog('PerpsController: Providers initialized successfully', {\n providerCount: this.providers.size,\n activeProvider: this.state.activeProvider,\n timestamp: new Date().toISOString(),\n attempts: attempt,\n });\n\n // Hydrate watchlist from AUS (non-blocking — transient failures are\n // caught inside and must not prevent init from completing).\n // Assigning to #ausQueue ensures subsequent toggleWatchlistMarket\n // calls wait for hydration before running their own GET-merge-PUT.\n this.#ausQueue = this.#syncWatchlistFromRemote().catch(() => {\n // Errors are already logged inside #syncWatchlistFromRemote.\n });\n\n return; // Exit retry loop on success\n } catch (error) {\n lastError = ensureError(error, 'PerpsController.performInitialization');\n\n this.#logError(\n lastError,\n this.#getErrorContext('performInitialization', {\n attempt,\n maxAttempts,\n }),\n );\n\n // If not the last attempt, wait before retrying (exponential backoff)\n if (attempt < maxAttempts) {\n const delay = baseDelay * Math.pow(2, attempt - 1); // 1s, 2s, 4s\n this.#debugLog(\n `PerpsController: Retrying initialization in ${delay}ms`,\n {\n attempt,\n maxAttempts,\n error: lastError.message,\n },\n );\n await wait(delay);\n }\n }\n }\n\n this.isInitialized = false;\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n state.initializationError = lastError?.message ?? 'Unknown error';\n });\n this.#initializationPromise = null; // Clear promise to allow retry\n\n this.#debugLog('PerpsController: Initialization failed', {\n error: lastError?.message,\n attempts: maxAttempts,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Instantiate provider instances based on current state and register them.\n * Selects and assigns the active provider instance from the registry.\n * Future providers can be added here with their own authentication patterns:\n * - Some might use API keys: new BinanceProvider({ apiKey, apiSecret })\n * - Some might use different wallet patterns: new GMXProvider({ signer })\n * - Some might not need auth at all: new DydxProvider()\n */\n #createProviders(): void {\n const { activeProvider } = this.state;\n\n this.#debugLog(\n 'PerpsController: Creating provider with HIP-3 configuration',\n {\n hip3Enabled: this.#hip3Enabled,\n hip3AllowlistMarkets: this.#hip3AllowlistMarkets,\n hip3BlocklistMarkets: this.#hip3BlocklistMarkets,\n hip3ConfigSource: this.#hip3ConfigSource,\n isTestnet: this.state.isTestnet,\n activeProvider,\n },\n );\n\n // Always create HyperLiquid provider as the base provider\n const hyperLiquidProvider = new HyperLiquidProvider({\n isTestnet: this.state.isTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n priceDeviationLimit: this.#priceDeviationLimit,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n builderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressTestnet,\n builderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressMainnet,\n subscriptionBuilderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressTestnet,\n subscriptionBuilderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressMainnet,\n onChaseOrderMaxDistanceReached: this.#publishChaseOrderMaxDistanceReached,\n getAgentSigner: this.#agentBindings.resolve,\n onAgentRejected: (account, agentAddress): void => {\n this.#agentBindings.release(account, agentAddress);\n this.#options.clientConfig?.providerCredentials?.hyperliquid?.onAgentRejected?.(\n account,\n agentAddress,\n );\n },\n });\n this.providers.set('hyperliquid', hyperLiquidProvider);\n\n // Register Lighter provider if enabled (POC). Dynamic import so clients\n // that do not ship the Lighter files skip registration silently, and so\n // bundlers can code-split it out when it is not enabled.\n // Uses .then()/.catch() instead of await because #createProviders is not\n // async; registration completing asynchronously is fine since the provider\n // is only used when explicitly enabled and selected.\n const isLighterEnabled = this.#isLighterProviderEnabled();\n if (isLighterEnabled) {\n // NOTE: Keep the path in a variable so bundlers that ignore the\n // webpackIgnore magic comment (e.g. Metro) cannot statically resolve the\n // import and pull the Lighter provider into the client bundle.\n const lighterModulePath = './providers/LighterProvider';\n this.#lighterRegistrationPromise = import(\n /* webpackIgnore: true */ lighterModulePath\n )\n .then(({ LighterProvider }) => {\n this.registerLighterProvider(LighterProvider);\n return;\n })\n .catch((error: unknown) => this.handleLighterImportError(error));\n }\n }\n\n /**\n * Registers the Lighter provider after dynamic import resolves.\n *\n * Extracted from the import().then() callback so it can be tested directly\n * (Jest cannot resolve dynamic imports without --experimental-vm-modules).\n *\n * @param LighterProviderClass - Constructor class for the Lighter provider.\n */\n protected registerLighterProvider(\n LighterProviderClass: new (opts: {\n isTestnet: boolean;\n platformDependencies: PerpsPlatformDependencies;\n messenger: PerpsControllerMessenger;\n lighterAuthConfig: LighterAuthConfig;\n signerBridge?: LighterSignerBridge;\n }) => PerpsProvider,\n ): void {\n const lighterIsTestnet = isProviderOnTestnet(\n 'lighter',\n this.state.isTestnet,\n );\n const lighter =\n this.#options.clientConfig?.providerCredentials?.lighter ?? {};\n const lighterProvider = new LighterProviderClass({\n isTestnet: lighterIsTestnet,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n signerBridge: lighter.signerBridge,\n lighterAuthConfig: {\n enabled: lighter.enabled,\n accountIndex: lighterIsTestnet\n ? lighter.accountIndexTestnet\n : lighter.accountIndexMainnet,\n apiKeyIndex: lighter.apiKeyIndex,\n },\n });\n this.providers.set('lighter', lighterProvider);\n this.#debugLog('PerpsController: Lighter provider registered', {\n isTestnet: lighterIsTestnet,\n });\n }\n\n /**\n * Handles errors from the Lighter dynamic import.\n *\n * Module-not-found errors are expected (clients may not ship Lighter) →\n * debug log. Other errors indicate constructor/config problems → Sentry.\n *\n * @param error - The caught error from the dynamic import or constructor.\n */\n protected handleLighterImportError(error: unknown): void {\n const isModuleError =\n (error as Record<string, unknown>)?.code === 'MODULE_NOT_FOUND';\n if (isModuleError) {\n this.#debugLog(\n 'PerpsController: Lighter provider module not available, skipping registration',\n );\n } else {\n this.#logError(\n error instanceof Error ? error : new Error(String(error)),\n this.#getErrorContext('createProviders.lighter'),\n );\n }\n }\n\n /**\n * Assigns the active provider instance based on the current activeProvider state.\n * Separated from #createProviders so it runs after async provider registration settles.\n */\n #assignActiveProvider(): void {\n const { activeProvider } = this.state;\n const hyperLiquidProvider = this.providers.get('hyperliquid');\n\n if (!hyperLiquidProvider) {\n throw new Error(\n 'HyperLiquid provider not registered — cannot assign active provider',\n );\n }\n\n if (activeProvider === 'aggregated') {\n this.activeProviderInstance = new AggregatedPerpsProvider({\n providers: this.providers,\n defaultProvider: 'hyperliquid',\n infrastructure: this.#options.infrastructure,\n isTestnet: this.state.isTestnet,\n });\n this.#debugLog(\n 'PerpsController: Using aggregated provider (multi-provider)',\n { registeredProviders: Array.from(this.providers.keys()) },\n );\n } else if (activeProvider === 'hyperliquid') {\n this.activeProviderInstance = hyperLiquidProvider;\n this.#debugLog(\n `PerpsController: Using direct provider (${activeProvider})`,\n );\n } else {\n // Any other direct provider, including a value persisted by an older\n // version whose venue has since been removed. `activeProvider` is\n // persisted, so throwing here would fail initialization on every\n // launch — the stale value must self-heal.\n const directProvider = this.providers.get(activeProvider);\n if (directProvider) {\n this.activeProviderInstance = directProvider;\n } else {\n this.#debugLog(\n `PerpsController: ${activeProvider} provider not available, falling back to hyperliquid`,\n );\n this.activeProviderInstance = hyperLiquidProvider;\n this.update((state) => {\n state.activeProvider = 'hyperliquid';\n });\n }\n this.#debugLog(\n `PerpsController: Using direct provider (${this.activeProviderInstance === hyperLiquidProvider ? 'hyperliquid' : activeProvider})`,\n );\n }\n }\n\n /**\n * Generate standard error context for Logger.error calls with searchable tags and context.\n * Enables Sentry dashboard filtering by feature, provider, and network.\n *\n * @param method - The method name where the error occurred\n * @param extra - Optional additional context fields (becomes searchable context data)\n * @returns PerpsLoggerOptions with tags (searchable) and context (searchable)\n * @private\n * @example\n * this.#logError(error, this.#getErrorContext('placeOrder', { symbol: 'BTC', operation: 'validate' }));\n * // Creates searchable tags: feature:perps, provider:hyperliquid, network:mainnet\n * // Creates searchable context: perps_controller.method:placeOrder, perps_controller.symbol:BTC, perps_controller.operation:validate\n */\n #getErrorContext(\n method: string,\n extra?: Record<string, unknown>,\n ): PerpsLoggerOptions {\n return {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: this.state.activeProvider,\n network: this.state.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'PerpsController',\n data: {\n method,\n ...extra,\n },\n },\n };\n }\n\n /**\n * Returns current controller state as PerpsControllerState.\n * Used by createServiceContext to avoid deep type instantiation when building stateManager.\n *\n * @returns The current controller state cast to PerpsControllerState.\n */\n #getControllerState(): PerpsControllerState {\n return this.state;\n }\n\n /**\n * Build a filter function that mirrors the provider's allowlist/blocklist\n * logic so that Terminal API results are filtered identically.\n *\n * @returns Filter predicate accepting a market symbol.\n */\n #buildMarketAllowedFilter(): (symbol: string) => boolean {\n const hip3Enabled = this.#hip3Enabled;\n const compiledAllowlist = this.#compilePatternsSafely(\n this.#hip3AllowlistMarkets,\n );\n const compiledBlocklist = this.#compilePatternsSafely(\n this.#hip3BlocklistMarkets,\n );\n return (symbol: string) => {\n const { dex } = parseAssetName(symbol);\n return shouldIncludeMarket(\n symbol,\n dex,\n hip3Enabled,\n compiledAllowlist,\n compiledBlocklist,\n );\n };\n }\n\n /**\n * Compile market patterns safely, skipping any that fail validation.\n *\n * @param patterns - Raw pattern strings from config.\n * @returns Compiled patterns (invalid entries silently skipped).\n */\n #compilePatternsSafely(patterns: string[]): CompiledMarketPattern[] {\n const compiled: CompiledMarketPattern[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push({ pattern, matcher: compileMarketPattern(pattern) });\n } catch {\n // Invalid patterns silently skipped — logged at provider level.\n }\n }\n return compiled;\n }\n\n /**\n * Create a ServiceContext for dependency injection into services\n * Provides all orchestration dependencies (tracing, analytics, state management)\n *\n * @param method - Method name for error context\n * @param additionalContext - Optional additional context (e.g., rewardsController, streamManager)\n * @returns ServiceContext with all required dependencies\n */\n #createServiceContext(\n method: string,\n additionalContext?: Partial<ServiceContext>,\n ): ServiceContext {\n return {\n tracingContext: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n errorContext: {\n controller: 'PerpsController',\n method,\n },\n stateManager: {\n update: (updater: (state: PerpsControllerState) => void) =>\n // Using `@ts-ignore` instead of `@ts-expect-error` since this error\n // comes and goes after unrelated changes.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: TS2589: Type instantiation is excessively deep and possibly infinite.\n this.update(updater),\n getState: (): PerpsControllerState => this.#getControllerState(),\n },\n ...additionalContext,\n };\n }\n\n /**\n * Ensure TradingService has controller dependencies set.\n * RewardsIntegrationService uses messenger internally for controller access.\n */\n #ensureTradingServiceDeps(): void {\n this.#tradingService.setControllerDependencies({\n rewardsIntegrationService: this.#rewardsIntegrationService,\n });\n }\n\n /**\n * Get the currently active provider.\n * In aggregated mode, returns AggregatedPerpsProvider which routes to underlying providers.\n * In single provider mode, returns HyperLiquidProvider directly.\n *\n * @returns The active provider (aggregated wrapper or direct provider based on mode)\n * @throws Error if provider is not initialized or reinitializing\n */\n getActiveProvider(): PerpsProvider {\n // Check if we're in the middle of reinitializing\n if (this.isCurrentlyReinitializing()) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.CLIENT_REINITIALIZING;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.CLIENT_REINITIALIZING);\n }\n\n // Check if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED);\n }\n\n // Return the active provider instance (set during initialization based on providerMode)\n if (!this.activeProviderInstance) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE);\n }\n\n return this.activeProviderInstance;\n }\n\n /**\n * Await in-flight initialization, then return the active provider.\n * Use for async action methods (trading, deposits, withdrawals) that should\n * tolerate an in-progress cold-start or reconnection instead of failing\n * immediately with CLIENT_NOT_INITIALIZED.\n *\n * Synchronous callers that need fail-fast behaviour should keep using\n * getActiveProvider() directly.\n *\n * @returns The active provider once initialization completes.\n */\n async #getActiveProviderWhenReady(): Promise<PerpsProvider> {\n // The context the action was issued under. A client reconnect\n // (disconnect then init) that switches account, network or provider must\n // not carry the action into the new context.\n const issuedContext = this.#getActionContext();\n let awaitedDisconnect = false;\n let awaitedInitializationStart = false;\n while (true) {\n const pendingDisconnect = this.#disconnectOperationPromise;\n if (pendingDisconnect) {\n awaitedDisconnect = true;\n await pendingDisconnect;\n continue;\n }\n\n const pendingReinitialization = this.#reinitializationOperationPromise;\n if (pendingReinitialization) {\n await pendingReinitialization;\n continue;\n }\n\n const pendingInitialization = this.#initializationPromise;\n if (\n this.state.initializationState === InitializationState.Initializing &&\n pendingInitialization\n ) {\n await pendingInitialization;\n continue;\n }\n\n // Clients reconnect with disconnect() followed by init(), and the\n // disconnect settles before init() is called. Give that init a bounded\n // window to start rather than failing an action the reconnect will\n // serve. Nothing here starts a connection the client did not ask for.\n if (\n awaitedDisconnect &&\n !awaitedInitializationStart &&\n !this.isInitialized &&\n !pendingInitialization\n ) {\n awaitedInitializationStart = true;\n await this.#waitForInitializationStart(\n PERPS_CONSTANTS.ConnectionTimeoutMs,\n );\n continue;\n }\n\n if (awaitedDisconnect && this.#getActionContext() !== issuedContext) {\n throw new Error(PERPS_ERROR_CODES.PROVIDER_LIFECYCLE_STALE);\n }\n\n return this.getActiveProvider();\n }\n }\n\n /**\n * Identify the account, network and provider an action runs under.\n *\n * @returns A key that changes when any of them changes.\n */\n #getActionContext(): string {\n const address = getSelectedEvmAccountFromMessenger(this.messenger)?.address;\n return [\n address?.toLowerCase() ?? '',\n this.state.isTestnet ? 'testnet' : 'mainnet',\n this.state.activeProvider,\n ].join('|');\n }\n\n /**\n * Get the currently active provider, returning null if not available\n * Use this method when the caller can gracefully handle a missing provider\n * (e.g., UI components during initialization or reconnection)\n *\n * @returns The active provider, or null if not initialized/reinitializing\n */\n getActiveProviderOrNull(): PerpsProvider | null {\n // Return null during reinitialization\n if (this.isCurrentlyReinitializing()) {\n return null;\n }\n\n // Return null if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n return null;\n }\n\n // Return the active provider instance or null if not found\n return this.activeProviderInstance ?? null;\n }\n\n /**\n * Get strategy capabilities through the active provider route used by order\n * placement. The query waits for in-flight initialization and reports an\n * explicit unavailable status when no provider route can answer reliably.\n *\n * @param params - Market and optional provider route.\n * @returns Provider-owned order capabilities.\n */\n async getOrderCapabilities(\n params: GetOrderCapabilitiesParams,\n ): Promise<PerpsOrderCapabilities> {\n let activeProvider: PerpsProvider;\n try {\n activeProvider = await this.#getActiveProviderWhenReady();\n } catch (error) {\n this.#debugLog('PerpsController: Order capabilities unavailable', {\n error: ensureError(error, 'PerpsController.getOrderCapabilities')\n .message,\n });\n return this.#getUnavailableOrderCapabilities(\n 'provider_unavailable',\n params.providerId,\n );\n }\n\n const resolvedProviderId =\n params.providerId ?? this.#getDirectProviderId(activeProvider);\n if (this.#hasConflictingProviderRoute(params.providerId, activeProvider)) {\n return this.#getUnavailableOrderCapabilities(\n 'provider_not_routable',\n resolvedProviderId,\n );\n }\n if (!activeProvider.getOrderCapabilities) {\n return this.#getUnavailableOrderCapabilities(\n 'not_implemented',\n resolvedProviderId,\n );\n }\n\n try {\n const capabilities = await activeProvider.getOrderCapabilities(params);\n if (\n capabilities.status === 'unavailable' &&\n capabilities.providerId === undefined &&\n resolvedProviderId !== undefined\n ) {\n return { ...capabilities, providerId: resolvedProviderId };\n }\n return capabilities;\n } catch (error) {\n const safeError = ensureError(\n error,\n 'PerpsController.getOrderCapabilities',\n );\n this.#debugLog('PerpsController: Order capabilities unavailable', {\n error: safeError.message,\n });\n return this.#getUnavailableOrderCapabilities(\n 'provider_unavailable',\n resolvedProviderId,\n );\n }\n }\n\n /**\n * Get the margin mode the market is currently locked to by an open\n * position or resting order, through the active provider route used by\n * order placement. Never throws; failures report an unavailable status.\n *\n * @param params - Market and optional provider route.\n * @returns The provider-reported margin-mode lock.\n */\n async getMarginModeLock(\n params: GetMarginModeLockParams,\n ): Promise<PerpsMarginModeLock> {\n let activeProvider: PerpsProvider;\n try {\n activeProvider = await this.#getActiveProviderWhenReady();\n } catch (error) {\n this.#debugLog('PerpsController: Margin mode lock unavailable', {\n error: ensureError(error, 'PerpsController.getMarginModeLock').message,\n });\n return this.#getUnavailableMarginModeLock(\n 'provider_unavailable',\n params.providerId,\n );\n }\n\n const resolvedProviderId =\n params.providerId ?? this.#getDirectProviderId(activeProvider);\n if (this.#hasConflictingProviderRoute(params.providerId, activeProvider)) {\n return this.#getUnavailableMarginModeLock(\n 'provider_not_routable',\n resolvedProviderId,\n );\n }\n if (!activeProvider.getMarginModeLock) {\n return this.#getUnavailableMarginModeLock(\n 'not_implemented',\n resolvedProviderId,\n );\n }\n\n try {\n const lock = await activeProvider.getMarginModeLock(params);\n if (\n lock.status === 'unavailable' &&\n lock.providerId === undefined &&\n resolvedProviderId !== undefined\n ) {\n return { ...lock, providerId: resolvedProviderId };\n }\n return lock;\n } catch (error) {\n this.#debugLog('PerpsController: Margin mode lock unavailable', {\n error: ensureError(error, 'PerpsController.getMarginModeLock').message,\n });\n return this.#getUnavailableMarginModeLock(\n 'provider_unavailable',\n resolvedProviderId,\n );\n }\n }\n\n #getUnavailableMarginModeLock(\n reason: MarginModeLockUnavailableReason,\n providerId: PerpsProviderType | undefined,\n ): PerpsMarginModeLock {\n return providerId\n ? { status: 'unavailable', providerId, reason }\n : { status: 'unavailable', reason };\n }\n\n /**\n * Build a Scale price ladder using the active provider's venue rules.\n *\n * @param params - Market, ladder bounds, count, and optional explicit route.\n * @returns Provider-normalized prices or a typed unavailable result.\n * @throws When the provider cannot normalize the requested ladder.\n */\n async getScalePriceLadder(\n params: GetScalePriceLadderParams,\n ): Promise<PerpsScalePriceLadder> {\n let activeProvider: PerpsProvider;\n try {\n activeProvider = await this.#getActiveProviderWhenReady();\n } catch (error) {\n this.#debugLog('PerpsController: Scale price ladder unavailable', {\n error: ensureError(error, 'PerpsController.getScalePriceLadder')\n .message,\n });\n return this.#getUnavailableScalePriceLadder(\n 'provider_unavailable',\n params.providerId,\n );\n }\n\n const resolvedProviderId =\n params.providerId ?? this.#getDirectProviderId(activeProvider);\n if (this.#hasConflictingProviderRoute(params.providerId, activeProvider)) {\n return this.#getUnavailableScalePriceLadder(\n 'provider_not_routable',\n resolvedProviderId,\n );\n }\n if (!activeProvider.getScalePriceLadder) {\n return this.#getUnavailableScalePriceLadder(\n 'not_implemented',\n resolvedProviderId,\n );\n }\n\n const result = await activeProvider.getScalePriceLadder(params);\n if (\n result.status === 'unavailable' &&\n result.providerId === undefined &&\n resolvedProviderId !== undefined\n ) {\n return { ...result, providerId: resolvedProviderId };\n }\n return result;\n }\n\n #getUnavailableScalePriceLadder(\n reason: ScalePriceLadderUnavailableReason,\n providerId: PerpsProviderType | undefined,\n ): PerpsScalePriceLadder {\n return providerId\n ? { status: 'unavailable', providerId, reason }\n : { status: 'unavailable', reason };\n }\n\n /**\n * Build an unavailable capability response and omit unknown provider IDs.\n *\n * @param reason - Why capability discovery is unavailable.\n * @param providerId - Requested or resolved direct provider identity.\n * @returns Unavailable capability response.\n */\n #getUnavailableOrderCapabilities(\n reason: OrderCapabilitiesUnavailableReason,\n providerId: PerpsProviderType | undefined,\n ): PerpsOrderCapabilities {\n return providerId\n ? { status: 'unavailable', providerId, reason }\n : { status: 'unavailable', reason };\n }\n\n /**\n * Return the identity of a resolved direct provider when it is known.\n * Routing providers do not have one provider identity for every operation.\n *\n * @param provider - Resolved provider.\n * @returns Direct provider identity, if known.\n */\n #getDirectProviderId(provider: PerpsProvider): PerpsProviderType | undefined {\n if (provider.routesOrdersByProviderId) {\n return undefined;\n }\n return Array.from(this.providers.entries()).find(\n ([, candidate]) => candidate === provider,\n )?.[0];\n }\n\n /**\n * Check whether a resolved direct provider conflicts with an explicit route.\n * Aggregated mode owns its own per-operation routing.\n *\n * @param providerId - Explicit provider route, if any.\n * @param provider - Provider resolved after any in-flight initialization.\n * @returns Whether the route conflicts with the active provider mode.\n */\n #hasConflictingProviderRoute(\n providerId: PerpsProviderType | undefined,\n provider: PerpsProvider,\n ): boolean {\n return (\n providerId !== undefined &&\n !provider.routesOrdersByProviderId &&\n providerId !== provider.protocolId\n );\n }\n\n /**\n * Resolve one routed order operation after any in-flight initialization.\n *\n * @param params - Routed operation context.\n * @param params.orderType - Order type, when the operation carries one.\n * @param params.providerId - Explicit provider route, when supplied.\n * @returns The initialized provider that owns the operation.\n */\n async #resolveRoutedOrderProvider(params: {\n orderType: OrderType | undefined;\n providerId: PerpsProviderType | undefined;\n }): Promise<PerpsProvider> {\n const { orderType, providerId } = params;\n const provider = await this.#getActiveProviderWhenReady();\n if (this.#hasConflictingProviderRoute(providerId, provider)) {\n throw new Error(\n orderType !== undefined && isStrategyOrderType(orderType)\n ? PERPS_ERROR_CODES.ORDER_STRATEGY_ROUTE_UNAVAILABLE\n : PERPS_ERROR_CODES.PROVIDER_NOT_FOUND,\n );\n }\n return provider;\n }\n\n /**\n * Place a new order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result with order ID and status.\n */\n async placeOrder(params: OrderParams): Promise<OrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n const result = await this.#tradingService.placeOrder({\n provider,\n params,\n context: this.#createServiceContext('placeOrder', {\n saveTradeConfiguration: (symbol: string, leverage: number) =>\n this.saveTradeConfiguration(symbol, leverage),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n\n if (result.success) {\n this.clearPendingTradeConfiguration(params.symbol);\n }\n\n return result;\n }\n\n /**\n * Edit an existing order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The updated order result with order ID and status.\n */\n async editOrder(params: EditOrderParams): Promise<OrderResult> {\n if (isStrategyOrderType(params.newOrder.orderType)) {\n return {\n success: false,\n error: PERPS_ERROR_CODES.ORDER_EDIT_STRATEGY_UNSUPPORTED,\n };\n }\n\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.newOrder.orderType,\n providerId: params.newOrder.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.editOrder({\n provider,\n params,\n context: this.#createServiceContext('editOrder'),\n });\n }\n\n /**\n * Cancel an existing order\n *\n * @param params - The operation parameters.\n * @returns The cancellation result with status.\n */\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n\n return this.#tradingService.cancelOrder({\n provider,\n params,\n context: this.#createServiceContext('cancelOrder'),\n });\n }\n\n /**\n * Read venue-backed TWAP lifecycle records through the active provider.\n * Providers without native TWAP history return an empty list.\n *\n * @returns Current and terminal TWAP schedules with slice fills.\n */\n async getTwapOrders(): Promise<TwapOrder[]> {\n const provider = await this.#getActiveProviderWhenReady();\n return provider.getTwapOrders ? await provider.getTwapOrders() : [];\n }\n\n /**\n * Read the active provider's retained Chase lifecycle snapshots.\n * Providers without an emulated Chase implementation return an empty list.\n *\n * @returns Current Chase session snapshots.\n */\n async getChaseOrders(): Promise<ChaseOrder[]> {\n const provider = await this.#getActiveProviderWhenReady();\n return provider.getChaseOrders ? await provider.getChaseOrders() : [];\n }\n\n /**\n * Stop Chase repricing for app backgrounding without cancelling the current\n * resting children.\n *\n * @returns Chase snapshots after suspension.\n * @throws If an aggregated provider cannot suspend every active venue. Other\n * providers may already be suspended; callers can retry to reconcile them.\n */\n async suspendChaseOrders(): Promise<ChaseOrder[]> {\n const provider = await this.#getActiveProviderWhenReady();\n return provider.suspendChaseOrders\n ? await provider.suspendChaseOrders()\n : [];\n }\n\n /**\n * Cancel multiple orders in parallel\n * Batch version of cancelOrder() that cancels multiple orders simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch cancellation results for each order.\n */\n async cancelOrders(params: CancelOrdersParams): Promise<CancelOrdersResult> {\n const provider = await this.#getActiveProviderWhenReady();\n\n return this.#tradingService.cancelOrders({\n provider,\n params,\n context: this.#createServiceContext('cancelOrders', {\n getOpenOrders: () => this.getOpenOrders(),\n }),\n withStreamPause: <TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ) => this.#withStreamPause(operation, channels),\n });\n }\n\n /**\n * Close a position (partial or full)\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result from the close position request.\n */\n async closePosition(params: ClosePositionParams): Promise<OrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePosition({\n provider,\n params,\n context: this.#createServiceContext('closePosition', {\n getPositions: () => this.getPositions(),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n }\n\n /**\n * Close multiple positions in parallel\n * Batch version of closePosition() that closes multiple positions simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch close results for each position.\n */\n async closePositions(\n params: ClosePositionsParams,\n ): Promise<ClosePositionsResult> {\n const provider = await this.#getActiveProviderWhenReady();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePositions({\n provider,\n params,\n context: this.#createServiceContext('closePositions', {\n getPositions: () => this.getPositions(),\n }),\n });\n }\n\n /**\n * Update TP/SL for an existing position\n *\n * @param params - The operation parameters.\n * @returns The order result from the TP/SL update.\n */\n async updatePositionTPSL(\n params: UpdatePositionTPSLParams,\n ): Promise<OrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: undefined,\n providerId: params.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updatePositionTPSL({\n provider,\n params,\n context: this.#createServiceContext('updatePositionTPSL'),\n });\n }\n\n /**\n * Update margin for an existing position (add or remove)\n *\n * @param params - The operation parameters.\n * @returns The margin update result.\n */\n async updateMargin(params: UpdateMarginParams): Promise<MarginResult> {\n const provider = await this.#getActiveProviderWhenReady();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updateMargin({\n provider,\n symbol: params.symbol,\n amount: params.amount,\n context: this.#createServiceContext('updateMargin'),\n });\n }\n\n /**\n * Flip position (reverse direction while keeping size and leverage)\n *\n * @param params - The operation parameters.\n * @returns The order result from the position flip.\n */\n async flipPosition(params: FlipPositionParams): Promise<OrderResult> {\n const provider = await this.#getActiveProviderWhenReady();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.flipPosition({\n provider,\n position: params.position,\n trackingData: params.trackingData,\n context: this.#createServiceContext('flipPosition'),\n });\n }\n\n /**\n * Simplified deposit method that prepares transaction for confirmation screen\n * No complex state tracking - just sets a loading flag\n *\n * @param params - Parameters for the deposit flow\n * @param params.amount - Optional deposit amount\n * @param params.placeOrder - If true, uses addTransaction instead of submit to avoid navigation\n * @returns An object containing a promise that resolves to the transaction hash.\n */\n async depositWithConfirmation(\n params: DepositWithConfirmationParams = {},\n ): Promise<{ result: Promise<string> }> {\n const { amount, placeOrder } = params;\n\n let currentDepositId: string | undefined;\n\n try {\n const provider = await this.#getActiveProviderWhenReady();\n const {\n transaction,\n assetChainId,\n currentDepositId: depositId,\n } = await this.#depositService.prepareTransaction({ provider });\n currentDepositId = depositId;\n\n // Get current account address via messenger (outside of update() for proper typing)\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n const accountAddress = evmAccount?.address ?? 'unknown';\n\n this.update((state) => {\n state.lastDepositResult = null;\n\n // Add deposit request to tracking\n const depositRequest = {\n id: currentDepositId ?? uuidv4(),\n timestamp: Date.now(),\n amount: amount ?? '0', // Use provided amount or default to '0'\n asset: USDC_SYMBOL,\n accountAddress, // Track which account initiated deposit\n success: false, // Will be updated when transaction completes\n txHash: undefined,\n status: 'pending' as TransactionStatus,\n source: undefined,\n transactionId: undefined, // Will be set to depositId when available\n };\n\n state.depositRequests.unshift(depositRequest); // Add to beginning of array\n });\n\n const networkClientId = this.#findNetworkClientIdForChain(assetChainId);\n\n if (!networkClientId) {\n throw new Error(\n `No network client found for chain ${assetChainId}. Please add the network first.`,\n );\n }\n\n let result: Promise<string>;\n let transactionMeta: { id: string };\n let depositOrderResult: Promise<string> | null = null;\n\n const defaultTransactionOptions = {\n networkClientId,\n origin: ORIGIN_METAMASK,\n skipInitialGasEstimate: true,\n };\n\n this.#options.infrastructure.tracer.addBreadcrumb({\n category: 'perps',\n message: 'Deposit action started',\n level: 'info',\n data: {\n place_order_after_deposit: placeOrder === true,\n },\n });\n\n if (placeOrder) {\n // Use addTransaction to create transaction without navigating to confirmation screen\n const addResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDepositAndOrder',\n });\n transactionMeta = addResult.transactionMeta;\n // Return transaction ID immediately (fire-and-forget for caller)\n result = Promise.resolve(transactionMeta.id);\n // Track deposit request lifecycle via the real transaction result\n depositOrderResult = addResult.result;\n } else {\n // submit shows the confirmation screen and returns a promise\n // The promise will resolve when transaction completes or reject if cancelled/failed\n const submitResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDeposit',\n });\n result = submitResult.result;\n transactionMeta = submitResult.transactionMeta;\n }\n\n // Store the transaction ID and try to get amount from transaction\n this.update((state) => {\n state.lastDepositTransactionId = transactionMeta.id;\n });\n\n // Track the transaction lifecycle only when using submit (deposit-only flow)\n if (!placeOrder) {\n // At this point, the confirmation modal is shown to the user\n // The result promise will resolve/reject based on user action and transaction outcome\n\n // Track the transaction lifecycle\n // The result promise will resolve/reject based on user action and transaction outcome\n // Note: We intentionally don't set depositInProgress immediately to avoid\n // showing toasts before the user confirms the transaction\n\n // TODO: @abretonc7s Find a better way to trigger our custom toast notification then having to toggle the state\n // How to replace the system notifications?\n result\n .then((actualTxHash) => {\n // Transaction was successfully completed\n // Set depositInProgress to true temporarily to show success\n this.update((state) => {\n state.depositInProgress = true;\n state.lastDepositResult = {\n success: true,\n txHash: actualTxHash,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n error: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n // For deposits, we have a txHash immediately, so mark as completed\n // (the transaction hash means the deposit was successful)\n requestToUpdate.status = 'completed';\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n }\n });\n\n // Clear depositInProgress after a short delay\n setTimeout(() => {\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n });\n }, 100);\n\n return;\n })\n .catch((error) => {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (userCancelled) {\n // User cancelled - clear any state, no toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n // Don't set lastDepositResult - no toast needed\n\n // Mark deposit request as cancelled\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'cancelled' as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n } else {\n // Transaction failed after confirmation - show error toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n state.lastDepositResult = {\n success: false,\n error: errorMessage,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n txHash: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'failed';\n requestToUpdate.success = false;\n }\n }\n });\n }\n });\n } else if (depositOrderResult) {\n // Track deposit request lifecycle for deposit+order flow\n depositOrderResult\n .then((actualTxHash) => {\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'completed';\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n });\n return;\n })\n .catch((error) => {\n const errorMessage = ensureError(\n error,\n 'PerpsController.depositWithOrder',\n ).message;\n const isCancellation =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = (\n isCancellation ? 'cancelled' : 'failed'\n ) as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n });\n }\n\n return {\n result,\n };\n } catch (error) {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (!userCancelled) {\n // Only track actual errors, not user cancellations\n this.update((state) => {\n state.lastDepositTransactionId = null;\n // Note: lastDepositResult is already set in the catch block above\n\n // Mark deposit request as failed if one was created\n if (currentDepositId) {\n const request = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (request) {\n request.status = 'failed';\n request.success = false;\n }\n }\n });\n }\n throw error;\n }\n }\n\n /**\n * Same as depositWithConfirmation - prepares transaction for confirmation screen.\n *\n * @returns A promise that resolves to the string result.\n */\n async depositWithOrder(): Promise<{ result: Promise<string> }> {\n return this.depositWithConfirmation({ placeOrder: true });\n }\n\n /**\n * Clear the last deposit result after it has been shown to the user\n */\n clearDepositResult(): void {\n this.update((state) => {\n state.lastDepositResult = null;\n });\n }\n\n clearWithdrawResult(): void {\n this.update((state) => {\n state.lastWithdrawResult = null;\n });\n }\n\n /**\n * Update withdrawal request status when it completes, or remove it on failure.\n * This is called when a withdrawal is matched with a completed withdrawal from the API.\n * When status is `failed`, the request is removed from the queue (not retained).\n *\n * @param withdrawalId - The withdrawal transaction ID.\n * @param status - The current status.\n * @param txHash - The transaction hash.\n */\n updateWithdrawalStatus(\n withdrawalId: string,\n status: 'completed' | 'failed',\n txHash?: string,\n ): void {\n let withdrawalAmount: string | undefined;\n let shouldTrack = false;\n let found = false;\n\n this.update((state) => {\n const withdrawalIndex = state.withdrawalRequests.findIndex(\n (request) => request.id === withdrawalId,\n );\n\n if (withdrawalIndex >= 0) {\n found = true;\n const request = state.withdrawalRequests[withdrawalIndex];\n withdrawalAmount = request.amount;\n shouldTrack =\n withdrawalAmount !== undefined && request.status !== status;\n\n if (status === 'failed') {\n state.withdrawalRequests.splice(withdrawalIndex, 1);\n state.withdrawInProgress = state.withdrawalRequests.some(\n (req) => req.status === 'pending' || req.status === 'bridging',\n );\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n } else {\n request.status = status;\n request.success = status === 'completed';\n if (txHash) {\n request.txHash = txHash;\n }\n\n // Clear withdrawal progress when withdrawal completes\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n }\n }\n });\n\n if (shouldTrack && withdrawalAmount !== undefined) {\n this.#getMetrics().trackPerpsEvent(\n PerpsAnalyticsEvent.WithdrawalTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]:\n status === 'completed'\n ? PERPS_EVENT_VALUE.STATUS.COMPLETED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.WITHDRAWAL_AMOUNT]:\n Number.parseFloat(withdrawalAmount),\n },\n );\n }\n\n if (found) {\n this.#debugLog('PerpsController: Updated withdrawal status', {\n withdrawalId,\n status,\n txHash,\n });\n }\n }\n\n /**\n * Complete a specific withdrawal detected via transaction history polling (FIFO queue).\n * Called when a completed withdrawal appears in the transaction history matching a pending request.\n *\n * Uses FIFO matching: oldest pending withdrawal is matched with first completed withdrawal\n * in history that happened after its submission time.\n *\n * @param withdrawalRequestId - The ID of the pending withdrawal request to mark as complete.\n * @param completedWithdrawal - The completed withdrawal data from the history API.\n * @param completedWithdrawal.txHash - The on-chain transaction hash.\n * @param completedWithdrawal.amount - The withdrawal amount.\n * @param completedWithdrawal.timestamp - The completion timestamp from the history API.\n * @param completedWithdrawal.asset - The asset symbol (e.g. USDC).\n */\n completeWithdrawalFromHistory(\n withdrawalRequestId: string,\n completedWithdrawal: {\n txHash: string;\n amount: string;\n timestamp: number;\n asset?: string;\n },\n ): void {\n let didRemove = false;\n this.update((state) => {\n const requestIndex = state.withdrawalRequests.findIndex(\n (req) => req.id === withdrawalRequestId,\n );\n\n if (requestIndex === -1) {\n return;\n }\n\n didRemove = true;\n state.withdrawalRequests.splice(requestIndex, 1);\n\n // Update the FIFO guard. The timestamp is persisted for cross-restart\n // protection. The txHashes array (not persisted) accumulates within a\n // session to prevent re-matching direct completions and same-millisecond\n // API completions. It resets naturally on app restart.\n state.lastCompletedWithdrawalTimestamp = completedWithdrawal.timestamp;\n state.lastCompletedWithdrawalTxHashes.push(completedWithdrawal.txHash);\n\n const hasPendingWithdrawals = state.withdrawalRequests.some(\n (req) => req.status === 'pending' || req.status === 'bridging',\n );\n\n state.withdrawInProgress = hasPendingWithdrawals;\n\n if (!hasPendingWithdrawals) {\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n }\n\n state.lastUpdateTimestamp = Date.now();\n });\n\n if (!didRemove) {\n return;\n }\n\n this.#debugLog(\n 'PerpsController: Completed withdrawal from transaction history (FIFO)',\n {\n withdrawalRequestId,\n txHash: completedWithdrawal.txHash,\n amount: completedWithdrawal.amount,\n },\n );\n\n this.#getMetrics().trackPerpsEvent(\n PerpsAnalyticsEvent.WithdrawalTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.COMPLETED,\n [PERPS_EVENT_PROPERTY.WITHDRAWAL_AMOUNT]: Number.parseFloat(\n completedWithdrawal.amount,\n ),\n },\n );\n }\n\n /**\n * Update withdrawal progress (persistent across navigation)\n *\n * @param progress - The progress indicator.\n * @param activeWithdrawalId - The active withdrawal ID.\n */\n updateWithdrawalProgress(\n progress: number,\n activeWithdrawalId: string | null = null,\n ): void {\n this.update((state) => {\n state.withdrawalProgress = {\n progress,\n lastUpdated: Date.now(),\n activeWithdrawalId,\n };\n });\n }\n\n /**\n * Get current withdrawal progress\n *\n * @returns The withdrawal progress, last update timestamp, and active withdrawal ID.\n */\n getWithdrawalProgress(): {\n progress: number;\n lastUpdated: number;\n activeWithdrawalId: string | null;\n } {\n return this.state.withdrawalProgress;\n }\n\n /**\n * Withdraw funds from trading account\n *\n * The withdrawal process varies by provider and may involve:\n * - Direct on-chain transfers\n * - Bridge operations\n * - Multi-step validation processes\n *\n * Check the specific provider documentation for detailed withdrawal flows.\n *\n * @param params Withdrawal parameters\n * @returns WithdrawResult with withdrawal ID and tracking info\n */\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n const provider = await this.#getActiveProviderWhenReady();\n\n return this.#accountService.withdraw({\n provider,\n params,\n context: this.#createServiceContext('withdraw'),\n refreshAccountState: async () => {\n await this.getAccountState({ source: 'post_withdrawal' });\n },\n });\n }\n\n /**\n * Get current positions\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow position queries\n * without full perps initialization (e.g., for showing positions on token details page)\n *\n * @param params - The operation parameters.\n * @returns Array of open positions for the active provider.\n */\n async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has positions) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n // TODO: When adding new providers, consider a provider factory pattern\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = provider.getPositions(params);\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getPositions({\n provider,\n params,\n context: this.#createServiceContext('getPositions'),\n });\n }\n\n /**\n * Get historical user fills (trade executions)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @param options - Optional call modifiers.\n * @param options.forceRefresh - Bypass the request-coalesce cache\n * end-to-end (user-initiated refresh).\n * @returns Array of historical trade executions (fills).\n */\n async getOrderFills(\n params?: GetOrderFillsParams,\n options?: { forceRefresh?: boolean },\n ): Promise<OrderFill[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrderFills({\n provider,\n params,\n context: this.#createServiceContext('getOrderFills'),\n forceRefresh: options?.forceRefresh,\n });\n }\n\n /**\n * List TP/SL protection changes the active provider parked for\n * explicit manual re-establishment. Providers without durable\n * settlement state return an empty list.\n *\n * @returns Pending manual-recovery entries.\n */\n async getPendingManualRecoveries(): Promise<PerpsPendingManualRecovery[]> {\n const provider = await this.#getActiveProviderWhenReady();\n if (!provider.getPendingManualRecoveries) {\n return [];\n }\n return provider.getPendingManualRecoveries();\n }\n\n /**\n * READ-ONLY list of the active provider's recovered-dispatch outcomes\n * (previously ambiguous submissions later resolved). Providers without\n * durable dispatch state return an empty list.\n *\n * @returns Pending recovered-dispatch outcomes.\n */\n async getRecoveredDispatches(): Promise<PerpsRecoveredDispatch[]> {\n const provider = await this.#getActiveProviderWhenReady();\n if (!provider.getRecoveredDispatches) {\n return [];\n }\n return provider.getRecoveredDispatches();\n }\n\n /**\n * Acknowledge ONE recovered-dispatch outcome by its stable id, after\n * refreshing venue state. Throws when the active provider has no\n * durable dispatch state or the id no longer matches.\n *\n * @param recoveryId - Stable id from {@link getRecoveredDispatches}.\n * @returns Resolves when the outcome is acknowledged.\n */\n async acknowledgeRecoveredDispatch(recoveryId: string): Promise<void> {\n const provider = await this.#getActiveProviderWhenReady();\n if (!provider.acknowledgeRecoveredDispatch) {\n throw new Error(\n 'The active perps provider has no recovered dispatches to acknowledge',\n );\n }\n return provider.acknowledgeRecoveredDispatch(recoveryId);\n }\n\n /**\n * Get historical user orders (order lifecycle)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @param options - Optional call modifiers.\n * @param options.forceRefresh - Bypass the request-coalesce cache\n * end-to-end (user-initiated refresh).\n * @returns Array of historical orders.\n */\n async getOrders(\n params?: GetOrdersParams,\n options?: { forceRefresh?: boolean },\n ): Promise<Order[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrders({\n provider,\n params,\n context: this.#createServiceContext('getOrders'),\n forceRefresh: options?.forceRefresh,\n });\n }\n\n /**\n * Get currently open orders (real-time status)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow open order queries\n * without full perps initialization (e.g., for background preloading)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getOpenOrders(params?: GetOrdersParams): Promise<Order[]> {\n // For standalone mode, access provider directly without initialization check\n if (params?.standalone && params.userAddress) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = provider.getOpenOrders(params);\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOpenOrders({\n provider,\n params,\n context: this.#createServiceContext('getOpenOrders'),\n });\n }\n\n /**\n * Get historical user funding history (funding payments)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @param options - Optional call modifiers.\n * @param options.forceRefresh - Bypass the request-coalesce cache\n * end-to-end (user-initiated refresh).\n * @returns Array of historical funding payments.\n */\n async getFunding(\n params?: GetFundingParams,\n options?: { forceRefresh?: boolean },\n ): Promise<Funding[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getFunding({\n provider,\n params,\n context: this.#createServiceContext('getFunding'),\n forceRefresh: options?.forceRefresh,\n });\n }\n\n /**\n * Get account state (balances, etc.)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow account state queries\n * without full perps initialization (e.g., for checking if user has perps funds)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getAccountState(params?: GetAccountStateParams): Promise<AccountState> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has perps funds) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = provider.getAccountState(params);\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getAccountState({\n provider,\n params,\n context: this.#createServiceContext('getAccountState'),\n });\n }\n\n /**\n * Get historical portfolio data\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns The historical portfolio data points.\n */\n async getHistoricalPortfolio(\n params?: GetHistoricalPortfolioParams,\n ): Promise<HistoricalPortfolioResult> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getHistoricalPortfolio({\n provider,\n params,\n context: this.#createServiceContext('getHistoricalPortfolio'),\n });\n }\n\n /**\n * Get available markets with optional filtering\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow market discovery\n * without full perps initialization (e.g., for discovery banners on spot screens)\n *\n * @param params - The operation parameters.\n * @returns Array of available markets matching the filter criteria.\n */\n async getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]> {\n const isMarketAllowed = this.#buildMarketAllowedFilter();\n if (params?.standalone) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = this.#marketDataService.getMarkets({\n provider,\n params,\n context: this.#createServiceContext('getMarkets'),\n isMarketAllowed,\n });\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getMarkets({\n provider,\n params,\n context: this.#createServiceContext('getMarkets'),\n isMarketAllowed,\n });\n }\n\n /**\n * Get market data with prices (includes price, volume, 24h change).\n * Optionally filter by category, sort, and limit the results.\n *\n * For standalone mode, bypasses getActiveProvider() to allow market data queries\n * without full perps initialization (e.g., for background preloading on app start)\n *\n * @param params - The operation parameters.\n * @param params.standalone - Whether to use standalone mode.\n * @param params.categories - Filter to markets matching any of these categories.\n * @param params.sortBy - Sort results by this field.\n * @param params.direction - Sort direction (default: desc).\n * @param params.limit - Maximum number of results to return.\n * @returns A promise that resolves to the market data.\n */\n async getMarketDataWithPrices(\n params?: GetMarketDataWithPricesParams,\n ): Promise<PerpsMarketData[]> {\n const globalSnapshot = this.#buildGlobalSnapshotContext();\n const context = this.#createServiceContext('getMarketDataWithPrices', {\n ...(globalSnapshot && { globalSnapshot }),\n });\n if (params?.standalone) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = this.#marketDataService.getMarketDataWithPrices({\n provider,\n params,\n context,\n });\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getMarketDataWithPrices({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Capture the exact static identity required to adopt an atomic snapshot.\n * Dynamic DEX discovery and non-Hyperliquid provider modes deliberately opt\n * out so they retain the provider path.\n *\n * @returns Snapshot identity plus a race guard, or undefined when unsafe.\n */\n #buildGlobalSnapshotContext(): ServiceContext['globalSnapshot'] {\n const snapshotConfigured =\n Boolean(this.#options.infrastructure.terminalApi?.globalSnapshotUrl) ||\n typeof this.#options.infrastructure.terminalMarketService\n ?.fetchGlobalSnapshot === 'function';\n if (!snapshotConfigured || this.state.activeProvider !== 'hyperliquid') {\n return undefined;\n }\n\n const enabledDexes = this.#getStaticSnapshotDexes();\n if (!enabledDexes) {\n return undefined;\n }\n const { isTestnet, hip3ConfigVersion } = this.state;\n return {\n request: {\n provider: 'hyperliquid',\n network: isTestnet ? 'testnet' : 'mainnet',\n enabledDexes,\n },\n isCurrent: () =>\n this.state.activeProvider === 'hyperliquid' &&\n this.state.isTestnet === isTestnet &&\n this.state.hip3ConfigVersion === hip3ConfigVersion,\n isMarketAllowed: this.#buildMarketAllowedFilter(),\n };\n }\n\n #getStaticSnapshotDexes(): string[] | undefined {\n if (!this.#hip3Enabled) {\n return ['main'];\n }\n if (this.state.isTestnet) {\n return TESTNET_HIP3_CONFIG.AutoDiscoverAll\n ? undefined\n : canonicalizeHyperLiquidDexes(TESTNET_HIP3_CONFIG.EnabledDexs);\n }\n if (MAINNET_HIP3_CONFIG.AutoDiscoverAll) {\n return undefined;\n }\n\n const dexes = new Set<string>();\n for (const pattern of this.#hip3AllowlistMarkets) {\n const colonIndex = pattern.indexOf(':');\n if (colonIndex <= 0) {\n if (/^[a-z][a-z0-9]*$/iu.test(pattern)) {\n dexes.add(pattern.toLowerCase());\n continue;\n }\n return undefined;\n }\n const dex = pattern.slice(0, colonIndex);\n if (dex && /^[a-z0-9][a-z0-9-]*$/u.test(dex)) {\n dexes.add(dex);\n } else {\n return undefined;\n }\n }\n return canonicalizeHyperLiquidDexes(dexes);\n }\n\n // ============================================================================\n // Market Data Preload (client-agnostic background caching)\n // ============================================================================\n\n /** State paths that the preload stateChange handler reads. */\n static readonly #preloadWatchedPaths = new Set([\n 'isTestnet',\n 'hip3ConfigVersion',\n ]);\n\n #preloadTimer: ReturnType<typeof setInterval> | null = null;\n\n #preloadStartRequested = false;\n\n #isPreloading = false;\n\n #marketPreloadQueued = false;\n\n #isPreloadingUserData = false;\n\n #userPreloadQueued = false;\n\n #lifecycleGeneration = 0;\n\n readonly #userSnapshotRequests = new Map<\n string,\n { provider: PerpsProvider; promise: Promise<PerpsUserDataSnapshot> }\n >();\n\n #preloadStateUnsubscribe: (() => void) | null = null;\n\n #accountChangeUnsubscribe: (() => void) | null = null;\n\n #previousIsTestnet: boolean | null = null;\n\n #previousHip3ConfigVersion: number | null = null;\n\n static readonly #preloadRefreshMs = 5 * 60 * 1000; // 5 min\n\n static readonly #preloadGuardMs = 30_000; // 30s debounce\n\n /**\n * Synchronously hydrate in-memory caches from disk-persisted snapshots.\n * Uses the sync MMKV API (~1ms) so data is available before any hook reads.\n * Falls back to no-op when getItemSync is not available (e.g. E2E).\n * All computed updates are applied in a single this.update() call to avoid\n * triggering state subscribers once per provider entry.\n */\n #hydrateCacheFromDiskSync(): void {\n const { marketUpdates, userUpdates, stats } = hydrateFromDiskSync(\n this.#options.infrastructure.diskCache,\n this.state.cachedMarketDataByProvider,\n this.state.cachedUserDataByProvider,\n PerpsController.#preloadGuardMs,\n );\n\n const hasMarketUpdates = Object.keys(marketUpdates).length > 0;\n const hasUserUpdates = Object.keys(userUpdates).length > 0;\n if (hasMarketUpdates || hasUserUpdates) {\n this.update((state) => {\n if (hasMarketUpdates) {\n Object.assign(state.cachedMarketDataByProvider, marketUpdates);\n }\n if (hasUserUpdates) {\n Object.assign(state.cachedUserDataByProvider, userUpdates);\n }\n });\n }\n\n this.#debugLog('PerpsController: Disk cache hydrated (sync)', {\n markets: stats.marketCount,\n positions: stats.userPositions,\n orders: stats.userOrders,\n duration_ms: stats.durationMs,\n });\n }\n\n /** Persist the latest selected-account snapshot for each provider/network. */\n #persistUserCacheToDisk(): void {\n const entries: DiskCacheUserEntry[] = [];\n\n for (const [cacheKey, entry] of Object.entries(\n this.state.cachedUserDataByProvider,\n )) {\n const [providerId, network] = cacheKey.split(':');\n if (\n !providerId ||\n (network !== 'mainnet' && network !== 'testnet') ||\n providerId === 'aggregated'\n ) {\n continue;\n }\n entries.push({\n providerNetworkKey: `${providerId}:${network}`,\n address: entry.address,\n positions: entry.positions,\n orders: entry.orders,\n accountState: entry.accountState,\n timestamp: entry.timestamp,\n ...(entry.hip3ConfigVersion !== undefined && {\n hip3ConfigVersion: entry.hip3ConfigVersion,\n }),\n ...(entry.dexes !== undefined && { dexes: entry.dexes }),\n });\n }\n\n this.#userDiskWrite = this.#userDiskWrite\n .then(() =>\n persistUserEntriesToDisk(\n this.#options.infrastructure.diskCache,\n entries,\n ),\n )\n .catch(() => {\n // Disk persistence is best-effort and must not block live data.\n });\n }\n\n /**\n * Start background market data preloading.\n * Fetches market data immediately and refreshes every 5 minutes.\n * Watches for isTestnet and hip3ConfigVersion changes to re-preload.\n */\n startMarketDataPreload(): void {\n this.#preloadStartRequested = true;\n if (this.#disconnectOperationPromise) {\n this.#debugLog(\n 'PerpsController: Disconnect in progress, deferring market data preload',\n );\n return;\n }\n if (this.#preloadTimer) {\n this.#debugLog('PerpsController: Preload already started, skipping');\n return;\n }\n\n this.#debugLog('PerpsController: Starting market data preload');\n\n // Track current values for change detection\n this.#previousIsTestnet = this.state.isTestnet;\n this.#previousHip3ConfigVersion = this.state.hip3ConfigVersion;\n\n // Immediate preload\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n\n // Periodic refresh\n this.#preloadTimer = setInterval(() => {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }, PerpsController.#preloadRefreshMs);\n\n // Watch for isTestnet / hip3ConfigVersion changes\n const handler: StateChangeListener<PerpsControllerState> = (\n _state,\n patches,\n ) => {\n // Early-return when no watched field changed (skips ~46 unrelated updates)\n const hasRelevantChange = patches.some(\n (patch) =>\n typeof patch.path[0] === 'string' &&\n PerpsController.#preloadWatchedPaths.has(patch.path[0]),\n );\n if (!hasRelevantChange) {\n return;\n }\n\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion;\n\n const testnetChanged = currentIsTestnet !== this.#previousIsTestnet;\n const hip3Changed =\n currentHip3Version !== this.#previousHip3ConfigVersion;\n\n if (testnetChanged || hip3Changed) {\n this.#debugLog(\n 'PerpsController: Network/config changed, re-preloading',\n {\n testnetChanged,\n hip3Changed,\n isTestnet: currentIsTestnet,\n hip3ConfigVersion: currentHip3Version,\n },\n );\n\n this.#previousIsTestnet = currentIsTestnet;\n this.#previousHip3ConfigVersion = currentHip3Version;\n\n // No need to clear user data cache — per-provider keys include the\n // network, so different networks don't collide. Re-preload will\n // populate the new key.\n\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n };\n\n this.messenger.subscribe('PerpsController:stateChanged', handler);\n this.#preloadStateUnsubscribe = (): void => {\n this.messenger.unsubscribe('PerpsController:stateChanged', handler);\n };\n\n // Watch for selected account changes and selected account group changes.\n const accountChangeHandler = (): void => {\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n const currentAddress = evmAccount?.address ?? null;\n this.#debugLog('PerpsController: account cache selection', {\n address: currentAddress?.toLowerCase() ?? null,\n availableKeys: Object.keys(this.state.cachedUserDataByProvider).sort(),\n });\n\n // The address guard makes the previous entry unreadable immediately;\n // refresh replaces it under the existing provider/network key.\n if (currentAddress) {\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n };\n this.messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n accountChangeHandler,\n );\n this.messenger.subscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n this.#accountChangeUnsubscribe = (): void => {\n this.messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n accountChangeHandler,\n );\n this.messenger.unsubscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n };\n }\n\n /**\n * Stop background market data preloading.\n */\n stopMarketDataPreload(): void {\n this.#debugLog('PerpsController: Stopping market data preload');\n this.#preloadStartRequested = false;\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n this.#marketPreloadQueued = false;\n this.#userPreloadQueued = false;\n this.#cleanupStandaloneProvider().catch(() => {\n /* fire-and-forget to preserve sync signature */\n });\n }\n\n /**\n * Perform a single market data preload (best-effort, no throw).\n */\n async #performMarketDataPreload(): Promise<void> {\n if (this.#isPreloading) {\n this.#marketPreloadQueued = true;\n return;\n }\n\n // Skip preloading during provider/network reinitialisation.\n // The activeProviderInstance still points to the OLD network's provider\n // until init() completes, so fetching now would store stale data under\n // the NEW network's cache key.\n if (this.#isReinitializing) {\n return;\n }\n\n // Determine actual provider and cache key for debounce\n const actualProviderId = this.activeProviderInstance\n ? this.state.activeProvider // includes 'aggregated'\n : 'hyperliquid';\n const cacheKey = buildProviderCacheKey(\n actualProviderId,\n this.state.isTestnet,\n );\n const preloadContext = {\n activeProvider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n hip3ConfigVersion: this.state.hip3ConfigVersion,\n lifecycleGeneration: this.#lifecycleGeneration,\n };\n const isCurrent = (): boolean =>\n this.#lifecycleGeneration === preloadContext.lifecycleGeneration &&\n this.state.activeProvider === preloadContext.activeProvider &&\n this.state.isTestnet === preloadContext.isTestnet &&\n this.state.hip3ConfigVersion === preloadContext.hip3ConfigVersion;\n const staticSnapshotDexes = this.#getStaticSnapshotDexes();\n\n const now = Date.now();\n const existingEntry = this.state.cachedMarketDataByProvider[cacheKey];\n if (\n existingEntry &&\n this.#isMarketCacheEntryCurrent(actualProviderId, existingEntry) &&\n now - existingEntry.timestamp < PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n this.#isPreloading = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | { success: boolean; marketCount?: number; error?: string }\n | undefined;\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n });\n\n this.#debugLog('PerpsController: Fetching market data in background');\n this.#debugLog('PerpsController: rest_preload_start');\n const data = await this.getMarketDataWithPrices({ standalone: true });\n this.#debugLog('PerpsController: rest_preload_end', {\n duration_ms: Math.round(performance.now() - preloadStart),\n markets: data.length,\n });\n\n if (!isCurrent()) {\n traceData = {\n success: false,\n error: 'Global snapshot preload context changed',\n };\n this.#debugLog(\n 'PerpsController: Discarding stale global snapshot preload',\n );\n return;\n }\n\n // Store under per-provider key(s)\n const ts = Date.now();\n const sourceExpiries = data.flatMap((market) =>\n market.dataSource === 'terminal-global-snapshot-mark' &&\n typeof market.sourceExpiresAt === 'number'\n ? [market.sourceExpiresAt]\n : [],\n );\n const sourceExpiresAt =\n data.length > 0 && sourceExpiries.length === data.length\n ? Math.min(...sourceExpiries)\n : undefined;\n const snapshotCacheIdentity =\n sourceExpiresAt !== undefined && staticSnapshotDexes\n ? {\n sourceExpiresAt,\n hip3ConfigVersion: preloadContext.hip3ConfigVersion,\n dexes: staticSnapshotDexes,\n }\n : {};\n const marketDiskEntries: {\n providerNetworkKey: string;\n data: PerpsMarketData[];\n timestamp: number;\n }[] = [];\n if (!isCurrent()) {\n traceData = {\n success: false,\n error: 'Global snapshot preload context changed',\n };\n return;\n }\n if (\n this.state.activeProvider === 'aggregated' &&\n this.activeProviderInstance\n ) {\n // Split returned data by providerId and store each slice\n const fallbackProviderId = 'hyperliquid'; // default for items missing providerId\n const byProvider = new Map<string, PerpsMarketData[]>();\n for (const item of data) {\n const pid = item.providerId ?? fallbackProviderId;\n const existing = byProvider.get(pid);\n if (existing) {\n existing.push(item);\n } else {\n byProvider.set(pid, [item]);\n }\n }\n this.update((state) => {\n for (const [pid, slice] of byProvider) {\n const key = buildProviderCacheKey(pid, this.state.isTestnet);\n marketDiskEntries.push({\n providerNetworkKey: key,\n data: slice,\n timestamp: ts,\n });\n state.cachedMarketDataByProvider[key] = {\n data: slice,\n timestamp: ts,\n };\n }\n // Write aggregated sentinel so the staleness guard sees it\n state.cachedMarketDataByProvider[cacheKey] = {\n data: [], // sentinel — real data is in per-provider keys\n timestamp: ts,\n };\n });\n } else {\n marketDiskEntries.push({\n providerNetworkKey: cacheKey,\n data,\n timestamp: ts,\n });\n this.update((state) => {\n state.cachedMarketDataByProvider[cacheKey] = {\n data,\n timestamp: ts,\n ...snapshotCacheIdentity,\n };\n });\n }\n\n persistMarketEntriesToDisk(\n this.#options.infrastructure.diskCache,\n marketDiskEntries,\n );\n\n this.#debugLog('PerpsController: Market data preloaded', {\n marketCount: data.length,\n });\n\n traceData = { success: true, marketCount: data.length };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsMarketDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n traceId,\n );\n } catch (error) {\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performMarketDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performMarketDataPreload'),\n this.#getErrorContext('performMarketDataPreload', {\n message: 'Background preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloading = false;\n if (this.#marketPreloadQueued && this.#preloadTimer) {\n this.#marketPreloadQueued = false;\n this.#performMarketDataPreload().catch(() => {\n // Background preload is best-effort.\n });\n }\n }\n }\n\n /**\n * Perform a single user data preload (best-effort, no throw).\n * Fetches positions, open orders, and account state via lightweight REST calls.\n */\n async #performUserDataPreload(): Promise<void> {\n if (this.#isPreloadingUserData) {\n this.#userPreloadQueued = true;\n return;\n }\n\n if (this.#isReinitializing) {\n return;\n }\n\n // Get current user address\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n if (!evmAccount?.address) {\n return;\n }\n\n const userAddress = evmAccount.address;\n const { activeProvider, isTestnet, hip3ConfigVersion } = this.state;\n const lifecycleGeneration = this.#lifecycleGeneration;\n const { activeProviderInstance } = this;\n const hyperliquidDexes = this.#getStaticSnapshotDexes();\n const isCurrent = (): boolean => {\n let currentAddress: string | undefined;\n try {\n currentAddress = getSelectedEvmAccountFromMessenger(\n this.messenger,\n )?.address;\n } catch {\n return false;\n }\n return (\n this.#lifecycleGeneration === lifecycleGeneration &&\n this.state.activeProvider === activeProvider &&\n this.activeProviderInstance === activeProviderInstance &&\n this.state.isTestnet === isTestnet &&\n this.state.hip3ConfigVersion === hip3ConfigVersion &&\n currentAddress?.toLowerCase() === userAddress.toLowerCase()\n );\n };\n\n // Determine actual provider (same logic as market preload)\n const actualProviderId = activeProviderInstance\n ? activeProvider // includes 'aggregated'\n : 'hyperliquid';\n const providerNetworkKey = buildProviderCacheKey(\n actualProviderId,\n isTestnet,\n );\n\n // Skip if cache is fresh and for same account\n const now = Date.now();\n const existingEntry =\n this.state.cachedUserDataByProvider[providerNetworkKey];\n const hasMatchingCache =\n existingEntry !== undefined &&\n this.#isUserCacheIdentityCurrent(\n actualProviderId,\n existingEntry,\n userAddress,\n );\n const cacheAgeMs = existingEntry ? now - existingEntry.timestamp : null;\n const websocketState = this.getWebSocketConnectionState();\n let selectedEntryKey: string | null = null;\n if (this.state.cachedUserDataByProvider[providerNetworkKey]) {\n selectedEntryKey = providerNetworkKey;\n }\n this.#debugLog('PerpsController: user cache preload decision', {\n requestedKey: providerNetworkKey,\n selectedEntryKey,\n availableKeys: Object.keys(this.state.cachedUserDataByProvider).sort(),\n hasMatchingCache,\n cacheAgeMs,\n websocketState,\n });\n if (\n existingEntry &&\n hasMatchingCache &&\n now - existingEntry.timestamp < PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n if (\n hasMatchingCache &&\n this.getWebSocketConnectionState() === WebSocketConnectionState.Connected\n ) {\n return;\n }\n\n this.#isPreloadingUserData = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | {\n success: boolean;\n positionCount?: number;\n orderCount?: number;\n error?: string;\n }\n | undefined;\n const staleContextError = 'User data preload context changed';\n const discardStalePreload = (): boolean => {\n if (isCurrent()) {\n return false;\n }\n traceData = { success: false, error: staleContextError };\n this.#debugLog('PerpsController: Discarding stale user data preload');\n return true;\n };\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: activeProvider,\n isTestnet,\n },\n });\n\n this.#debugLog('PerpsController: Fetching user data in background');\n\n if (activeProvider === 'hyperliquid') {\n const snapshot = await this.getUserDataSnapshot();\n if (discardStalePreload()) {\n return;\n }\n this.#debugLog('PerpsController: User data preloaded', {\n positionCount: snapshot.positions.length,\n orderCount: snapshot.orders.length,\n totalBalance: snapshot.accountState.totalBalance,\n });\n traceData = {\n success: true,\n positionCount: snapshot.positions.length,\n orderCount: snapshot.orders.length,\n };\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsUserDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n traceId,\n );\n return;\n }\n\n const [positions, orders, accountState] = await Promise.all([\n this.getPositions({ standalone: true, userAddress }),\n this.getOpenOrders({ standalone: true, userAddress }),\n this.getAccountState({ standalone: true, userAddress }),\n ]);\n\n if (discardStalePreload()) {\n return;\n }\n\n if (activeProvider === 'aggregated' && activeProviderInstance) {\n // Split by providerId and write one cache entry per provider key\n // (mirrors the market-data preload pattern at ~line 2976)\n const ts = Date.now();\n type UserDataBucket = {\n positions: typeof positions;\n orders: typeof orders;\n accountState: typeof accountState | null;\n };\n const fallbackProviderId = 'hyperliquid'; // default for items missing providerId\n const byProvider = new Map<string, UserDataBucket>();\n\n const ensureBucket = (pid: string): UserDataBucket => {\n let bucket = byProvider.get(pid);\n if (!bucket) {\n bucket = { positions: [], orders: [], accountState: null };\n byProvider.set(pid, bucket);\n }\n return bucket;\n };\n\n for (const pos of positions) {\n ensureBucket(pos.providerId ?? fallbackProviderId).positions.push(\n pos,\n );\n }\n\n for (const order of orders) {\n ensureBucket(order.providerId ?? fallbackProviderId).orders.push(\n order,\n );\n }\n\n // AccountState — assign to its provider bucket\n ensureBucket(\n accountState.providerId ?? fallbackProviderId,\n ).accountState = accountState;\n\n if (discardStalePreload()) {\n return;\n }\n this.update((state) => {\n for (const [pid, data] of byProvider) {\n const key = buildProviderCacheKey(pid, isTestnet);\n state.cachedUserDataByProvider[key] = {\n ...data,\n timestamp: ts,\n address: userAddress,\n ...(pid === 'hyperliquid' &&\n hyperliquidDexes && {\n hip3ConfigVersion,\n dexes: hyperliquidDexes,\n }),\n };\n }\n // Write aggregated sentinel so the staleness guard sees it\n state.cachedUserDataByProvider[providerNetworkKey] = {\n positions: [],\n orders: [],\n accountState: null,\n timestamp: ts,\n address: userAddress,\n };\n });\n\n this.#persistUserCacheToDisk();\n } else {\n // Single provider — store directly under its key\n const ts = Date.now();\n if (discardStalePreload()) {\n return;\n }\n this.update((state) => {\n state.cachedUserDataByProvider[providerNetworkKey] = {\n positions,\n orders,\n accountState,\n timestamp: ts,\n address: userAddress,\n ...(actualProviderId === 'hyperliquid' &&\n hyperliquidDexes && {\n hip3ConfigVersion,\n dexes: hyperliquidDexes,\n }),\n };\n });\n\n this.#persistUserCacheToDisk();\n }\n\n this.#debugLog('PerpsController: User data preloaded', {\n positionCount: positions.length,\n orderCount: orders.length,\n totalBalance: accountState.totalBalance,\n });\n\n traceData = {\n success: true,\n positionCount: positions.length,\n orderCount: orders.length,\n };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsUserDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n traceId,\n );\n } catch (error) {\n if (discardStalePreload()) {\n return;\n }\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performUserDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performUserDataPreload'),\n this.#getErrorContext('performUserDataPreload', {\n message: 'Background user data preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloadingUserData = false;\n if (this.#userPreloadQueued && this.#preloadTimer) {\n this.#userPreloadQueued = false;\n this.#performUserDataPreload().catch(() => {\n // Background preload is best-effort.\n });\n }\n }\n }\n\n /**\n * Get list of available HIP-3 builder-deployed DEXs\n *\n * @param params - Optional parameters for filtering\n * @returns Array of DEX names\n */\n async getAvailableDexs(params?: GetAvailableDexsParams): Promise<string[]> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getAvailableDexs');\n return this.#marketDataService.getAvailableDexs({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Fetch historical candle data\n * Thin delegation to MarketDataService\n *\n * @param options - The configuration options.\n * @param options.symbol - The trading pair symbol.\n * @param options.interval - The candle interval period.\n * @param options.limit - Maximum number of items to fetch.\n * @param options.endTime - End timestamp in milliseconds.\n * @returns The historical candle data for the requested symbol and interval.\n */\n async fetchHistoricalCandles(options: {\n symbol: string;\n interval: CandlePeriod;\n limit?: number;\n endTime?: number;\n }): Promise<CandleData> {\n const { symbol, interval, limit = 100, endTime } = options;\n const provider = this.getActiveProvider();\n return this.#marketDataService.fetchHistoricalCandles({\n provider,\n symbol,\n interval,\n limit,\n endTime,\n context: this.#createServiceContext('fetchHistoricalCandles'),\n });\n }\n\n /**\n * Calculate liquidation price for a position\n * Uses provider-specific formulas based on protocol rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the string result.\n */\n async calculateLiquidationPrice(\n params: LiquidationPriceParams,\n ): Promise<string> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateLiquidationPrice');\n return this.#marketDataService.calculateLiquidationPrice({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Project the isolated position that would remain after a proposed order.\n * Margin and liquidation availability are independent: a missing liquidation\n * does not hide a valid margin projection. Cross-margin returns unsupported.\n *\n * @param params - Live position plus the proposed order.\n * @returns Discriminated preview of the resulting position.\n */\n async previewPositionModify(\n params: PositionModifyPreviewParams,\n ): Promise<PositionModifyPreviewResult> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('previewPositionModify');\n return this.#marketDataService.previewPositionModify({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Calculate maintenance margin for a specific asset\n * Returns a percentage (e.g., 0.0125 for 1.25%)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the numeric result.\n */\n async calculateMaintenanceMargin(\n params: MaintenanceMarginParams,\n ): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateMaintenanceMargin');\n return this.#marketDataService.calculateMaintenanceMargin({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Get maximum leverage allowed for an asset\n *\n * @param asset - The asset identifier.\n * @param providerId - Optional provider route for aggregated markets.\n * @returns A promise that resolves to the numeric result.\n */\n async getMaxLeverage(\n asset: string,\n providerId?: PerpsProviderType,\n ): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getMaxLeverage');\n return this.#marketDataService.getMaxLeverage({\n provider,\n asset,\n ...(providerId === undefined ? {} : { providerId }),\n context,\n });\n }\n\n /**\n * Validate order parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateOrder(\n params: OrderParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n const context = this.#createServiceContext('validateOrder');\n return this.#marketDataService.validateOrder({ provider, params, context });\n }\n\n /**\n * Validate close position parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async validateClosePosition(\n params: ClosePositionParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n const context = this.#createServiceContext('validateClosePosition');\n return this.#marketDataService.validateClosePosition({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Validate withdrawal parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateWithdrawal(\n params: WithdrawParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n return this.#accountService.validateWithdrawal({ provider, params });\n }\n\n /**\n * Get supported withdrawal routes - returns complete asset and routing information\n *\n * @returns Array of supported asset routes for withdrawals.\n */\n getWithdrawalRoutes(): AssetRoute[] {\n try {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getWithdrawalRoutes({ provider });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.getWithdrawalRoutes'),\n this.#getErrorContext('getWithdrawalRoutes'),\n );\n // Return empty array if provider is not available\n return [];\n }\n }\n\n /**\n * Set the transient UTM / discovery attribution context.\n * Replaces any previously set context. Held in-memory only — not persisted.\n *\n * @param context - The attribution context (UTM fields) to store.\n */\n setAttributionContext(context: PerpsAttributionContext): void {\n this.#attributionContext = { ...context };\n }\n\n /**\n * Get a copy of the current attribution context.\n *\n * @returns A shallow copy of the stored attribution context.\n */\n getAttributionContext(): PerpsAttributionContext {\n return { ...this.#attributionContext };\n }\n\n /**\n * Clear the stored attribution context.\n */\n clearAttributionContext(): void {\n this.#attributionContext = {};\n }\n\n /**\n * Merge the stored UTM attribution context into a set of analytics event\n * properties. Only defined UTM fields are added, mapped\n * to their canonical PERPS_EVENT_PROPERTY keys. Provided properties take\n * precedence and are never overwritten.\n *\n * @param properties - Base event properties to merge attribution into.\n * @returns A new properties object including any defined UTM keys.\n */\n mergeAttributionContext(\n properties: PerpsAnalyticsProperties = {},\n ): PerpsAnalyticsProperties {\n const utm: PerpsAnalyticsProperties = {};\n const context = this.#attributionContext;\n if (context.utmSource !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_SOURCE] = context.utmSource;\n }\n if (context.utmMedium !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_MEDIUM] = context.utmMedium;\n }\n if (context.utmCampaign !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_CAMPAIGN] = context.utmCampaign;\n }\n if (context.utmContent !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_CONTENT] = context.utmContent;\n }\n if (context.utmTerm !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_TERM] = context.utmTerm;\n }\n // Provided properties win over attribution context.\n return { ...utm, ...properties };\n }\n\n /**\n * Toggle between testnet and mainnet\n *\n * @returns The toggle result with success status and current network mode.\n */\n async toggleTestnet(): Promise<ToggleTestnetResult> {\n while (this.#disconnectOperationPromise) {\n await this.#disconnectOperationPromise;\n }\n\n // Prevent concurrent reinitializations\n if (this.isCurrentlyReinitializing()) {\n this.#debugLog(\n 'PerpsController: Already reinitializing, skipping toggle',\n {\n timestamp: new Date().toISOString(),\n },\n );\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n const completeReinitialization = this.#beginReinitialization();\n const previousIsTestnet = this.state.isTestnet;\n\n try {\n const pendingInitialization = this.#initializationPromise;\n if (pendingInitialization) {\n await pendingInitialization;\n }\n\n await this.#cleanupStandaloneProvider();\n\n const previousNetwork = previousIsTestnet ? 'testnet' : 'mainnet';\n\n this.update((state) => {\n state.isTestnet = !state.isTestnet;\n });\n\n const newNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Network toggle initiated', {\n from: previousNetwork,\n to: newNetwork,\n timestamp: new Date().toISOString(),\n });\n\n // Reset initialization state and reinitialize provider with new testnet setting\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.#initWithoutDisconnectWait();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ??\n 'Network toggle initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Network toggle completed', {\n newNetwork,\n isTestnet: this.state.isTestnet,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, isTestnet: this.state.isTestnet };\n } catch (error) {\n // Rollback isTestnet to previous value\n this.update((state) => {\n state.isTestnet = previousIsTestnet;\n });\n\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: ensureError(error, 'PerpsController.toggleTestnet').message,\n };\n } finally {\n completeReinitialization();\n\n // Re-trigger preload now that reinit is complete and the\n // activeProviderInstance points to the correct network.\n // The state-change listener may have already fired during reinit\n // but was skipped due to the #isReinitializing guard.\n if (this.#preloadTimer) {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n }\n }\n\n /**\n * Switch to a different provider\n * Uses a full reinit approach: disconnect() → update state → init()\n * This ensures complete state reset including WebSocket connections and caches.\n *\n * @param providerId - The provider identifier.\n * @returns The switch result with success status and active provider.\n */\n async switchProvider(\n providerId: PerpsActiveProviderMode,\n ): Promise<SwitchProviderResult> {\n while (this.#disconnectOperationPromise) {\n await this.#disconnectOperationPromise;\n }\n\n // Prevent concurrent switches\n if (this.isCurrentlyReinitializing()) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n const completeReinitialization = this.#beginReinitialization();\n let previousProvider = this.state.activeProvider;\n\n try {\n const pendingInitialization = this.#initializationPromise;\n if (pendingInitialization) {\n await pendingInitialization;\n }\n\n // A completed disconnect leaves no initialization promise to await. Rebuild\n // the provider registry before same-provider detection or route validation\n // so a successful switch always leaves a usable active provider.\n const needsInitialization =\n !this.isInitialized ||\n this.state.initializationState !== InitializationState.Initialized;\n if (needsInitialization) {\n await this.#initWithoutDisconnectWait();\n const initializationFailed =\n !this.isInitialized ||\n this.state.initializationState !== InitializationState.Initialized;\n if (initializationFailed) {\n throw new Error(\n this.state.initializationError ?? 'Provider initialization failed',\n );\n }\n }\n\n // Initialization may select a fallback provider. Read the effective\n // provider only after it settles so no-op detection and rollback both\n // use the state this switch is actually replacing.\n previousProvider = this.state.activeProvider;\n if (previousProvider === providerId) {\n return { success: true, providerId };\n }\n\n // Validate provider only after a pending initialization has rebuilt the\n // registry. Otherwise a switch queued behind disconnect can observe the\n // intentionally empty teardown state.\n const isValidProvider =\n providerId === 'aggregated' || this.providers.has(providerId);\n\n if (!isValidProvider) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: `Provider ${providerId} not available`,\n };\n }\n\n await this.#cleanupStandaloneProvider();\n\n this.#debugLog('PerpsController: Provider switch initiated', {\n from: previousProvider,\n to: providerId,\n timestamp: new Date().toISOString(),\n });\n\n // Provider disconnect is handled by performInitialization() during\n // reinitialization.\n\n // Update state with new provider (market data cache preserved per-provider)\n this.update((state) => {\n state.activeProvider = providerId;\n state.accountState = null;\n state.initializationState = InitializationState.Uninitialized;\n });\n\n // Reset initialization state and reinitialize\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.#initWithoutDisconnectWait();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ?? 'Provider initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Provider switch completed', {\n providerId,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, providerId };\n } catch (error) {\n // Rollback state to previous provider\n this.update((state) => {\n state.activeProvider = previousProvider;\n });\n\n this.#logError(\n ensureError(error, 'PerpsController.switchProvider'),\n this.#getErrorContext('switchProvider', { providerId }),\n );\n\n // Attempt to reinitialize the previous provider via init(),\n // which handles all provider modes including 'aggregated'.\n try {\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.#initWithoutDisconnectWait();\n\n this.#debugLog(\n 'PerpsController: Rollback to previous provider succeeded',\n {\n previousProvider,\n timestamp: new Date().toISOString(),\n },\n );\n } catch (reinitError) {\n // Reinit also failed — mark as failed\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n });\n this.#logError(\n ensureError(reinitError, 'PerpsController.switchProvider.rollback'),\n this.#getErrorContext('switchProvider.rollback', {\n previousProvider,\n }),\n );\n }\n\n return {\n success: false,\n providerId: previousProvider,\n error:\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n } finally {\n completeReinitialization();\n\n // Re-trigger preload now that reinit is complete.\n if (this.#preloadTimer) {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n }\n }\n\n /**\n * Get current network (mainnet/testnet)\n *\n * @returns Either 'mainnet' or 'testnet' based on the current configuration.\n */\n getCurrentNetwork(): 'mainnet' | 'testnet' {\n return this.state.isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Get the ordered list of all market categories for HIP-3 markets.\n * Returns a stable, explicitly ordered array so the UI can render\n * category filter tabs without deriving order from config insertion.\n *\n * @returns Ordered array of {@link MarketTypeFilter} values. Does not include the 'all' or 'new' sentinels — those are separate UI controls.\n */\n getMarketCategories(): MarketTypeFilter[] {\n return MARKET_CATEGORIES;\n }\n\n /**\n * Get the current WebSocket connection state from the active provider.\n * Used by the UI to monitor connection health and show notifications.\n *\n * @returns The current WebSocket connection state, or DISCONNECTED if not supported\n */\n getWebSocketConnectionState(): WebSocketConnectionState {\n try {\n const provider = this.getActiveProvider();\n if (provider.getWebSocketConnectionState) {\n return provider.getWebSocketConnectionState();\n }\n // Fallback for providers that don't support this method\n return WebSocketConnectionState.Disconnected;\n } catch {\n // If no provider is active, return disconnected\n return WebSocketConnectionState.Disconnected;\n }\n }\n\n /**\n * Subscribe to WebSocket connection state changes from the active provider.\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, or no-op if not supported\n */\n subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n try {\n const provider = this.getActiveProvider();\n if (provider.subscribeToConnectionState) {\n return provider.subscribeToConnectionState(listener);\n }\n // Fallback: immediately call with current state and return no-op unsubscribe\n listener(this.getWebSocketConnectionState(), 0);\n return () => {\n // No-op\n };\n } catch {\n // If no provider is active, call with disconnected and return no-op\n listener(WebSocketConnectionState.Disconnected, 0);\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Manually trigger a WebSocket reconnection attempt.\n * Used by the UI retry button when connection is lost.\n */\n async reconnect(): Promise<void> {\n this.#debugLog('[PerpsController] reconnect() called');\n try {\n const provider = this.getActiveProvider();\n if (provider.reconnect) {\n this.#debugLog('[PerpsController] Delegating to provider.reconnect()');\n await provider.reconnect();\n this.#debugLog('[PerpsController] provider.reconnect() completed');\n } else {\n this.#debugLog(\n '[PerpsController] Provider does not support reconnect()',\n );\n }\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.reconnect'),\n this.#getErrorContext('reconnect', {\n operation: 'websocket_reconnect',\n }),\n );\n }\n }\n\n // Live data delegation (NO Redux) - delegates to active provider\n\n /**\n * Subscribe to live price updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPrices(params: SubscribePricesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPrices(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPrices'),\n this.#getErrorContext('subscribeToPrices', {\n symbols: params.symbols?.join(','),\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live position updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPositions(params: SubscribePositionsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPositions(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPositions'),\n this.#getErrorContext('subscribeToPositions', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order fill updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderFills(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderFills'),\n this.#getErrorContext('subscribeToOrderFills', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Stream TWAP lifecycle updates through the active provider.\n *\n * Providers without a native TWAP push channel do not implement this; the\n * returned no-op cleanup lets a client fall back to polling `getTwapOrders`\n * without branching on provider identity.\n *\n * @param params - Subscription parameters including callback and account ID.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToTwapOrders(params: SubscribeTwapOrdersParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider?.subscribeToTwapOrders) {\n return () => {\n // No-op: provider missing or without a native TWAP push channel\n };\n }\n try {\n return provider.subscribeToTwapOrders(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToTwapOrders'),\n this.#getErrorContext('subscribeToTwapOrders', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrders(params: SubscribeOrdersParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrders(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrders'),\n this.#getErrorContext('subscribeToOrders', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live account updates.\n * Updates controller state (Redux) when new account data arrives so consumers\n * like usePerpsBalanceTokenFilter (PayWithModal) see the latest balance.\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToAccount(params: SubscribeAccountParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n const originalCallback = params.callback;\n return provider.subscribeToAccount({\n ...params,\n callback: (account: AccountState | null) => {\n if (account) {\n this.update((state) => {\n state.accountState = account;\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n originalCallback(account);\n },\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToAccount'),\n this.#getErrorContext('subscribeToAccount', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to full order book updates with multiple depth levels\n * Creates a dedicated L2Book subscription for real-time order book data\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderBook(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderBook'),\n this.#getErrorContext('subscribeToOrderBook', {\n symbol: params.symbol,\n levels: params.levels,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live candle updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToCandles(params: SubscribeCandlesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToCandles(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToCandles'),\n this.#getErrorContext('subscribeToCandles', {\n symbol: params.symbol,\n interval: params.interval,\n duration: params.duration,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to open interest cap updates\n * Zero additional network overhead - data comes from existing webData3 subscription\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOICaps(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOICaps'),\n this.#getErrorContext('subscribeToOICaps', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Configure live data throttling\n *\n * @param config - The configuration object.\n */\n setLiveDataConfig(config: Partial<LiveDataConfig>): void {\n try {\n const provider = this.getActiveProvider();\n provider.setLiveDataConfig(config);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.setLiveDataConfig'),\n this.#getErrorContext('setLiveDataConfig'),\n );\n }\n }\n\n /**\n * Calculate trading fees through the active provider route.\n * Each provider owns its fee policy. An explicit provider route overrides\n * the active/default provider used by placement.\n *\n * @param params - The operation parameters.\n * @returns The fee calculation result for the trade.\n */\n async calculateFees(\n params: FeeCalculationParams,\n ): Promise<FeeCalculationResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n // Preview owns subscription hydration. The submit resolver remains a pure\n // cache read and can therefore never start a benefits request while an\n // order is being signed.\n await this.#rewardsIntegrationService.refreshSubscriptionBenefits();\n\n // ADR 0064: preview is also where the trading address is announced, so a\n // fill decoded off the HL fan-out can be attributed back to a profile.\n // Fire-and-forget — attribution plumbing must not delay or fail a quote.\n const selectedAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n if (selectedAccount) {\n this.#rewardsIntegrationService\n .registerTradingAddress(selectedAccount.address, {\n isTestnet: this.state.isTestnet,\n })\n .catch(() => {\n /* never blocks a fee preview */\n });\n }\n\n // The preview quotes the same blended rate the submit path charges, which\n // is only possible once the order notional reaches the resolver. `amount`\n // is the order notional in USD for the quote being previewed.\n const orderNotionalUsd = params.amount\n ? Number.parseFloat(params.amount)\n : undefined;\n const feeResolution =\n await this.#rewardsIntegrationService.resolveFee(orderNotionalUsd);\n // Taken from the resolution rather than read separately: a second read can\n // observe a different snapshot if the cache is invalidated or the feature\n // flag flips between the two, which would surface metadata describing a\n // waiver the quoted rates do not reflect.\n const waiverStatus = feeResolution.subscription;\n const context = this.#createServiceContext('calculateFees', {\n subscriptionFeeWaiver:\n waiverStatus.reason === 'no-source' ? undefined : waiverStatus,\n feeResolution,\n });\n return this.#marketDataService.calculateFees({ provider, params, context });\n }\n\n /**\n * Sign HyperLiquid L1 actions (orders, cancels, leverage, ...) for a main\n * account on a network with an approved agent, or pin them to the main\n * account with null (`getAgentSigner` is then not asked for that account and\n * network until `clearAgentSigners`). User-signed actions stay on the main\n * account, and the agent is never used for another account or network. The\n * controller keeps the binding across provider re-creation (a provider or\n * network switch, or re-initialization), so it can also be set before\n * `init`. Like every controller action, it is available through the\n * messenger once `init` has run.\n *\n * @param account - The main account and network the agent is approved for.\n * @param agentSigner - The host-owned agent signer, or null to pin the main\n * account.\n */\n setAgentSigner(\n account: PerpsAgentAccount,\n agentSigner: PerpsAgentSigner | null,\n ): void {\n this.#agentBindings.set(account, agentSigner);\n // Drop agents the providers already resolved so the binding applies to\n // the next L1 action.\n this.#clearProviderAgentSigners();\n }\n\n /**\n * Forget every HyperLiquid agent, set or resolved, so the next L1 action\n * asks `providerCredentials.hyperliquid.getAgentSigner` again; an answer\n * still pending is discarded too. Call it when the wallet locks (with\n * `getAgentSigner` returning null while locked) and nothing signs with an\n * agent until it returns one again. Like every controller action, it is\n * available through the messenger once `init` has run.\n */\n clearAgentSigners(): void {\n this.#agentBindings.clear();\n this.#clearProviderAgentSigners();\n }\n\n /**\n * Drop the agents every provider resolved.\n */\n #clearProviderAgentSigners(): void {\n for (const provider of this.providers.values()) {\n provider.clearAgentSigners?.();\n }\n }\n\n /**\n * Run the active provider's deferred trading setup ahead of the first order\n * (HyperLiquid account migration, builder fee and referral; Lighter\n * venue-key registration), so its signatures happen in one guided session,\n * such as agent setup, instead of at order time. The builder fee and\n * Lighter's registration are signed by the main account; with an agent,\n * the referral and the account migration are L1 actions the agent signs.\n *\n * @returns `ready: true` when none of these steps will need a signature\n * again before the first order, and only while an account is selected and\n * the main account can sign, whichever provider answered (including\n * providers without deferred setup, for example in aggregated mode). A\n * HyperLiquid referral whose MetaMask referral code is not ready yet is\n * checked again at the next call, not before orders, so it does not hold\n * it back. Otherwise `ready: false`, without an error while a step will\n * be asked again (a declined HyperLiquid migration, builder fee or Lighter\n * registration, or a step the agent could not sign), or with:\n * - `KEYRING_LOCKED` when the main account cannot sign, before or during\n * setup;\n * - `EXCHANGE_ACCOUNT_NOT_FOUND` for a wallet with no account on the venue\n * yet;\n * - `NO_ACCOUNT_SELECTED` when no account is selected;\n * - `PROVIDER_LIFECYCLE_STALE` when the provider disconnected or the account\n * changed during setup;\n * - otherwise the message of the error that stopped setup, which is logged.\n * @throws Like the other provider-backed actions, `CLIENT_NOT_INITIALIZED`\n * before `init`, and `CLIENT_REINITIALIZING` or `PROVIDER_NOT_AVAILABLE`\n * when no active provider is available.\n */\n async prepareTradingWallet(): Promise<ReadyToTradeResult> {\n const provider = await this.#getActiveProviderWhenReady();\n // With nothing selected, the AccountsController answers an empty account.\n const readSelectedAddress = (): string | undefined => {\n const address = getSelectedEvmAccountFromMessenger(\n this.messenger,\n )?.address;\n return address ? address.toLowerCase() : undefined;\n };\n const addressAtStart = readSelectedAddress();\n const result = (await provider.prepareTradingWallet?.()) ?? {\n ready: true,\n };\n const address = readSelectedAddress();\n // The steps ran for the account selected when they started (in aggregated\n // mode, one provider after another), so their result is not the current\n // account's.\n if (address !== addressAtStart) {\n return {\n ready: false,\n error: PERPS_ERROR_CODES.PROVIDER_LIFECYCLE_STALE,\n };\n }\n if (!result.ready) {\n return result;\n }\n // A provider with nothing to prepare, alone or aggregated, checks neither\n // the signer nor the selected account.\n if (\n !isMainAccountSignerReady(\n this.#options.infrastructure.accountSigner,\n () => this.messenger.call('KeyringController:getState').isUnlocked,\n )\n ) {\n return { ready: false, error: PERPS_ERROR_CODES.KEYRING_LOCKED };\n }\n if (!address) {\n return { ready: false, error: PERPS_ERROR_CODES.NO_ACCOUNT_SELECTED };\n }\n return result;\n }\n\n /**\n * Approve the dedicated subscription builder outside order submission.\n *\n * @deprecated ADR 0064 replaced the dedicated subscription builder with cloid\n * marking on the standard builder, so there is nothing left to approve. Kept\n * as a no-op so clients still calling it keep building while they migrate;\n * remove it once cloid marking is verified in shadow mode.\n *\n * Resolves `true`, not `false`. The method answers \"is the subscription\n * builder ready?\", and the honest answer is now \"nothing needs approving\" —\n * a `false` would read as a setup failure to a caller that branches on it and\n * could block a waiver that is already fully in effect.\n * @returns Always `true`; no approval is required.\n */\n async approveSubscriptionBuilderFee(): Promise<boolean> {\n this.#debugLog(\n 'PerpsController: approveSubscriptionBuilderFee is a no-op; subscription attribution now rides on the order cloid',\n );\n return true;\n }\n\n /**\n * Drop the cached subscription benefits snapshot.\n *\n * Call this when the identity behind the benefits changes — sign-out, or a\n * profile switch. The snapshot carries no profile identity of its own, so\n * without this it keeps answering for the previous profile until the next\n * successful refresh. The next fee resolution reports the waiver as\n * unavailable, so it is withheld until preview or lifecycle hydration.\n */\n invalidateSubscriptionBenefits(): void {\n this.#rewardsIntegrationService.invalidateSubscriptionBenefits();\n }\n\n /**\n * Disconnect provider and cleanup subscriptions\n * Call this when navigating away from Perps screens to prevent battery drain\n */\n async disconnect(): Promise<void> {\n while (this.#disconnectOperationPromise) {\n // Each explicit disconnect claims a teardown after the operation already\n // in flight. This lets a later disconnect close providers created by an\n // init call that was queued behind the same earlier teardown.\n this.#preloadStartRequested = false;\n await this.#disconnectOperationPromise;\n }\n\n // A disconnect stops the current preload session. A later start call made\n // while teardown is in flight sets this back to true and is resumed below.\n this.#preloadStartRequested = false;\n\n let resolveOperation = (): void => undefined;\n const operation = new Promise<void>((resolve) => {\n resolveOperation = resolve;\n });\n this.#disconnectOperationPromise = operation;\n\n try {\n await this.#performDisconnect();\n } finally {\n resolveOperation();\n if (this.#disconnectOperationPromise === operation) {\n this.#disconnectOperationPromise = null;\n }\n if (this.#preloadStartRequested) {\n this.startMarketDataPreload();\n }\n }\n }\n\n /**\n * Disconnect after this call has claimed the controller lifecycle.\n *\n * @returns A promise that resolves when teardown finishes.\n */\n async #performDisconnect(): Promise<void> {\n this.#lifecycleGeneration += 1;\n this.#debugLog(\n 'PerpsController: Disconnecting provider to cleanup subscriptions',\n {\n timestamp: new Date().toISOString(),\n },\n );\n\n // Stop preload interval and messenger subscriptions first,\n // so no background work fires while we tear down providers.\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n\n const pendingReinitialization = this.#reinitializationOperationPromise;\n if (pendingReinitialization) {\n await pendingReinitialization;\n }\n\n // Initialization owns provider creation. Let it finish before teardown so\n // it cannot repopulate providers after this method clears the references.\n const pendingInitialization = this.#initializationPromise;\n if (pendingInitialization) {\n try {\n await pendingInitialization;\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.disconnect.initialization'),\n this.#getErrorContext('disconnect', {\n operation: 'awaitInitialization',\n }),\n );\n }\n }\n\n const provider = this.activeProviderInstance;\n if (provider) {\n try {\n await provider.disconnect();\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.disconnect'),\n this.#getErrorContext('disconnect'),\n );\n }\n }\n\n // Clear stale reference so standalone reads don't route through old provider\n this.activeProviderInstance = null;\n\n // Cleanup cached standalone provider (if any) — awaited to prevent races\n await this.#cleanupStandaloneProvider();\n\n // Note: Feature-flag subscription is NOT cleaned up here.\n // It is a controller-lifetime concern (set once in the constructor),\n // not a session-lifetime concern. Unsubscribing here would break\n // geo-blocking / HIP-3 flag propagation after disconnect → reconnect.\n\n // Reset initialization state to ensure proper reconnection\n this.isInitialized = false;\n this.#initializationPromise = null;\n }\n\n /**\n * Eligibility (Geo-Blocking)\n */\n\n /**\n * Fetch geo location\n *\n * Returned in Country or Country-Region format\n * Example: FR, DE, US-MI, CA-ON\n */\n /**\n * Refresh eligibility status\n */\n /**\n * Resume eligibility monitoring after onboarding completes.\n * Clears the deferred flag and triggers an immediate eligibility check\n * using the current remote feature flag state.\n */\n startEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = false;\n try {\n const currentState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n this.refreshEligibilityOnFeatureFlagChange(currentState);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.startEligibilityMonitoring'),\n this.#getErrorContext('startEligibilityMonitoring', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n }\n\n /**\n * Stops geo-blocking eligibility monitoring.\n * Call this when the user disables basic functionality (e.g. useExternalServices becomes false).\n * Prevents geolocation calls until startEligibilityMonitoring() is called again.\n * Safe to call multiple times.\n */\n stopEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = true;\n }\n\n async refreshEligibility(): Promise<void> {\n if (this.#eligibilityCheckDeferred) {\n return;\n }\n\n // Capture the current version before starting the async operation.\n // This prevents race conditions where stale eligibility checks\n // (started with fallback config) overwrite results from newer checks\n // (started with remote config after it was fetched).\n const versionAtStart = this.#blockedRegionListVersion;\n\n try {\n const geoLocation = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n\n const isEligible = await this.#eligibilityService.checkEligibility({\n blockedRegions: this.blockedRegionList.list,\n geoLocation,\n });\n\n // Only update state if the blocked region list hasn't changed while we were awaiting.\n // This prevents stale fallback-based eligibility checks from overwriting\n // results from remote-based checks.\n if (this.#blockedRegionListVersion !== versionAtStart) {\n return;\n }\n\n this.update((state) => {\n state.isEligible = isEligible;\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.refreshEligibility'),\n this.#getErrorContext('refreshEligibility'),\n );\n\n // Only update on error if version is still current\n if (this.#blockedRegionListVersion === versionAtStart) {\n // Default to eligible on error\n this.update((state) => {\n state.isEligible = true;\n });\n }\n }\n }\n\n /**\n * Get block explorer URL for an address or just the base URL\n *\n * @param address - Optional address to append to the base URL\n * @returns Block explorer URL\n */\n getBlockExplorerUrl(address?: string): string {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getBlockExplorerUrl({ provider, address });\n }\n\n /**\n * Check if user is first-time for the current network\n *\n * @returns True if the condition is met.\n */\n isFirstTimeUserOnCurrentNetwork(): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.isFirstTimeUser[currentNetwork];\n }\n\n /**\n * Mark that the user has completed the tutorial/onboarding\n * This prevents the tutorial from showing again\n */\n markTutorialCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking tutorial as completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.isFirstTimeUser[currentNetwork] = false;\n });\n }\n\n /*\n * Mark that user has placed their first successful order\n * This prevents the notification tooltip from showing again\n */\n markFirstOrderCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking first order completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.hasPlacedFirstOrder[currentNetwork] = true;\n });\n }\n\n /**\n * Reset first-time user state for both networks\n * This is useful for testing the tutorial flow\n * Called by Reset Account feature in settings\n */\n resetFirstTimeUserState(): void {\n this.#debugLog('PerpsController: Resetting first-time user state', {\n timestamp: new Date().toISOString(),\n previousState: this.state.isFirstTimeUser,\n });\n\n this.update((state) => {\n state.isFirstTimeUser = {\n testnet: true,\n mainnet: true,\n };\n state.hasPlacedFirstOrder = {\n testnet: false,\n mainnet: false,\n };\n });\n }\n\n /**\n * Clear pending/bridging withdrawal and deposit requests\n * This is useful when users want to clear stuck pending indicators\n * Called by Reset Account feature in settings\n */\n clearPendingTransactionRequests(): void {\n this.#debugLog('PerpsController: Clearing pending transaction requests', {\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n // Filter out pending/bridging withdrawals, keep completed for history\n state.withdrawalRequests = state.withdrawalRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Filter out pending deposits, keep completed/failed for history\n state.depositRequests = state.depositRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Reset withdrawal progress\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n });\n }\n\n /**\n * Get saved trade configuration for a market\n *\n * @param symbol - The trading pair symbol.\n * @returns The resulting string value.\n */\n getTradeConfiguration(symbol: string): { leverage?: number } | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config = this.state.tradeConfigurations[network]?.[symbol];\n\n if (!config?.leverage) {\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved trade config', {\n symbol,\n network,\n leverage: config.leverage,\n });\n\n return { leverage: config.leverage };\n }\n\n /**\n * Save trade configuration for a market\n *\n * @param symbol - Market symbol\n * @param leverage - Leverage value\n */\n saveTradeConfiguration(symbol: string, leverage: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving trade configuration', {\n symbol,\n network,\n leverage,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n leverage,\n };\n });\n }\n\n /**\n * Save pending trade configuration for a market\n * This is a temporary configuration that expires after 30 seconds.\n *\n * @param symbol - Market symbol\n * @param config - Pending trade configuration (includes optional selected payment token from Pay row)\n * @param config.amount - The amount value.\n * @param config.leverage - The leverage multiplier.\n * @param config.takeProfitPrice - The take profit price.\n * @param config.stopLossPrice - The stop loss price.\n * @param config.limitPrice - The limit price.\n * @param config.orderType - The order type.\n * @param config.reduceOnly - Whether the order may only reduce a position.\n * @param config.direction - Long or short.\n * @param config.selectedPaymentToken - The selected payment token.\n */\n savePendingTradeConfiguration(\n symbol: string,\n config: {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n reduceOnly?: boolean;\n direction?: OrderDirection;\n /** When user used pay-with-token in PerpsPayRow: minimal token shape to restore selection */\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n },\n ): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving pending trade configuration', {\n symbol,\n network,\n config,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n pendingConfig: {\n ...config,\n timestamp: Date.now(),\n },\n };\n if (config.orderType) {\n state.selectedOrderType = config.orderType;\n }\n });\n }\n\n /**\n * Get pending trade configuration for a market\n * Returns undefined if config doesn't exist or has expired.\n *\n * @param symbol - Market symbol\n * @returns Pending trade configuration or undefined\n */\n getPendingTradeConfiguration(symbol: string):\n | {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n reduceOnly?: boolean;\n direction?: OrderDirection;\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n }\n | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config =\n this.state.tradeConfigurations[network]?.[symbol]?.pendingConfig;\n\n if (!config) {\n return undefined;\n }\n\n const now = Date.now();\n const age = now - config.timestamp;\n\n if (age > PERPS_CONSTANTS.PendingTradeConfigurationTtlMs) {\n this.#debugLog('PerpsController: Pending trade config expired', {\n symbol,\n network,\n age,\n timestamp: config.timestamp,\n });\n // Clear expired config\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved pending trade config', {\n symbol,\n network,\n config,\n age,\n });\n\n // Return config without timestamp\n const { timestamp, ...configWithoutTimestamp } = config;\n return configWithoutTimestamp;\n }\n\n /**\n * Clear pending trade configuration for a market\n *\n * @param symbol - Market symbol\n */\n clearPendingTradeConfiguration(symbol: string): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Clearing pending trade configuration', {\n symbol,\n network,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n }\n\n /**\n * Get saved market filter preferences\n * Handles backward compatibility with legacy string format\n *\n * @returns The saved sort option ID and direction.\n */\n getMarketFilterPreferences(): {\n optionId: SortOptionId;\n direction: SortDirection;\n } {\n const pref = this.state.marketFilterPreferences;\n\n // Handle legacy string format (backward compatibility)\n if (typeof pref === 'string') {\n // Map legacy compound IDs to new format\n // Old format: 'priceChange-desc' or 'priceChange-asc'\n // New format: { optionId: 'priceChange', direction: 'desc'/'asc' }\n if (pref === 'priceChange-desc') {\n return {\n optionId: 'priceChange',\n direction: 'desc',\n };\n }\n if (pref === 'priceChange-asc') {\n return {\n optionId: 'priceChange',\n direction: 'asc',\n };\n }\n\n // Handle other simple legacy strings (e.g., 'volume', 'openInterest', etc.)\n return {\n optionId: pref,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n };\n }\n\n // Return new object format or default\n return (\n pref ?? {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n }\n );\n }\n\n /**\n * Save market filter preferences\n *\n * @param optionId - Sort/filter option ID\n * @param direction - Sort direction ('asc' or 'desc')\n */\n saveMarketFilterPreferences(\n optionId: SortOptionId,\n direction: SortDirection,\n ): void {\n this.#debugLog('PerpsController: Saving market filter preferences', {\n optionId,\n direction,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n state.marketFilterPreferences = { optionId, direction };\n });\n }\n\n /**\n * Get the user's max slippage tolerance in basis points.\n *\n * @returns The configured max slippage bps, or undefined if never set (callers should default to 300 bps / 3%).\n */\n getMaxSlippage(): number | undefined {\n return this.state.maxSlippageBps;\n }\n\n /**\n * Set the user's max slippage tolerance in basis points.\n *\n * @param bps - Max slippage in basis points (e.g. 300 = 3%). Clamped to 10–1000, snapped to step of 10.\n */\n setMaxSlippage(bps: number): void {\n // Reject non-finite input (NaN/Infinity) so it cannot reach the order\n // path, where it would poison `getMaxSlippage` and produce a NaN limit\n // price. `Math.max(..., NaN)` returns NaN and `??` does not catch it.\n if (!Number.isFinite(bps)) {\n return;\n }\n const clamped = Math.min(\n MAX_SLIPPAGE_BOUNDS.MaxBps,\n Math.max(MAX_SLIPPAGE_BOUNDS.MinBps, bps),\n );\n const snapped =\n Math.round(clamped / MAX_SLIPPAGE_BOUNDS.StepBps) *\n MAX_SLIPPAGE_BOUNDS.StepBps;\n this.update((state) => {\n state.maxSlippageBps = snapped;\n });\n }\n\n /**\n * Get market-agnostic Pro order-book display preferences.\n *\n * @returns The current order-book display preferences.\n */\n getOrderBookPreferences(): OrderBookPreferences {\n return {\n ...DEFAULT_ORDER_BOOK_PREFERENCES,\n ...this.state.orderBookPreferences,\n };\n }\n\n /**\n * Update market-agnostic Pro order-book display preferences.\n *\n * @param patch - Partial order-book preferences to update.\n */\n setOrderBookPreferences(patch: Partial<OrderBookPreferences>): void {\n this.update((state) => {\n state.orderBookPreferences = {\n ...DEFAULT_ORDER_BOOK_PREFERENCES,\n ...state.orderBookPreferences,\n ...patch,\n };\n });\n }\n\n /**\n * Get the selected order type shared by every market.\n *\n * @returns The selected order type.\n */\n getSelectedOrderType(): OrderType {\n return this.state.selectedOrderType ?? DEFAULT_SELECTED_ORDER_TYPE;\n }\n\n /**\n * Set the selected order type shared by every market.\n *\n * @param orderType - The selected order type.\n */\n setSelectedOrderType(orderType: OrderType): void {\n this.update((state) => {\n state.selectedOrderType = orderType;\n });\n }\n\n /**\n * Get the number of candles shown in Lite and Pro chart viewports.\n *\n * @returns The visible candle count.\n */\n getVisibleCandleCount(): number {\n const count = this.state.visibleCandleCount;\n return Number.isFinite(count) ? count : VISIBLE_CANDLE_COUNT_CONFIG.Default;\n }\n\n /**\n * Set the number of candles shown in Lite and Pro chart viewports.\n *\n * @param count - Requested visible candle count.\n */\n setVisibleCandleCount(count: number): void {\n if (!Number.isFinite(count)) {\n return;\n }\n\n const normalized = Math.min(\n VISIBLE_CANDLE_COUNT_CONFIG.Max,\n Math.max(VISIBLE_CANDLE_COUNT_CONFIG.Min, Math.round(count)),\n );\n this.update((state) => {\n state.visibleCandleCount = normalized;\n });\n }\n\n /**\n * Get the user's pro-mode layout preferences (network-independent).\n *\n * @returns The current pro-mode layout preferences.\n */\n getProLayoutPreferences(): ProLayoutPreferences {\n // Merge over defaults so callers always receive a fully-populated object,\n // even if the persisted state predates one of the fields.\n return {\n ...DEFAULT_PRO_LAYOUT_PREFERENCES,\n ...this.state.proLayoutPreferences,\n };\n }\n\n /**\n * Update the user's pro-mode layout preferences.\n *\n * Patch-style setter: only the provided fields are updated, the rest are\n * preserved. This keeps the signature stable as new layout fields are added.\n *\n * @param patch - Partial set of pro-mode layout preferences to update.\n */\n setProLayoutPreferences(patch: Partial<ProLayoutPreferences>): void {\n this.update((state) => {\n state.proLayoutPreferences = {\n ...state.proLayoutPreferences,\n ...patch,\n };\n });\n }\n\n /**\n * Set the Perps interface mode (lite/pro).\n *\n * @param mode - The mode to switch to.\n */\n setPerpsMode(mode: PerpsMode): void {\n this.update((state) => {\n state.mode = mode;\n });\n }\n\n /**\n * Set the selected payment token for the Perps order/deposit flow.\n * Pass null or a token with description PERPS_CONSTANTS.PerpsBalanceTokenDescription to select Perps balance.\n * Only required fields (address, chainId) are stored in state; description and symbol are optional.\n *\n * @param token - The token identifier.\n */\n setSelectedPaymentToken(token: PerpsSelectedPaymentToken | null): void {\n let normalized: PerpsSelectedPaymentToken | null = null;\n if (\n token !== null &&\n token.description !== PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ) {\n normalized = token;\n }\n\n const current = this.state.selectedPaymentToken as\n | SelectedPaymentTokenSnapshot\n | null\n | undefined;\n const initialPaymentMethod =\n current === null ||\n current === undefined ||\n current?.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (current?.symbol ?? 'unknown');\n const newPaymentMethod =\n token === null ||\n token.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (token.symbol ?? 'unknown');\n\n if (initialPaymentMethod !== newPaymentMethod) {\n this.#getMetrics().trackPerpsEvent(PerpsAnalyticsEvent.UiInteraction, {\n [PERPS_EVENT_PROPERTY.INTERACTION_TYPE]:\n PERPS_EVENT_VALUE.INTERACTION_TYPE.PAYMENT_METHOD_CHANGED,\n [PERPS_EVENT_PROPERTY.INITIAL_PAYMENT_METHOD]: initialPaymentMethod,\n [PERPS_EVENT_PROPERTY.NEW_PAYMENT_METHOD]: newPaymentMethod,\n });\n }\n\n let snapshot: Json | null = null;\n if (normalized !== null) {\n snapshot = {\n ...(normalized.description !== undefined && {\n description: normalized.description,\n }),\n address: normalized.address,\n chainId: normalized.chainId,\n symbol: normalized.symbol,\n } as unknown as Json;\n }\n\n this.update((state) => {\n state.selectedPaymentToken = snapshot;\n });\n }\n\n /**\n * Reset the selected payment token to Perps balance (null).\n * Call when leaving the Perps order view so the next visit defaults to Perps balance.\n */\n resetSelectedPaymentToken(): void {\n this.update((state) => {\n state.selectedPaymentToken = null;\n });\n }\n\n /**\n * Get saved order book grouping for a market\n *\n * @param symbol - Market symbol\n * @returns The saved grouping value or undefined if not set\n */\n getOrderBookGrouping(symbol: string): number | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const grouping =\n this.state.tradeConfigurations[network]?.[symbol]?.orderBookGrouping;\n\n if (grouping !== undefined) {\n this.#debugLog('PerpsController: Retrieved order book grouping', {\n symbol,\n network,\n grouping,\n });\n }\n\n return grouping;\n }\n\n /**\n * Save order book grouping for a market\n *\n * @param symbol - Market symbol\n * @param grouping - Price grouping value\n */\n saveOrderBookGrouping(symbol: string, grouping: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving order book grouping', {\n symbol,\n network,\n grouping,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n orderBookGrouping: grouping,\n };\n });\n }\n\n /**\n * Get the saved margin mode (Isolated/Cross) for a market on the current\n * network. Clients should still let a venue-enforced mode take priority.\n *\n * @param symbol - Market symbol\n * @returns The saved margin mode or undefined if not set\n */\n getMarginMode(symbol: string): MarginMode | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.tradeConfigurations[network]?.[symbol]?.marginMode;\n }\n\n /**\n * Save the margin mode (Isolated/Cross) picked for a market on the current\n * network. Values other than `isolated` or `cross` are ignored.\n *\n * @param symbol - Market symbol\n * @param marginMode - Margin mode to persist\n */\n saveMarginMode(symbol: string, marginMode: MarginMode): void {\n if (marginMode !== 'isolated' && marginMode !== 'cross') {\n return;\n }\n\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving margin mode', {\n symbol,\n network,\n marginMode,\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n marginMode,\n };\n });\n }\n\n /**\n * Toggle watchlist status for a market.\n *\n * Updates local state immediately (optimistic UI) and then syncs the new\n * watchlist to AuthenticatedUserStorageService. If the remote write fails,\n * the local state is reverted so it stays consistent with AUS.\n *\n * When the user is unauthenticated, or the active provider is not yet\n * supported by the AUS schema, the controller continues operating with\n * local-persisted state only — no error is surfaced to the caller.\n *\n * Watchlist markets are stored per network (testnet/mainnet).\n *\n * @param symbol - The trading pair symbol.\n */\n async toggleWatchlistMarket(symbol: string): Promise<void> {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const currentWatchlist = this.state.watchlistMarkets[currentNetwork];\n const isWatchlisted = currentWatchlist.includes(symbol);\n\n this.#debugLog('PerpsController: Toggling watchlist market', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n symbol,\n action: isWatchlisted ? 'remove' : 'add',\n });\n\n // Step 1: Optimistic local state update — UI reflects change immediately.\n this.update((state) => {\n if (isWatchlisted) {\n state.watchlistMarkets[currentNetwork] = currentWatchlist.filter(\n (marketSymbol) => marketSymbol !== symbol,\n );\n } else {\n state.watchlistMarkets[currentNetwork] = [...currentWatchlist, symbol];\n }\n });\n\n this.#getMetrics().trackPerpsEvent(PerpsAnalyticsEvent.UiInteraction, {\n [PERPS_EVENT_PROPERTY.INTERACTION_TYPE]:\n PERPS_EVENT_VALUE.INTERACTION_TYPE.FAVORITE_TOGGLED,\n [PERPS_EVENT_PROPERTY.ASSET]: symbol,\n [PERPS_EVENT_PROPERTY.ACTION_TYPE]: isWatchlisted\n ? PERPS_EVENT_VALUE.ACTION_TYPE.UNFAVORITE_MARKET\n : PERPS_EVENT_VALUE.ACTION_TYPE.FAVORITE_MARKET,\n [PERPS_EVENT_PROPERTY.FAVORITES_COUNT]:\n this.state.watchlistMarkets[currentNetwork].length,\n });\n\n // Step 2: Persist to AUS; revert local state if the write fails.\n // Enqueue behind #ausQueue so that:\n // - concurrent toggles serialize their GET-merge-PUT sequences, and\n // - any in-flight init hydration completes before we issue a write.\n try {\n await new Promise<void>((resolve, reject) => {\n this.#ausQueue = this.#ausQueue\n .then(() => this.#persistWatchlistToRemote(currentNetwork))\n .then(resolve, reject)\n // Swallow the error on the queue chain so later operations can run.\n .catch(() => undefined);\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.toggleWatchlistMarket'),\n this.#getErrorContext('toggleWatchlistMarket', {\n symbol,\n network: currentNetwork,\n action: isWatchlisted ? 'remove' : 'add',\n }),\n );\n // Revert the optimistic update.\n this.update((state) => {\n state.watchlistMarkets[currentNetwork] = currentWatchlist;\n });\n }\n }\n\n /**\n * Check if a market is in the watchlist on the current network\n *\n * @param symbol - The trading pair symbol.\n * @returns True if the condition is met.\n */\n isWatchlistMarket(symbol: string): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork].includes(symbol);\n }\n\n /**\n * Get all watchlist markets for the current network\n *\n * @returns The resulting string value.\n */\n getWatchlistMarkets(): string[] {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork];\n }\n\n /**\n * Record that the user viewed a market.\n *\n * The symbol is prepended to the per-network recently-viewed list (newest-first).\n * Any existing entry for the same symbol is removed first so there are no\n * duplicates. The list is then capped at PERPS_CONSTANTS.RecentlyViewedMarketsLimit.\n *\n * @param symbol - The trading pair symbol (e.g. 'BTC', 'ETH', 'xyz:TSLA').\n */\n recordMarketViewed(symbol: string): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const now = Date.now();\n\n this.update((state) => {\n const current = state.recentlyViewedMarkets[currentNetwork].filter(\n (entry) => entry.symbol !== symbol,\n );\n state.recentlyViewedMarkets[currentNetwork] = [\n { symbol, viewedAt: now },\n ...current,\n ].slice(0, PERPS_CONSTANTS.RecentlyViewedMarketsLimit);\n });\n }\n\n /**\n * Get recently viewed markets for the current network.\n *\n * Returns up to PERPS_CONSTANTS.RecentlyViewedMarketsLimit symbols, ordered\n * newest-first, filtered to entries within the last\n * PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs (24 hours). Returns an empty\n * array when no qualifying entries exist.\n *\n * @returns Ordered array of market symbols.\n */\n getRecentlyViewedMarkets(): string[] {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const cutoff = Date.now() - PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs;\n\n return this.state.recentlyViewedMarkets[currentNetwork]\n .filter((entry) => entry.viewedAt > cutoff)\n .map((entry) => entry.symbol)\n .slice(0, PERPS_CONSTANTS.RecentlyViewedMarketsLimit);\n }\n\n /**\n * Writes the current local watchlist to AuthenticatedUserStorageService\n * using a read-merge-write strategy to avoid overwriting other preferences.\n *\n * Skips silently when:\n * - The active provider has no AUS exchange key (e.g. `'aggregated'`).\n * - The remote preferences blob does not yet exist (returns `null` / 404).\n * In that case, `NotificationServicesController.createOnChainTriggers` is\n * the canonical owner that creates the initial blob.\n *\n * Throws on remote write failure so the caller can decide whether to revert.\n *\n * @param network - Which network's list to sync ('testnet' | 'mainnet').\n */\n async #persistWatchlistToRemote(\n network: 'testnet' | 'mainnet',\n ): Promise<void> {\n const exchangeKey = resolveWatchlistExchangeKey(this.state.activeProvider);\n if (!exchangeKey) {\n this.#debugLog(\n 'PerpsController: Skipping AUS watchlist sync — provider not mapped',\n { activeProvider: this.state.activeProvider },\n );\n return;\n }\n\n const prefs = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n if (!prefs) {\n this.#debugLog(\n 'PerpsController: Skipping AUS watchlist write — preferences blob not yet initialised',\n { exchangeKey, network },\n );\n return;\n }\n\n const existingWatchlist: PerpsWatchlistMarkets = prefs.perps\n .watchlistMarkets ?? {\n hyperliquid: { testnet: [], mainnet: [] },\n };\n\n const nextWatchlistMarkets: PerpsWatchlistMarkets = {\n ...existingWatchlist,\n [exchangeKey]: {\n ...existingWatchlist[exchangeKey],\n [network]: this.state.watchlistMarkets[network],\n },\n };\n\n const nextPrefs: NotificationPreferences = {\n ...prefs,\n perps: {\n ...prefs.perps,\n watchlistMarkets: nextWatchlistMarkets,\n },\n };\n\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPrefs,\n );\n\n this.#debugLog('PerpsController: Watchlist synced to AUS', {\n exchangeKey,\n network,\n count: this.state.watchlistMarkets[network].length,\n });\n }\n\n /**\n * Hydrates `state.watchlistMarkets` from AuthenticatedUserStorageService on\n * controller initialisation.\n *\n * AUS is the source of truth; local state is used as an offline cache.\n * This method also handles the one-time migration from local-only state to\n * AUS for users who had a watchlist before AUS sync was introduced.\n *\n * All remote errors are swallowed so a transient network failure does not\n * block the rest of `init()`.\n */\n async #syncWatchlistFromRemote(): Promise<void> {\n const exchangeKey = resolveWatchlistExchangeKey(this.state.activeProvider);\n if (!exchangeKey) {\n this.#debugLog(\n 'PerpsController: Skipping AUS watchlist hydration — provider not mapped',\n { activeProvider: this.state.activeProvider },\n );\n return;\n }\n\n try {\n const prefs = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n if (!prefs) {\n this.#debugLog(\n 'PerpsController: No AUS preferences blob — using local watchlist',\n );\n return;\n }\n\n const remoteExchangeWatchlist =\n prefs.perps.watchlistMarkets?.[exchangeKey];\n\n // AUS is the source of truth: an absent exchange key means this device\n // has not been migrated yet — push any local favorites up once.\n // A present key (even with empty arrays) must be honored as-is,\n // including an intentional remote clear.\n if (remoteExchangeWatchlist === undefined) {\n // Blob exists but has no watchlist for this exchange yet.\n // If local state has any markets, push them up as a one-time migration.\n const { testnet, mainnet } = this.state.watchlistMarkets;\n const hasLocalMarkets = testnet.length > 0 || mainnet.length > 0;\n\n if (hasLocalMarkets) {\n this.#debugLog('PerpsController: Migrating local watchlist to AUS', {\n exchangeKey,\n testnetCount: testnet.length,\n mainnetCount: mainnet.length,\n });\n // Push testnet and mainnet together via a single read-merge-write.\n // Start from existing remote watchlistMarkets (or empty fallback) so\n // that other exchanges already stored in AUS are not overwritten.\n const existingWatchlist: PerpsWatchlistMarkets = prefs.perps\n .watchlistMarkets ?? {\n hyperliquid: { testnet: [], mainnet: [] },\n };\n const nextWatchlistMarkets: PerpsWatchlistMarkets = {\n ...existingWatchlist,\n [exchangeKey]: { testnet, mainnet },\n };\n const nextPrefs: NotificationPreferences = {\n ...prefs,\n perps: {\n ...prefs.perps,\n watchlistMarkets: nextWatchlistMarkets,\n },\n };\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPrefs,\n );\n this.#debugLog('PerpsController: Local watchlist migrated to AUS', {\n exchangeKey,\n });\n }\n } else {\n // AUS has an entry for this exchange — hydrate local state from it.\n this.update((state) => {\n state.watchlistMarkets.testnet = remoteExchangeWatchlist.testnet;\n state.watchlistMarkets.mainnet = remoteExchangeWatchlist.mainnet;\n });\n this.#debugLog('PerpsController: Watchlist hydrated from AUS', {\n exchangeKey,\n testnetCount: remoteExchangeWatchlist.testnet.length,\n mainnetCount: remoteExchangeWatchlist.mainnet.length,\n });\n }\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.syncWatchlistFromRemote'),\n this.#getErrorContext('syncWatchlistFromRemote'),\n );\n }\n }\n\n /**\n * Report order events to data lake API with retry (non-blocking)\n * Thin delegation to DataLakeService\n *\n * @param params - The operation parameters.\n * @param params.action - The order action.\n * @param params.symbol - The trading pair symbol.\n * @param params.slPrice - The stop loss price.\n * @param params.tpPrice - The take profit price.\n * @param params.retryCount - Internal retry counter.\n * @param params._traceId - Internal trace ID.\n * @returns Whether the report was sent successfully, with an optional error message.\n */\n protected async reportOrderToDataLake(params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n retryCount?: number;\n _traceId?: string;\n }): Promise<{ success: boolean; error?: string }> {\n return this.#dataLakeService.reportOrder({\n action: params.action,\n symbol: params.symbol,\n slPrice: params.slPrice,\n tpPrice: params.tpPrice,\n isTestnet: this.state.isTestnet,\n context: this.#createServiceContext('reportOrderToDataLake', {}),\n retryCount: params.retryCount,\n _traceId: params._traceId,\n });\n }\n\n /**\n * Check if the controller is currently reinitializing\n *\n * @returns true if providers are being reinitialized\n */\n public isCurrentlyReinitializing(): boolean {\n return this.#isReinitializing;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"PerpsController.js","sourceRoot":"","sources":["../src/PerpsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n NotificationPreferences,\n PerpsWatchlistMarkets,\n} from '@metamask/authenticated-user-storage';\nimport {\n BaseController,\n ControllerGetStateAction,\n ControllerStateChangedEvent,\n ControllerStateChangeEvent,\n StateMetadata,\n} from '@metamask/base-controller';\nimport type { StateChangeListener } from '@metamask/base-controller';\nimport { ORIGIN_METAMASK } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport type { Json } from '@metamask/utils';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport {\n CandlePeriod,\n VISIBLE_CANDLE_COUNT_CONFIG,\n} from './constants/chartConfig.js';\nimport {\n PERPS_EVENT_PROPERTY,\n PERPS_EVENT_VALUE,\n} from './constants/eventNames.js';\nimport {\n canonicalizeHyperLiquidDexes,\n MAINNET_HIP3_CONFIG,\n TESTNET_HIP3_CONFIG,\n USDC_SYMBOL,\n} from './constants/hyperLiquidConfig.js';\nimport { PerpsMeasurementName } from './constants/performanceMetrics.js';\nimport type {\n SortOptionId,\n OrderBookPreferences,\n ProLayoutPreferences,\n PerpsMode,\n} from './constants/perpsConfig.js';\nimport {\n PERPS_CONSTANTS,\n MARKET_SORTING_CONFIG,\n buildProviderCacheKey,\n MAX_SLIPPAGE_BOUNDS,\n DEFAULT_PERPS_MODE,\n DEFAULT_ORDER_BOOK_PREFERENCES,\n DEFAULT_PRO_LAYOUT_PREFERENCES,\n DEFAULT_SELECTED_ORDER_TYPE,\n} from './constants/perpsConfig.js';\nimport type { PerpsControllerMethodActions } from './PerpsController-method-action-types.js';\nimport { PERPS_ERROR_CODES } from './perpsErrorCodes.js';\nimport { AggregatedPerpsProvider } from './providers/AggregatedPerpsProvider.js';\nimport { HyperLiquidProvider } from './providers/HyperLiquidProvider.js';\nimport { AccountService } from './services/AccountService.js';\nimport { isMainAccountSignerReady } from './services/accountSigner.js';\nimport { AgentBindings } from './services/agentSigner.js';\nimport { DataLakeService } from './services/DataLakeService.js';\nimport { DepositService } from './services/DepositService.js';\nimport { EligibilityService } from './services/EligibilityService.js';\nimport { FeatureFlagConfigurationService } from './services/FeatureFlagConfigurationService.js';\nimport { MarketDataService } from './services/MarketDataService.js';\nimport { isProviderOnTestnet } from './services/providerNetwork.js';\nimport { RewardsIntegrationService } from './services/RewardsIntegrationService.js';\nimport type { ServiceContext } from './services/ServiceContext.js';\nimport { TerminalMarketService } from './services/TerminalMarketService.js';\nimport { TradingService } from './services/TradingService.js';\n// PerpsStreamChannelKey removed: using string for channel keys (PerpsStreamManager.pauseChannel takes string)\nimport {\n WebSocketConnectionState,\n PerpsAnalyticsEvent,\n PerpsTraceNames,\n PerpsTraceOperations,\n isVersionGatedFeatureFlag,\n MARKET_CATEGORIES,\n // Platform dependencies interface for core migration (bundles all platform-specific deps)\n} from './types/index.js';\nimport type {\n AccountState,\n AssetRoute,\n CancelOrderParams,\n CancelOrderResult,\n CancelOrdersParams,\n CancelOrdersResult,\n ChaseOrder,\n ChaseOrderMaxDistanceReached,\n ClosePositionParams,\n ClosePositionsParams,\n ClosePositionsResult,\n DepositWithConfirmationParams,\n EditOrderParams,\n FeeCalculationParams,\n FeeCalculationResult,\n FlipPositionParams,\n Funding,\n GetAccountStateParams,\n GetAvailableDexsParams,\n GetFundingParams,\n GetMarketDataWithPricesParams,\n GetMarketsParams,\n GetOrderCapabilitiesParams,\n GetMarginModeLockParams,\n GetScalePriceLadderParams,\n GetOrderFillsParams,\n GetOrdersParams,\n GetPositionsParams,\n PerpsProvider,\n LiquidationPriceParams,\n LiveDataConfig,\n MaintenanceMarginParams,\n PositionModifyPreviewParams,\n PositionModifyPreviewResult,\n MarginMode,\n MarginResult,\n MarketInfo,\n Order,\n OrderCapabilitiesUnavailableReason,\n MarginModeLockUnavailableReason,\n OrderDirection,\n OrderFill,\n OrderParams,\n OrderResult,\n PerpsControllerConfig,\n PerpsMarketData,\n PerpsOrderCapabilities,\n PerpsMarginModeLock,\n PerpsScalePriceLadder,\n ScalePriceLadderUnavailableReason,\n PerpsPendingManualRecovery,\n PerpsRecoveredDispatch,\n Position,\n SubscribeAccountParams,\n SubscribeCandlesParams,\n SubscribeOICapsParams,\n SubscribeOrderBookParams,\n SubscribeOrderFillsParams,\n SubscribeOrdersParams,\n SubscribeTwapOrdersParams,\n SubscribePositionsParams,\n SubscribePricesParams,\n ReadyToTradeResult,\n SwitchProviderResult,\n ToggleTestnetResult,\n TwapOrder,\n UpdateMarginParams,\n UpdatePositionTPSLParams,\n WithdrawParams,\n WithdrawResult,\n GetHistoricalPortfolioParams,\n HistoricalPortfolioResult,\n OrderType,\n PerpsAgentAccount,\n PerpsAgentSigner,\n PerpsPlatformDependencies,\n PerpsLogger,\n PerpsActiveProviderMode,\n PerpsAnalyticsProperties,\n PerpsAttributionContext,\n PerpsProviderType,\n PerpsUserDataSnapshot,\n PerpsSelectedPaymentToken,\n PerpsRemoteFeatureFlagState,\n PerpsTransactionParams,\n PerpsAddTransactionOptions,\n MarketTypeFilter,\n} from './types/index.js';\nimport type { SortDirection } from './types/index.js';\nimport type {\n LighterAuthConfig,\n LighterSignerBridge,\n} from './types/lighter-types.js';\nimport type {\n PerpsControllerAllowedActions,\n PerpsControllerAllowedEvents,\n} from './types/messenger.js';\nimport type { CandleData } from './types/perps-types.js';\nimport {\n LastTransactionResult,\n TransactionStatus,\n} from './types/transactionTypes.js';\nimport { getSelectedEvmAccountFromMessenger } from './utils/accountUtils.js';\nimport { ensureError } from './utils/errorUtils.js';\nimport { parseAssetName } from './utils/hyperLiquidAdapter.js';\nimport {\n clonePerpsMarketData,\n compileMarketPattern,\n shouldIncludeMarket,\n} from './utils/marketUtils.js';\nimport type { CompiledMarketPattern } from './utils/marketUtils.js';\nimport { isStrategyOrderType } from './utils/orderTypes.js';\nimport {\n hydrateFromDiskSync,\n persistMarketEntriesToDisk,\n persistUserEntriesToDisk,\n} from './utils/perpsDiskPersistence.js';\nimport type { DiskCacheUserEntry } from './utils/perpsDiskPersistence.js';\nimport { wait } from './utils/wait.js';\n\n/** Derived type for logger options from PerpsLogger interface */\ntype PerpsLoggerOptions = Parameters<PerpsLogger['error']>[1];\n\nfunction cloneUserDataSnapshot(\n snapshot: PerpsUserDataSnapshot,\n): PerpsUserDataSnapshot {\n return {\n positions: snapshot.positions.map((position) => ({\n ...position,\n leverage: { ...position.leverage },\n cumulativeFunding: { ...position.cumulativeFunding },\n ...(position.takeProfitOrders && {\n takeProfitOrders: position.takeProfitOrders.map((order) => ({\n ...order,\n })),\n }),\n ...(position.stopLossOrders && {\n stopLossOrders: position.stopLossOrders.map((order) => ({\n ...order,\n })),\n }),\n })),\n orders: snapshot.orders.map((order) => ({ ...order })),\n accountState: {\n ...snapshot.accountState,\n ...(snapshot.accountState.subAccountBreakdown && {\n subAccountBreakdown: Object.fromEntries(\n Object.entries(snapshot.accountState.subAccountBreakdown).map(\n ([dex, balances]) => [dex, { ...balances }],\n ),\n ),\n }),\n },\n identity: {\n ...snapshot.identity,\n dexes: [...snapshot.identity.dexes],\n },\n };\n}\n\n/**\n * Maps an active provider mode to the corresponding exchange key used in the\n * AUS {@link PerpsWatchlistMarkets} schema.\n *\n * Returns `null` for modes that are not yet represented in the AUS schema\n * (e.g. `'aggregated'`), which signals callers to skip remote sync and fall\n * back to local state only. Add new entries here as additional DEX providers\n * gain AUS watchlist support.\n *\n * @param activeProvider - The current active provider mode from controller state.\n * @returns The matching `PerpsWatchlistMarkets` key, or `null` if unsupported.\n */\nexport function resolveWatchlistExchangeKey(\n activeProvider: PerpsActiveProviderMode,\n): keyof PerpsWatchlistMarkets | null {\n const map: Partial<\n Record<PerpsActiveProviderMode, keyof PerpsWatchlistMarkets>\n > = {\n hyperliquid: 'hyperliquid',\n };\n return map[activeProvider] ?? null;\n}\n\n// PaymentToken: minimal interface for deposit flow (replaces mobile-only AssetType)\n\n/**\n * Minimal payment token stored in PerpsController state.\n * Only required fields for identification, Perps balance detection, and analytics.\n */\nexport type SelectedPaymentTokenSnapshot = {\n description?: string;\n address: string;\n chainId: string;\n symbol?: string;\n};\n\n// Re-export error codes from separate file to avoid circular dependencies\nexport { PERPS_ERROR_CODES, type PerpsErrorCode } from './perpsErrorCodes.js';\n\n/**\n * Initialization state enum for state machine tracking\n */\nexport enum InitializationState {\n Uninitialized = 'uninitialized',\n Initializing = 'initializing',\n Initialized = 'initialized',\n Failed = 'failed',\n}\n\n// Re-exported so consumers can keep importing these from the controller entry\n// point; the canonical definitions live in the dependency-free constants module.\nexport {\n PerpsMode,\n DEFAULT_ORDER_BOOK_PREFERENCES,\n DEFAULT_PERPS_MODE,\n DEFAULT_PRO_LAYOUT_PREFERENCES,\n DEFAULT_SELECTED_ORDER_TYPE,\n} from './constants/perpsConfig.js';\nexport type {\n OrderBookListCurrency,\n OrderBookListMetric,\n OrderBookPreferences,\n ProLayoutPreferences,\n ProOrdersSideFilter,\n ProOrdersSortDirection,\n ProOrdersSortField,\n ProPositionsSideFilter,\n ProPositionsSortDirection,\n ProPositionsSortField,\n} from './constants/perpsConfig.js';\n\n/**\n * State shape for PerpsController\n */\nexport type PerpsControllerState = {\n // Active provider\n activeProvider: PerpsActiveProviderMode;\n isTestnet: boolean; // Dev toggle for testnet\n\n // Initialization state machine\n initializationState: InitializationState;\n initializationError: string | null;\n initializationAttempts: number;\n\n // Account data (persisted) - using HyperLiquid property names\n accountState: AccountState | null;\n\n // Perps balances per provider for portfolio display (historical data)\n perpsBalances: {\n [provider: string]: {\n totalBalance: string; // Current total account value (cash + positions) in USD\n unrealizedPnl: string; // Current P&L from open positions in USD\n accountValue1dAgo: string; // Account value 24h ago for daily change calculation in USD\n lastUpdated: number; // Timestamp of last update\n };\n };\n\n // Simple deposit state (transient, for UI feedback)\n depositInProgress: boolean;\n // Internal transaction id for the deposit transaction\n // We use this to fetch the bridge quotes and get the estimated time.\n lastDepositTransactionId: string | null;\n lastDepositResult: LastTransactionResult | null;\n\n // Simple withdrawal state (transient, for UI feedback)\n // Note: withdrawInProgress is now derived from withdrawalRequests having pending/bridging entries\n withdrawInProgress: boolean;\n lastWithdrawResult: LastTransactionResult | null;\n\n // FIFO guard for withdrawal completion matching.\n // Timestamp is persisted — survives app restarts so the hook skips\n // already-processed history entries even after relaunch.\n // TxHashes array is NOT persisted — it tracks completions within a\n // single session to prevent re-matching (direct completions,\n // same-millisecond API completions). Resets naturally on app restart;\n // the timestamp guard provides cross-restart protection.\n lastCompletedWithdrawalTimestamp: number | null;\n lastCompletedWithdrawalTxHashes: string[];\n\n // Withdrawal request tracking (persistent, for transaction history)\n withdrawalRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this withdrawal\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Withdrawal progress tracking (persistent across navigation)\n withdrawalProgress: {\n progress: number; // 0-100\n lastUpdated: number; // timestamp\n activeWithdrawalId: string | null; // ID of the withdrawal being tracked\n };\n\n // Deposit request tracking (persistent, for transaction history)\n depositRequests: {\n id: string;\n amount: string;\n asset: string;\n accountAddress: string; // Account that initiated this deposit\n txHash?: string;\n timestamp: number;\n success: boolean;\n status: TransactionStatus;\n destination?: string;\n source?: string;\n transactionId?: string;\n withdrawalId?: string;\n depositId?: string;\n }[];\n\n // Eligibility (Geo-Blocking)\n isEligible: boolean;\n\n // Tutorial/First time user tracking (per network)\n isFirstTimeUser: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Notification tracking\n hasPlacedFirstOrder: {\n testnet: boolean;\n mainnet: boolean;\n };\n\n // Watchlist markets tracking (per network)\n watchlistMarkets: {\n testnet: string[]; // Array of watchlist market symbols for testnet\n mainnet: string[]; // Array of watchlist market symbols for mainnet\n };\n\n // Recently viewed markets tracking (per network, persisted)\n // Entries are ordered newest-first. TTL filtering and the 10-item cap\n // are applied on read in getRecentlyViewedMarkets / selectRecentlyViewedMarkets.\n recentlyViewedMarkets: {\n testnet: { symbol: string; viewedAt: number }[];\n mainnet: { symbol: string; viewedAt: number }[];\n };\n\n // Trade configurations per market (per network)\n tradeConfigurations: {\n testnet: {\n [marketSymbol: string]: {\n leverage?: number; // Last used leverage for this market\n orderBookGrouping?: number; // Persisted price grouping for order book\n marginMode?: MarginMode; // Last Isolated/Cross pick for this market\n // Pending trade configuration (temporary, expires after 30 seconds)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n reduceOnly?: boolean; // Whether the order may only reduce a position\n direction?: OrderDirection; // Long vs short\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n mainnet: {\n [marketSymbol: string]: {\n leverage?: number;\n orderBookGrouping?: number; // Persisted price grouping for order book\n marginMode?: MarginMode; // Last Isolated/Cross pick for this market\n // Pending trade configuration (temporary, expires after 30 seconds)\n pendingConfig?: {\n amount?: string; // Order size in USD\n leverage?: number; // Leverage\n takeProfitPrice?: string; // Take profit price\n stopLossPrice?: string; // Stop loss price\n limitPrice?: string; // Limit price (for limit orders)\n orderType?: OrderType; // Market vs limit\n reduceOnly?: boolean; // Whether the order may only reduce a position\n direction?: OrderDirection; // Long vs short\n timestamp: number; // When the config was saved (for expiration check)\n };\n };\n };\n };\n\n // Max slippage tolerance in basis points (e.g. 300 = 3%). Global user preference.\n maxSlippageBps?: number;\n\n // Market filter preferences (network-independent) - includes both sorting and filtering options\n marketFilterPreferences: {\n optionId: SortOptionId;\n direction: SortDirection;\n };\n\n // Pro-mode layout preferences (network-independent). Flat object that\n // persists across markets (unlike the per-market tradeConfigurations).\n proLayoutPreferences: ProLayoutPreferences;\n\n // Pro order-book display preferences (network-independent).\n orderBookPreferences: OrderBookPreferences;\n\n // Last selected order type, shared across markets and networks.\n selectedOrderType: OrderType;\n\n // Number of candles visible in Lite and Pro chart viewports.\n visibleCandleCount: number;\n\n // Perps interface mode (lite/pro), network-independent global preference.\n mode: PerpsMode;\n\n // Error handling\n lastError: string | null;\n lastUpdateTimestamp: number;\n\n // HIP-3 Configuration Version (incremented when HIP-3 remote flags change)\n // Used to trigger reconnection and cache invalidation in ConnectionManager\n hip3ConfigVersion: number;\n\n // Selected payment token for Perps order/deposit flow (null = Perps balance). Stored as Json (minimal shape: description, address, chainId).\n selectedPaymentToken: Json | null;\n\n // Cached market data from background preloading (REST snapshots, not WebSocket)\n // Keyed by \"providerId:network\" (e.g. 'hyperliquid:mainnet', 'lighter:testnet')\n cachedMarketDataByProvider: Record<\n string,\n {\n data: PerpsMarketData[];\n timestamp: number;\n sourceExpiresAt?: number;\n hip3ConfigVersion?: number;\n dexes?: string[];\n }\n >;\n\n // Cached user data from background preloading (REST snapshots, not WebSocket)\n // Keyed by \"providerId:network\". The entry carries the selected address and\n // exact HyperLiquid configuration identity, both validated before reads.\n cachedUserDataByProvider: Record<\n string,\n {\n positions: Position[];\n orders: Order[];\n accountState: AccountState | null;\n timestamp: number;\n address: string;\n hip3ConfigVersion?: number;\n dexes?: string[];\n }\n >;\n};\n\n/**\n * Get default PerpsController state\n *\n * To change the active provider, modify the `activeProvider` value below:\n * - 'hyperliquid': HyperLiquid provider (default, production)\n * - 'aggregated': Multi-provider aggregation mode\n *\n * @returns The default perps controller state.\n */\nexport const getDefaultPerpsControllerState = (): PerpsControllerState => ({\n activeProvider: 'hyperliquid',\n isTestnet: false, // Default to mainnet\n initializationState: InitializationState.Uninitialized,\n initializationError: null,\n initializationAttempts: 0,\n accountState: null,\n perpsBalances: {},\n depositInProgress: false,\n lastDepositResult: null,\n withdrawInProgress: false,\n lastDepositTransactionId: null,\n lastWithdrawResult: null,\n lastCompletedWithdrawalTimestamp: null,\n lastCompletedWithdrawalTxHashes: [],\n withdrawalRequests: [],\n withdrawalProgress: {\n progress: 0,\n lastUpdated: 0,\n activeWithdrawalId: null,\n },\n depositRequests: [],\n lastError: null,\n lastUpdateTimestamp: 0,\n isEligible: false,\n isFirstTimeUser: {\n testnet: true,\n mainnet: true,\n },\n hasPlacedFirstOrder: {\n testnet: false,\n mainnet: false,\n },\n watchlistMarkets: {\n testnet: [],\n mainnet: [],\n },\n recentlyViewedMarkets: {\n testnet: [],\n mainnet: [],\n },\n tradeConfigurations: {\n testnet: {},\n mainnet: {},\n },\n marketFilterPreferences: {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n },\n proLayoutPreferences: { ...DEFAULT_PRO_LAYOUT_PREFERENCES },\n orderBookPreferences: { ...DEFAULT_ORDER_BOOK_PREFERENCES },\n selectedOrderType: DEFAULT_SELECTED_ORDER_TYPE,\n visibleCandleCount: VISIBLE_CANDLE_COUNT_CONFIG.Default,\n mode: DEFAULT_PERPS_MODE,\n hip3ConfigVersion: 0,\n selectedPaymentToken: null,\n cachedMarketDataByProvider: {},\n cachedUserDataByProvider: {},\n});\n\n/**\n * State metadata for the PerpsController\n */\nconst metadata: StateMetadata<PerpsControllerState> = {\n accountState: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n perpsBalances: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isTestnet: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n activeProvider: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationState: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationError: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n initializationAttempts: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n depositInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositTransactionId: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastDepositResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawInProgress: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastWithdrawResult: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastCompletedWithdrawalTimestamp: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastCompletedWithdrawalTxHashes: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n withdrawalProgress: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n depositRequests: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n lastError: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n lastUpdateTimestamp: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n isEligible: {\n includeInStateLogs: true,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n isFirstTimeUser: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hasPlacedFirstOrder: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n watchlistMarkets: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n recentlyViewedMarkets: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n tradeConfigurations: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n maxSlippageBps: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n marketFilterPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n proLayoutPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n orderBookPreferences: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n selectedOrderType: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n visibleCandleCount: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n mode: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n hip3ConfigVersion: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: false,\n },\n selectedPaymentToken: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedMarketDataByProvider: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n cachedUserDataByProvider: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nexport type PerpsControllerChaseOrderMaxDistanceReachedEvent = {\n type: 'PerpsController:chaseOrderMaxDistanceReached';\n payload: [ChaseOrderMaxDistanceReached];\n};\n\n/** PerpsController events. */\nexport type PerpsControllerEvents =\n | ControllerStateChangeEvent<'PerpsController', PerpsControllerState>\n | ControllerStateChangedEvent<'PerpsController', PerpsControllerState>\n | PerpsControllerChaseOrderMaxDistanceReachedEvent;\n\n/**\n * The action which can be used to retrieve the state of the\n * {@link PerpsController}.\n */\nexport type PerpsControllerGetStateAction = ControllerGetStateAction<\n 'PerpsController',\n PerpsControllerState\n>;\n\n/**\n * PerpsController actions\n */\nexport type PerpsControllerActions =\n | PerpsControllerGetStateAction\n | PerpsControllerMethodActions;\n\n/**\n * PerpsController messenger constraints.\n * Includes both PerpsController's own actions/events and\n * allowed actions/events from external controllers.\n */\nexport type PerpsControllerMessenger = Messenger<\n 'PerpsController',\n PerpsControllerActions | PerpsControllerAllowedActions,\n PerpsControllerEvents | PerpsControllerAllowedEvents\n>;\n\n/**\n * PerpsController options\n */\nexport type PerpsControllerOptions = {\n messenger: PerpsControllerMessenger;\n state?: Partial<PerpsControllerState>;\n clientConfig?: PerpsControllerConfig;\n /**\n * Platform-specific dependencies (required)\n * Provides logging, metrics, tracing, stream management, and rewards.\n * Cross-controller communication uses the messenger pattern.\n * Must be provided by the platform (mobile/extension) at instantiation time.\n */\n infrastructure: PerpsPlatformDependencies;\n /**\n * When true, defers the initial eligibility (geolocation) check until\n * `startEligibilityMonitoring()` is called. This prevents the eager\n * geolocation fetch from firing during wallet onboarding (privacy compliance).\n */\n deferEligibilityCheck?: boolean;\n};\n\ntype BlockedRegionList = {\n list: string[];\n source: 'remote' | 'fallback';\n};\n\ntype UserSnapshotContext = {\n provider: PerpsProvider;\n standaloneProvider: HyperLiquidProvider | null;\n address: string;\n isTestnet: boolean;\n hip3ConfigVersion: number;\n expectedDexes: string[];\n isCurrent: () => boolean;\n};\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'approveSubscriptionBuilderFee',\n 'calculateFees',\n 'calculateLiquidationPrice',\n 'calculateMaintenanceMargin',\n 'cancelOrder',\n 'cancelOrders',\n 'clearAgentSigners',\n 'clearAttributionContext',\n 'clearDepositResult',\n 'clearPendingTradeConfiguration',\n 'clearPendingTransactionRequests',\n 'clearWithdrawResult',\n 'closePosition',\n 'closePositions',\n 'completeWithdrawalFromHistory',\n 'depositWithConfirmation',\n 'depositWithOrder',\n 'disconnect',\n 'editOrder',\n 'fetchHistoricalCandles',\n 'flipPosition',\n 'getAccountState',\n 'getActiveProvider',\n 'getActiveProviderOrNull',\n 'getAttributionContext',\n 'getAvailableDexs',\n 'getBlockExplorerUrl',\n 'getCachedMarketDataForActiveProvider',\n 'getCachedUserDataForActiveProvider',\n 'getChaseOrders',\n 'getTwapOrders',\n 'getUserDataSnapshot',\n 'getCurrentNetwork',\n 'getFunding',\n 'getHistoricalPortfolio',\n 'getMarketCategories',\n 'getMarketDataWithPrices',\n 'getMarketFilterPreferences',\n 'getMarkets',\n 'getMarginMode',\n 'getMaxLeverage',\n 'getOpenOrders',\n 'getOrderBookGrouping',\n 'getOrderBookPreferences',\n 'getOrderCapabilities',\n 'getMarginModeLock',\n 'getScalePriceLadder',\n 'getOrderFills',\n 'getOrders',\n 'getPendingManualRecoveries',\n 'getPendingTradeConfiguration',\n 'getPositions',\n 'getSelectedOrderType',\n 'getRecoveredDispatches',\n 'acknowledgeRecoveredDispatch',\n 'getTradeConfiguration',\n 'getRecentlyViewedMarkets',\n 'getVisibleCandleCount',\n 'getWatchlistMarkets',\n 'getWebSocketConnectionState',\n 'getWithdrawalProgress',\n 'getWithdrawalRoutes',\n 'init',\n 'invalidateSubscriptionBenefits',\n 'isCurrentlyReinitializing',\n 'isFirstTimeUserOnCurrentNetwork',\n 'isWatchlistMarket',\n 'markFirstOrderCompleted',\n 'markTutorialCompleted',\n 'placeOrder',\n 'prepareTradingWallet',\n 'previewPositionModify',\n 'reconnect',\n 'recordMarketViewed',\n 'refreshEligibility',\n 'resetFirstTimeUserState',\n 'resetSelectedPaymentToken',\n 'getMaxSlippage',\n 'setMaxSlippage',\n 'setOrderBookPreferences',\n 'getProLayoutPreferences',\n 'setProLayoutPreferences',\n 'setPerpsMode',\n 'setSelectedOrderType',\n 'saveMarginMode',\n 'saveMarketFilterPreferences',\n 'saveOrderBookGrouping',\n 'savePendingTradeConfiguration',\n 'saveTradeConfiguration',\n 'setAgentSigner',\n 'setAttributionContext',\n 'setLiveDataConfig',\n 'setSelectedPaymentToken',\n 'setVisibleCandleCount',\n 'startEligibilityMonitoring',\n 'startMarketDataPreload',\n 'stopEligibilityMonitoring',\n 'stopMarketDataPreload',\n 'subscribeToAccount',\n 'subscribeToCandles',\n 'subscribeToConnectionState',\n 'subscribeToOICaps',\n 'subscribeToOrderBook',\n 'subscribeToOrderFills',\n 'subscribeToOrders',\n 'subscribeToPositions',\n 'subscribeToPrices',\n 'subscribeToTwapOrders',\n 'suspendChaseOrders',\n 'switchProvider',\n 'toggleTestnet',\n 'toggleWatchlistMarket',\n 'updateMargin',\n 'updatePositionTPSL',\n 'updateWithdrawalProgress',\n 'updateWithdrawalStatus',\n 'validateClosePosition',\n 'validateOrder',\n 'validateWithdrawal',\n 'withdraw',\n] as const;\n\n/**\n * PerpsController - Protocol-agnostic perpetuals trading controller\n *\n * Provides a unified interface for perpetual futures trading across multiple protocols.\n * Features dual data flow architecture:\n * - Trading actions use Redux for persistence and optimistic updates\n * - Live data uses direct callbacks for maximum performance\n */\nexport class PerpsController extends BaseController<\n 'PerpsController',\n PerpsControllerState,\n PerpsControllerMessenger\n> {\n protected providers: Map<PerpsProviderType, PerpsProvider>;\n\n protected isInitialized = false;\n\n #initializationPromise: Promise<void> | null = null;\n\n // Actions that saw a disconnect wait here for the client's follow-up init().\n readonly #initializationStartWaiters = new Set<() => void>();\n\n #isReinitializing = false;\n\n #reinitializationOperationPromise: Promise<void> | null = null;\n\n #disconnectOperationPromise: Promise<void> | null = null;\n\n #lighterRegistrationPromise: Promise<void> | null = null;\n\n protected blockedRegionList: BlockedRegionList = {\n list: [],\n source: 'fallback',\n };\n\n /**\n * Version counter for blocked region list.\n * Used to prevent race conditions where stale eligibility checks\n * (started with fallback config) overwrite results from newer checks\n * (started with remote config).\n */\n #blockedRegionListVersion = 0;\n\n // Store HIP-3 configuration (mutable for runtime updates from remote flags)\n #hip3Enabled: boolean;\n\n #hip3AllowlistMarkets: string[];\n\n #hip3BlocklistMarkets: string[];\n\n #hip3ConfigSource: 'remote' | 'fallback' = 'fallback';\n\n // Optional client override for the max market-vs-oracle price deviation before a\n // market is reported untradable (PriceUpdate.isTradable). Protocol-agnostic: passed\n // through to each provider, which applies its own default when this is undefined.\n readonly #priceDeviationLimit?: number;\n\n /**\n * Transient UTM / discovery attribution context.\n * Held in-memory only (never persisted in PerpsControllerState) and merged\n * into analytics event properties via {@link mergeAttributionContext}.\n */\n #attributionContext: PerpsAttributionContext = {};\n\n /**\n * Check if the Lighter provider is enabled.\n *\n * Local override (`providerCredentials.lighter.enabled`) wins; otherwise\n * the remote `perpsLighterProviderEnabled` feature flag decides — but only\n * for clients that wired the venue signer bridge. A remote flag must not\n * be able to register a trading provider the client never mounted a\n * signer for (the gates would otherwise split between core and client).\n *\n * @returns True if the condition is met.\n */\n #isLighterProviderEnabled(): boolean {\n const lighter = this.#options.clientConfig?.providerCredentials?.lighter;\n\n if (lighter?.enabled) {\n return true;\n }\n if (!lighter?.signerBridge) {\n return false;\n }\n\n try {\n const remoteState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n const remoteFlag =\n remoteState.remoteFeatureFlags?.perpsLighterProviderEnabled;\n\n if (isVersionGatedFeatureFlag(remoteFlag)) {\n const validated =\n this.#options.infrastructure.featureFlags.validateVersionGated(\n remoteFlag,\n );\n return validated ?? false;\n }\n\n return false;\n } catch {\n return false;\n }\n }\n\n /**\n * Active provider instance for routing operations.\n * When activeProvider is 'hyperliquid' or 'lighter': points to specific provider directly\n * When activeProvider is 'aggregated': points to AggregatedPerpsProvider wrapper\n */\n protected activeProviderInstance: PerpsProvider | null = null;\n\n /**\n * Cached standalone provider for pre-initialization discovery queries.\n * Avoids creating a new HyperLiquidProvider (and potentially leaking WebSocket\n * connections) on every standalone call from the preload cycle.\n */\n #standaloneProvider: HyperLiquidProvider | null = null;\n\n #handlersRegistered = false;\n\n // HyperLiquid agent bindings made through setAgentSigner, kept across\n // provider instances; they answer before the host's getAgentSigner.\n readonly #agentBindings: AgentBindings;\n\n #standaloneProviderIsTestnet: boolean | null = null;\n\n #standaloneProviderHip3Version: number | null = null;\n\n readonly #standaloneProviderOperations = new Map<\n PerpsProvider,\n Set<Promise<unknown>>\n >();\n\n #eligibilityCheckDeferred: boolean;\n\n /**\n * Serial promise queue for all AUS watchlist operations (hydration and\n * individual toggles). Chaining every operation onto this field ensures\n * that:\n *\n * - A toggle that fires immediately after init() always runs *after* the\n * init hydration finishes (Bug 3).\n * - Concurrent toggles are serialised so the last PUT reflects all changes\n * rather than racing with each other (Bug 4).\n *\n * Errors from individual operations are swallowed inside the queue so that\n * a failed operation does not stall subsequent ones.\n */\n #ausQueue: Promise<void> = Promise.resolve();\n\n #userDiskWrite: Promise<void> = Promise.resolve();\n\n // Store options for dependency injection (allows core package to inject platform-specific services)\n readonly #options: PerpsControllerOptions;\n\n // Service instances (instantiated with platform dependencies)\n readonly #tradingService: TradingService;\n\n readonly #marketDataService: MarketDataService;\n\n readonly #accountService: AccountService;\n\n readonly #eligibilityService: EligibilityService;\n\n readonly #dataLakeService: DataLakeService;\n\n readonly #depositService: DepositService;\n\n readonly #featureFlagConfigurationService: FeatureFlagConfigurationService;\n\n readonly #rewardsIntegrationService: RewardsIntegrationService;\n\n readonly #publishChaseOrderMaxDistanceReached = (\n event: ChaseOrderMaxDistanceReached,\n ): void => {\n this.messenger.publish(\n 'PerpsController:chaseOrderMaxDistanceReached',\n event,\n );\n };\n\n constructor({\n messenger,\n state = {},\n clientConfig = {},\n infrastructure,\n deferEligibilityCheck = false,\n }: PerpsControllerOptions) {\n super({\n name: 'PerpsController',\n metadata,\n messenger,\n state: { ...getDefaultPerpsControllerState(), ...state },\n });\n\n this.#eligibilityCheckDeferred = deferEligibilityCheck;\n\n // Store options for dependency injection\n this.#options = {\n messenger,\n state,\n clientConfig,\n infrastructure,\n };\n this.#agentBindings = new AgentBindings(\n clientConfig?.providerCredentials?.hyperliquid?.getAgentSigner,\n );\n\n // Instantiate services with platform dependencies\n // Services that need cross-controller access receive the messenger\n this.#tradingService = new TradingService(infrastructure);\n this.#marketDataService = new MarketDataService({\n ...infrastructure,\n terminalMarketService:\n infrastructure.terminalMarketService ??\n (infrastructure.terminalApi?.marketDataUrl ||\n infrastructure.terminalApiUrl ||\n infrastructure.terminalApi?.globalSnapshotUrl\n ? new TerminalMarketService(infrastructure)\n : undefined),\n });\n this.#accountService = new AccountService(infrastructure, messenger);\n this.#eligibilityService = new EligibilityService(infrastructure);\n this.#dataLakeService = new DataLakeService(infrastructure, messenger);\n this.#depositService = new DepositService(infrastructure, messenger);\n this.#featureFlagConfigurationService = new FeatureFlagConfigurationService(\n infrastructure,\n );\n this.#rewardsIntegrationService = new RewardsIntegrationService(\n infrastructure,\n messenger,\n );\n\n // Set HIP-3 fallback configuration from client (will be updated if remote flags available)\n this.#hip3Enabled = clientConfig.fallbackHip3Enabled ?? false;\n this.#hip3AllowlistMarkets = [\n ...(clientConfig.fallbackHip3AllowlistMarkets ?? []),\n ];\n this.#hip3BlocklistMarkets = [\n ...(clientConfig.fallbackHip3BlocklistMarkets ?? []),\n ];\n this.#priceDeviationLimit = clientConfig.fallbackPriceDeviationLimit;\n\n // Immediately set the fallback region list since RemoteFeatureFlagController is empty by default and takes a moment to populate.\n this.setBlockedRegionList(\n clientConfig.fallbackBlockedRegions ?? [],\n 'fallback',\n );\n\n /**\n * Immediately read current state to catch any flags already loaded\n * This is necessary to avoid race conditions where the RemoteFeatureFlagController fetches flags\n * before the PerpsController initializes its RemoteFeatureFlagController subscription.\n *\n * We still subscribe in case the RemoteFeatureFlagController is not yet populated and updates later.\n */\n try {\n const currentRemoteFeatureFlagState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n\n this.refreshEligibilityOnFeatureFlagChange(currentRemoteFeatureFlagState);\n } catch (error) {\n // If we can't read the remote feature flags at construction time, we'll rely on:\n // 1. The fallback blocked regions already set above\n // 2. The subscription to catch updates when RemoteFeatureFlagController is ready\n this.#logError(\n ensureError(error, 'PerpsController.constructor'),\n this.#getErrorContext('constructor', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n\n // Subscribe for the full controller lifetime — intentionally not stored;\n // geo-blocking and HIP-3 flag propagation must remain active across\n // disconnect → reconnect cycles and must never be torn down.\n this.messenger.subscribe(\n 'RemoteFeatureFlagController:stateChange',\n this.refreshEligibilityOnFeatureFlagChange.bind(this),\n );\n\n // Also subscribed for the controller lifetime: the subscription profile\n // must learn the new trading address after every account switch, and the\n // preload-scoped account handler is torn down on disconnect, so it cannot\n // carry this.\n const forgetRegisteredTradingAddresses = (): void => {\n this.#rewardsIntegrationService.resetRegisteredTradingAddresses();\n // Clearing alone only guarantees the *next preview* re-registers. An\n // order submitted straight after a switch, with no preview in between,\n // would otherwise be attributed to nothing, so the new address announces\n // itself here. Fire-and-forget: attribution plumbing must not block or\n // fail an account switch.\n const switchedAccount = getSelectedEvmAccountFromMessenger(\n this.messenger,\n );\n if (switchedAccount) {\n this.#rewardsIntegrationService\n .registerTradingAddress(switchedAccount.address, {\n isTestnet: this.state.isTestnet,\n })\n .catch(() => {\n /* never blocks an account switch */\n });\n }\n };\n this.messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n forgetRegisteredTradingAddresses,\n );\n this.messenger.subscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n forgetRegisteredTradingAddresses,\n );\n\n this.providers = new Map();\n\n // Migrate old persisted data without accountAddress\n this.#migrateRequestsIfNeeded();\n\n // Eagerly hydrate in-memory caches from disk so hooks see data on first render.\n // Must happen at construction time — before any React component mounts.\n this.#hydrateCacheFromDiskSync();\n this.#options.infrastructure.performance.onControllerConstructed?.(\n this.#options.infrastructure.performance.now(),\n );\n }\n\n // ============================================================================\n // Infrastructure Access Methods\n // These methods provide access to platform-specific infrastructure via dependency injection.\n // Infrastructure is required and must be provided at instantiation time.\n // ============================================================================\n\n /**\n * Log an error using injected infrastructure logger\n *\n * @param error - The error that occurred.\n * @param options - The configuration options.\n */\n #logError(error: Error, options?: PerpsLoggerOptions): void {\n this.#options.infrastructure.logger.error(error, options);\n }\n\n /**\n * Log debug message using injected infrastructure debugLogger\n *\n * @param args - The function arguments.\n */\n #debugLog(\n ...args: (string | number | boolean | object | null | undefined)[]\n ): void {\n this.#options.infrastructure.debugLogger.log(...args);\n }\n\n /**\n * Resolve the provider ids that should participate in aggregated cache reads.\n *\n * Providers can still be registering when the first render happens, so we\n * also look at cache keys to recover disk-hydrated provider snapshots before\n * `init()` finishes populating `this.providers`.\n *\n * @param cacheKeys - Cache keys currently present in the relevant cache map.\n * @returns Provider ids that should be included in aggregated reads.\n */\n #getAggregatedCacheProviderIds(cacheKeys: string[]): string[] {\n const providerIds = new Set<string>();\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n for (const [providerId] of this.providers) {\n providerIds.add(providerId);\n }\n\n for (const key of cacheKeys) {\n const [providerId, network] = key.split(':');\n if (\n !providerId ||\n network !== currentNetwork ||\n providerId === 'aggregated'\n ) {\n continue;\n }\n\n if (\n providerId === 'hyperliquid' ||\n (providerId === 'lighter' && this.#isLighterProviderEnabled()) ||\n this.providers.has(providerId as PerpsProviderType)\n ) {\n providerIds.add(providerId);\n }\n }\n\n return Array.from(providerIds);\n }\n\n /**\n * Read cached market data for the currently active provider (or aggregated).\n * Returns null when no valid cache exists or when cache has expired.\n *\n * @param options - Optional settings.\n * @param options.skipTTL - When true, bypass the 5-minute TTL check.\n * Used during initial render so disk-hydrated structural data (with\n * placeholder prices) is returned regardless of age.\n * @returns The cached market data array, or null if no valid cache.\n */\n getCachedMarketDataForActiveProvider(options?: {\n skipTTL?: boolean;\n }): PerpsMarketData[] | null {\n const { activeProvider } = this.state;\n const cache = this.state.cachedMarketDataByProvider;\n\n if (activeProvider === 'aggregated') {\n // Assemble from all registered provider entries\n const assembled: PerpsMarketData[] = [];\n for (const providerId of this.#getAggregatedCacheProviderIds(\n Object.keys(cache),\n )) {\n const key = buildProviderCacheKey(providerId, this.state.isTestnet);\n const entry = cache[key];\n if (!entry || entry.data.length === 0) {\n continue;\n }\n if (!this.#isMarketCacheEntryCurrent(providerId, entry, options)) {\n continue;\n }\n assembled.push(...clonePerpsMarketData(entry.data));\n }\n if (assembled.length === 0) {\n return null;\n }\n return assembled;\n }\n\n // Single provider mode\n const key = buildProviderCacheKey(activeProvider, this.state.isTestnet);\n const entry = cache[key];\n if (!entry || entry.data.length === 0) {\n return null;\n }\n if (!this.#isMarketCacheEntryCurrent(activeProvider, entry, options)) {\n return null;\n }\n return clonePerpsMarketData(entry.data);\n }\n\n #isMarketCacheEntryCurrent(\n providerId: string,\n entry: PerpsControllerState['cachedMarketDataByProvider'][string],\n options?: { skipTTL?: boolean },\n ): boolean {\n if (entry.sourceExpiresAt !== undefined) {\n const expectedDexes = this.#getStaticSnapshotDexes();\n return (\n providerId === 'hyperliquid' &&\n Date.now() < entry.sourceExpiresAt &&\n entry.hip3ConfigVersion === this.state.hip3ConfigVersion &&\n expectedDexes !== undefined &&\n Array.isArray(entry.dexes) &&\n entry.dexes.length === expectedDexes.length &&\n entry.dexes.every((dex, index) => dex === expectedDexes[index])\n );\n }\n return (\n options?.skipTTL === true ||\n Date.now() - entry.timestamp <= PerpsController.#preloadGuardMs * 10\n );\n }\n\n /**\n * Read cached user data for the currently active provider (or aggregated).\n * Returns null when no valid cache exists, cache has expired, or address\n * does not match the currently selected EVM account.\n *\n * @param options - Optional settings.\n * @param options.skipTTL - When true, bypass the 60s staleness check.\n * Used during initial render so disk-hydrated user data (positions/orders)\n * is returned regardless of age, avoiding a skeleton flash.\n * @returns The cached user data, or null if no valid cache.\n */\n getCachedUserDataForActiveProvider(options?: { skipTTL?: boolean }): {\n positions: Position[];\n orders: Order[];\n accountState: AccountState | null;\n } | null {\n const { activeProvider } = this.state;\n const cache = this.state.cachedUserDataByProvider;\n const staleCutoff = PerpsController.#preloadGuardMs * 2; // 60s\n\n // Get current user address for validation\n let currentAddress: string | null = null;\n try {\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n currentAddress = evmAccount?.address ?? null;\n } catch {\n // Account identity is required before account-scoped data can be trusted.\n }\n\n if (!currentAddress) {\n return null;\n }\n const selectedAddress = currentAddress;\n\n const skipTTL = options?.skipTTL ?? false;\n\n const isValidEntry = (\n providerId: string,\n entry:\n | PerpsControllerState['cachedUserDataByProvider'][string]\n | undefined,\n ): entry is PerpsControllerState['cachedUserDataByProvider'][string] => {\n if (!entry) {\n return false;\n }\n if (!skipTTL && Date.now() - entry.timestamp >= staleCutoff) {\n return false;\n }\n if (\n !this.#isUserCacheIdentityCurrent(providerId, entry, selectedAddress)\n ) {\n return false;\n }\n return true;\n };\n\n if (activeProvider === 'aggregated') {\n // Assemble from all registered provider entries\n const allPositions: Position[] = [];\n const allOrders: Order[] = [];\n let defaultAccountState: AccountState | null = null;\n let hasValidEntry = false;\n\n for (const providerId of this.#getAggregatedCacheProviderIds(\n Object.keys(cache),\n )) {\n const providerNetworkKey = buildProviderCacheKey(\n providerId,\n this.state.isTestnet,\n );\n const entry = cache[providerNetworkKey];\n if (!isValidEntry(providerId, entry)) {\n continue;\n }\n hasValidEntry = true;\n allPositions.push(...entry.positions);\n allOrders.push(...entry.orders);\n // AccountState from default provider (hyperliquid)\n if (providerId === 'hyperliquid') {\n defaultAccountState = entry.accountState;\n }\n }\n\n if (!hasValidEntry) {\n return null;\n }\n\n return {\n positions: allPositions,\n orders: allOrders,\n accountState: defaultAccountState,\n };\n }\n\n // Single provider mode\n const providerNetworkKey = buildProviderCacheKey(\n activeProvider,\n this.state.isTestnet,\n );\n const entry = cache[providerNetworkKey];\n if (!entry || !isValidEntry(activeProvider, entry)) {\n return null;\n }\n\n return {\n positions: entry.positions,\n orders: entry.orders,\n accountState: entry.accountState,\n };\n }\n\n #isUserCacheIdentityCurrent(\n providerId: string,\n entry: PerpsControllerState['cachedUserDataByProvider'][string],\n address: string,\n ): boolean {\n if (entry.address.toLowerCase() !== address.toLowerCase()) {\n return false;\n }\n if (providerId !== 'hyperliquid') {\n return true;\n }\n\n const expectedDexes = this.#getStaticSnapshotDexes();\n return (\n entry.hip3ConfigVersion === this.state.hip3ConfigVersion &&\n expectedDexes !== undefined &&\n Array.isArray(entry.dexes) &&\n entry.dexes.length === expectedDexes.length &&\n entry.dexes.every((dex, index) => dex === expectedDexes[index])\n );\n }\n\n /**\n * Fetch, validate, and atomically cache a complete user-data snapshot.\n * This remains callable after mount so consumers can seed their live channel\n * from one coherent positions/orders/account result.\n *\n * @returns The accepted user-data snapshot.\n */\n async getUserDataSnapshot(): Promise<PerpsUserDataSnapshot> {\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n if (!evmAccount?.address) {\n throw new Error('Cannot fetch user data snapshot without an EVM account');\n }\n if (this.state.activeProvider !== 'hyperliquid') {\n throw new Error('User data snapshots require Hyperliquid provider mode');\n }\n\n const capturedActiveProvider = this.activeProviderInstance;\n const standaloneProvider = capturedActiveProvider\n ? null\n : this.#getOrCreateStandaloneProvider();\n const provider = capturedActiveProvider ?? standaloneProvider;\n if (!provider) {\n throw new Error('Cannot create standalone Hyperliquid provider');\n }\n const { address } = evmAccount;\n const { isTestnet, hip3ConfigVersion } = this.state;\n const lifecycleGeneration = this.#lifecycleGeneration;\n const network = isTestnet ? 'testnet' : 'mainnet';\n const expectedDexes = this.#getStaticSnapshotDexes();\n if (!expectedDexes) {\n throw new Error('User data snapshot DEX identity is not static');\n }\n const isCurrent = (): boolean => {\n let currentAddress: string | undefined;\n try {\n currentAddress = getSelectedEvmAccountFromMessenger(\n this.messenger,\n )?.address;\n } catch {\n return false;\n }\n\n return (\n this.#lifecycleGeneration === lifecycleGeneration &&\n this.state.activeProvider === 'hyperliquid' &&\n (!capturedActiveProvider ||\n this.activeProviderInstance === capturedActiveProvider) &&\n this.state.isTestnet === isTestnet &&\n this.state.hip3ConfigVersion === hip3ConfigVersion &&\n currentAddress?.toLowerCase() === address.toLowerCase()\n );\n };\n\n const context: UserSnapshotContext = {\n provider,\n standaloneProvider,\n address,\n isTestnet,\n hip3ConfigVersion,\n expectedDexes,\n isCurrent,\n };\n const requestKey = [\n 'hyperliquid',\n network,\n address.toLowerCase(),\n hip3ConfigVersion,\n ...expectedDexes,\n ].join('|');\n const existingRequest = this.#userSnapshotRequests.get(requestKey);\n if (existingRequest?.provider === provider) {\n return existingRequest.promise;\n }\n\n const request = this.#fetchAndCacheUserDataSnapshot(context);\n this.#userSnapshotRequests.set(requestKey, { provider, promise: request });\n try {\n return await request;\n } finally {\n if (this.#userSnapshotRequests.get(requestKey)?.promise === request) {\n this.#userSnapshotRequests.delete(requestKey);\n }\n }\n }\n\n async #fetchAndCacheUserDataSnapshot(\n context: UserSnapshotContext,\n ): Promise<PerpsUserDataSnapshot> {\n const {\n provider,\n standaloneProvider,\n address,\n isTestnet,\n hip3ConfigVersion,\n expectedDexes,\n isCurrent,\n } = context;\n if (!isCurrent()) {\n throw new Error('User data snapshot context changed');\n }\n if (!provider.getUserDataSnapshot) {\n throw new Error('Provider has no atomic snapshot API');\n }\n const identity = {\n provider: 'hyperliquid' as const,\n network: isTestnet ? ('testnet' as const) : ('mainnet' as const),\n hip3ConfigVersion,\n dexes: expectedDexes,\n };\n const snapshotRequest = provider.getUserDataSnapshot({\n userAddress: address,\n identity,\n });\n const snapshot = standaloneProvider\n ? await this.#trackStandaloneProviderOperation(\n standaloneProvider,\n snapshotRequest,\n )\n : await snapshotRequest;\n\n if (!isCurrent()) {\n throw new Error('User data snapshot context changed');\n }\n\n const snapshotIdentity = snapshot.identity;\n const hasCompleteBundle =\n Array.isArray(snapshot.positions) &&\n Array.isArray(snapshot.orders) &&\n snapshot.accountState !== null &&\n typeof snapshot.accountState === 'object';\n const hasExactIdentity =\n snapshotIdentity.provider === identity.provider &&\n snapshotIdentity.network === identity.network &&\n snapshotIdentity.hip3ConfigVersion === identity.hip3ConfigVersion &&\n snapshotIdentity.address.toLowerCase() === address.toLowerCase() &&\n snapshotIdentity.dexes.length === expectedDexes.length &&\n snapshotIdentity.dexes.every(\n (dex, index) => dex === expectedDexes[index],\n );\n if (!hasCompleteBundle || !hasExactIdentity) {\n throw new Error('User data snapshot is incomplete or mismatched');\n }\n\n if (!isCurrent()) {\n throw new Error('User data snapshot context changed');\n }\n\n const cachedSnapshot = cloneUserDataSnapshot(snapshot);\n const result = cloneUserDataSnapshot(snapshot);\n const timestamp = Date.now();\n const providerNetworkKey = buildProviderCacheKey('hyperliquid', isTestnet);\n this.update((state) => {\n state.cachedUserDataByProvider[providerNetworkKey] = {\n positions: cachedSnapshot.positions,\n orders: cachedSnapshot.orders,\n accountState: cachedSnapshot.accountState,\n timestamp,\n address,\n hip3ConfigVersion,\n dexes: expectedDexes,\n };\n });\n this.#persistUserCacheToDisk();\n this.#debugLog('PerpsController: user cache snapshot written', {\n writtenKey: providerNetworkKey,\n availableKeys: Object.keys(this.state.cachedUserDataByProvider).sort(),\n positionCount: cachedSnapshot.positions.length,\n orderCount: cachedSnapshot.orders.length,\n });\n\n return result;\n }\n\n /**\n * Returns a cached standalone HyperLiquidProvider for pre-initialization\n * discovery queries. Creates a new instance on first call or when the\n * isTestnet / hip3ConfigVersion has changed since the last creation.\n *\n * @returns A HyperLiquidProvider suitable for standalone REST calls.\n */\n #getOrCreateStandaloneProvider(): HyperLiquidProvider {\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion ?? 0;\n\n if (\n this.#standaloneProvider &&\n this.#standaloneProviderIsTestnet === currentIsTestnet &&\n this.#standaloneProviderHip3Version === currentHip3Version\n ) {\n return this.#standaloneProvider;\n }\n\n // Stale or missing — retire the old provider after active operations finish.\n if (this.#standaloneProvider) {\n const old = this.#standaloneProvider;\n this.#standaloneProvider = null;\n this.#standaloneProviderIsTestnet = null;\n this.#standaloneProviderHip3Version = null;\n this.#retireStandaloneProvider(old).catch(() => {\n /* best-effort */\n });\n }\n\n this.#standaloneProvider = new HyperLiquidProvider({\n isTestnet: currentIsTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n priceDeviationLimit: this.#priceDeviationLimit,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n builderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressTestnet,\n builderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressMainnet,\n subscriptionBuilderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressTestnet,\n subscriptionBuilderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressMainnet,\n onChaseOrderMaxDistanceReached: this.#publishChaseOrderMaxDistanceReached,\n });\n this.#standaloneProviderIsTestnet = currentIsTestnet;\n this.#standaloneProviderHip3Version = currentHip3Version;\n\n return this.#standaloneProvider;\n }\n\n #trackStandaloneProviderOperation<Result>(\n provider: PerpsProvider,\n operation: Promise<Result>,\n ): Promise<Result> {\n const operations =\n this.#standaloneProviderOperations.get(provider) ?? new Set();\n this.#standaloneProviderOperations.set(provider, operations);\n\n const trackedOperation = operation.finally(() => {\n operations.delete(trackedOperation);\n if (operations.size === 0) {\n this.#standaloneProviderOperations.delete(provider);\n }\n });\n operations.add(trackedOperation);\n\n return trackedOperation;\n }\n\n async #retireStandaloneProvider(\n provider: HyperLiquidProvider,\n ): Promise<void> {\n const operations = this.#standaloneProviderOperations.get(provider);\n if (operations?.size) {\n await Promise.allSettled([...operations]);\n }\n try {\n await provider.disconnect();\n } catch {\n /* best-effort */\n } finally {\n this.#standaloneProviderOperations.delete(provider);\n }\n }\n\n /**\n * Disconnect and discard the cached standalone provider (if any).\n * Best-effort — errors are silently caught.\n */\n async #cleanupStandaloneProvider(): Promise<void> {\n const provider = this.#standaloneProvider;\n if (!provider) {\n return;\n }\n this.#standaloneProvider = null;\n this.#standaloneProviderIsTestnet = null;\n this.#standaloneProviderHip3Version = null;\n await this.#retireStandaloneProvider(provider);\n }\n\n /**\n * Test-observable accessor for whether a standalone provider is cached.\n *\n * @returns True if a standalone provider instance exists.\n */\n protected hasStandaloneProvider(): boolean {\n return this.#standaloneProvider !== null;\n }\n\n /**\n * Get metrics instance from platform dependencies\n *\n * @returns The platform metrics instance.\n */\n #getMetrics(): PerpsPlatformDependencies['metrics'] {\n return this.#options.infrastructure.metrics;\n }\n\n // ============================================================================\n // Messenger-based Controller Access\n // These methods use the messenger pattern for inter-controller communication\n // ============================================================================\n\n /**\n * Find network client ID for a given chain via messenger\n *\n * @param chainId - The chain identifier.\n * @returns The resulting string value.\n */\n #findNetworkClientIdForChain(chainId: string): string | undefined {\n return this.messenger.call(\n 'NetworkController:findNetworkClientIdByChainId',\n chainId as `0x${string}`,\n );\n }\n\n /**\n * Submit a transaction via messenger (shows confirmation screen)\n *\n * @param txParams - The transaction parameters.\n * @param txParams.from - The sender address.\n * @param txParams.to - The recipient address.\n * @param txParams.value - The transaction value.\n * @param txParams.data - The transaction data payload.\n * @param txParams.gas - The gas limit.\n * @param options - The configuration options.\n * @param options.networkClientId - The network client identifier.\n * @param options.origin - The transaction origin.\n * @param options.type - The transaction type.\n * @param options.skipInitialGasEstimate - Whether to skip initial gas estimation.\n * @returns The transaction result containing a hash promise and transaction metadata.\n */\n async #submitTransaction(\n txParams: PerpsTransactionParams,\n options: PerpsAddTransactionOptions,\n ): Promise<{\n result: Promise<string>;\n transactionMeta: { id: string; hash?: string };\n }> {\n // Cast needed: PerpsController uses loose string types for txParams/options\n // while TransactionController uses strict branded types (TransactionParams, AddTransactionOptions)\n return this.messenger.call(\n 'TransactionController:addTransaction',\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n txParams,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { ...(options as any), isInternal: true },\n );\n }\n\n /**\n * Clean up old withdrawal/deposit requests that don't have accountAddress\n * These are from before the accountAddress field was added and can't be displayed\n * in the UI (which filters by account), so we discard them.\n * Also drop persisted failed withdrawals — failures are surfaced via lastWithdrawResult only.\n */\n #migrateRequestsIfNeeded(): void {\n this.update((state) => {\n // Remove withdrawal requests without accountAddress - they can't be attributed to any account\n state.withdrawalRequests = state.withdrawalRequests.filter(\n (req) => Boolean(req.accountAddress) && req.status !== 'failed',\n );\n\n // Remove deposit requests without accountAddress - they can't be attributed to any account\n state.depositRequests = state.depositRequests.filter((req) =>\n Boolean(req.accountAddress),\n );\n });\n }\n\n protected setBlockedRegionList(\n list: string[],\n source: 'remote' | 'fallback',\n ): void {\n this.#featureFlagConfigurationService.setBlockedRegions({\n list,\n source,\n context: this.#createServiceContext('setBlockedRegionList', {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n newList: string[],\n newSource: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list: newList, source: newSource };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n }),\n });\n }\n\n /**\n * Respond to RemoteFeatureFlagController state changes\n * Refreshes user eligibility based on geo-blocked regions defined in remote feature flag.\n * Uses fallback configuration when remote feature flag is undefined.\n * Note: Initial eligibility is set in the constructor if fallback regions are provided.\n *\n * @param remoteFeatureFlagControllerState - State from RemoteFeatureFlagController.\n */\n protected refreshEligibilityOnFeatureFlagChange(\n remoteFeatureFlagControllerState: PerpsRemoteFeatureFlagState,\n ): void {\n this.#featureFlagConfigurationService.refreshEligibility({\n remoteFeatureFlagControllerState,\n context: this.#createServiceContext(\n 'refreshEligibilityOnFeatureFlagChange',\n {\n getBlockedRegionList: () => this.blockedRegionList,\n setBlockedRegionList: (\n list: string[],\n source: 'remote' | 'fallback',\n ) => {\n this.blockedRegionList = { list, source };\n this.#blockedRegionListVersion += 1;\n },\n refreshEligibility: () => this.refreshEligibility(),\n getHip3Config: () => ({\n enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n source: this.#hip3ConfigSource,\n }),\n setHip3Config: (config) => {\n if (config.enabled !== undefined) {\n this.#hip3Enabled = config.enabled;\n }\n if (config.allowlistMarkets !== undefined) {\n this.#hip3AllowlistMarkets = [...config.allowlistMarkets];\n }\n if (config.blocklistMarkets !== undefined) {\n this.#hip3BlocklistMarkets = [...config.blocklistMarkets];\n }\n if (config.source !== undefined) {\n this.#hip3ConfigSource = config.source;\n }\n },\n incrementHip3ConfigVersion: () => {\n const newVersion = (this.state.hip3ConfigVersion || 0) + 1;\n this.update((state) => {\n state.hip3ConfigVersion = newVersion;\n });\n return newVersion;\n },\n },\n ),\n });\n }\n\n /**\n * Execute an operation while temporarily pausing specified stream channels\n * to prevent WebSocket updates from triggering UI re-renders during operations.\n *\n * WebSocket connections remain alive but updates are not emitted to subscribers.\n * This prevents race conditions where UI re-renders fetch stale data during operations.\n *\n * @param operation - The async operation to execute\n * @param channels - Array of stream channel names to pause\n * @returns The result of the operation\n * @example\n * ```typescript\n * // Cancel orders without stream interference\n * await this.#withStreamPause(\n * async () => this.provider.cancelOrders({ cancelAll: true }),\n * ['orders']\n * );\n *\n * // Close positions and pause multiple streams\n * await this.#withStreamPause(\n * async () => this.provider.closePositions(positions),\n * ['positions', 'account', 'orders']\n * );\n * ```\n */\n async #withStreamPause<TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ): Promise<TResult> {\n const pausedChannels: string[] = [];\n const { streamManager } = this.#options.infrastructure;\n\n // Pause emission on specified channels (WebSocket stays connected)\n // Track which channels successfully paused to ensure proper cleanup\n for (const channel of channels) {\n try {\n streamManager.pauseChannel(channel);\n pausedChannels.push(channel);\n } catch (error) {\n // Log error to Sentry but continue pausing remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'pause',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n\n try {\n // Execute operation without stream interference\n return await operation();\n } finally {\n // Resume only channels that were successfully paused\n for (const channel of pausedChannels) {\n try {\n streamManager.resumeChannel(channel);\n } catch (error) {\n // Log error to Sentry but continue resuming remaining channels\n this.#logError(\n ensureError(error, 'PerpsController.withStreamPause'),\n this.#getErrorContext('withStreamPause', {\n operation: 'resume',\n channel: String(channel),\n pausedChannels: pausedChannels.join(','),\n }),\n );\n }\n }\n }\n }\n\n /**\n * Initialize the PerpsController providers\n * Must be called before using any other methods\n * Prevents double initialization with promise caching\n *\n * @returns A promise that resolves when the operation completes.\n */\n async init(): Promise<void> {\n while (true) {\n const pendingDisconnect = this.#disconnectOperationPromise;\n if (pendingDisconnect) {\n await pendingDisconnect;\n continue;\n }\n\n const pendingReinitialization = this.#reinitializationOperationPromise;\n if (pendingReinitialization) {\n await pendingReinitialization;\n continue;\n }\n\n return this.#initWithoutDisconnectWait();\n }\n }\n\n /**\n * Initialize without waiting for disconnect. Reinitialization operations use\n * this after they have claimed the controller lifecycle.\n *\n * @returns A promise that resolves when initialization finishes.\n */\n async #initWithoutDisconnectWait(): Promise<void> {\n if (!this.#handlersRegistered) {\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n this.#handlersRegistered = true;\n }\n\n if (this.isInitialized) {\n return undefined;\n }\n\n if (this.#initializationPromise) {\n return this.#initializationPromise;\n }\n\n this.#initializationPromise = this.#performInitialization();\n this.#initializationStartWaiters.forEach((notifyStarted) =>\n notifyStarted(),\n );\n return this.#initializationPromise;\n }\n\n /**\n * Resolve once a new initialization starts, or after the timeout.\n *\n * @param timeoutMs - Longest time to wait for init() to be called.\n * @returns A promise that resolves when init starts or the timeout elapses.\n */\n async #waitForInitializationStart(timeoutMs: number): Promise<void> {\n let notifyStarted = (): void => undefined;\n const started = new Promise<void>((resolve) => {\n notifyStarted = resolve;\n });\n this.#initializationStartWaiters.add(notifyStarted);\n const timeout = setTimeout(notifyStarted, timeoutMs);\n try {\n await started;\n } finally {\n clearTimeout(timeout);\n this.#initializationStartWaiters.delete(notifyStarted);\n }\n }\n\n /**\n * Track a network or provider reinitialization so disconnect can serialize\n * behind the whole operation, including work before and after init().\n *\n * @returns A callback that releases the lifecycle operation.\n */\n #beginReinitialization(): () => void {\n this.#isReinitializing = true;\n let resolveOperation = (): void => undefined;\n const operation = new Promise<void>((resolve) => {\n resolveOperation = resolve;\n });\n this.#reinitializationOperationPromise = operation;\n\n return (): void => {\n this.#isReinitializing = false;\n resolveOperation();\n if (this.#reinitializationOperationPromise === operation) {\n this.#reinitializationOperationPromise = null;\n }\n };\n }\n\n /**\n * Actual initialization implementation with retry logic\n */\n async #performInitialization(): Promise<void> {\n const maxAttempts = 3;\n const baseDelay = 1000;\n\n this.update((state) => {\n state.initializationState = InitializationState.Initializing;\n state.initializationError = null;\n state.initializationAttempts = 0;\n });\n\n this.#debugLog('PerpsController: Initializing providers', {\n currentNetwork: this.state.isTestnet ? 'testnet' : 'mainnet',\n existingProviders: Array.from(this.providers.keys()),\n timestamp: new Date().toISOString(),\n });\n\n let lastError: Error | null = null;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n this.update((state) => {\n state.initializationAttempts = attempt;\n });\n\n // Disconnect existing providers to close WebSocket connections\n const existingProviders = Array.from(this.providers.values());\n if (existingProviders.length > 0) {\n this.#debugLog('PerpsController: Disconnecting existing providers', {\n count: existingProviders.length,\n timestamp: new Date().toISOString(),\n });\n await Promise.all(\n existingProviders.map((provider) => provider.disconnect()),\n );\n }\n this.providers.clear();\n await this.#cleanupStandaloneProvider();\n\n this.#createProviders();\n\n // Await the Lighter dynamic import (if started) so Lighter is in the\n // providers map before we assign the active provider. Runs concurrently\n // with the WebSocket readiness delay for zero additional latency.\n await Promise.all([\n wait(PERPS_CONSTANTS.ReconnectionCleanupDelayMs),\n this.#lighterRegistrationPromise,\n ]);\n this.#lighterRegistrationPromise = null;\n\n this.#assignActiveProvider();\n\n this.isInitialized = true;\n this.update((state) => {\n state.initializationState = InitializationState.Initialized;\n state.initializationError = null;\n });\n\n this.#debugLog('PerpsController: Providers initialized successfully', {\n providerCount: this.providers.size,\n activeProvider: this.state.activeProvider,\n timestamp: new Date().toISOString(),\n attempts: attempt,\n });\n\n // Hydrate watchlist from AUS (non-blocking — transient failures are\n // caught inside and must not prevent init from completing).\n // Assigning to #ausQueue ensures subsequent toggleWatchlistMarket\n // calls wait for hydration before running their own GET-merge-PUT.\n this.#ausQueue = this.#syncWatchlistFromRemote().catch(() => {\n // Errors are already logged inside #syncWatchlistFromRemote.\n });\n\n return; // Exit retry loop on success\n } catch (error) {\n lastError = ensureError(error, 'PerpsController.performInitialization');\n\n this.#logError(\n lastError,\n this.#getErrorContext('performInitialization', {\n attempt,\n maxAttempts,\n }),\n );\n\n // If not the last attempt, wait before retrying (exponential backoff)\n if (attempt < maxAttempts) {\n const delay = baseDelay * Math.pow(2, attempt - 1); // 1s, 2s, 4s\n this.#debugLog(\n `PerpsController: Retrying initialization in ${delay}ms`,\n {\n attempt,\n maxAttempts,\n error: lastError.message,\n },\n );\n await wait(delay);\n }\n }\n }\n\n this.isInitialized = false;\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n state.initializationError = lastError?.message ?? 'Unknown error';\n });\n this.#initializationPromise = null; // Clear promise to allow retry\n\n this.#debugLog('PerpsController: Initialization failed', {\n error: lastError?.message,\n attempts: maxAttempts,\n timestamp: new Date().toISOString(),\n });\n }\n\n /**\n * Instantiate provider instances based on current state and register them.\n * Selects and assigns the active provider instance from the registry.\n * Future providers can be added here with their own authentication patterns:\n * - Some might use API keys: new BinanceProvider({ apiKey, apiSecret })\n * - Some might use different wallet patterns: new GMXProvider({ signer })\n * - Some might not need auth at all: new DydxProvider()\n */\n #createProviders(): void {\n const { activeProvider } = this.state;\n\n this.#debugLog(\n 'PerpsController: Creating provider with HIP-3 configuration',\n {\n hip3Enabled: this.#hip3Enabled,\n hip3AllowlistMarkets: this.#hip3AllowlistMarkets,\n hip3BlocklistMarkets: this.#hip3BlocklistMarkets,\n hip3ConfigSource: this.#hip3ConfigSource,\n isTestnet: this.state.isTestnet,\n activeProvider,\n },\n );\n\n // Always create HyperLiquid provider as the base provider\n const hyperLiquidProvider = new HyperLiquidProvider({\n isTestnet: this.state.isTestnet,\n hip3Enabled: this.#hip3Enabled,\n allowlistMarkets: this.#hip3AllowlistMarkets,\n blocklistMarkets: this.#hip3BlocklistMarkets,\n priceDeviationLimit: this.#priceDeviationLimit,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n builderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressTestnet,\n builderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.builderAddressMainnet,\n subscriptionBuilderAddressTestnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressTestnet,\n subscriptionBuilderAddressMainnet:\n this.#options.clientConfig?.providerCredentials?.hyperliquid\n ?.subscriptionBuilderAddressMainnet,\n onChaseOrderMaxDistanceReached: this.#publishChaseOrderMaxDistanceReached,\n getAgentSigner: this.#agentBindings.resolve,\n onAgentRejected: (account, agentAddress): void => {\n this.#agentBindings.release(account, agentAddress);\n this.#options.clientConfig?.providerCredentials?.hyperliquid?.onAgentRejected?.(\n account,\n agentAddress,\n );\n },\n });\n this.providers.set('hyperliquid', hyperLiquidProvider);\n\n // Register Lighter provider if enabled (POC). Dynamic import so clients\n // that do not ship the Lighter files skip registration silently, and so\n // bundlers can code-split it out when it is not enabled.\n // Uses .then()/.catch() instead of await because #createProviders is not\n // async; registration completing asynchronously is fine since the provider\n // is only used when explicitly enabled and selected.\n const isLighterEnabled = this.#isLighterProviderEnabled();\n if (isLighterEnabled) {\n // NOTE: Keep the path in a variable so bundlers that ignore the\n // webpackIgnore magic comment (e.g. Metro) cannot statically resolve the\n // import and pull the Lighter provider into the client bundle.\n const lighterModulePath = './providers/LighterProvider';\n this.#lighterRegistrationPromise = import(\n /* webpackIgnore: true */ lighterModulePath\n )\n .then(({ LighterProvider }) => {\n this.registerLighterProvider(LighterProvider);\n return;\n })\n .catch((error: unknown) => this.handleLighterImportError(error));\n }\n }\n\n /**\n * Registers the Lighter provider after dynamic import resolves.\n *\n * Extracted from the import().then() callback so it can be tested directly\n * (Jest cannot resolve dynamic imports without --experimental-vm-modules).\n *\n * @param LighterProviderClass - Constructor class for the Lighter provider.\n */\n protected registerLighterProvider(\n LighterProviderClass: new (opts: {\n isTestnet: boolean;\n platformDependencies: PerpsPlatformDependencies;\n messenger: PerpsControllerMessenger;\n lighterAuthConfig: LighterAuthConfig;\n signerBridge?: LighterSignerBridge;\n }) => PerpsProvider,\n ): void {\n const lighterIsTestnet = isProviderOnTestnet(\n 'lighter',\n this.state.isTestnet,\n );\n const lighter =\n this.#options.clientConfig?.providerCredentials?.lighter ?? {};\n const lighterProvider = new LighterProviderClass({\n isTestnet: lighterIsTestnet,\n platformDependencies: this.#options.infrastructure,\n messenger: this.messenger,\n signerBridge: lighter.signerBridge,\n lighterAuthConfig: {\n enabled: lighter.enabled,\n accountIndex: lighterIsTestnet\n ? lighter.accountIndexTestnet\n : lighter.accountIndexMainnet,\n apiKeyIndex: lighter.apiKeyIndex,\n },\n });\n this.providers.set('lighter', lighterProvider);\n this.#debugLog('PerpsController: Lighter provider registered', {\n isTestnet: lighterIsTestnet,\n });\n }\n\n /**\n * Handles errors from the Lighter dynamic import.\n *\n * Module-not-found errors are expected (clients may not ship Lighter) →\n * debug log. Other errors indicate constructor/config problems → Sentry.\n *\n * @param error - The caught error from the dynamic import or constructor.\n */\n protected handleLighterImportError(error: unknown): void {\n const isModuleError =\n (error as Record<string, unknown>)?.code === 'MODULE_NOT_FOUND';\n if (isModuleError) {\n this.#debugLog(\n 'PerpsController: Lighter provider module not available, skipping registration',\n );\n } else {\n this.#logError(\n error instanceof Error ? error : new Error(String(error)),\n this.#getErrorContext('createProviders.lighter'),\n );\n }\n }\n\n /**\n * Assigns the active provider instance based on the current activeProvider state.\n * Separated from #createProviders so it runs after async provider registration settles.\n */\n #assignActiveProvider(): void {\n const { activeProvider } = this.state;\n const hyperLiquidProvider = this.providers.get('hyperliquid');\n\n if (!hyperLiquidProvider) {\n throw new Error(\n 'HyperLiquid provider not registered — cannot assign active provider',\n );\n }\n\n if (activeProvider === 'aggregated') {\n this.activeProviderInstance = new AggregatedPerpsProvider({\n providers: this.providers,\n defaultProvider: 'hyperliquid',\n infrastructure: this.#options.infrastructure,\n isTestnet: this.state.isTestnet,\n });\n this.#debugLog(\n 'PerpsController: Using aggregated provider (multi-provider)',\n { registeredProviders: Array.from(this.providers.keys()) },\n );\n } else if (activeProvider === 'hyperliquid') {\n this.activeProviderInstance = hyperLiquidProvider;\n this.#debugLog(\n `PerpsController: Using direct provider (${activeProvider})`,\n );\n } else {\n // Any other direct provider, including a value persisted by an older\n // version whose venue has since been removed. `activeProvider` is\n // persisted, so throwing here would fail initialization on every\n // launch — the stale value must self-heal.\n const directProvider = this.providers.get(activeProvider);\n if (directProvider) {\n this.activeProviderInstance = directProvider;\n } else {\n this.#debugLog(\n `PerpsController: ${activeProvider} provider not available, falling back to hyperliquid`,\n );\n this.activeProviderInstance = hyperLiquidProvider;\n this.update((state) => {\n state.activeProvider = 'hyperliquid';\n });\n }\n this.#debugLog(\n `PerpsController: Using direct provider (${this.activeProviderInstance === hyperLiquidProvider ? 'hyperliquid' : activeProvider})`,\n );\n }\n }\n\n /**\n * Generate standard error context for Logger.error calls with searchable tags and context.\n * Enables Sentry dashboard filtering by feature, provider, and network.\n *\n * @param method - The method name where the error occurred\n * @param extra - Optional additional context fields (becomes searchable context data)\n * @returns PerpsLoggerOptions with tags (searchable) and context (searchable)\n * @private\n * @example\n * this.#logError(error, this.#getErrorContext('placeOrder', { symbol: 'BTC', operation: 'validate' }));\n * // Creates searchable tags: feature:perps, provider:hyperliquid, network:mainnet\n * // Creates searchable context: perps_controller.method:placeOrder, perps_controller.symbol:BTC, perps_controller.operation:validate\n */\n #getErrorContext(\n method: string,\n extra?: Record<string, unknown>,\n ): PerpsLoggerOptions {\n return {\n tags: {\n feature: PERPS_CONSTANTS.FeatureName,\n provider: this.state.activeProvider,\n network: this.state.isTestnet ? 'testnet' : 'mainnet',\n },\n context: {\n name: 'PerpsController',\n data: {\n method,\n ...extra,\n },\n },\n };\n }\n\n /**\n * Returns current controller state as PerpsControllerState.\n * Used by createServiceContext to avoid deep type instantiation when building stateManager.\n *\n * @returns The current controller state cast to PerpsControllerState.\n */\n #getControllerState(): PerpsControllerState {\n return this.state;\n }\n\n /**\n * Build a filter function that mirrors the provider's allowlist/blocklist\n * logic so that Terminal API results are filtered identically.\n *\n * @returns Filter predicate accepting a market symbol.\n */\n #buildMarketAllowedFilter(): (symbol: string) => boolean {\n const hip3Enabled = this.#hip3Enabled;\n const compiledAllowlist = this.#compilePatternsSafely(\n this.#hip3AllowlistMarkets,\n );\n const compiledBlocklist = this.#compilePatternsSafely(\n this.#hip3BlocklistMarkets,\n );\n return (symbol: string) => {\n const { dex } = parseAssetName(symbol);\n return shouldIncludeMarket(\n symbol,\n dex,\n hip3Enabled,\n compiledAllowlist,\n compiledBlocklist,\n );\n };\n }\n\n /**\n * Compile market patterns safely, skipping any that fail validation.\n *\n * @param patterns - Raw pattern strings from config.\n * @returns Compiled patterns (invalid entries silently skipped).\n */\n #compilePatternsSafely(patterns: string[]): CompiledMarketPattern[] {\n const compiled: CompiledMarketPattern[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push({ pattern, matcher: compileMarketPattern(pattern) });\n } catch {\n // Invalid patterns silently skipped — logged at provider level.\n }\n }\n return compiled;\n }\n\n /**\n * Create a ServiceContext for dependency injection into services\n * Provides all orchestration dependencies (tracing, analytics, state management)\n *\n * @param method - Method name for error context\n * @param additionalContext - Optional additional context (e.g., rewardsController, streamManager)\n * @returns ServiceContext with all required dependencies\n */\n #createServiceContext(\n method: string,\n additionalContext?: Partial<ServiceContext>,\n ): ServiceContext {\n return {\n tracingContext: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n errorContext: {\n controller: 'PerpsController',\n method,\n },\n stateManager: {\n update: (updater: (state: PerpsControllerState) => void) =>\n // Using `@ts-ignore` instead of `@ts-expect-error` since this error\n // comes and goes after unrelated changes.\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore: TS2589: Type instantiation is excessively deep and possibly infinite.\n this.update(updater),\n getState: (): PerpsControllerState => this.#getControllerState(),\n },\n ...additionalContext,\n };\n }\n\n /**\n * Ensure TradingService has controller dependencies set.\n * RewardsIntegrationService uses messenger internally for controller access.\n */\n #ensureTradingServiceDeps(): void {\n this.#tradingService.setControllerDependencies({\n rewardsIntegrationService: this.#rewardsIntegrationService,\n });\n }\n\n /**\n * Get the currently active provider.\n * In aggregated mode, returns AggregatedPerpsProvider which routes to underlying providers.\n * In single provider mode, returns HyperLiquidProvider directly.\n *\n * @returns The active provider (aggregated wrapper or direct provider based on mode)\n * @throws Error if provider is not initialized or reinitializing\n */\n getActiveProvider(): PerpsProvider {\n // Check if we're in the middle of reinitializing\n if (this.isCurrentlyReinitializing()) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.CLIENT_REINITIALIZING;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.CLIENT_REINITIALIZING);\n }\n\n // Check if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.CLIENT_NOT_INITIALIZED);\n }\n\n // Return the active provider instance (set during initialization based on providerMode)\n if (!this.activeProviderInstance) {\n this.update((state) => {\n state.lastError = PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE;\n state.lastUpdateTimestamp = Date.now();\n });\n throw new Error(PERPS_ERROR_CODES.PROVIDER_NOT_AVAILABLE);\n }\n\n return this.activeProviderInstance;\n }\n\n /**\n * Await in-flight initialization, then return the active provider.\n * Use for async action methods (trading, deposits, withdrawals) that should\n * tolerate an in-progress cold-start or reconnection instead of failing\n * immediately with CLIENT_NOT_INITIALIZED.\n *\n * Synchronous callers that need fail-fast behaviour should keep using\n * getActiveProvider() directly.\n *\n * @returns The active provider once initialization completes.\n */\n async #getActiveProviderWhenReady(): Promise<PerpsProvider> {\n // The context the action was issued under. A client reconnect\n // (disconnect then init) that switches account, network or provider must\n // not carry the action into the new context.\n const issuedContext = this.#getActionContext();\n let awaitedDisconnect = false;\n let awaitedInitializationStart = false;\n while (true) {\n const pendingDisconnect = this.#disconnectOperationPromise;\n if (pendingDisconnect) {\n awaitedDisconnect = true;\n await pendingDisconnect;\n continue;\n }\n\n const pendingReinitialization = this.#reinitializationOperationPromise;\n if (pendingReinitialization) {\n await pendingReinitialization;\n continue;\n }\n\n const pendingInitialization = this.#initializationPromise;\n if (\n this.state.initializationState === InitializationState.Initializing &&\n pendingInitialization\n ) {\n await pendingInitialization;\n continue;\n }\n\n // Clients reconnect with disconnect() followed by init(), and the\n // disconnect settles before init() is called. Give that init a bounded\n // window to start rather than failing an action the reconnect will\n // serve. Nothing here starts a connection the client did not ask for.\n if (\n awaitedDisconnect &&\n !awaitedInitializationStart &&\n !this.isInitialized &&\n !pendingInitialization\n ) {\n awaitedInitializationStart = true;\n await this.#waitForInitializationStart(\n PERPS_CONSTANTS.ConnectionTimeoutMs,\n );\n continue;\n }\n\n if (awaitedDisconnect && this.#getActionContext() !== issuedContext) {\n throw new Error(PERPS_ERROR_CODES.PROVIDER_LIFECYCLE_STALE);\n }\n\n return this.getActiveProvider();\n }\n }\n\n /**\n * Identify the account, network and provider an action runs under.\n *\n * @returns A key that changes when any of them changes.\n */\n #getActionContext(): string {\n const address = getSelectedEvmAccountFromMessenger(this.messenger)?.address;\n return [\n address?.toLowerCase() ?? '',\n this.state.isTestnet ? 'testnet' : 'mainnet',\n this.state.activeProvider,\n ].join('|');\n }\n\n /**\n * Get the currently active provider, returning null if not available\n * Use this method when the caller can gracefully handle a missing provider\n * (e.g., UI components during initialization or reconnection)\n *\n * @returns The active provider, or null if not initialized/reinitializing\n */\n getActiveProviderOrNull(): PerpsProvider | null {\n // Return null during reinitialization\n if (this.isCurrentlyReinitializing()) {\n return null;\n }\n\n // Return null if not initialized\n if (\n this.state.initializationState !== InitializationState.Initialized ||\n !this.isInitialized\n ) {\n return null;\n }\n\n // Return the active provider instance or null if not found\n return this.activeProviderInstance ?? null;\n }\n\n /**\n * Get strategy capabilities through the active provider route used by order\n * placement. The query waits for in-flight initialization and reports an\n * explicit unavailable status when no provider route can answer reliably.\n *\n * @param params - Market and optional provider route.\n * @returns Provider-owned order capabilities.\n */\n async getOrderCapabilities(\n params: GetOrderCapabilitiesParams,\n ): Promise<PerpsOrderCapabilities> {\n let activeProvider: PerpsProvider;\n try {\n activeProvider = await this.#getActiveProviderWhenReady();\n } catch (error) {\n this.#debugLog('PerpsController: Order capabilities unavailable', {\n error: ensureError(error, 'PerpsController.getOrderCapabilities')\n .message,\n });\n return this.#getUnavailableOrderCapabilities(\n 'provider_unavailable',\n params.providerId,\n );\n }\n\n const resolvedProviderId =\n params.providerId ?? this.#getDirectProviderId(activeProvider);\n if (this.#hasConflictingProviderRoute(params.providerId, activeProvider)) {\n return this.#getUnavailableOrderCapabilities(\n 'provider_not_routable',\n resolvedProviderId,\n );\n }\n if (!activeProvider.getOrderCapabilities) {\n return this.#getUnavailableOrderCapabilities(\n 'not_implemented',\n resolvedProviderId,\n );\n }\n\n try {\n const capabilities = await activeProvider.getOrderCapabilities(params);\n if (\n capabilities.status === 'unavailable' &&\n capabilities.providerId === undefined &&\n resolvedProviderId !== undefined\n ) {\n return { ...capabilities, providerId: resolvedProviderId };\n }\n return capabilities;\n } catch (error) {\n const safeError = ensureError(\n error,\n 'PerpsController.getOrderCapabilities',\n );\n this.#debugLog('PerpsController: Order capabilities unavailable', {\n error: safeError.message,\n });\n return this.#getUnavailableOrderCapabilities(\n 'provider_unavailable',\n resolvedProviderId,\n );\n }\n }\n\n /**\n * Get the margin mode the market is currently locked to by an open\n * position or resting order, through the active provider route used by\n * order placement. Never throws; failures report an unavailable status.\n *\n * @param params - Market and optional provider route.\n * @returns The provider-reported margin-mode lock.\n */\n async getMarginModeLock(\n params: GetMarginModeLockParams,\n ): Promise<PerpsMarginModeLock> {\n let activeProvider: PerpsProvider;\n try {\n activeProvider = await this.#getActiveProviderWhenReady();\n } catch (error) {\n this.#debugLog('PerpsController: Margin mode lock unavailable', {\n error: ensureError(error, 'PerpsController.getMarginModeLock').message,\n });\n return this.#getUnavailableMarginModeLock(\n 'provider_unavailable',\n params.providerId,\n );\n }\n\n const resolvedProviderId =\n params.providerId ?? this.#getDirectProviderId(activeProvider);\n if (this.#hasConflictingProviderRoute(params.providerId, activeProvider)) {\n return this.#getUnavailableMarginModeLock(\n 'provider_not_routable',\n resolvedProviderId,\n );\n }\n if (!activeProvider.getMarginModeLock) {\n return this.#getUnavailableMarginModeLock(\n 'not_implemented',\n resolvedProviderId,\n );\n }\n\n try {\n const lock = await activeProvider.getMarginModeLock(params);\n if (\n lock.status === 'unavailable' &&\n lock.providerId === undefined &&\n resolvedProviderId !== undefined\n ) {\n return { ...lock, providerId: resolvedProviderId };\n }\n return lock;\n } catch (error) {\n this.#debugLog('PerpsController: Margin mode lock unavailable', {\n error: ensureError(error, 'PerpsController.getMarginModeLock').message,\n });\n return this.#getUnavailableMarginModeLock(\n 'provider_unavailable',\n resolvedProviderId,\n );\n }\n }\n\n #getUnavailableMarginModeLock(\n reason: MarginModeLockUnavailableReason,\n providerId: PerpsProviderType | undefined,\n ): PerpsMarginModeLock {\n return providerId\n ? { status: 'unavailable', providerId, reason }\n : { status: 'unavailable', reason };\n }\n\n /**\n * Build a Scale price ladder using the active provider's venue rules.\n *\n * @param params - Market, ladder bounds, count, and optional explicit route.\n * @returns Provider-normalized prices or a typed unavailable result.\n * @throws When the provider cannot normalize the requested ladder.\n */\n async getScalePriceLadder(\n params: GetScalePriceLadderParams,\n ): Promise<PerpsScalePriceLadder> {\n let activeProvider: PerpsProvider;\n try {\n activeProvider = await this.#getActiveProviderWhenReady();\n } catch (error) {\n this.#debugLog('PerpsController: Scale price ladder unavailable', {\n error: ensureError(error, 'PerpsController.getScalePriceLadder')\n .message,\n });\n return this.#getUnavailableScalePriceLadder(\n 'provider_unavailable',\n params.providerId,\n );\n }\n\n const resolvedProviderId =\n params.providerId ?? this.#getDirectProviderId(activeProvider);\n if (this.#hasConflictingProviderRoute(params.providerId, activeProvider)) {\n return this.#getUnavailableScalePriceLadder(\n 'provider_not_routable',\n resolvedProviderId,\n );\n }\n if (!activeProvider.getScalePriceLadder) {\n return this.#getUnavailableScalePriceLadder(\n 'not_implemented',\n resolvedProviderId,\n );\n }\n\n const result = await activeProvider.getScalePriceLadder(params);\n if (\n result.status === 'unavailable' &&\n result.providerId === undefined &&\n resolvedProviderId !== undefined\n ) {\n return { ...result, providerId: resolvedProviderId };\n }\n return result;\n }\n\n #getUnavailableScalePriceLadder(\n reason: ScalePriceLadderUnavailableReason,\n providerId: PerpsProviderType | undefined,\n ): PerpsScalePriceLadder {\n return providerId\n ? { status: 'unavailable', providerId, reason }\n : { status: 'unavailable', reason };\n }\n\n /**\n * Build an unavailable capability response and omit unknown provider IDs.\n *\n * @param reason - Why capability discovery is unavailable.\n * @param providerId - Requested or resolved direct provider identity.\n * @returns Unavailable capability response.\n */\n #getUnavailableOrderCapabilities(\n reason: OrderCapabilitiesUnavailableReason,\n providerId: PerpsProviderType | undefined,\n ): PerpsOrderCapabilities {\n return providerId\n ? { status: 'unavailable', providerId, reason }\n : { status: 'unavailable', reason };\n }\n\n /**\n * Return the identity of a resolved direct provider when it is known.\n * Routing providers do not have one provider identity for every operation.\n *\n * @param provider - Resolved provider.\n * @returns Direct provider identity, if known.\n */\n #getDirectProviderId(provider: PerpsProvider): PerpsProviderType | undefined {\n if (provider.routesOrdersByProviderId) {\n return undefined;\n }\n return Array.from(this.providers.entries()).find(\n ([, candidate]) => candidate === provider,\n )?.[0];\n }\n\n /**\n * Check whether a resolved direct provider conflicts with an explicit route.\n * Aggregated mode owns its own per-operation routing.\n *\n * @param providerId - Explicit provider route, if any.\n * @param provider - Provider resolved after any in-flight initialization.\n * @returns Whether the route conflicts with the active provider mode.\n */\n #hasConflictingProviderRoute(\n providerId: PerpsProviderType | undefined,\n provider: PerpsProvider,\n ): boolean {\n return (\n providerId !== undefined &&\n !provider.routesOrdersByProviderId &&\n providerId !== provider.protocolId\n );\n }\n\n /**\n * Resolve one routed order operation after any in-flight initialization.\n *\n * @param params - Routed operation context.\n * @param params.orderType - Order type, when the operation carries one.\n * @param params.providerId - Explicit provider route, when supplied.\n * @returns The initialized provider that owns the operation.\n */\n async #resolveRoutedOrderProvider(params: {\n orderType: OrderType | undefined;\n providerId: PerpsProviderType | undefined;\n }): Promise<PerpsProvider> {\n const { orderType, providerId } = params;\n const provider = await this.#getActiveProviderWhenReady();\n if (this.#hasConflictingProviderRoute(providerId, provider)) {\n throw new Error(\n orderType !== undefined && isStrategyOrderType(orderType)\n ? PERPS_ERROR_CODES.ORDER_STRATEGY_ROUTE_UNAVAILABLE\n : PERPS_ERROR_CODES.PROVIDER_NOT_FOUND,\n );\n }\n return provider;\n }\n\n /**\n * Place a new order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result with order ID and status.\n */\n async placeOrder(params: OrderParams): Promise<OrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n const result = await this.#tradingService.placeOrder({\n provider,\n params,\n context: this.#createServiceContext('placeOrder', {\n saveTradeConfiguration: (symbol: string, leverage: number) =>\n this.saveTradeConfiguration(symbol, leverage),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n\n if (result.success) {\n this.clearPendingTradeConfiguration(params.symbol);\n }\n\n return result;\n }\n\n /**\n * Edit an existing order\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The updated order result with order ID and status.\n */\n async editOrder(params: EditOrderParams): Promise<OrderResult> {\n if (isStrategyOrderType(params.newOrder.orderType)) {\n return {\n success: false,\n error: PERPS_ERROR_CODES.ORDER_EDIT_STRATEGY_UNSUPPORTED,\n };\n }\n\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.newOrder.orderType,\n providerId: params.newOrder.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.editOrder({\n provider,\n params,\n context: this.#createServiceContext('editOrder'),\n });\n }\n\n /**\n * Cancel an existing order\n *\n * @param params - The operation parameters.\n * @returns The cancellation result with status.\n */\n async cancelOrder(params: CancelOrderParams): Promise<CancelOrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n\n return this.#tradingService.cancelOrder({\n provider,\n params,\n context: this.#createServiceContext('cancelOrder'),\n });\n }\n\n /**\n * Read venue-backed TWAP lifecycle records through the active provider.\n * Providers without native TWAP history return an empty list.\n *\n * @returns Current and terminal TWAP schedules with slice fills.\n */\n async getTwapOrders(): Promise<TwapOrder[]> {\n const provider = await this.#getActiveProviderWhenReady();\n return provider.getTwapOrders ? await provider.getTwapOrders() : [];\n }\n\n /**\n * Read the active provider's retained Chase lifecycle snapshots.\n * Providers without an emulated Chase implementation return an empty list.\n *\n * @returns Current Chase session snapshots.\n */\n async getChaseOrders(): Promise<ChaseOrder[]> {\n const provider = await this.#getActiveProviderWhenReady();\n return provider.getChaseOrders ? await provider.getChaseOrders() : [];\n }\n\n /**\n * Stop Chase repricing for app backgrounding without cancelling the current\n * resting children.\n *\n * @returns Chase snapshots after suspension.\n * @throws If an aggregated provider cannot suspend every active venue. Other\n * providers may already be suspended; callers can retry to reconcile them.\n */\n async suspendChaseOrders(): Promise<ChaseOrder[]> {\n const provider = await this.#getActiveProviderWhenReady();\n return provider.suspendChaseOrders\n ? await provider.suspendChaseOrders()\n : [];\n }\n\n /**\n * Cancel multiple orders in parallel\n * Batch version of cancelOrder() that cancels multiple orders simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch cancellation results for each order.\n */\n async cancelOrders(params: CancelOrdersParams): Promise<CancelOrdersResult> {\n const provider = await this.#getActiveProviderWhenReady();\n\n return this.#tradingService.cancelOrders({\n provider,\n params,\n context: this.#createServiceContext('cancelOrders', {\n getOpenOrders: () => this.getOpenOrders(),\n }),\n withStreamPause: <TResult>(\n operation: () => Promise<TResult>,\n channels: string[],\n ) => this.#withStreamPause(operation, channels),\n });\n }\n\n /**\n * Close a position (partial or full)\n * Thin delegation to TradingService\n *\n * @param params - The operation parameters.\n * @returns The order result from the close position request.\n */\n async closePosition(params: ClosePositionParams): Promise<OrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePosition({\n provider,\n params,\n context: this.#createServiceContext('closePosition', {\n getPositions: () => this.getPositions(),\n }),\n reportOrderToDataLake: (dataLakeParams) =>\n this.reportOrderToDataLake(dataLakeParams),\n });\n }\n\n /**\n * Close multiple positions in parallel\n * Batch version of closePosition() that closes multiple positions simultaneously\n *\n * @param params - The operation parameters.\n * @returns The batch close results for each position.\n */\n async closePositions(\n params: ClosePositionsParams,\n ): Promise<ClosePositionsResult> {\n const provider = await this.#getActiveProviderWhenReady();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.closePositions({\n provider,\n params,\n context: this.#createServiceContext('closePositions', {\n getPositions: () => this.getPositions(),\n }),\n });\n }\n\n /**\n * Update TP/SL for an existing position\n *\n * @param params - The operation parameters.\n * @returns The order result from the TP/SL update.\n */\n async updatePositionTPSL(\n params: UpdatePositionTPSLParams,\n ): Promise<OrderResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: undefined,\n providerId: params.providerId,\n });\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updatePositionTPSL({\n provider,\n params,\n context: this.#createServiceContext('updatePositionTPSL'),\n });\n }\n\n /**\n * Update margin for an existing position (add or remove)\n *\n * @param params - The operation parameters.\n * @returns The margin update result.\n */\n async updateMargin(params: UpdateMarginParams): Promise<MarginResult> {\n const provider = await this.#getActiveProviderWhenReady();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.updateMargin({\n provider,\n symbol: params.symbol,\n amount: params.amount,\n context: this.#createServiceContext('updateMargin'),\n });\n }\n\n /**\n * Flip position (reverse direction while keeping size and leverage)\n *\n * @param params - The operation parameters.\n * @returns The order result from the position flip.\n */\n async flipPosition(params: FlipPositionParams): Promise<OrderResult> {\n const provider = await this.#getActiveProviderWhenReady();\n this.#ensureTradingServiceDeps();\n\n return this.#tradingService.flipPosition({\n provider,\n position: params.position,\n trackingData: params.trackingData,\n context: this.#createServiceContext('flipPosition'),\n });\n }\n\n /**\n * Simplified deposit method that prepares transaction for confirmation screen\n * No complex state tracking - just sets a loading flag\n *\n * @param params - Parameters for the deposit flow\n * @param params.amount - Optional deposit amount\n * @param params.placeOrder - If true, uses addTransaction instead of submit to avoid navigation\n * @returns An object containing a promise that resolves to the transaction hash.\n */\n async depositWithConfirmation(\n params: DepositWithConfirmationParams = {},\n ): Promise<{ result: Promise<string> }> {\n const { amount, placeOrder } = params;\n\n let currentDepositId: string | undefined;\n\n try {\n const provider = await this.#getActiveProviderWhenReady();\n const {\n transaction,\n assetChainId,\n currentDepositId: depositId,\n } = await this.#depositService.prepareTransaction({ provider });\n currentDepositId = depositId;\n\n // Get current account address via messenger (outside of update() for proper typing)\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n const accountAddress = evmAccount?.address ?? 'unknown';\n\n this.update((state) => {\n state.lastDepositResult = null;\n\n // Add deposit request to tracking\n const depositRequest = {\n id: currentDepositId ?? uuidv4(),\n timestamp: Date.now(),\n amount: amount ?? '0', // Use provided amount or default to '0'\n asset: USDC_SYMBOL,\n accountAddress, // Track which account initiated deposit\n success: false, // Will be updated when transaction completes\n txHash: undefined,\n status: 'pending' as TransactionStatus,\n source: undefined,\n transactionId: undefined, // Will be set to depositId when available\n };\n\n state.depositRequests.unshift(depositRequest); // Add to beginning of array\n });\n\n const networkClientId = this.#findNetworkClientIdForChain(assetChainId);\n\n if (!networkClientId) {\n throw new Error(\n `No network client found for chain ${assetChainId}. Please add the network first.`,\n );\n }\n\n let result: Promise<string>;\n let transactionMeta: { id: string };\n let depositOrderResult: Promise<string> | null = null;\n\n const defaultTransactionOptions = {\n networkClientId,\n origin: ORIGIN_METAMASK,\n skipInitialGasEstimate: true,\n };\n\n this.#options.infrastructure.tracer.addBreadcrumb({\n category: 'perps',\n message: 'Deposit action started',\n level: 'info',\n data: {\n place_order_after_deposit: placeOrder === true,\n },\n });\n\n if (placeOrder) {\n // Use addTransaction to create transaction without navigating to confirmation screen\n const addResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDepositAndOrder',\n });\n transactionMeta = addResult.transactionMeta;\n // Return transaction ID immediately (fire-and-forget for caller)\n result = Promise.resolve(transactionMeta.id);\n // Track deposit request lifecycle via the real transaction result\n depositOrderResult = addResult.result;\n } else {\n // submit shows the confirmation screen and returns a promise\n // The promise will resolve when transaction completes or reject if cancelled/failed\n const submitResult = await this.#submitTransaction(transaction, {\n ...defaultTransactionOptions,\n type: 'perpsDeposit',\n });\n result = submitResult.result;\n transactionMeta = submitResult.transactionMeta;\n }\n\n // Store the transaction ID and try to get amount from transaction\n this.update((state) => {\n state.lastDepositTransactionId = transactionMeta.id;\n });\n\n // Track the transaction lifecycle only when using submit (deposit-only flow)\n if (!placeOrder) {\n // At this point, the confirmation modal is shown to the user\n // The result promise will resolve/reject based on user action and transaction outcome\n\n // Track the transaction lifecycle\n // The result promise will resolve/reject based on user action and transaction outcome\n // Note: We intentionally don't set depositInProgress immediately to avoid\n // showing toasts before the user confirms the transaction\n\n // TODO: @abretonc7s Find a better way to trigger our custom toast notification then having to toggle the state\n // How to replace the system notifications?\n result\n .then((actualTxHash) => {\n // Transaction was successfully completed\n // Set depositInProgress to true temporarily to show success\n this.update((state) => {\n state.depositInProgress = true;\n state.lastDepositResult = {\n success: true,\n txHash: actualTxHash,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n error: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n // For deposits, we have a txHash immediately, so mark as completed\n // (the transaction hash means the deposit was successful)\n requestToUpdate.status = 'completed';\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n }\n });\n\n // Clear depositInProgress after a short delay\n setTimeout(() => {\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n });\n }, 100);\n\n return;\n })\n .catch((error) => {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (userCancelled) {\n // User cancelled - clear any state, no toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n // Don't set lastDepositResult - no toast needed\n\n // Mark deposit request as cancelled\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'cancelled' as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n } else {\n // Transaction failed after confirmation - show error toast\n this.update((state) => {\n state.depositInProgress = false;\n state.lastDepositTransactionId = null;\n state.lastDepositResult = {\n success: false,\n error: errorMessage,\n amount: amount ?? '0',\n asset: USDC_SYMBOL, // Default asset for deposits\n timestamp: Date.now(),\n txHash: '',\n };\n\n // Update the deposit request by request ID to avoid race conditions\n if (state.depositRequests.length > 0) {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'failed';\n requestToUpdate.success = false;\n }\n }\n });\n }\n });\n } else if (depositOrderResult) {\n // Track deposit request lifecycle for deposit+order flow\n depositOrderResult\n .then((actualTxHash) => {\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = 'completed';\n requestToUpdate.success = true;\n requestToUpdate.txHash = actualTxHash;\n }\n });\n return;\n })\n .catch((error) => {\n const errorMessage = ensureError(\n error,\n 'PerpsController.depositWithOrder',\n ).message;\n const isCancellation =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n this.update((state) => {\n const requestToUpdate = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (requestToUpdate) {\n requestToUpdate.status = (\n isCancellation ? 'cancelled' : 'failed'\n ) as TransactionStatus;\n requestToUpdate.success = false;\n }\n });\n });\n }\n\n return {\n result,\n };\n } catch (error) {\n // Check if user denied/cancelled the transaction\n const errorMessage = ensureError(\n error,\n 'PerpsController.initiateDeposit',\n ).message;\n const userCancelled =\n errorMessage.includes('User denied') ||\n errorMessage.includes('User rejected') ||\n errorMessage.includes('User cancelled') ||\n errorMessage.includes('User canceled');\n\n if (!userCancelled) {\n // Only track actual errors, not user cancellations\n this.update((state) => {\n state.lastDepositTransactionId = null;\n // Note: lastDepositResult is already set in the catch block above\n\n // Mark deposit request as failed if one was created\n if (currentDepositId) {\n const request = state.depositRequests.find(\n (req) => req.id === currentDepositId,\n );\n if (request) {\n request.status = 'failed';\n request.success = false;\n }\n }\n });\n }\n throw error;\n }\n }\n\n /**\n * Same as depositWithConfirmation - prepares transaction for confirmation screen.\n *\n * @returns A promise that resolves to the string result.\n */\n async depositWithOrder(): Promise<{ result: Promise<string> }> {\n return this.depositWithConfirmation({ placeOrder: true });\n }\n\n /**\n * Clear the last deposit result after it has been shown to the user\n */\n clearDepositResult(): void {\n this.update((state) => {\n state.lastDepositResult = null;\n });\n }\n\n clearWithdrawResult(): void {\n this.update((state) => {\n state.lastWithdrawResult = null;\n });\n }\n\n /**\n * Update withdrawal request status when it completes, or remove it on failure.\n * This is called when a withdrawal is matched with a completed withdrawal from the API.\n * When status is `failed`, the request is removed from the queue (not retained).\n *\n * @param withdrawalId - The withdrawal transaction ID.\n * @param status - The current status.\n * @param txHash - The transaction hash.\n */\n updateWithdrawalStatus(\n withdrawalId: string,\n status: 'completed' | 'failed',\n txHash?: string,\n ): void {\n let withdrawalAmount: string | undefined;\n let shouldTrack = false;\n let found = false;\n\n this.update((state) => {\n const withdrawalIndex = state.withdrawalRequests.findIndex(\n (request) => request.id === withdrawalId,\n );\n\n if (withdrawalIndex >= 0) {\n found = true;\n const request = state.withdrawalRequests[withdrawalIndex];\n withdrawalAmount = request.amount;\n shouldTrack =\n withdrawalAmount !== undefined && request.status !== status;\n\n if (status === 'failed') {\n state.withdrawalRequests.splice(withdrawalIndex, 1);\n state.withdrawInProgress = state.withdrawalRequests.some(\n (req) => req.status === 'pending' || req.status === 'bridging',\n );\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n } else {\n request.status = status;\n request.success = status === 'completed';\n if (txHash) {\n request.txHash = txHash;\n }\n\n // Clear withdrawal progress when withdrawal completes\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n }\n }\n });\n\n if (shouldTrack && withdrawalAmount !== undefined) {\n this.#getMetrics().trackPerpsEvent(\n PerpsAnalyticsEvent.WithdrawalTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]:\n status === 'completed'\n ? PERPS_EVENT_VALUE.STATUS.COMPLETED\n : PERPS_EVENT_VALUE.STATUS.FAILED,\n [PERPS_EVENT_PROPERTY.WITHDRAWAL_AMOUNT]:\n Number.parseFloat(withdrawalAmount),\n },\n );\n }\n\n if (found) {\n this.#debugLog('PerpsController: Updated withdrawal status', {\n withdrawalId,\n status,\n txHash,\n });\n }\n }\n\n /**\n * Complete a specific withdrawal detected via transaction history polling (FIFO queue).\n * Called when a completed withdrawal appears in the transaction history matching a pending request.\n *\n * Uses FIFO matching: oldest pending withdrawal is matched with first completed withdrawal\n * in history that happened after its submission time.\n *\n * @param withdrawalRequestId - The ID of the pending withdrawal request to mark as complete.\n * @param completedWithdrawal - The completed withdrawal data from the history API.\n * @param completedWithdrawal.txHash - The on-chain transaction hash.\n * @param completedWithdrawal.amount - The withdrawal amount.\n * @param completedWithdrawal.timestamp - The completion timestamp from the history API.\n * @param completedWithdrawal.asset - The asset symbol (e.g. USDC).\n */\n completeWithdrawalFromHistory(\n withdrawalRequestId: string,\n completedWithdrawal: {\n txHash: string;\n amount: string;\n timestamp: number;\n asset?: string;\n },\n ): void {\n let didRemove = false;\n this.update((state) => {\n const requestIndex = state.withdrawalRequests.findIndex(\n (req) => req.id === withdrawalRequestId,\n );\n\n if (requestIndex === -1) {\n return;\n }\n\n didRemove = true;\n state.withdrawalRequests.splice(requestIndex, 1);\n\n // Update the FIFO guard. The timestamp is persisted for cross-restart\n // protection. The txHashes array (not persisted) accumulates within a\n // session to prevent re-matching direct completions and same-millisecond\n // API completions. It resets naturally on app restart.\n state.lastCompletedWithdrawalTimestamp = completedWithdrawal.timestamp;\n state.lastCompletedWithdrawalTxHashes.push(completedWithdrawal.txHash);\n\n const hasPendingWithdrawals = state.withdrawalRequests.some(\n (req) => req.status === 'pending' || req.status === 'bridging',\n );\n\n state.withdrawInProgress = hasPendingWithdrawals;\n\n if (!hasPendingWithdrawals) {\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n }\n\n state.lastUpdateTimestamp = Date.now();\n });\n\n if (!didRemove) {\n return;\n }\n\n this.#debugLog(\n 'PerpsController: Completed withdrawal from transaction history (FIFO)',\n {\n withdrawalRequestId,\n txHash: completedWithdrawal.txHash,\n amount: completedWithdrawal.amount,\n },\n );\n\n this.#getMetrics().trackPerpsEvent(\n PerpsAnalyticsEvent.WithdrawalTransaction,\n {\n [PERPS_EVENT_PROPERTY.STATUS]: PERPS_EVENT_VALUE.STATUS.COMPLETED,\n [PERPS_EVENT_PROPERTY.WITHDRAWAL_AMOUNT]: Number.parseFloat(\n completedWithdrawal.amount,\n ),\n },\n );\n }\n\n /**\n * Update withdrawal progress (persistent across navigation)\n *\n * @param progress - The progress indicator.\n * @param activeWithdrawalId - The active withdrawal ID.\n */\n updateWithdrawalProgress(\n progress: number,\n activeWithdrawalId: string | null = null,\n ): void {\n this.update((state) => {\n state.withdrawalProgress = {\n progress,\n lastUpdated: Date.now(),\n activeWithdrawalId,\n };\n });\n }\n\n /**\n * Get current withdrawal progress\n *\n * @returns The withdrawal progress, last update timestamp, and active withdrawal ID.\n */\n getWithdrawalProgress(): {\n progress: number;\n lastUpdated: number;\n activeWithdrawalId: string | null;\n } {\n return this.state.withdrawalProgress;\n }\n\n /**\n * Withdraw funds from trading account\n *\n * The withdrawal process varies by provider and may involve:\n * - Direct on-chain transfers\n * - Bridge operations\n * - Multi-step validation processes\n *\n * Check the specific provider documentation for detailed withdrawal flows.\n *\n * @param params Withdrawal parameters\n * @returns WithdrawResult with withdrawal ID and tracking info\n */\n async withdraw(params: WithdrawParams): Promise<WithdrawResult> {\n const provider = await this.#getActiveProviderWhenReady();\n\n return this.#accountService.withdraw({\n provider,\n params,\n context: this.#createServiceContext('withdraw'),\n refreshAccountState: async () => {\n await this.getAccountState({ source: 'post_withdrawal' });\n },\n });\n }\n\n /**\n * Get current positions\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow position queries\n * without full perps initialization (e.g., for showing positions on token details page)\n *\n * @param params - The operation parameters.\n * @returns Array of open positions for the active provider.\n */\n async getPositions(params?: GetPositionsParams): Promise<Position[]> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has positions) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n // TODO: When adding new providers, consider a provider factory pattern\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = provider.getPositions(params);\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getPositions({\n provider,\n params,\n context: this.#createServiceContext('getPositions'),\n });\n }\n\n /**\n * Get historical user fills (trade executions)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @param options - Optional call modifiers.\n * @param options.forceRefresh - Bypass the request-coalesce cache\n * end-to-end (user-initiated refresh).\n * @returns Array of historical trade executions (fills).\n */\n async getOrderFills(\n params?: GetOrderFillsParams,\n options?: { forceRefresh?: boolean },\n ): Promise<OrderFill[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrderFills({\n provider,\n params,\n context: this.#createServiceContext('getOrderFills'),\n forceRefresh: options?.forceRefresh,\n });\n }\n\n /**\n * List TP/SL protection changes the active provider parked for\n * explicit manual re-establishment. Providers without durable\n * settlement state return an empty list.\n *\n * @returns Pending manual-recovery entries.\n */\n async getPendingManualRecoveries(): Promise<PerpsPendingManualRecovery[]> {\n const provider = await this.#getActiveProviderWhenReady();\n if (!provider.getPendingManualRecoveries) {\n return [];\n }\n return provider.getPendingManualRecoveries();\n }\n\n /**\n * READ-ONLY list of the active provider's recovered-dispatch outcomes\n * (previously ambiguous submissions later resolved). Providers without\n * durable dispatch state return an empty list.\n *\n * @returns Pending recovered-dispatch outcomes.\n */\n async getRecoveredDispatches(): Promise<PerpsRecoveredDispatch[]> {\n const provider = await this.#getActiveProviderWhenReady();\n if (!provider.getRecoveredDispatches) {\n return [];\n }\n return provider.getRecoveredDispatches();\n }\n\n /**\n * Acknowledge ONE recovered-dispatch outcome by its stable id, after\n * refreshing venue state. Throws when the active provider has no\n * durable dispatch state or the id no longer matches.\n *\n * @param recoveryId - Stable id from {@link getRecoveredDispatches}.\n * @returns Resolves when the outcome is acknowledged.\n */\n async acknowledgeRecoveredDispatch(recoveryId: string): Promise<void> {\n const provider = await this.#getActiveProviderWhenReady();\n if (!provider.acknowledgeRecoveredDispatch) {\n throw new Error(\n 'The active perps provider has no recovered dispatches to acknowledge',\n );\n }\n return provider.acknowledgeRecoveredDispatch(recoveryId);\n }\n\n /**\n * Get historical user orders (order lifecycle)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @param options - Optional call modifiers.\n * @param options.forceRefresh - Bypass the request-coalesce cache\n * end-to-end (user-initiated refresh).\n * @returns Array of historical orders.\n */\n async getOrders(\n params?: GetOrdersParams,\n options?: { forceRefresh?: boolean },\n ): Promise<Order[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOrders({\n provider,\n params,\n context: this.#createServiceContext('getOrders'),\n forceRefresh: options?.forceRefresh,\n });\n }\n\n /**\n * Get currently open orders (real-time status)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow open order queries\n * without full perps initialization (e.g., for background preloading)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getOpenOrders(params?: GetOrdersParams): Promise<Order[]> {\n // For standalone mode, access provider directly without initialization check\n if (params?.standalone && params.userAddress) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = provider.getOpenOrders(params);\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getOpenOrders({\n provider,\n params,\n context: this.#createServiceContext('getOpenOrders'),\n });\n }\n\n /**\n * Get historical user funding history (funding payments)\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @param options - Optional call modifiers.\n * @param options.forceRefresh - Bypass the request-coalesce cache\n * end-to-end (user-initiated refresh).\n * @returns Array of historical funding payments.\n */\n async getFunding(\n params?: GetFundingParams,\n options?: { forceRefresh?: boolean },\n ): Promise<Funding[]> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getFunding({\n provider,\n params,\n context: this.#createServiceContext('getFunding'),\n forceRefresh: options?.forceRefresh,\n });\n }\n\n /**\n * Get account state (balances, etc.)\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow account state queries\n * without full perps initialization (e.g., for checking if user has perps funds)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async getAccountState(params?: GetAccountStateParams): Promise<AccountState> {\n // For standalone mode, access provider directly without initialization check\n // This allows discovery use cases (checking if user has perps funds) without full perps setup\n if (params?.standalone && params.userAddress) {\n // Use activeProviderInstance if available (respects provider abstraction)\n // Fallback to cached standalone provider for pre-initialization discovery\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = provider.getAccountState(params);\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getAccountState({\n provider,\n params,\n context: this.#createServiceContext('getAccountState'),\n });\n }\n\n /**\n * Get historical portfolio data\n * Thin delegation to MarketDataService\n *\n * @param params - The operation parameters.\n * @returns The historical portfolio data points.\n */\n async getHistoricalPortfolio(\n params?: GetHistoricalPortfolioParams,\n ): Promise<HistoricalPortfolioResult> {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getHistoricalPortfolio({\n provider,\n params,\n context: this.#createServiceContext('getHistoricalPortfolio'),\n });\n }\n\n /**\n * Get available markets with optional filtering\n * Thin delegation to MarketDataService\n *\n * For standalone mode, bypasses getActiveProvider() to allow market discovery\n * without full perps initialization (e.g., for discovery banners on spot screens)\n *\n * @param params - The operation parameters.\n * @returns Array of available markets matching the filter criteria.\n */\n async getMarkets(params?: GetMarketsParams): Promise<MarketInfo[]> {\n const isMarketAllowed = this.#buildMarketAllowedFilter();\n if (params?.standalone) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = this.#marketDataService.getMarkets({\n provider,\n params,\n context: this.#createServiceContext('getMarkets'),\n isMarketAllowed,\n });\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getMarkets({\n provider,\n params,\n context: this.#createServiceContext('getMarkets'),\n isMarketAllowed,\n });\n }\n\n /**\n * Get market data with prices (includes price, volume, 24h change).\n * Optionally filter by category, sort, and limit the results.\n *\n * For standalone mode, bypasses getActiveProvider() to allow market data queries\n * without full perps initialization (e.g., for background preloading on app start)\n *\n * @param params - The operation parameters.\n * @param params.standalone - Whether to use standalone mode.\n * @param params.categories - Filter to markets matching any of these categories.\n * @param params.sortBy - Sort results by this field.\n * @param params.direction - Sort direction (default: desc).\n * @param params.limit - Maximum number of results to return.\n * @returns A promise that resolves to the market data.\n */\n async getMarketDataWithPrices(\n params?: GetMarketDataWithPricesParams,\n ): Promise<PerpsMarketData[]> {\n const globalSnapshot = this.#buildGlobalSnapshotContext();\n const context = this.#createServiceContext('getMarketDataWithPrices', {\n ...(globalSnapshot && { globalSnapshot }),\n });\n if (params?.standalone) {\n const provider =\n this.activeProviderInstance ?? this.#getOrCreateStandaloneProvider();\n const operation = this.#marketDataService.getMarketDataWithPrices({\n provider,\n params,\n context,\n });\n return provider === this.#standaloneProvider\n ? this.#trackStandaloneProviderOperation(provider, operation)\n : operation;\n }\n\n const provider = this.getActiveProvider();\n return this.#marketDataService.getMarketDataWithPrices({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Capture the exact static identity required to adopt an atomic snapshot.\n * Dynamic DEX discovery and non-Hyperliquid provider modes deliberately opt\n * out so they retain the provider path.\n *\n * @returns Snapshot identity plus a race guard, or undefined when unsafe.\n */\n #buildGlobalSnapshotContext(): ServiceContext['globalSnapshot'] {\n const snapshotConfigured =\n Boolean(this.#options.infrastructure.terminalApi?.globalSnapshotUrl) ||\n typeof this.#options.infrastructure.terminalMarketService\n ?.fetchGlobalSnapshot === 'function';\n if (!snapshotConfigured || this.state.activeProvider !== 'hyperliquid') {\n return undefined;\n }\n\n const enabledDexes = this.#getStaticSnapshotDexes();\n if (!enabledDexes) {\n return undefined;\n }\n const { isTestnet, hip3ConfigVersion } = this.state;\n return {\n request: {\n provider: 'hyperliquid',\n network: isTestnet ? 'testnet' : 'mainnet',\n enabledDexes,\n },\n isCurrent: () =>\n this.state.activeProvider === 'hyperliquid' &&\n this.state.isTestnet === isTestnet &&\n this.state.hip3ConfigVersion === hip3ConfigVersion,\n isMarketAllowed: this.#buildMarketAllowedFilter(),\n };\n }\n\n #getStaticSnapshotDexes(): string[] | undefined {\n if (!this.#hip3Enabled) {\n return ['main'];\n }\n if (this.state.isTestnet) {\n return TESTNET_HIP3_CONFIG.AutoDiscoverAll\n ? undefined\n : canonicalizeHyperLiquidDexes(TESTNET_HIP3_CONFIG.EnabledDexs);\n }\n if (MAINNET_HIP3_CONFIG.AutoDiscoverAll) {\n return undefined;\n }\n\n const dexes = new Set<string>();\n for (const pattern of this.#hip3AllowlistMarkets) {\n const colonIndex = pattern.indexOf(':');\n if (colonIndex <= 0) {\n if (/^[a-z][a-z0-9]*$/iu.test(pattern)) {\n dexes.add(pattern.toLowerCase());\n continue;\n }\n return undefined;\n }\n const dex = pattern.slice(0, colonIndex);\n if (dex && /^[a-z0-9][a-z0-9-]*$/u.test(dex)) {\n dexes.add(dex);\n } else {\n return undefined;\n }\n }\n return canonicalizeHyperLiquidDexes(dexes);\n }\n\n // ============================================================================\n // Market Data Preload (client-agnostic background caching)\n // ============================================================================\n\n /** State paths that the preload stateChange handler reads. */\n static readonly #preloadWatchedPaths = new Set([\n 'isTestnet',\n 'hip3ConfigVersion',\n ]);\n\n #preloadTimer: ReturnType<typeof setInterval> | null = null;\n\n #preloadStartRequested = false;\n\n #isPreloading = false;\n\n #marketPreloadQueued = false;\n\n #isPreloadingUserData = false;\n\n #userPreloadQueued = false;\n\n #lifecycleGeneration = 0;\n\n readonly #userSnapshotRequests = new Map<\n string,\n { provider: PerpsProvider; promise: Promise<PerpsUserDataSnapshot> }\n >();\n\n #preloadStateUnsubscribe: (() => void) | null = null;\n\n #accountChangeUnsubscribe: (() => void) | null = null;\n\n #previousIsTestnet: boolean | null = null;\n\n #previousHip3ConfigVersion: number | null = null;\n\n static readonly #preloadRefreshMs = 5 * 60 * 1000; // 5 min\n\n static readonly #preloadGuardMs = 30_000; // 30s debounce\n\n /**\n * Synchronously hydrate in-memory caches from disk-persisted snapshots.\n * Uses the sync MMKV API (~1ms) so data is available before any hook reads.\n * Falls back to no-op when getItemSync is not available (e.g. E2E).\n * All computed updates are applied in a single this.update() call to avoid\n * triggering state subscribers once per provider entry.\n */\n #hydrateCacheFromDiskSync(): void {\n const { marketUpdates, userUpdates, stats } = hydrateFromDiskSync(\n this.#options.infrastructure.diskCache,\n this.state.cachedMarketDataByProvider,\n this.state.cachedUserDataByProvider,\n PerpsController.#preloadGuardMs,\n );\n\n const hasMarketUpdates = Object.keys(marketUpdates).length > 0;\n const hasUserUpdates = Object.keys(userUpdates).length > 0;\n if (hasMarketUpdates || hasUserUpdates) {\n this.update((state) => {\n if (hasMarketUpdates) {\n Object.assign(state.cachedMarketDataByProvider, marketUpdates);\n }\n if (hasUserUpdates) {\n Object.assign(state.cachedUserDataByProvider, userUpdates);\n }\n });\n }\n\n this.#debugLog('PerpsController: Disk cache hydrated (sync)', {\n markets: stats.marketCount,\n positions: stats.userPositions,\n orders: stats.userOrders,\n duration_ms: stats.durationMs,\n });\n }\n\n /** Persist the latest selected-account snapshot for each provider/network. */\n #persistUserCacheToDisk(): void {\n const entries: DiskCacheUserEntry[] = [];\n\n for (const [cacheKey, entry] of Object.entries(\n this.state.cachedUserDataByProvider,\n )) {\n const [providerId, network] = cacheKey.split(':');\n if (\n !providerId ||\n (network !== 'mainnet' && network !== 'testnet') ||\n providerId === 'aggregated'\n ) {\n continue;\n }\n entries.push({\n providerNetworkKey: `${providerId}:${network}`,\n address: entry.address,\n positions: entry.positions,\n orders: entry.orders,\n accountState: entry.accountState,\n timestamp: entry.timestamp,\n ...(entry.hip3ConfigVersion !== undefined && {\n hip3ConfigVersion: entry.hip3ConfigVersion,\n }),\n ...(entry.dexes !== undefined && { dexes: entry.dexes }),\n });\n }\n\n this.#userDiskWrite = this.#userDiskWrite\n .then(() =>\n persistUserEntriesToDisk(\n this.#options.infrastructure.diskCache,\n entries,\n ),\n )\n .catch(() => {\n // Disk persistence is best-effort and must not block live data.\n });\n }\n\n /**\n * Start background market data preloading.\n * Fetches market data immediately and refreshes every 5 minutes.\n * Watches for isTestnet and hip3ConfigVersion changes to re-preload.\n */\n startMarketDataPreload(): void {\n this.#preloadStartRequested = true;\n if (this.#disconnectOperationPromise) {\n this.#debugLog(\n 'PerpsController: Disconnect in progress, deferring market data preload',\n );\n return;\n }\n if (this.#preloadTimer) {\n this.#debugLog('PerpsController: Preload already started, skipping');\n return;\n }\n\n this.#debugLog('PerpsController: Starting market data preload');\n\n // Track current values for change detection\n this.#previousIsTestnet = this.state.isTestnet;\n this.#previousHip3ConfigVersion = this.state.hip3ConfigVersion;\n\n // Immediate preload\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n\n // Periodic refresh\n this.#preloadTimer = setInterval(() => {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }, PerpsController.#preloadRefreshMs);\n\n // Watch for isTestnet / hip3ConfigVersion changes\n const handler: StateChangeListener<PerpsControllerState> = (\n _state,\n patches,\n ) => {\n // Early-return when no watched field changed (skips ~46 unrelated updates)\n const hasRelevantChange = patches.some(\n (patch) =>\n typeof patch.path[0] === 'string' &&\n PerpsController.#preloadWatchedPaths.has(patch.path[0]),\n );\n if (!hasRelevantChange) {\n return;\n }\n\n const currentIsTestnet = this.state.isTestnet;\n const currentHip3Version = this.state.hip3ConfigVersion;\n\n const testnetChanged = currentIsTestnet !== this.#previousIsTestnet;\n const hip3Changed =\n currentHip3Version !== this.#previousHip3ConfigVersion;\n\n if (testnetChanged || hip3Changed) {\n this.#debugLog(\n 'PerpsController: Network/config changed, re-preloading',\n {\n testnetChanged,\n hip3Changed,\n isTestnet: currentIsTestnet,\n hip3ConfigVersion: currentHip3Version,\n },\n );\n\n this.#previousIsTestnet = currentIsTestnet;\n this.#previousHip3ConfigVersion = currentHip3Version;\n\n // No need to clear user data cache — per-provider keys include the\n // network, so different networks don't collide. Re-preload will\n // populate the new key.\n\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n };\n\n this.messenger.subscribe('PerpsController:stateChanged', handler);\n this.#preloadStateUnsubscribe = (): void => {\n this.messenger.unsubscribe('PerpsController:stateChanged', handler);\n };\n\n // Watch for selected account changes and selected account group changes.\n const accountChangeHandler = (): void => {\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n const currentAddress = evmAccount?.address ?? null;\n this.#debugLog('PerpsController: account cache selection', {\n address: currentAddress?.toLowerCase() ?? null,\n availableKeys: Object.keys(this.state.cachedUserDataByProvider).sort(),\n });\n\n // The address guard makes the previous entry unreadable immediately;\n // refresh replaces it under the existing provider/network key.\n if (currentAddress) {\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n };\n this.messenger.subscribe(\n 'AccountsController:selectedAccountChange',\n accountChangeHandler,\n );\n this.messenger.subscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n this.#accountChangeUnsubscribe = (): void => {\n this.messenger.unsubscribe(\n 'AccountsController:selectedAccountChange',\n accountChangeHandler,\n );\n this.messenger.unsubscribe(\n 'AccountTreeController:selectedAccountGroupChange',\n accountChangeHandler,\n );\n };\n }\n\n /**\n * Stop background market data preloading.\n */\n stopMarketDataPreload(): void {\n this.#debugLog('PerpsController: Stopping market data preload');\n this.#preloadStartRequested = false;\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n this.#marketPreloadQueued = false;\n this.#userPreloadQueued = false;\n this.#cleanupStandaloneProvider().catch(() => {\n /* fire-and-forget to preserve sync signature */\n });\n }\n\n /**\n * Perform a single market data preload (best-effort, no throw).\n */\n async #performMarketDataPreload(): Promise<void> {\n if (this.#isPreloading) {\n this.#marketPreloadQueued = true;\n return;\n }\n\n // Skip preloading during provider/network reinitialisation.\n // The activeProviderInstance still points to the OLD network's provider\n // until init() completes, so fetching now would store stale data under\n // the NEW network's cache key.\n if (this.#isReinitializing) {\n return;\n }\n\n // Determine actual provider and cache key for debounce\n const actualProviderId = this.activeProviderInstance\n ? this.state.activeProvider // includes 'aggregated'\n : 'hyperliquid';\n const cacheKey = buildProviderCacheKey(\n actualProviderId,\n this.state.isTestnet,\n );\n const preloadContext = {\n activeProvider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n hip3ConfigVersion: this.state.hip3ConfigVersion,\n lifecycleGeneration: this.#lifecycleGeneration,\n };\n const isCurrent = (): boolean =>\n this.#lifecycleGeneration === preloadContext.lifecycleGeneration &&\n this.state.activeProvider === preloadContext.activeProvider &&\n this.state.isTestnet === preloadContext.isTestnet &&\n this.state.hip3ConfigVersion === preloadContext.hip3ConfigVersion;\n const staticSnapshotDexes = this.#getStaticSnapshotDexes();\n\n const now = Date.now();\n const existingEntry = this.state.cachedMarketDataByProvider[cacheKey];\n if (\n existingEntry &&\n this.#isMarketCacheEntryCurrent(actualProviderId, existingEntry) &&\n now - existingEntry.timestamp < PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n this.#isPreloading = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | { success: boolean; marketCount?: number; error?: string }\n | undefined;\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: this.state.activeProvider,\n isTestnet: this.state.isTestnet,\n },\n });\n\n this.#debugLog('PerpsController: Fetching market data in background');\n this.#debugLog('PerpsController: rest_preload_start');\n const data = await this.getMarketDataWithPrices({ standalone: true });\n this.#debugLog('PerpsController: rest_preload_end', {\n duration_ms: Math.round(performance.now() - preloadStart),\n markets: data.length,\n });\n\n if (!isCurrent()) {\n traceData = {\n success: false,\n error: 'Global snapshot preload context changed',\n };\n this.#debugLog(\n 'PerpsController: Discarding stale global snapshot preload',\n );\n return;\n }\n\n // Store under per-provider key(s)\n const ts = Date.now();\n const sourceExpiries = data.flatMap((market) =>\n market.dataSource === 'terminal-global-snapshot-mark' &&\n typeof market.sourceExpiresAt === 'number'\n ? [market.sourceExpiresAt]\n : [],\n );\n const sourceExpiresAt =\n data.length > 0 && sourceExpiries.length === data.length\n ? Math.min(...sourceExpiries)\n : undefined;\n const snapshotCacheIdentity =\n sourceExpiresAt !== undefined && staticSnapshotDexes\n ? {\n sourceExpiresAt,\n hip3ConfigVersion: preloadContext.hip3ConfigVersion,\n dexes: staticSnapshotDexes,\n }\n : {};\n const marketDiskEntries: {\n providerNetworkKey: string;\n data: PerpsMarketData[];\n timestamp: number;\n }[] = [];\n if (!isCurrent()) {\n traceData = {\n success: false,\n error: 'Global snapshot preload context changed',\n };\n return;\n }\n if (\n this.state.activeProvider === 'aggregated' &&\n this.activeProviderInstance\n ) {\n // Split returned data by providerId and store each slice\n const fallbackProviderId = 'hyperliquid'; // default for items missing providerId\n const byProvider = new Map<string, PerpsMarketData[]>();\n for (const item of data) {\n const pid = item.providerId ?? fallbackProviderId;\n const existing = byProvider.get(pid);\n if (existing) {\n existing.push(item);\n } else {\n byProvider.set(pid, [item]);\n }\n }\n this.update((state) => {\n for (const [pid, slice] of byProvider) {\n const key = buildProviderCacheKey(pid, this.state.isTestnet);\n marketDiskEntries.push({\n providerNetworkKey: key,\n data: slice,\n timestamp: ts,\n });\n state.cachedMarketDataByProvider[key] = {\n data: slice,\n timestamp: ts,\n };\n }\n // Write aggregated sentinel so the staleness guard sees it\n state.cachedMarketDataByProvider[cacheKey] = {\n data: [], // sentinel — real data is in per-provider keys\n timestamp: ts,\n };\n });\n } else {\n marketDiskEntries.push({\n providerNetworkKey: cacheKey,\n data,\n timestamp: ts,\n });\n this.update((state) => {\n state.cachedMarketDataByProvider[cacheKey] = {\n data,\n timestamp: ts,\n ...snapshotCacheIdentity,\n };\n });\n }\n\n persistMarketEntriesToDisk(\n this.#options.infrastructure.diskCache,\n marketDiskEntries,\n );\n\n this.#debugLog('PerpsController: Market data preloaded', {\n marketCount: data.length,\n });\n\n traceData = { success: true, marketCount: data.length };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsMarketDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n traceId,\n );\n } catch (error) {\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performMarketDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performMarketDataPreload'),\n this.#getErrorContext('performMarketDataPreload', {\n message: 'Background preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.MarketDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloading = false;\n if (this.#marketPreloadQueued && this.#preloadTimer) {\n this.#marketPreloadQueued = false;\n this.#performMarketDataPreload().catch(() => {\n // Background preload is best-effort.\n });\n }\n }\n }\n\n /**\n * Perform a single user data preload (best-effort, no throw).\n * Fetches positions, open orders, and account state via lightweight REST calls.\n */\n async #performUserDataPreload(): Promise<void> {\n if (this.#isPreloadingUserData) {\n this.#userPreloadQueued = true;\n return;\n }\n\n if (this.#isReinitializing) {\n return;\n }\n\n // Get current user address\n const evmAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n if (!evmAccount?.address) {\n return;\n }\n\n const userAddress = evmAccount.address;\n const { activeProvider, isTestnet, hip3ConfigVersion } = this.state;\n const lifecycleGeneration = this.#lifecycleGeneration;\n const { activeProviderInstance } = this;\n const hyperliquidDexes = this.#getStaticSnapshotDexes();\n const isCurrent = (): boolean => {\n let currentAddress: string | undefined;\n try {\n currentAddress = getSelectedEvmAccountFromMessenger(\n this.messenger,\n )?.address;\n } catch {\n return false;\n }\n return (\n this.#lifecycleGeneration === lifecycleGeneration &&\n this.state.activeProvider === activeProvider &&\n this.activeProviderInstance === activeProviderInstance &&\n this.state.isTestnet === isTestnet &&\n this.state.hip3ConfigVersion === hip3ConfigVersion &&\n currentAddress?.toLowerCase() === userAddress.toLowerCase()\n );\n };\n\n // Determine actual provider (same logic as market preload)\n const actualProviderId = activeProviderInstance\n ? activeProvider // includes 'aggregated'\n : 'hyperliquid';\n const providerNetworkKey = buildProviderCacheKey(\n actualProviderId,\n isTestnet,\n );\n\n // Skip if cache is fresh and for same account\n const now = Date.now();\n const existingEntry =\n this.state.cachedUserDataByProvider[providerNetworkKey];\n const hasMatchingCache =\n existingEntry !== undefined &&\n this.#isUserCacheIdentityCurrent(\n actualProviderId,\n existingEntry,\n userAddress,\n );\n const cacheAgeMs = existingEntry ? now - existingEntry.timestamp : null;\n const websocketState = this.getWebSocketConnectionState();\n let selectedEntryKey: string | null = null;\n if (this.state.cachedUserDataByProvider[providerNetworkKey]) {\n selectedEntryKey = providerNetworkKey;\n }\n this.#debugLog('PerpsController: user cache preload decision', {\n requestedKey: providerNetworkKey,\n selectedEntryKey,\n availableKeys: Object.keys(this.state.cachedUserDataByProvider).sort(),\n hasMatchingCache,\n cacheAgeMs,\n websocketState,\n });\n if (\n existingEntry &&\n hasMatchingCache &&\n now - existingEntry.timestamp < PerpsController.#preloadGuardMs\n ) {\n return;\n }\n\n if (\n hasMatchingCache &&\n this.getWebSocketConnectionState() === WebSocketConnectionState.Connected\n ) {\n return;\n }\n\n this.#isPreloadingUserData = true;\n const traceId = uuidv4();\n const preloadStart = performance.now();\n let traceData:\n | {\n success: boolean;\n positionCount?: number;\n orderCount?: number;\n error?: string;\n }\n | undefined;\n const staleContextError = 'User data preload context changed';\n const discardStalePreload = (): boolean => {\n if (isCurrent()) {\n return false;\n }\n traceData = { success: false, error: staleContextError };\n this.#debugLog('PerpsController: Discarding stale user data preload');\n return true;\n };\n\n try {\n this.#options.infrastructure.tracer.trace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n op: PerpsTraceOperations.Operation,\n tags: {\n provider: activeProvider,\n isTestnet,\n },\n });\n\n this.#debugLog('PerpsController: Fetching user data in background');\n\n if (activeProvider === 'hyperliquid') {\n const snapshot = await this.getUserDataSnapshot();\n if (discardStalePreload()) {\n return;\n }\n this.#debugLog('PerpsController: User data preloaded', {\n positionCount: snapshot.positions.length,\n orderCount: snapshot.orders.length,\n totalBalance: snapshot.accountState.totalBalance,\n });\n traceData = {\n success: true,\n positionCount: snapshot.positions.length,\n orderCount: snapshot.orders.length,\n };\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsUserDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n traceId,\n );\n return;\n }\n\n const [positions, orders, accountState] = await Promise.all([\n this.getPositions({ standalone: true, userAddress }),\n this.getOpenOrders({ standalone: true, userAddress }),\n this.getAccountState({ standalone: true, userAddress }),\n ]);\n\n if (discardStalePreload()) {\n return;\n }\n\n if (activeProvider === 'aggregated' && activeProviderInstance) {\n // Split by providerId and write one cache entry per provider key\n // (mirrors the market-data preload pattern at ~line 2976)\n const ts = Date.now();\n type UserDataBucket = {\n positions: typeof positions;\n orders: typeof orders;\n accountState: typeof accountState | null;\n };\n const fallbackProviderId = 'hyperliquid'; // default for items missing providerId\n const byProvider = new Map<string, UserDataBucket>();\n\n const ensureBucket = (pid: string): UserDataBucket => {\n let bucket = byProvider.get(pid);\n if (!bucket) {\n bucket = { positions: [], orders: [], accountState: null };\n byProvider.set(pid, bucket);\n }\n return bucket;\n };\n\n for (const pos of positions) {\n ensureBucket(pos.providerId ?? fallbackProviderId).positions.push(\n pos,\n );\n }\n\n for (const order of orders) {\n ensureBucket(order.providerId ?? fallbackProviderId).orders.push(\n order,\n );\n }\n\n // AccountState — assign to its provider bucket\n ensureBucket(\n accountState.providerId ?? fallbackProviderId,\n ).accountState = accountState;\n\n if (discardStalePreload()) {\n return;\n }\n this.update((state) => {\n for (const [pid, data] of byProvider) {\n const key = buildProviderCacheKey(pid, isTestnet);\n state.cachedUserDataByProvider[key] = {\n ...data,\n timestamp: ts,\n address: userAddress,\n ...(pid === 'hyperliquid' &&\n hyperliquidDexes && {\n hip3ConfigVersion,\n dexes: hyperliquidDexes,\n }),\n };\n }\n // Write aggregated sentinel so the staleness guard sees it\n state.cachedUserDataByProvider[providerNetworkKey] = {\n positions: [],\n orders: [],\n accountState: null,\n timestamp: ts,\n address: userAddress,\n };\n });\n\n this.#persistUserCacheToDisk();\n } else {\n // Single provider — store directly under its key\n const ts = Date.now();\n if (discardStalePreload()) {\n return;\n }\n this.update((state) => {\n state.cachedUserDataByProvider[providerNetworkKey] = {\n positions,\n orders,\n accountState,\n timestamp: ts,\n address: userAddress,\n ...(actualProviderId === 'hyperliquid' &&\n hyperliquidDexes && {\n hip3ConfigVersion,\n dexes: hyperliquidDexes,\n }),\n };\n });\n\n this.#persistUserCacheToDisk();\n }\n\n this.#debugLog('PerpsController: User data preloaded', {\n positionCount: positions.length,\n orderCount: orders.length,\n totalBalance: accountState.totalBalance,\n });\n\n traceData = {\n success: true,\n positionCount: positions.length,\n orderCount: orders.length,\n };\n\n this.#options.infrastructure.tracer.setMeasurement(\n PerpsMeasurementName.PerpsUserDataPreload,\n performance.now() - preloadStart,\n 'millisecond',\n traceId,\n );\n } catch (error) {\n if (discardStalePreload()) {\n return;\n }\n traceData = {\n success: false,\n error: ensureError(error, 'PerpsController.performUserDataPreload')\n .message,\n };\n this.#logError(\n ensureError(error, 'PerpsController.performUserDataPreload'),\n this.#getErrorContext('performUserDataPreload', {\n message: 'Background user data preload failed',\n }),\n );\n } finally {\n this.#options.infrastructure.tracer.endTrace({\n name: PerpsTraceNames.UserDataPreload,\n id: traceId,\n data: traceData,\n });\n this.#isPreloadingUserData = false;\n if (this.#userPreloadQueued && this.#preloadTimer) {\n this.#userPreloadQueued = false;\n this.#performUserDataPreload().catch(() => {\n // Background preload is best-effort.\n });\n }\n }\n }\n\n /**\n * Get list of available HIP-3 builder-deployed DEXs\n *\n * @param params - Optional parameters for filtering\n * @returns Array of DEX names\n */\n async getAvailableDexs(params?: GetAvailableDexsParams): Promise<string[]> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getAvailableDexs');\n return this.#marketDataService.getAvailableDexs({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Fetch historical candle data\n * Thin delegation to MarketDataService\n *\n * @param options - The configuration options.\n * @param options.symbol - The trading pair symbol.\n * @param options.interval - The candle interval period.\n * @param options.limit - Maximum number of items to fetch.\n * @param options.endTime - End timestamp in milliseconds.\n * @returns The historical candle data for the requested symbol and interval.\n */\n async fetchHistoricalCandles(options: {\n symbol: string;\n interval: CandlePeriod;\n limit?: number;\n endTime?: number;\n }): Promise<CandleData> {\n const { symbol, interval, limit = 100, endTime } = options;\n const provider = this.getActiveProvider();\n return this.#marketDataService.fetchHistoricalCandles({\n provider,\n symbol,\n interval,\n limit,\n endTime,\n context: this.#createServiceContext('fetchHistoricalCandles'),\n });\n }\n\n /**\n * Calculate liquidation price for a position\n * Uses provider-specific formulas based on protocol rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the string result.\n */\n async calculateLiquidationPrice(\n params: LiquidationPriceParams,\n ): Promise<string> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateLiquidationPrice');\n return this.#marketDataService.calculateLiquidationPrice({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Project the isolated position that would remain after a proposed order.\n * Margin and liquidation availability are independent: a missing liquidation\n * does not hide a valid margin projection. Cross-margin returns unsupported.\n *\n * @param params - Live position plus the proposed order.\n * @returns Discriminated preview of the resulting position.\n */\n async previewPositionModify(\n params: PositionModifyPreviewParams,\n ): Promise<PositionModifyPreviewResult> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('previewPositionModify');\n return this.#marketDataService.previewPositionModify({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Calculate maintenance margin for a specific asset\n * Returns a percentage (e.g., 0.0125 for 1.25%)\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the numeric result.\n */\n async calculateMaintenanceMargin(\n params: MaintenanceMarginParams,\n ): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('calculateMaintenanceMargin');\n return this.#marketDataService.calculateMaintenanceMargin({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Get maximum leverage allowed for an asset\n *\n * @param asset - The asset identifier.\n * @param providerId - Optional provider route for aggregated markets.\n * @returns A promise that resolves to the numeric result.\n */\n async getMaxLeverage(\n asset: string,\n providerId?: PerpsProviderType,\n ): Promise<number> {\n const provider = this.getActiveProvider();\n const context = this.#createServiceContext('getMaxLeverage');\n return this.#marketDataService.getMaxLeverage({\n provider,\n asset,\n ...(providerId === undefined ? {} : { providerId }),\n context,\n });\n }\n\n /**\n * Validate order parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateOrder(\n params: OrderParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n const context = this.#createServiceContext('validateOrder');\n return this.#marketDataService.validateOrder({ provider, params, context });\n }\n\n /**\n * Validate close position parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns A promise that resolves to the result.\n */\n async validateClosePosition(\n params: ClosePositionParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n const context = this.#createServiceContext('validateClosePosition');\n return this.#marketDataService.validateClosePosition({\n provider,\n params,\n context,\n });\n }\n\n /**\n * Validate withdrawal parameters according to protocol-specific rules\n *\n * @param params - The operation parameters.\n * @returns True if the condition is met.\n */\n async validateWithdrawal(\n params: WithdrawParams,\n ): Promise<{ isValid: boolean; error?: string }> {\n const provider = this.getActiveProvider();\n return this.#accountService.validateWithdrawal({ provider, params });\n }\n\n /**\n * Get supported withdrawal routes - returns complete asset and routing information\n *\n * @returns Array of supported asset routes for withdrawals.\n */\n getWithdrawalRoutes(): AssetRoute[] {\n try {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getWithdrawalRoutes({ provider });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.getWithdrawalRoutes'),\n this.#getErrorContext('getWithdrawalRoutes'),\n );\n // Return empty array if provider is not available\n return [];\n }\n }\n\n /**\n * Set the transient UTM / discovery attribution context.\n * Replaces any previously set context. Held in-memory only — not persisted.\n *\n * @param context - The attribution context (UTM fields) to store.\n */\n setAttributionContext(context: PerpsAttributionContext): void {\n this.#attributionContext = { ...context };\n }\n\n /**\n * Get a copy of the current attribution context.\n *\n * @returns A shallow copy of the stored attribution context.\n */\n getAttributionContext(): PerpsAttributionContext {\n return { ...this.#attributionContext };\n }\n\n /**\n * Clear the stored attribution context.\n */\n clearAttributionContext(): void {\n this.#attributionContext = {};\n }\n\n /**\n * Merge the stored UTM attribution context into a set of analytics event\n * properties. Only defined UTM fields are added, mapped\n * to their canonical PERPS_EVENT_PROPERTY keys. Provided properties take\n * precedence and are never overwritten.\n *\n * @param properties - Base event properties to merge attribution into.\n * @returns A new properties object including any defined UTM keys.\n */\n mergeAttributionContext(\n properties: PerpsAnalyticsProperties = {},\n ): PerpsAnalyticsProperties {\n const utm: PerpsAnalyticsProperties = {};\n const context = this.#attributionContext;\n if (context.utmSource !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_SOURCE] = context.utmSource;\n }\n if (context.utmMedium !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_MEDIUM] = context.utmMedium;\n }\n if (context.utmCampaign !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_CAMPAIGN] = context.utmCampaign;\n }\n if (context.utmContent !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_CONTENT] = context.utmContent;\n }\n if (context.utmTerm !== undefined) {\n utm[PERPS_EVENT_PROPERTY.UTM_TERM] = context.utmTerm;\n }\n // Provided properties win over attribution context.\n return { ...utm, ...properties };\n }\n\n /**\n * Toggle between testnet and mainnet\n *\n * @returns The toggle result with success status and current network mode.\n */\n async toggleTestnet(): Promise<ToggleTestnetResult> {\n while (this.#disconnectOperationPromise) {\n await this.#disconnectOperationPromise;\n }\n\n // Prevent concurrent reinitializations\n if (this.isCurrentlyReinitializing()) {\n this.#debugLog(\n 'PerpsController: Already reinitializing, skipping toggle',\n {\n timestamp: new Date().toISOString(),\n },\n );\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n const completeReinitialization = this.#beginReinitialization();\n const previousIsTestnet = this.state.isTestnet;\n\n try {\n const pendingInitialization = this.#initializationPromise;\n if (pendingInitialization) {\n await pendingInitialization;\n }\n\n await this.#cleanupStandaloneProvider();\n\n const previousNetwork = previousIsTestnet ? 'testnet' : 'mainnet';\n\n this.update((state) => {\n state.isTestnet = !state.isTestnet;\n });\n\n const newNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Network toggle initiated', {\n from: previousNetwork,\n to: newNetwork,\n timestamp: new Date().toISOString(),\n });\n\n // Reset initialization state and reinitialize provider with new testnet setting\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.#initWithoutDisconnectWait();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ??\n 'Network toggle initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Network toggle completed', {\n newNetwork,\n isTestnet: this.state.isTestnet,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, isTestnet: this.state.isTestnet };\n } catch (error) {\n // Rollback isTestnet to previous value\n this.update((state) => {\n state.isTestnet = previousIsTestnet;\n });\n\n return {\n success: false,\n isTestnet: this.state.isTestnet,\n error: ensureError(error, 'PerpsController.toggleTestnet').message,\n };\n } finally {\n completeReinitialization();\n\n // Re-trigger preload now that reinit is complete and the\n // activeProviderInstance points to the correct network.\n // The state-change listener may have already fired during reinit\n // but was skipped due to the #isReinitializing guard.\n if (this.#preloadTimer) {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n }\n }\n\n /**\n * Switch to a different provider\n * Uses a full reinit approach: disconnect() → update state → init()\n * This ensures complete state reset including WebSocket connections and caches.\n *\n * @param providerId - The provider identifier.\n * @returns The switch result with success status and active provider.\n */\n async switchProvider(\n providerId: PerpsActiveProviderMode,\n ): Promise<SwitchProviderResult> {\n while (this.#disconnectOperationPromise) {\n await this.#disconnectOperationPromise;\n }\n\n // Prevent concurrent switches\n if (this.isCurrentlyReinitializing()) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: PERPS_ERROR_CODES.CLIENT_REINITIALIZING,\n };\n }\n\n const completeReinitialization = this.#beginReinitialization();\n let previousProvider = this.state.activeProvider;\n\n try {\n const pendingInitialization = this.#initializationPromise;\n if (pendingInitialization) {\n await pendingInitialization;\n }\n\n // A completed disconnect leaves no initialization promise to await. Rebuild\n // the provider registry before same-provider detection or route validation\n // so a successful switch always leaves a usable active provider.\n const needsInitialization =\n !this.isInitialized ||\n this.state.initializationState !== InitializationState.Initialized;\n if (needsInitialization) {\n await this.#initWithoutDisconnectWait();\n const initializationFailed =\n !this.isInitialized ||\n this.state.initializationState !== InitializationState.Initialized;\n if (initializationFailed) {\n throw new Error(\n this.state.initializationError ?? 'Provider initialization failed',\n );\n }\n }\n\n // Initialization may select a fallback provider. Read the effective\n // provider only after it settles so no-op detection and rollback both\n // use the state this switch is actually replacing.\n previousProvider = this.state.activeProvider;\n if (previousProvider === providerId) {\n return { success: true, providerId };\n }\n\n // Validate provider only after a pending initialization has rebuilt the\n // registry. Otherwise a switch queued behind disconnect can observe the\n // intentionally empty teardown state.\n const isValidProvider =\n providerId === 'aggregated' || this.providers.has(providerId);\n\n if (!isValidProvider) {\n return {\n success: false,\n providerId: this.state.activeProvider,\n error: `Provider ${providerId} not available`,\n };\n }\n\n await this.#cleanupStandaloneProvider();\n\n this.#debugLog('PerpsController: Provider switch initiated', {\n from: previousProvider,\n to: providerId,\n timestamp: new Date().toISOString(),\n });\n\n // Provider disconnect is handled by performInitialization() during\n // reinitialization.\n\n // Update state with new provider (market data cache preserved per-provider)\n this.update((state) => {\n state.activeProvider = providerId;\n state.accountState = null;\n state.initializationState = InitializationState.Uninitialized;\n });\n\n // Reset initialization state and reinitialize\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.#initWithoutDisconnectWait();\n\n // Check if initialization actually succeeded — performInitialization()\n // does not throw on failure, it sets state to Failed and resolves.\n if (this.state.initializationState === InitializationState.Failed) {\n throw new Error(\n this.state.initializationError ?? 'Provider initialization failed',\n );\n }\n\n this.#debugLog('PerpsController: Provider switch completed', {\n providerId,\n timestamp: new Date().toISOString(),\n });\n\n return { success: true, providerId };\n } catch (error) {\n // Rollback state to previous provider\n this.update((state) => {\n state.activeProvider = previousProvider;\n });\n\n this.#logError(\n ensureError(error, 'PerpsController.switchProvider'),\n this.#getErrorContext('switchProvider', { providerId }),\n );\n\n // Attempt to reinitialize the previous provider via init(),\n // which handles all provider modes including 'aggregated'.\n try {\n this.isInitialized = false;\n this.#initializationPromise = null;\n await this.#initWithoutDisconnectWait();\n\n this.#debugLog(\n 'PerpsController: Rollback to previous provider succeeded',\n {\n previousProvider,\n timestamp: new Date().toISOString(),\n },\n );\n } catch (reinitError) {\n // Reinit also failed — mark as failed\n this.update((state) => {\n state.initializationState = InitializationState.Failed;\n });\n this.#logError(\n ensureError(reinitError, 'PerpsController.switchProvider.rollback'),\n this.#getErrorContext('switchProvider.rollback', {\n previousProvider,\n }),\n );\n }\n\n return {\n success: false,\n providerId: previousProvider,\n error:\n error instanceof Error\n ? error.message\n : PERPS_ERROR_CODES.UNKNOWN_ERROR,\n };\n } finally {\n completeReinitialization();\n\n // Re-trigger preload now that reinit is complete.\n if (this.#preloadTimer) {\n this.#performMarketDataPreload().catch(() => {\n /* fire-and-forget */\n });\n this.#performUserDataPreload().catch(() => {\n /* fire-and-forget */\n });\n }\n }\n }\n\n /**\n * Get current network (mainnet/testnet)\n *\n * @returns Either 'mainnet' or 'testnet' based on the current configuration.\n */\n getCurrentNetwork(): 'mainnet' | 'testnet' {\n return this.state.isTestnet ? 'testnet' : 'mainnet';\n }\n\n /**\n * Get the ordered list of all market categories for HIP-3 markets.\n * Returns a stable, explicitly ordered array so the UI can render\n * category filter tabs without deriving order from config insertion.\n *\n * @returns Ordered array of {@link MarketTypeFilter} values. Does not include the 'all' or 'new' sentinels — those are separate UI controls.\n */\n getMarketCategories(): MarketTypeFilter[] {\n return MARKET_CATEGORIES;\n }\n\n /**\n * Get the current WebSocket connection state from the active provider.\n * Used by the UI to monitor connection health and show notifications.\n *\n * @returns The current WebSocket connection state, or DISCONNECTED if not supported\n */\n getWebSocketConnectionState(): WebSocketConnectionState {\n try {\n const provider = this.getActiveProvider();\n if (provider.getWebSocketConnectionState) {\n return provider.getWebSocketConnectionState();\n }\n // Fallback for providers that don't support this method\n return WebSocketConnectionState.Disconnected;\n } catch {\n // If no provider is active, return disconnected\n return WebSocketConnectionState.Disconnected;\n }\n }\n\n /**\n * Subscribe to WebSocket connection state changes from the active provider.\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, or no-op if not supported\n */\n subscribeToConnectionState(\n listener: (\n state: WebSocketConnectionState,\n reconnectionAttempt: number,\n ) => void,\n ): () => void {\n try {\n const provider = this.getActiveProvider();\n if (provider.subscribeToConnectionState) {\n return provider.subscribeToConnectionState(listener);\n }\n // Fallback: immediately call with current state and return no-op unsubscribe\n listener(this.getWebSocketConnectionState(), 0);\n return () => {\n // No-op\n };\n } catch {\n // If no provider is active, call with disconnected and return no-op\n listener(WebSocketConnectionState.Disconnected, 0);\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Manually trigger a WebSocket reconnection attempt.\n * Used by the UI retry button when connection is lost.\n */\n async reconnect(): Promise<void> {\n this.#debugLog('[PerpsController] reconnect() called');\n try {\n const provider = this.getActiveProvider();\n if (provider.reconnect) {\n this.#debugLog('[PerpsController] Delegating to provider.reconnect()');\n await provider.reconnect();\n this.#debugLog('[PerpsController] provider.reconnect() completed');\n } else {\n this.#debugLog(\n '[PerpsController] Provider does not support reconnect()',\n );\n }\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.reconnect'),\n this.#getErrorContext('reconnect', {\n operation: 'websocket_reconnect',\n }),\n );\n }\n }\n\n // Live data delegation (NO Redux) - delegates to active provider\n\n /**\n * Subscribe to live price updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPrices(params: SubscribePricesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPrices(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPrices'),\n this.#getErrorContext('subscribeToPrices', {\n symbols: params.symbols?.join(','),\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live position updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToPositions(params: SubscribePositionsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToPositions(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToPositions'),\n this.#getErrorContext('subscribeToPositions', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order fill updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderFills(params: SubscribeOrderFillsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderFills(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderFills'),\n this.#getErrorContext('subscribeToOrderFills', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Stream TWAP lifecycle updates through the active provider.\n *\n * Providers without a native TWAP push channel do not implement this; the\n * returned no-op cleanup lets a client fall back to polling `getTwapOrders`\n * without branching on provider identity.\n *\n * @param params - Subscription parameters including callback and account ID.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToTwapOrders(params: SubscribeTwapOrdersParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider?.subscribeToTwapOrders) {\n return () => {\n // No-op: provider missing or without a native TWAP push channel\n };\n }\n try {\n return provider.subscribeToTwapOrders(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToTwapOrders'),\n this.#getErrorContext('subscribeToTwapOrders', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live order updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrders(params: SubscribeOrdersParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrders(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrders'),\n this.#getErrorContext('subscribeToOrders', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live account updates.\n * Updates controller state (Redux) when new account data arrives so consumers\n * like usePerpsBalanceTokenFilter (PayWithModal) see the latest balance.\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToAccount(params: SubscribeAccountParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n const originalCallback = params.callback;\n return provider.subscribeToAccount({\n ...params,\n callback: (account: AccountState | null) => {\n if (account) {\n this.update((state) => {\n state.accountState = account;\n state.lastUpdateTimestamp = Date.now();\n state.lastError = null;\n });\n }\n originalCallback(account);\n },\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToAccount'),\n this.#getErrorContext('subscribeToAccount', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to full order book updates with multiple depth levels\n * Creates a dedicated L2Book subscription for real-time order book data\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOrderBook(params: SubscribeOrderBookParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOrderBook(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOrderBook'),\n this.#getErrorContext('subscribeToOrderBook', {\n symbol: params.symbol,\n levels: params.levels,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to live candle updates\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToCandles(params: SubscribeCandlesParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToCandles(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToCandles'),\n this.#getErrorContext('subscribeToCandles', {\n symbol: params.symbol,\n interval: params.interval,\n duration: params.duration,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Subscribe to open interest cap updates\n * Zero additional network overhead - data comes from existing webData3 subscription\n *\n * @param params - The operation parameters.\n * @returns A cleanup function to remove the subscription.\n */\n subscribeToOICaps(params: SubscribeOICapsParams): () => void {\n const provider = this.getActiveProviderOrNull();\n if (!provider) {\n return () => {\n // No-op: Provider not initialized\n };\n }\n try {\n return provider.subscribeToOICaps(params);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.subscribeToOICaps'),\n this.#getErrorContext('subscribeToOICaps', {\n accountId: params.accountId,\n }),\n );\n return () => {\n // No-op\n };\n }\n }\n\n /**\n * Configure live data throttling\n *\n * @param config - The configuration object.\n */\n setLiveDataConfig(config: Partial<LiveDataConfig>): void {\n try {\n const provider = this.getActiveProvider();\n provider.setLiveDataConfig(config);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.setLiveDataConfig'),\n this.#getErrorContext('setLiveDataConfig'),\n );\n }\n }\n\n /**\n * Calculate trading fees through the active provider route.\n * Each provider owns its fee policy. An explicit provider route overrides\n * the active/default provider used by placement.\n *\n * @param params - The operation parameters.\n * @returns The fee calculation result for the trade.\n */\n async calculateFees(\n params: FeeCalculationParams,\n ): Promise<FeeCalculationResult> {\n const provider = await this.#resolveRoutedOrderProvider({\n orderType: params.orderType,\n providerId: params.providerId,\n });\n // Preview owns subscription hydration. The submit resolver remains a pure\n // cache read and can therefore never start a benefits request while an\n // order is being signed.\n await this.#rewardsIntegrationService.refreshSubscriptionBenefits();\n\n // ADR 0064: preview is also where the trading address is announced, so a\n // fill decoded off the HL fan-out can be attributed back to a profile.\n // Fire-and-forget — attribution plumbing must not delay or fail a quote.\n const selectedAccount = getSelectedEvmAccountFromMessenger(this.messenger);\n if (selectedAccount) {\n this.#rewardsIntegrationService\n .registerTradingAddress(selectedAccount.address, {\n isTestnet: this.state.isTestnet,\n })\n .catch(() => {\n /* never blocks a fee preview */\n });\n }\n\n // The preview quotes the same blended rate the submit path charges, which\n // is only possible once the order notional reaches the resolver. `amount`\n // is the order notional in USD for the quote being previewed.\n const orderNotionalUsd = params.amount\n ? Number.parseFloat(params.amount)\n : undefined;\n const feeResolution = await this.#rewardsIntegrationService.resolveFee(\n orderNotionalUsd,\n {\n providerId: provider.protocolId,\n isTestnet: this.state.isTestnet,\n },\n );\n // Taken from the resolution rather than read separately: a second read can\n // observe a different snapshot if the cache is invalidated or the feature\n // flag flips between the two, which would surface metadata describing a\n // waiver the quoted rates do not reflect.\n const waiverStatus = feeResolution.subscription;\n const context = this.#createServiceContext('calculateFees', {\n subscriptionFeeWaiver:\n waiverStatus.reason === 'no-source' ? undefined : waiverStatus,\n feeResolution,\n });\n return this.#marketDataService.calculateFees({ provider, params, context });\n }\n\n /**\n * Sign HyperLiquid L1 actions (orders, cancels, leverage, ...) for a main\n * account on a network with an approved agent, or pin them to the main\n * account with null (`getAgentSigner` is then not asked for that account and\n * network until `clearAgentSigners`). User-signed actions stay on the main\n * account, and the agent is never used for another account or network. The\n * controller keeps the binding across provider re-creation (a provider or\n * network switch, or re-initialization), so it can also be set before\n * `init`. Like every controller action, it is available through the\n * messenger once `init` has run.\n *\n * @param account - The main account and network the agent is approved for.\n * @param agentSigner - The host-owned agent signer, or null to pin the main\n * account.\n */\n setAgentSigner(\n account: PerpsAgentAccount,\n agentSigner: PerpsAgentSigner | null,\n ): void {\n this.#agentBindings.set(account, agentSigner);\n // Drop agents the providers already resolved so the binding applies to\n // the next L1 action.\n this.#clearProviderAgentSigners();\n }\n\n /**\n * Forget every HyperLiquid agent, set or resolved, so the next L1 action\n * asks `providerCredentials.hyperliquid.getAgentSigner` again; an answer\n * still pending is discarded too. Call it when the wallet locks (with\n * `getAgentSigner` returning null while locked) and nothing signs with an\n * agent until it returns one again. Like every controller action, it is\n * available through the messenger once `init` has run.\n */\n clearAgentSigners(): void {\n this.#agentBindings.clear();\n this.#clearProviderAgentSigners();\n }\n\n /**\n * Drop the agents every provider resolved.\n */\n #clearProviderAgentSigners(): void {\n for (const provider of this.providers.values()) {\n provider.clearAgentSigners?.();\n }\n }\n\n /**\n * Run the active provider's deferred trading setup ahead of the first order\n * (HyperLiquid account migration, builder fee and referral; Lighter\n * venue-key registration), so its signatures happen in one guided session,\n * such as agent setup, instead of at order time. The builder fee and\n * Lighter's registration are signed by the main account; with an agent,\n * the referral and the account migration are L1 actions the agent signs.\n *\n * @returns `ready: true` when none of these steps will need a signature\n * again before the first order, and only while an account is selected and\n * the main account can sign, whichever provider answered (including\n * providers without deferred setup, for example in aggregated mode). A\n * HyperLiquid referral whose MetaMask referral code is not ready yet is\n * checked again at the next call, not before orders, so it does not hold\n * it back. Otherwise `ready: false`, without an error while a step will\n * be asked again (a declined HyperLiquid migration, builder fee or Lighter\n * registration, or a step the agent could not sign), or with:\n * - `KEYRING_LOCKED` when the main account cannot sign, before or during\n * setup;\n * - `EXCHANGE_ACCOUNT_NOT_FOUND` for a wallet with no account on the venue\n * yet;\n * - `NO_ACCOUNT_SELECTED` when no account is selected;\n * - `PROVIDER_LIFECYCLE_STALE` when the provider disconnected or the account\n * changed during setup;\n * - otherwise the message of the error that stopped setup, which is logged.\n * @throws Like the other provider-backed actions, `CLIENT_NOT_INITIALIZED`\n * before `init`, and `CLIENT_REINITIALIZING` or `PROVIDER_NOT_AVAILABLE`\n * when no active provider is available.\n */\n async prepareTradingWallet(): Promise<ReadyToTradeResult> {\n const provider = await this.#getActiveProviderWhenReady();\n // With nothing selected, the AccountsController answers an empty account.\n const readSelectedAddress = (): string | undefined => {\n const address = getSelectedEvmAccountFromMessenger(\n this.messenger,\n )?.address;\n return address ? address.toLowerCase() : undefined;\n };\n const addressAtStart = readSelectedAddress();\n const result = (await provider.prepareTradingWallet?.()) ?? {\n ready: true,\n };\n const address = readSelectedAddress();\n // The steps ran for the account selected when they started (in aggregated\n // mode, one provider after another), so their result is not the current\n // account's.\n if (address !== addressAtStart) {\n return {\n ready: false,\n error: PERPS_ERROR_CODES.PROVIDER_LIFECYCLE_STALE,\n };\n }\n if (!result.ready) {\n return result;\n }\n // A provider with nothing to prepare, alone or aggregated, checks neither\n // the signer nor the selected account.\n if (\n !isMainAccountSignerReady(\n this.#options.infrastructure.accountSigner,\n () => this.messenger.call('KeyringController:getState').isUnlocked,\n )\n ) {\n return { ready: false, error: PERPS_ERROR_CODES.KEYRING_LOCKED };\n }\n if (!address) {\n return { ready: false, error: PERPS_ERROR_CODES.NO_ACCOUNT_SELECTED };\n }\n return result;\n }\n\n /**\n * Approve the dedicated subscription builder outside order submission.\n *\n * @deprecated ADR 0064 replaced the dedicated subscription builder with cloid\n * marking on the standard builder, so there is nothing left to approve. Kept\n * as a no-op so clients still calling it keep building while they migrate;\n * remove it once cloid marking is verified in shadow mode.\n *\n * Resolves `true`, not `false`. The method answers \"is the subscription\n * builder ready?\", and the honest answer is now \"nothing needs approving\" —\n * a `false` would read as a setup failure to a caller that branches on it and\n * could block a waiver that is already fully in effect.\n * @returns Always `true`; no approval is required.\n */\n async approveSubscriptionBuilderFee(): Promise<boolean> {\n this.#debugLog(\n 'PerpsController: approveSubscriptionBuilderFee is a no-op; subscription attribution now rides on the order cloid',\n );\n return true;\n }\n\n /**\n * Drop the cached subscription benefits snapshot.\n *\n * Call this when the identity behind the benefits changes — sign-out, or a\n * profile switch. The snapshot carries no profile identity of its own, so\n * without this it keeps answering for the previous profile until the next\n * successful refresh. The next fee resolution reports the waiver as\n * unavailable, so it is withheld until preview or lifecycle hydration.\n */\n invalidateSubscriptionBenefits(): void {\n this.#rewardsIntegrationService.invalidateSubscriptionBenefits();\n }\n\n /**\n * Disconnect provider and cleanup subscriptions\n * Call this when navigating away from Perps screens to prevent battery drain\n */\n async disconnect(): Promise<void> {\n while (this.#disconnectOperationPromise) {\n // Each explicit disconnect claims a teardown after the operation already\n // in flight. This lets a later disconnect close providers created by an\n // init call that was queued behind the same earlier teardown.\n this.#preloadStartRequested = false;\n await this.#disconnectOperationPromise;\n }\n\n // A disconnect stops the current preload session. A later start call made\n // while teardown is in flight sets this back to true and is resumed below.\n this.#preloadStartRequested = false;\n\n let resolveOperation = (): void => undefined;\n const operation = new Promise<void>((resolve) => {\n resolveOperation = resolve;\n });\n this.#disconnectOperationPromise = operation;\n\n try {\n await this.#performDisconnect();\n } finally {\n resolveOperation();\n if (this.#disconnectOperationPromise === operation) {\n this.#disconnectOperationPromise = null;\n }\n if (this.#preloadStartRequested) {\n this.startMarketDataPreload();\n }\n }\n }\n\n /**\n * Disconnect after this call has claimed the controller lifecycle.\n *\n * @returns A promise that resolves when teardown finishes.\n */\n async #performDisconnect(): Promise<void> {\n this.#lifecycleGeneration += 1;\n this.#debugLog(\n 'PerpsController: Disconnecting provider to cleanup subscriptions',\n {\n timestamp: new Date().toISOString(),\n },\n );\n\n // Stop preload interval and messenger subscriptions first,\n // so no background work fires while we tear down providers.\n if (this.#preloadTimer) {\n clearInterval(this.#preloadTimer);\n this.#preloadTimer = null;\n }\n if (this.#preloadStateUnsubscribe) {\n this.#preloadStateUnsubscribe();\n this.#preloadStateUnsubscribe = null;\n }\n if (this.#accountChangeUnsubscribe) {\n this.#accountChangeUnsubscribe();\n this.#accountChangeUnsubscribe = null;\n }\n this.#previousIsTestnet = null;\n this.#previousHip3ConfigVersion = null;\n\n const pendingReinitialization = this.#reinitializationOperationPromise;\n if (pendingReinitialization) {\n await pendingReinitialization;\n }\n\n // Initialization owns provider creation. Let it finish before teardown so\n // it cannot repopulate providers after this method clears the references.\n const pendingInitialization = this.#initializationPromise;\n if (pendingInitialization) {\n try {\n await pendingInitialization;\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.disconnect.initialization'),\n this.#getErrorContext('disconnect', {\n operation: 'awaitInitialization',\n }),\n );\n }\n }\n\n const provider = this.activeProviderInstance;\n if (provider) {\n try {\n await provider.disconnect();\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.disconnect'),\n this.#getErrorContext('disconnect'),\n );\n }\n }\n\n // Clear stale reference so standalone reads don't route through old provider\n this.activeProviderInstance = null;\n\n // Cleanup cached standalone provider (if any) — awaited to prevent races\n await this.#cleanupStandaloneProvider();\n\n // Note: Feature-flag subscription is NOT cleaned up here.\n // It is a controller-lifetime concern (set once in the constructor),\n // not a session-lifetime concern. Unsubscribing here would break\n // geo-blocking / HIP-3 flag propagation after disconnect → reconnect.\n\n // Reset initialization state to ensure proper reconnection\n this.isInitialized = false;\n this.#initializationPromise = null;\n }\n\n /**\n * Eligibility (Geo-Blocking)\n */\n\n /**\n * Fetch geo location\n *\n * Returned in Country or Country-Region format\n * Example: FR, DE, US-MI, CA-ON\n */\n /**\n * Refresh eligibility status\n */\n /**\n * Resume eligibility monitoring after onboarding completes.\n * Clears the deferred flag and triggers an immediate eligibility check\n * using the current remote feature flag state.\n */\n startEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = false;\n try {\n const currentState = this.messenger.call(\n 'RemoteFeatureFlagController:getState',\n );\n this.refreshEligibilityOnFeatureFlagChange(currentState);\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.startEligibilityMonitoring'),\n this.#getErrorContext('startEligibilityMonitoring', {\n operation: 'readRemoteFeatureFlags',\n }),\n );\n }\n }\n\n /**\n * Stops geo-blocking eligibility monitoring.\n * Call this when the user disables basic functionality (e.g. useExternalServices becomes false).\n * Prevents geolocation calls until startEligibilityMonitoring() is called again.\n * Safe to call multiple times.\n */\n stopEligibilityMonitoring(): void {\n this.#eligibilityCheckDeferred = true;\n }\n\n async refreshEligibility(): Promise<void> {\n if (this.#eligibilityCheckDeferred) {\n return;\n }\n\n // Capture the current version before starting the async operation.\n // This prevents race conditions where stale eligibility checks\n // (started with fallback config) overwrite results from newer checks\n // (started with remote config after it was fetched).\n const versionAtStart = this.#blockedRegionListVersion;\n\n try {\n const geoLocation = await this.messenger.call(\n 'GeolocationController:getGeolocation',\n );\n\n const isEligible = await this.#eligibilityService.checkEligibility({\n blockedRegions: this.blockedRegionList.list,\n geoLocation,\n });\n\n // Only update state if the blocked region list hasn't changed while we were awaiting.\n // This prevents stale fallback-based eligibility checks from overwriting\n // results from remote-based checks.\n if (this.#blockedRegionListVersion !== versionAtStart) {\n return;\n }\n\n this.update((state) => {\n state.isEligible = isEligible;\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.refreshEligibility'),\n this.#getErrorContext('refreshEligibility'),\n );\n\n // Only update on error if version is still current\n if (this.#blockedRegionListVersion === versionAtStart) {\n // Default to eligible on error\n this.update((state) => {\n state.isEligible = true;\n });\n }\n }\n }\n\n /**\n * Get block explorer URL for an address or just the base URL\n *\n * @param address - Optional address to append to the base URL\n * @returns Block explorer URL\n */\n getBlockExplorerUrl(address?: string): string {\n const provider = this.getActiveProvider();\n return this.#marketDataService.getBlockExplorerUrl({ provider, address });\n }\n\n /**\n * Check if user is first-time for the current network\n *\n * @returns True if the condition is met.\n */\n isFirstTimeUserOnCurrentNetwork(): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.isFirstTimeUser[currentNetwork];\n }\n\n /**\n * Mark that the user has completed the tutorial/onboarding\n * This prevents the tutorial from showing again\n */\n markTutorialCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking tutorial as completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.isFirstTimeUser[currentNetwork] = false;\n });\n }\n\n /*\n * Mark that user has placed their first successful order\n * This prevents the notification tooltip from showing again\n */\n markFirstOrderCompleted(): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Marking first order completed', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n });\n\n this.update((state) => {\n state.hasPlacedFirstOrder[currentNetwork] = true;\n });\n }\n\n /**\n * Reset first-time user state for both networks\n * This is useful for testing the tutorial flow\n * Called by Reset Account feature in settings\n */\n resetFirstTimeUserState(): void {\n this.#debugLog('PerpsController: Resetting first-time user state', {\n timestamp: new Date().toISOString(),\n previousState: this.state.isFirstTimeUser,\n });\n\n this.update((state) => {\n state.isFirstTimeUser = {\n testnet: true,\n mainnet: true,\n };\n state.hasPlacedFirstOrder = {\n testnet: false,\n mainnet: false,\n };\n });\n }\n\n /**\n * Clear pending/bridging withdrawal and deposit requests\n * This is useful when users want to clear stuck pending indicators\n * Called by Reset Account feature in settings\n */\n clearPendingTransactionRequests(): void {\n this.#debugLog('PerpsController: Clearing pending transaction requests', {\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n // Filter out pending/bridging withdrawals, keep completed for history\n state.withdrawalRequests = state.withdrawalRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Filter out pending deposits, keep completed/failed for history\n state.depositRequests = state.depositRequests.filter(\n (req) => req.status !== 'pending' && req.status !== 'bridging',\n );\n\n // Reset withdrawal progress\n state.withdrawalProgress = {\n progress: 0,\n lastUpdated: Date.now(),\n activeWithdrawalId: null,\n };\n });\n }\n\n /**\n * Get saved trade configuration for a market\n *\n * @param symbol - The trading pair symbol.\n * @returns The resulting string value.\n */\n getTradeConfiguration(symbol: string): { leverage?: number } | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config = this.state.tradeConfigurations[network]?.[symbol];\n\n if (!config?.leverage) {\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved trade config', {\n symbol,\n network,\n leverage: config.leverage,\n });\n\n return { leverage: config.leverage };\n }\n\n /**\n * Save trade configuration for a market\n *\n * @param symbol - Market symbol\n * @param leverage - Leverage value\n */\n saveTradeConfiguration(symbol: string, leverage: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving trade configuration', {\n symbol,\n network,\n leverage,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n leverage,\n };\n });\n }\n\n /**\n * Save pending trade configuration for a market\n * This is a temporary configuration that expires after 30 seconds.\n *\n * @param symbol - Market symbol\n * @param config - Pending trade configuration (includes optional selected payment token from Pay row)\n * @param config.amount - The amount value.\n * @param config.leverage - The leverage multiplier.\n * @param config.takeProfitPrice - The take profit price.\n * @param config.stopLossPrice - The stop loss price.\n * @param config.limitPrice - The limit price.\n * @param config.orderType - The order type.\n * @param config.reduceOnly - Whether the order may only reduce a position.\n * @param config.direction - Long or short.\n * @param config.selectedPaymentToken - The selected payment token.\n */\n savePendingTradeConfiguration(\n symbol: string,\n config: {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n reduceOnly?: boolean;\n direction?: OrderDirection;\n /** When user used pay-with-token in PerpsPayRow: minimal token shape to restore selection */\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n },\n ): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving pending trade configuration', {\n symbol,\n network,\n config,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n pendingConfig: {\n ...config,\n timestamp: Date.now(),\n },\n };\n if (config.orderType) {\n state.selectedOrderType = config.orderType;\n }\n });\n }\n\n /**\n * Get pending trade configuration for a market\n * Returns undefined if config doesn't exist or has expired.\n *\n * @param symbol - Market symbol\n * @returns Pending trade configuration or undefined\n */\n getPendingTradeConfiguration(symbol: string):\n | {\n amount?: string;\n leverage?: number;\n takeProfitPrice?: string;\n stopLossPrice?: string;\n limitPrice?: string;\n orderType?: OrderType;\n reduceOnly?: boolean;\n direction?: OrderDirection;\n selectedPaymentToken?: PerpsSelectedPaymentToken | null;\n }\n | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const config =\n this.state.tradeConfigurations[network]?.[symbol]?.pendingConfig;\n\n if (!config) {\n return undefined;\n }\n\n const now = Date.now();\n const age = now - config.timestamp;\n\n if (age > PERPS_CONSTANTS.PendingTradeConfigurationTtlMs) {\n this.#debugLog('PerpsController: Pending trade config expired', {\n symbol,\n network,\n age,\n timestamp: config.timestamp,\n });\n // Clear expired config\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n return undefined;\n }\n\n this.#debugLog('PerpsController: Retrieved pending trade config', {\n symbol,\n network,\n config,\n age,\n });\n\n // Return config without timestamp\n const { timestamp, ...configWithoutTimestamp } = config;\n return configWithoutTimestamp;\n }\n\n /**\n * Clear pending trade configuration for a market\n *\n * @param symbol - Market symbol\n */\n clearPendingTradeConfiguration(symbol: string): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Clearing pending trade configuration', {\n symbol,\n network,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (state.tradeConfigurations[network]?.[symbol]?.pendingConfig) {\n delete state.tradeConfigurations[network][symbol].pendingConfig;\n }\n });\n }\n\n /**\n * Get saved market filter preferences\n * Handles backward compatibility with legacy string format\n *\n * @returns The saved sort option ID and direction.\n */\n getMarketFilterPreferences(): {\n optionId: SortOptionId;\n direction: SortDirection;\n } {\n const pref = this.state.marketFilterPreferences;\n\n // Handle legacy string format (backward compatibility)\n if (typeof pref === 'string') {\n // Map legacy compound IDs to new format\n // Old format: 'priceChange-desc' or 'priceChange-asc'\n // New format: { optionId: 'priceChange', direction: 'desc'/'asc' }\n if (pref === 'priceChange-desc') {\n return {\n optionId: 'priceChange',\n direction: 'desc',\n };\n }\n if (pref === 'priceChange-asc') {\n return {\n optionId: 'priceChange',\n direction: 'asc',\n };\n }\n\n // Handle other simple legacy strings (e.g., 'volume', 'openInterest', etc.)\n return {\n optionId: pref,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n };\n }\n\n // Return new object format or default\n return (\n pref ?? {\n optionId: MARKET_SORTING_CONFIG.DefaultSortOptionId,\n direction: MARKET_SORTING_CONFIG.DefaultDirection,\n }\n );\n }\n\n /**\n * Save market filter preferences\n *\n * @param optionId - Sort/filter option ID\n * @param direction - Sort direction ('asc' or 'desc')\n */\n saveMarketFilterPreferences(\n optionId: SortOptionId,\n direction: SortDirection,\n ): void {\n this.#debugLog('PerpsController: Saving market filter preferences', {\n optionId,\n direction,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n state.marketFilterPreferences = { optionId, direction };\n });\n }\n\n /**\n * Get the user's max slippage tolerance in basis points.\n *\n * @returns The configured max slippage bps, or undefined if never set (callers should default to 300 bps / 3%).\n */\n getMaxSlippage(): number | undefined {\n return this.state.maxSlippageBps;\n }\n\n /**\n * Set the user's max slippage tolerance in basis points.\n *\n * @param bps - Max slippage in basis points (e.g. 300 = 3%). Clamped to 10–1000, snapped to step of 10.\n */\n setMaxSlippage(bps: number): void {\n // Reject non-finite input (NaN/Infinity) so it cannot reach the order\n // path, where it would poison `getMaxSlippage` and produce a NaN limit\n // price. `Math.max(..., NaN)` returns NaN and `??` does not catch it.\n if (!Number.isFinite(bps)) {\n return;\n }\n const clamped = Math.min(\n MAX_SLIPPAGE_BOUNDS.MaxBps,\n Math.max(MAX_SLIPPAGE_BOUNDS.MinBps, bps),\n );\n const snapped =\n Math.round(clamped / MAX_SLIPPAGE_BOUNDS.StepBps) *\n MAX_SLIPPAGE_BOUNDS.StepBps;\n this.update((state) => {\n state.maxSlippageBps = snapped;\n });\n }\n\n /**\n * Get market-agnostic Pro order-book display preferences.\n *\n * @returns The current order-book display preferences.\n */\n getOrderBookPreferences(): OrderBookPreferences {\n return {\n ...DEFAULT_ORDER_BOOK_PREFERENCES,\n ...this.state.orderBookPreferences,\n };\n }\n\n /**\n * Update market-agnostic Pro order-book display preferences.\n *\n * @param patch - Partial order-book preferences to update.\n */\n setOrderBookPreferences(patch: Partial<OrderBookPreferences>): void {\n this.update((state) => {\n state.orderBookPreferences = {\n ...DEFAULT_ORDER_BOOK_PREFERENCES,\n ...state.orderBookPreferences,\n ...patch,\n };\n });\n }\n\n /**\n * Get the selected order type shared by every market.\n *\n * @returns The selected order type.\n */\n getSelectedOrderType(): OrderType {\n return this.state.selectedOrderType ?? DEFAULT_SELECTED_ORDER_TYPE;\n }\n\n /**\n * Set the selected order type shared by every market.\n *\n * @param orderType - The selected order type.\n */\n setSelectedOrderType(orderType: OrderType): void {\n this.update((state) => {\n state.selectedOrderType = orderType;\n });\n }\n\n /**\n * Get the number of candles shown in Lite and Pro chart viewports.\n *\n * @returns The visible candle count.\n */\n getVisibleCandleCount(): number {\n const count = this.state.visibleCandleCount;\n return Number.isFinite(count) ? count : VISIBLE_CANDLE_COUNT_CONFIG.Default;\n }\n\n /**\n * Set the number of candles shown in Lite and Pro chart viewports.\n *\n * @param count - Requested visible candle count.\n */\n setVisibleCandleCount(count: number): void {\n if (!Number.isFinite(count)) {\n return;\n }\n\n const normalized = Math.min(\n VISIBLE_CANDLE_COUNT_CONFIG.Max,\n Math.max(VISIBLE_CANDLE_COUNT_CONFIG.Min, Math.round(count)),\n );\n this.update((state) => {\n state.visibleCandleCount = normalized;\n });\n }\n\n /**\n * Get the user's pro-mode layout preferences (network-independent).\n *\n * @returns The current pro-mode layout preferences.\n */\n getProLayoutPreferences(): ProLayoutPreferences {\n // Merge over defaults so callers always receive a fully-populated object,\n // even if the persisted state predates one of the fields.\n return {\n ...DEFAULT_PRO_LAYOUT_PREFERENCES,\n ...this.state.proLayoutPreferences,\n };\n }\n\n /**\n * Update the user's pro-mode layout preferences.\n *\n * Patch-style setter: only the provided fields are updated, the rest are\n * preserved. This keeps the signature stable as new layout fields are added.\n *\n * @param patch - Partial set of pro-mode layout preferences to update.\n */\n setProLayoutPreferences(patch: Partial<ProLayoutPreferences>): void {\n this.update((state) => {\n state.proLayoutPreferences = {\n ...state.proLayoutPreferences,\n ...patch,\n };\n });\n }\n\n /**\n * Set the Perps interface mode (lite/pro).\n *\n * @param mode - The mode to switch to.\n */\n setPerpsMode(mode: PerpsMode): void {\n this.update((state) => {\n state.mode = mode;\n });\n }\n\n /**\n * Set the selected payment token for the Perps order/deposit flow.\n * Pass null or a token with description PERPS_CONSTANTS.PerpsBalanceTokenDescription to select Perps balance.\n * Only required fields (address, chainId) are stored in state; description and symbol are optional.\n *\n * @param token - The token identifier.\n */\n setSelectedPaymentToken(token: PerpsSelectedPaymentToken | null): void {\n let normalized: PerpsSelectedPaymentToken | null = null;\n if (\n token !== null &&\n token.description !== PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ) {\n normalized = token;\n }\n\n const current = this.state.selectedPaymentToken as\n | SelectedPaymentTokenSnapshot\n | null\n | undefined;\n const initialPaymentMethod =\n current === null ||\n current === undefined ||\n current?.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (current?.symbol ?? 'unknown');\n const newPaymentMethod =\n token === null ||\n token.description === PERPS_CONSTANTS.PerpsBalanceTokenDescription\n ? 'perps_balance'\n : (token.symbol ?? 'unknown');\n\n if (initialPaymentMethod !== newPaymentMethod) {\n this.#getMetrics().trackPerpsEvent(PerpsAnalyticsEvent.UiInteraction, {\n [PERPS_EVENT_PROPERTY.INTERACTION_TYPE]:\n PERPS_EVENT_VALUE.INTERACTION_TYPE.PAYMENT_METHOD_CHANGED,\n [PERPS_EVENT_PROPERTY.INITIAL_PAYMENT_METHOD]: initialPaymentMethod,\n [PERPS_EVENT_PROPERTY.NEW_PAYMENT_METHOD]: newPaymentMethod,\n });\n }\n\n let snapshot: Json | null = null;\n if (normalized !== null) {\n snapshot = {\n ...(normalized.description !== undefined && {\n description: normalized.description,\n }),\n address: normalized.address,\n chainId: normalized.chainId,\n symbol: normalized.symbol,\n } as unknown as Json;\n }\n\n this.update((state) => {\n state.selectedPaymentToken = snapshot;\n });\n }\n\n /**\n * Reset the selected payment token to Perps balance (null).\n * Call when leaving the Perps order view so the next visit defaults to Perps balance.\n */\n resetSelectedPaymentToken(): void {\n this.update((state) => {\n state.selectedPaymentToken = null;\n });\n }\n\n /**\n * Get saved order book grouping for a market\n *\n * @param symbol - Market symbol\n * @returns The saved grouping value or undefined if not set\n */\n getOrderBookGrouping(symbol: string): number | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n const grouping =\n this.state.tradeConfigurations[network]?.[symbol]?.orderBookGrouping;\n\n if (grouping !== undefined) {\n this.#debugLog('PerpsController: Retrieved order book grouping', {\n symbol,\n network,\n grouping,\n });\n }\n\n return grouping;\n }\n\n /**\n * Save order book grouping for a market\n *\n * @param symbol - Market symbol\n * @param grouping - Price grouping value\n */\n saveOrderBookGrouping(symbol: string, grouping: number): void {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving order book grouping', {\n symbol,\n network,\n grouping,\n timestamp: new Date().toISOString(),\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n orderBookGrouping: grouping,\n };\n });\n }\n\n /**\n * Get the saved margin mode (Isolated/Cross) for a market on the current\n * network. Clients should still let a venue-enforced mode take priority.\n *\n * @param symbol - Market symbol\n * @returns The saved margin mode or undefined if not set\n */\n getMarginMode(symbol: string): MarginMode | undefined {\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.tradeConfigurations[network]?.[symbol]?.marginMode;\n }\n\n /**\n * Save the margin mode (Isolated/Cross) picked for a market on the current\n * network. Values other than `isolated` or `cross` are ignored.\n *\n * @param symbol - Market symbol\n * @param marginMode - Margin mode to persist\n */\n saveMarginMode(symbol: string, marginMode: MarginMode): void {\n if (marginMode !== 'isolated' && marginMode !== 'cross') {\n return;\n }\n\n const network = this.state.isTestnet ? 'testnet' : 'mainnet';\n\n this.#debugLog('PerpsController: Saving margin mode', {\n symbol,\n network,\n marginMode,\n });\n\n this.update((state) => {\n if (!state.tradeConfigurations[network]) {\n state.tradeConfigurations[network] = {};\n }\n\n const existingConfig = state.tradeConfigurations[network][symbol] || {};\n state.tradeConfigurations[network][symbol] = {\n ...existingConfig,\n marginMode,\n };\n });\n }\n\n /**\n * Toggle watchlist status for a market.\n *\n * Updates local state immediately (optimistic UI) and then syncs the new\n * watchlist to AuthenticatedUserStorageService. If the remote write fails,\n * the local state is reverted so it stays consistent with AUS.\n *\n * When the user is unauthenticated, or the active provider is not yet\n * supported by the AUS schema, the controller continues operating with\n * local-persisted state only — no error is surfaced to the caller.\n *\n * Watchlist markets are stored per network (testnet/mainnet).\n *\n * @param symbol - The trading pair symbol.\n */\n async toggleWatchlistMarket(symbol: string): Promise<void> {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const currentWatchlist = this.state.watchlistMarkets[currentNetwork];\n const isWatchlisted = currentWatchlist.includes(symbol);\n\n this.#debugLog('PerpsController: Toggling watchlist market', {\n timestamp: new Date().toISOString(),\n network: currentNetwork,\n symbol,\n action: isWatchlisted ? 'remove' : 'add',\n });\n\n // Step 1: Optimistic local state update — UI reflects change immediately.\n this.update((state) => {\n if (isWatchlisted) {\n state.watchlistMarkets[currentNetwork] = currentWatchlist.filter(\n (marketSymbol) => marketSymbol !== symbol,\n );\n } else {\n state.watchlistMarkets[currentNetwork] = [...currentWatchlist, symbol];\n }\n });\n\n this.#getMetrics().trackPerpsEvent(PerpsAnalyticsEvent.UiInteraction, {\n [PERPS_EVENT_PROPERTY.INTERACTION_TYPE]:\n PERPS_EVENT_VALUE.INTERACTION_TYPE.FAVORITE_TOGGLED,\n [PERPS_EVENT_PROPERTY.ASSET]: symbol,\n [PERPS_EVENT_PROPERTY.ACTION_TYPE]: isWatchlisted\n ? PERPS_EVENT_VALUE.ACTION_TYPE.UNFAVORITE_MARKET\n : PERPS_EVENT_VALUE.ACTION_TYPE.FAVORITE_MARKET,\n [PERPS_EVENT_PROPERTY.FAVORITES_COUNT]:\n this.state.watchlistMarkets[currentNetwork].length,\n });\n\n // Step 2: Persist to AUS; revert local state if the write fails.\n // Enqueue behind #ausQueue so that:\n // - concurrent toggles serialize their GET-merge-PUT sequences, and\n // - any in-flight init hydration completes before we issue a write.\n try {\n await new Promise<void>((resolve, reject) => {\n this.#ausQueue = this.#ausQueue\n .then(() => this.#persistWatchlistToRemote(currentNetwork))\n .then(resolve, reject)\n // Swallow the error on the queue chain so later operations can run.\n .catch(() => undefined);\n });\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.toggleWatchlistMarket'),\n this.#getErrorContext('toggleWatchlistMarket', {\n symbol,\n network: currentNetwork,\n action: isWatchlisted ? 'remove' : 'add',\n }),\n );\n // Revert the optimistic update.\n this.update((state) => {\n state.watchlistMarkets[currentNetwork] = currentWatchlist;\n });\n }\n }\n\n /**\n * Check if a market is in the watchlist on the current network\n *\n * @param symbol - The trading pair symbol.\n * @returns True if the condition is met.\n */\n isWatchlistMarket(symbol: string): boolean {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork].includes(symbol);\n }\n\n /**\n * Get all watchlist markets for the current network\n *\n * @returns The resulting string value.\n */\n getWatchlistMarkets(): string[] {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n return this.state.watchlistMarkets[currentNetwork];\n }\n\n /**\n * Record that the user viewed a market.\n *\n * The symbol is prepended to the per-network recently-viewed list (newest-first).\n * Any existing entry for the same symbol is removed first so there are no\n * duplicates. The list is then capped at PERPS_CONSTANTS.RecentlyViewedMarketsLimit.\n *\n * @param symbol - The trading pair symbol (e.g. 'BTC', 'ETH', 'xyz:TSLA').\n */\n recordMarketViewed(symbol: string): void {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const now = Date.now();\n\n this.update((state) => {\n const current = state.recentlyViewedMarkets[currentNetwork].filter(\n (entry) => entry.symbol !== symbol,\n );\n state.recentlyViewedMarkets[currentNetwork] = [\n { symbol, viewedAt: now },\n ...current,\n ].slice(0, PERPS_CONSTANTS.RecentlyViewedMarketsLimit);\n });\n }\n\n /**\n * Get recently viewed markets for the current network.\n *\n * Returns up to PERPS_CONSTANTS.RecentlyViewedMarketsLimit symbols, ordered\n * newest-first, filtered to entries within the last\n * PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs (24 hours). Returns an empty\n * array when no qualifying entries exist.\n *\n * @returns Ordered array of market symbols.\n */\n getRecentlyViewedMarkets(): string[] {\n const currentNetwork = this.state.isTestnet ? 'testnet' : 'mainnet';\n const cutoff = Date.now() - PERPS_CONSTANTS.RecentlyViewedMarketsTtlMs;\n\n return this.state.recentlyViewedMarkets[currentNetwork]\n .filter((entry) => entry.viewedAt > cutoff)\n .map((entry) => entry.symbol)\n .slice(0, PERPS_CONSTANTS.RecentlyViewedMarketsLimit);\n }\n\n /**\n * Writes the current local watchlist to AuthenticatedUserStorageService\n * using a read-merge-write strategy to avoid overwriting other preferences.\n *\n * Skips silently when:\n * - The active provider has no AUS exchange key (e.g. `'aggregated'`).\n * - The remote preferences blob does not yet exist (returns `null` / 404).\n * In that case, `NotificationServicesController.createOnChainTriggers` is\n * the canonical owner that creates the initial blob.\n *\n * Throws on remote write failure so the caller can decide whether to revert.\n *\n * @param network - Which network's list to sync ('testnet' | 'mainnet').\n */\n async #persistWatchlistToRemote(\n network: 'testnet' | 'mainnet',\n ): Promise<void> {\n const exchangeKey = resolveWatchlistExchangeKey(this.state.activeProvider);\n if (!exchangeKey) {\n this.#debugLog(\n 'PerpsController: Skipping AUS watchlist sync — provider not mapped',\n { activeProvider: this.state.activeProvider },\n );\n return;\n }\n\n const prefs = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n if (!prefs) {\n this.#debugLog(\n 'PerpsController: Skipping AUS watchlist write — preferences blob not yet initialised',\n { exchangeKey, network },\n );\n return;\n }\n\n const existingWatchlist: PerpsWatchlistMarkets = prefs.perps\n .watchlistMarkets ?? {\n hyperliquid: { testnet: [], mainnet: [] },\n };\n\n const nextWatchlistMarkets: PerpsWatchlistMarkets = {\n ...existingWatchlist,\n [exchangeKey]: {\n ...existingWatchlist[exchangeKey],\n [network]: this.state.watchlistMarkets[network],\n },\n };\n\n const nextPrefs: NotificationPreferences = {\n ...prefs,\n perps: {\n ...prefs.perps,\n watchlistMarkets: nextWatchlistMarkets,\n },\n };\n\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPrefs,\n );\n\n this.#debugLog('PerpsController: Watchlist synced to AUS', {\n exchangeKey,\n network,\n count: this.state.watchlistMarkets[network].length,\n });\n }\n\n /**\n * Hydrates `state.watchlistMarkets` from AuthenticatedUserStorageService on\n * controller initialisation.\n *\n * AUS is the source of truth; local state is used as an offline cache.\n * This method also handles the one-time migration from local-only state to\n * AUS for users who had a watchlist before AUS sync was introduced.\n *\n * All remote errors are swallowed so a transient network failure does not\n * block the rest of `init()`.\n */\n async #syncWatchlistFromRemote(): Promise<void> {\n const exchangeKey = resolveWatchlistExchangeKey(this.state.activeProvider);\n if (!exchangeKey) {\n this.#debugLog(\n 'PerpsController: Skipping AUS watchlist hydration — provider not mapped',\n { activeProvider: this.state.activeProvider },\n );\n return;\n }\n\n try {\n const prefs = await this.messenger.call(\n 'AuthenticatedUserStorageService:getNotificationPreferences',\n );\n\n if (!prefs) {\n this.#debugLog(\n 'PerpsController: No AUS preferences blob — using local watchlist',\n );\n return;\n }\n\n const remoteExchangeWatchlist =\n prefs.perps.watchlistMarkets?.[exchangeKey];\n\n // AUS is the source of truth: an absent exchange key means this device\n // has not been migrated yet — push any local favorites up once.\n // A present key (even with empty arrays) must be honored as-is,\n // including an intentional remote clear.\n if (remoteExchangeWatchlist === undefined) {\n // Blob exists but has no watchlist for this exchange yet.\n // If local state has any markets, push them up as a one-time migration.\n const { testnet, mainnet } = this.state.watchlistMarkets;\n const hasLocalMarkets = testnet.length > 0 || mainnet.length > 0;\n\n if (hasLocalMarkets) {\n this.#debugLog('PerpsController: Migrating local watchlist to AUS', {\n exchangeKey,\n testnetCount: testnet.length,\n mainnetCount: mainnet.length,\n });\n // Push testnet and mainnet together via a single read-merge-write.\n // Start from existing remote watchlistMarkets (or empty fallback) so\n // that other exchanges already stored in AUS are not overwritten.\n const existingWatchlist: PerpsWatchlistMarkets = prefs.perps\n .watchlistMarkets ?? {\n hyperliquid: { testnet: [], mainnet: [] },\n };\n const nextWatchlistMarkets: PerpsWatchlistMarkets = {\n ...existingWatchlist,\n [exchangeKey]: { testnet, mainnet },\n };\n const nextPrefs: NotificationPreferences = {\n ...prefs,\n perps: {\n ...prefs.perps,\n watchlistMarkets: nextWatchlistMarkets,\n },\n };\n await this.messenger.call(\n 'AuthenticatedUserStorageService:putNotificationPreferences',\n nextPrefs,\n );\n this.#debugLog('PerpsController: Local watchlist migrated to AUS', {\n exchangeKey,\n });\n }\n } else {\n // AUS has an entry for this exchange — hydrate local state from it.\n this.update((state) => {\n state.watchlistMarkets.testnet = remoteExchangeWatchlist.testnet;\n state.watchlistMarkets.mainnet = remoteExchangeWatchlist.mainnet;\n });\n this.#debugLog('PerpsController: Watchlist hydrated from AUS', {\n exchangeKey,\n testnetCount: remoteExchangeWatchlist.testnet.length,\n mainnetCount: remoteExchangeWatchlist.mainnet.length,\n });\n }\n } catch (error) {\n this.#logError(\n ensureError(error, 'PerpsController.syncWatchlistFromRemote'),\n this.#getErrorContext('syncWatchlistFromRemote'),\n );\n }\n }\n\n /**\n * Report order events to data lake API with retry (non-blocking)\n * Thin delegation to DataLakeService\n *\n * @param params - The operation parameters.\n * @param params.action - The order action.\n * @param params.symbol - The trading pair symbol.\n * @param params.slPrice - The stop loss price.\n * @param params.tpPrice - The take profit price.\n * @param params.retryCount - Internal retry counter.\n * @param params._traceId - Internal trace ID.\n * @returns Whether the report was sent successfully, with an optional error message.\n */\n protected async reportOrderToDataLake(params: {\n action: 'open' | 'close';\n symbol: string;\n slPrice?: number;\n tpPrice?: number;\n retryCount?: number;\n _traceId?: string;\n }): Promise<{ success: boolean; error?: string }> {\n return this.#dataLakeService.reportOrder({\n action: params.action,\n symbol: params.symbol,\n slPrice: params.slPrice,\n tpPrice: params.tpPrice,\n isTestnet: this.state.isTestnet,\n context: this.#createServiceContext('reportOrderToDataLake', {}),\n retryCount: params.retryCount,\n _traceId: params._traceId,\n });\n }\n\n /**\n * Check if the controller is currently reinitializing\n *\n * @returns true if providers are being reinitialized\n */\n public isCurrentlyReinitializing(): boolean {\n return this.#isReinitializing;\n }\n}\n"]}
|