@metamask-previews/assets-controller 1.0.0-preview-bc3c2ef97 → 1.0.0-preview-0bb0ab8a7
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 +1 -0
- package/dist/AssetsController.cjs +12 -12
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +1 -1
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +1 -1
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +12 -12
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.cjs.map +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs +1 -1
- package/dist/data-sources/BackendWebsocketDataSource.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +26 -26
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +1 -1
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +1 -1
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +26 -26
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/SnapDataSource.cjs +6 -6
- package/dist/data-sources/SnapDataSource.cjs.map +1 -1
- package/dist/data-sources/SnapDataSource.mjs +6 -6
- package/dist/data-sources/SnapDataSource.mjs.map +1 -1
- package/dist/data-sources/TokenDataSource.cjs +4 -5
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +4 -5
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs +1 -1
- package/dist/middlewares/DetectionMiddleware.cjs.map +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs +1 -1
- package/dist/middlewares/DetectionMiddleware.mjs.map +1 -1
- package/dist/selectors/balance.cjs +2 -2
- package/dist/selectors/balance.cjs.map +1 -1
- package/dist/selectors/balance.d.cts.map +1 -1
- package/dist/selectors/balance.d.mts.map +1 -1
- package/dist/selectors/balance.mjs +2 -2
- package/dist/selectors/balance.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +3 -3
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +3 -3
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcDataSource.cjs","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport { toHex } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState, NetworkStatus } from '@metamask/network-controller';\nimport {\n isStrictHexString,\n isCaipChainId,\n parseCaipChainId,\n} from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport BigNumberJS from 'bignumber.js';\n\nimport { AbstractDataSource } from './AbstractDataSource';\nimport type {\n DataSourceState,\n SubscriptionRequest,\n} from './AbstractDataSource';\nimport {\n BalanceFetcher,\n MulticallClient,\n TokenDetector,\n} from './evm-rpc-services';\nimport type {\n BalancePollingInput,\n DetectionPollingInput,\n} from './evm-rpc-services';\nimport type {\n Address,\n Provider as RpcProvider,\n TokenListState,\n BalanceFetchResult,\n TokenDetectionResult,\n} from './evm-rpc-services';\nimport type { AssetsControllerMessenger } from '../AssetsController';\nimport { projectLogger, createModuleLogger } from '../logger';\nimport type {\n ChainId,\n Caip19AssetId,\n AssetBalance,\n AssetMetadata,\n DataRequest,\n DataResponse,\n Middleware,\n} from '../types';\n\nconst CONTROLLER_NAME = 'RpcDataSource';\nconst DEFAULT_BALANCE_INTERVAL = 30_000; // 30 seconds\nconst DEFAULT_DETECTION_INTERVAL = 180_000; // 3 minutes\n\nconst log = createModuleLogger(projectLogger, CONTROLLER_NAME);\n\n// NetworkController action to get state\nexport type NetworkControllerGetStateAction = {\n type: 'NetworkController:getState';\n handler: () => NetworkState;\n};\n\n// NetworkController action to get network client by ID\nexport type NetworkControllerGetNetworkClientByIdAction = {\n type: 'NetworkController:getNetworkClientById';\n handler: (networkClientId: string) => NetworkClient;\n};\n\n// Network client returned by NetworkController\nexport type NetworkClient = {\n provider: EthereumProvider;\n configuration: {\n chainId: string;\n };\n};\n\n// Ethereum provider interface\nexport type EthereumProvider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n};\n\n// NetworkController state change event\nexport type NetworkControllerStateChangeEvent = {\n type: 'NetworkController:stateChange';\n payload: [NetworkState, Patch[]];\n};\n\n// Patch type for state changes\ntype Patch = {\n op: 'add' | 'remove' | 'replace';\n path: string[];\n value?: unknown;\n};\n\n// TokenListController:getState action\ntype TokenListControllerGetStateAction = {\n type: 'TokenListController:getState';\n handler: () => {\n tokensChainsCache: Record<\n string,\n { timestamp: number; data: Record<string, unknown> }\n >;\n };\n};\n\n// AssetsController:getState action (for assets balance and metadata)\ntype AssetsControllerGetStateAction = {\n type: 'AssetsController:getState';\n handler: () => {\n assetsMetadata: Record<Caip19AssetId, AssetMetadata>;\n assetsBalance: Record<string, Record<string, { amount: string }>>;\n };\n};\n\n// NetworkEnablementController:getState action\ntype NetworkEnablementControllerGetStateAction = {\n type: 'NetworkEnablementController:getState';\n handler: () => {\n enabledNetworkMap: Record<string, Record<string, boolean>>;\n nativeAssetIdentifiers: Record<string, string>;\n };\n};\n\n// Allowed actions that RpcDataSource can call\nexport type RpcDataSourceAllowedActions =\n | NetworkControllerGetStateAction\n | NetworkControllerGetNetworkClientByIdAction\n | AssetsControllerGetStateAction\n | TokenListControllerGetStateAction\n | NetworkEnablementControllerGetStateAction;\n\n// Allowed events that RpcDataSource can subscribe to\nexport type RpcDataSourceAllowedEvents = NetworkControllerStateChangeEvent;\n\n/** Network status for each chain */\nexport type ChainStatus = {\n chainId: ChainId;\n status: NetworkStatus;\n name: string;\n nativeCurrency: string;\n /** Network client ID for getting the provider */\n networkClientId: string;\n};\n\n/** RpcDataSource is stateless */\nexport type RpcDataSourceState = Record<never, never>;\n\n/** Optional configuration for RpcDataSource when the controller instantiates it. */\nexport type RpcDataSourceConfig = {\n balanceInterval?: number;\n detectionInterval?: number;\n tokenDetectionEnabled?: boolean;\n timeout?: number;\n};\n\nexport type RpcDataSourceOptions = {\n /** The AssetsController messenger (shared by all data sources). */\n messenger: AssetsControllerMessenger;\n /** Called when active chains are updated. Pass dataSourceName so the controller knows the source. */\n onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n /** Request timeout in ms */\n timeout?: number;\n /** Balance polling interval in ms (default: 30s) */\n balanceInterval?: number;\n /** Token detection polling interval in ms (default: 180s / 3 min) */\n detectionInterval?: number;\n /** Whether token detection is enabled */\n tokenDetectionEnabled?: boolean;\n};\n\n/**\n * Subscription data stored for each active subscription.\n */\ntype SubscriptionData = {\n /** Polling tokens from BalanceFetcher */\n balancePollingTokens: string[];\n /** Polling tokens from TokenDetector */\n detectionPollingTokens: string[];\n /** Chain IDs being polled */\n chains: ChainId[];\n /** Accounts being polled */\n accounts: InternalAccount[];\n /** Callback to report asset updates to the controller */\n onAssetsUpdate: (response: DataResponse) => void | Promise<void>;\n};\n\n/**\n * Convert CAIP chain ID or hex chain ID to hex chain ID.\n *\n * @param chainId - CAIP chain ID or hex chain ID.\n * @returns Hex chain ID.\n */\nexport const caipChainIdToHex = (chainId: string): Hex => {\n if (isStrictHexString(chainId)) {\n return chainId;\n }\n\n if (isCaipChainId(chainId)) {\n return toHex(parseCaipChainId(chainId).reference);\n }\n\n throw new Error('caipChainIdToHex - Failed to provide CAIP-2 or Hex chainId');\n};\n\n/**\n * Data source for fetching balances via RPC calls.\n *\n * Orchestrates polling through BalanceFetcher and TokenDetector,\n * each of which handle their own polling intervals.\n *\n * Communicates with AssetsController via Messenger:\n *\n * Actions:\n * - RpcDataSource:getActiveChains\n * - RpcDataSource:fetch\n * - RpcDataSource:subscribe\n * - RpcDataSource:unsubscribe\n *\n * Events:\n * - RpcDataSource:activeChainsUpdated\n * - RpcDataSource:assetsUpdated\n */\nexport class RpcDataSource extends AbstractDataSource<\n typeof CONTROLLER_NAME,\n DataSourceState\n> {\n readonly #messenger: AssetsControllerMessenger;\n\n readonly #onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n\n readonly #timeout: number;\n\n readonly #tokenDetectionEnabled: boolean;\n\n /** Currently active chains */\n #activeChains: ChainId[] = [];\n\n /** Network status for each active chain */\n #chainStatuses: Record<ChainId, ChainStatus> = {};\n\n /** Cache of Web3Provider instances by chainId */\n readonly #providerCache: Map<ChainId, Web3Provider> = new Map();\n\n /** Active subscriptions by ID */\n readonly #activeSubscriptions: Map<string, SubscriptionData> = new Map();\n\n // Rpc-datasource components\n readonly #multicallClient: MulticallClient;\n\n readonly #balanceFetcher: BalanceFetcher;\n\n readonly #tokenDetector: TokenDetector;\n\n constructor(options: RpcDataSourceOptions) {\n super(CONTROLLER_NAME, { activeChains: [] });\n this.#messenger = options.messenger;\n this.#onActiveChainsUpdated = options.onActiveChainsUpdated;\n this.#timeout = options.timeout ?? 10_000;\n this.#tokenDetectionEnabled = options.tokenDetectionEnabled ?? false;\n\n const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;\n const detectionInterval =\n options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;\n\n log('Initializing RpcDataSource', {\n timeout: this.#timeout,\n balanceInterval,\n detectionInterval,\n tokenDetectionEnabled: this.#tokenDetectionEnabled,\n });\n\n // Initialize MulticallClient with a provider getter\n this.#multicallClient = new MulticallClient((hexChainId: string) => {\n return this.#getMulticallProvider(hexChainId);\n });\n\n // Create messenger adapters for BalanceFetcher and TokenDetector\n const balanceFetcherMessenger = {\n call: (\n _action: 'AssetsController:getState',\n ): {\n assetsBalance: Record<string, Record<string, { amount: string }>>;\n } => {\n const state = this.#messenger.call('AssetsController:getState');\n return {\n assetsBalance: (state.assetsBalance ?? {}) as Record<\n string,\n Record<string, { amount: string }>\n >,\n };\n },\n };\n\n const tokenDetectorMessenger = {\n call: (_action: 'TokenListController:getState'): TokenListState => {\n return (\n this.#messenger as unknown as { call: (a: string) => TokenListState }\n ).call('TokenListController:getState');\n },\n };\n\n // Initialize BalanceFetcher with polling interval\n this.#balanceFetcher = new BalanceFetcher(\n this.#multicallClient,\n balanceFetcherMessenger,\n { pollingInterval: balanceInterval },\n );\n this.#balanceFetcher.setOnBalanceUpdate(\n this.#handleBalanceUpdate.bind(this),\n );\n\n // Initialize TokenDetector with polling interval\n this.#tokenDetector = new TokenDetector(\n this.#multicallClient,\n tokenDetectorMessenger,\n { pollingInterval: detectionInterval },\n );\n this.#tokenDetector.setOnDetectionUpdate(\n this.#handleDetectionUpdate.bind(this),\n );\n\n this.#subscribeToNetworkController();\n this.#initializeFromNetworkController();\n }\n\n /**\n * Convert a raw balance to human-readable format using decimals.\n *\n * @param rawBalance - The raw balance string.\n * @param decimals - The number of decimals for the token.\n * @returns The human-readable balance string.\n */\n #convertToHumanReadable(rawBalance: string, decimals: number): string {\n const rawAmount = new BigNumberJS(rawBalance);\n const divisor = new BigNumberJS(10).pow(decimals);\n return rawAmount.dividedBy(divisor).toString();\n }\n\n /**\n * Collect metadata for a list of balance entries.\n * For native tokens, generates metadata from chain status.\n * For ERC20 tokens, looks up from existing state or token list.\n *\n * @param balances - Array of balance entries with assetId.\n * @param chainId - The CAIP-2 chain ID.\n * @returns Record of asset metadata keyed by asset ID.\n */\n #collectMetadataForBalances(\n balances: { assetId: Caip19AssetId }[],\n chainId: ChainId,\n ): Record<Caip19AssetId, AssetMetadata> {\n const assetsMetadata: Record<Caip19AssetId, AssetMetadata> = {};\n const existingMetadata = this.#getExistingAssetsMetadata();\n\n for (const balance of balances) {\n const isNative = balance.assetId.includes('/slip44:');\n if (isNative) {\n const chainStatus = this.#chainStatuses[chainId];\n\n if (chainStatus) {\n assetsMetadata[balance.assetId] = {\n type: 'native',\n symbol: chainStatus.nativeCurrency,\n name: chainStatus.nativeCurrency,\n decimals: 18,\n };\n }\n } else {\n // For ERC20 tokens, try existing metadata from state first\n const existingMeta = existingMetadata[balance.assetId];\n\n if (existingMeta) {\n assetsMetadata[balance.assetId] = existingMeta;\n } else {\n // Fallback to token list if not in state\n const tokenListMeta = this.#getTokenMetadataFromTokenList(\n balance.assetId,\n );\n if (tokenListMeta) {\n assetsMetadata[balance.assetId] = tokenListMeta;\n } else {\n // Default metadata for unknown ERC20 tokens.\n // Use 18 decimals (the standard for most ERC20 tokens)\n // to ensure consistent human-readable balance format.\n assetsMetadata[balance.assetId] = {\n type: 'erc20',\n symbol: '',\n name: '',\n decimals: 18,\n };\n }\n }\n }\n }\n\n return assetsMetadata;\n }\n\n /**\n * Handle balance update from BalanceFetcher.\n *\n * @param result - The balance fetch result.\n */\n #handleBalanceUpdate(result: BalanceFetchResult): void {\n const newBalances: Record<string, { amount: string }> = {};\n\n // Convert hex chain ID to CAIP-2 format\n const chainIdDecimal = parseInt(result.chainId, 16);\n const caipChainId = `eip155:${chainIdDecimal}` as ChainId;\n\n // Collect metadata for all balances\n const assetsMetadata = this.#collectMetadataForBalances(\n result.balances,\n caipChainId,\n );\n\n // Convert balances to human-readable format using metadata\n for (const balance of result.balances) {\n const metadata = assetsMetadata[balance.assetId];\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = metadata?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n newBalances[balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n\n // Only send new data to AssetsController - it handles merging atomically\n // to avoid race conditions when concurrent updates occur for the same account\n const response: DataResponse = {\n assetsBalance: {\n [result.accountId]: newBalances,\n },\n assetsMetadata,\n };\n\n log('Balance update response', {\n accountId: result.accountId,\n newBalanceCount: Object.keys(newBalances).length,\n });\n\n for (const subscription of this.#activeSubscriptions.values()) {\n subscription.onAssetsUpdate(response)?.catch((error) => {\n log('Failed to update assets', { error });\n });\n }\n }\n\n /**\n * Handle detection update from TokenDetector.\n *\n * @param result - The token detection result.\n */\n #handleDetectionUpdate(result: TokenDetectionResult): void {\n log('Detected new tokens', {\n count: result.detectedAssets.length,\n });\n\n // Build new metadata from detected assets\n const newMetadata: Record<Caip19AssetId, AssetMetadata> = {};\n if (result.detectedAssets.length > 0) {\n for (const asset of result.detectedAssets) {\n // Only include if we have metadata (symbol and decimals at minimum)\n if (asset.symbol && asset.decimals !== undefined) {\n newMetadata[asset.assetId] = {\n type: 'erc20',\n symbol: asset.symbol,\n name: asset.name ?? asset.symbol,\n decimals: asset.decimals,\n image: asset.image,\n };\n }\n }\n }\n\n // Build new balances from detected tokens\n const newBalances: Record<string, { amount: string }> = {};\n if (result.detectedBalances.length > 0) {\n for (const balance of result.detectedBalances) {\n // Get decimals from the detected asset metadata\n const detectedAsset = result.detectedAssets.find(\n (asset) => asset.assetId === balance.assetId,\n );\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = detectedAsset?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n newBalances[balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n }\n\n // Only send new data to AssetsController - it handles merging atomically\n // to avoid race conditions when concurrent updates occur for the same account\n const response: DataResponse = {\n detectedAssets: {\n [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),\n },\n assetsMetadata: newMetadata,\n assetsBalance: {\n [result.accountId]: newBalances,\n },\n };\n\n for (const subscription of this.#activeSubscriptions.values()) {\n subscription.onAssetsUpdate(response)?.catch((error) => {\n log('Failed to update detected assets', { error });\n });\n }\n }\n\n #subscribeToNetworkController(): void {\n (\n this.#messenger as unknown as {\n subscribe: (e: string, h: (s: NetworkState) => void) => void;\n }\n ).subscribe(\n 'NetworkController:stateChange',\n (networkState: NetworkState) => {\n log('NetworkController state changed');\n this.#clearProviderCache();\n this.#updateFromNetworkState(networkState);\n },\n );\n }\n\n #initializeFromNetworkController(): void {\n log('Initializing from NetworkController');\n try {\n const networkState = (\n this.#messenger as unknown as { call: (a: string) => NetworkState }\n ).call('NetworkController:getState');\n this.#updateFromNetworkState(networkState);\n } catch (error) {\n log('Failed to initialize from NetworkController', error);\n }\n }\n\n #updateFromNetworkState(networkState: NetworkState): void {\n const { networkConfigurationsByChainId, networksMetadata } = networkState;\n\n const chainStatuses: Record<ChainId, ChainStatus> = {};\n const activeChains: ChainId[] = [];\n\n for (const [hexChainId, config] of Object.entries(\n networkConfigurationsByChainId,\n )) {\n const decimalChainId = parseInt(hexChainId, 16);\n const caip2ChainId = `eip155:${decimalChainId}` as ChainId;\n\n const defaultRpcEndpoint =\n config.rpcEndpoints[config.defaultRpcEndpointIndex];\n if (!defaultRpcEndpoint) {\n continue;\n }\n\n const { networkClientId } = defaultRpcEndpoint;\n const metadata = networksMetadata[networkClientId];\n\n const status: NetworkStatus =\n metadata?.status ?? ('unknown' as NetworkStatus);\n\n chainStatuses[caip2ChainId] = {\n chainId: caip2ChainId,\n status,\n name: config.name,\n nativeCurrency: config.nativeCurrency,\n networkClientId,\n };\n\n if (status === 'available' || status === 'unknown') {\n activeChains.push(caip2ChainId);\n }\n }\n\n log('Network state updated', {\n configuredChains: Object.keys(chainStatuses),\n activeChains,\n });\n\n // Check if chains changed\n const previousChains = [...this.#activeChains];\n const previousSet = new Set(previousChains);\n const hasChanges =\n previousChains.length !== activeChains.length ||\n activeChains.some((chain) => !previousSet.has(chain));\n\n // Update internal state and data source state before notifying, so that\n // when the controller handles the callback and calls getActiveChainsSync(),\n // it receives the updated chains (same order as AbstractDataSource.updateActiveChains).\n this.#chainStatuses = chainStatuses;\n this.#activeChains = activeChains;\n this.state.activeChains = activeChains;\n\n if (hasChanges) {\n this.#onActiveChainsUpdated(this.getName(), activeChains, previousChains);\n }\n }\n\n #getProvider(chainId: ChainId): Web3Provider | undefined {\n const cached = this.#providerCache.get(chainId);\n if (cached) {\n return cached;\n }\n\n const chainStatus = this.#chainStatuses[chainId];\n if (!chainStatus) {\n return undefined;\n }\n\n try {\n const networkClient = (\n this.#messenger as unknown as {\n call: (a: string, id: string) => NetworkClient;\n }\n ).call(\n 'NetworkController:getNetworkClientById',\n chainStatus.networkClientId,\n );\n if (!networkClient?.provider) {\n return undefined;\n }\n const web3Provider = new Web3Provider(networkClient.provider);\n this.#providerCache.set(chainId, web3Provider);\n\n return web3Provider;\n } catch (error) {\n log('Failed to get provider for chain', { chainId, error });\n return undefined;\n }\n }\n\n /**\n * Get provider for MulticallClient using a hex chainId.\n *\n * @param hexChainId - The hex string representation of the chain id.\n * @returns An RpcProvider instance for the specified chain.\n */\n #getMulticallProvider(hexChainId: string): RpcProvider {\n const decimalChainId = parseInt(hexChainId, 16);\n const caip2ChainId = `eip155:${decimalChainId}` as ChainId;\n\n const web3Provider = this.#getProvider(caip2ChainId);\n\n if (!web3Provider) {\n throw new Error(`No provider available for chain ${hexChainId}`);\n }\n\n return {\n call: async (params: { to: string; data: string }): Promise<string> => {\n return web3Provider.call({\n to: params.to,\n data: params.data,\n });\n },\n getBalance: async (address: string): Promise<{ toString(): string }> => {\n const balance = await web3Provider.getBalance(address);\n return balance;\n },\n };\n }\n\n #clearProviderCache(): void {\n this.#providerCache.clear();\n }\n\n /**\n * Get the data source name.\n *\n * @returns The name of this data source.\n */\n /**\n * Get the status of all configured chains.\n *\n * @returns Record of chain statuses keyed by chain ID.\n */\n getChainStatuses(): Record<ChainId, ChainStatus> {\n return { ...this.#chainStatuses };\n }\n\n /**\n * Get the status of a specific chain.\n *\n * @param chainId - The chain ID to get status for.\n * @returns The chain status or undefined if not found.\n */\n getChainStatus(chainId: ChainId): ChainStatus | undefined {\n return this.#chainStatuses[chainId];\n }\n\n /**\n * Set the balance polling interval.\n *\n * @param interval - The polling interval in milliseconds.\n */\n setBalancePollingInterval(interval: number): void {\n log('Setting balance polling interval', { interval });\n this.#balanceFetcher.setIntervalLength(interval);\n }\n\n /**\n * Get the current balance polling interval.\n *\n * @returns The polling interval in milliseconds, or undefined if not set.\n */\n getBalancePollingInterval(): number | undefined {\n return this.#balanceFetcher.getIntervalLength();\n }\n\n /**\n * Set the token detection polling interval.\n *\n * @param interval - The polling interval in milliseconds.\n */\n setDetectionPollingInterval(interval: number): void {\n log('Setting detection polling interval', { interval });\n this.#tokenDetector.setIntervalLength(interval);\n }\n\n /**\n * Get the current token detection polling interval.\n *\n * @returns The polling interval in milliseconds, or undefined if not set.\n */\n getDetectionPollingInterval(): number | undefined {\n return this.#tokenDetector.getIntervalLength();\n }\n\n async fetch(request: DataRequest): Promise<DataResponse> {\n const response: DataResponse = {};\n\n const chainsToFetch = request.chainIds.filter((chainId) =>\n this.#activeChains.includes(chainId),\n );\n\n log('Fetch requested', {\n accounts: request.accountsWithSupportedChains.map((a) => a.account.id),\n requestedChains: request.chainIds,\n chainsToFetch,\n });\n\n if (chainsToFetch.length === 0) {\n log('No active chains to fetch');\n return response;\n }\n\n const assetsBalance: Record<\n string,\n Record<Caip19AssetId, AssetBalance>\n > = {};\n const assetsMetadata: Record<Caip19AssetId, AssetMetadata> = {};\n const failedChains: ChainId[] = [];\n\n // Fetch balances for each account and its supported chains (pre-computed in request)\n for (const {\n account,\n supportedChains,\n } of request.accountsWithSupportedChains) {\n const chainsForAccount = chainsToFetch.filter((chain) =>\n supportedChains.includes(chain),\n );\n if (chainsForAccount.length === 0) {\n continue;\n }\n\n const { address, id: accountId } = account;\n\n for (const chainId of chainsForAccount) {\n const hexChainId = caipChainIdToHex(chainId);\n\n try {\n // Use BalanceFetcher for batched balance fetching\n const result = await this.#balanceFetcher.fetchBalancesForTokens(\n hexChainId,\n accountId,\n address as Address,\n [], // Empty array means just native token\n { includeNative: true },\n );\n\n if (!assetsBalance[accountId]) {\n assetsBalance[accountId] = {};\n }\n\n // Collect metadata for all balances\n const balanceMetadata = this.#collectMetadataForBalances(\n result.balances,\n chainId,\n );\n Object.assign(assetsMetadata, balanceMetadata);\n\n // Convert balances to human-readable format\n for (const balance of result.balances) {\n const metadata = assetsMetadata[balance.assetId];\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = metadata?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n assetsBalance[accountId][balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n } catch (error) {\n log('Failed to fetch balance', { address, chainId, error });\n\n if (!assetsBalance[accountId]) {\n assetsBalance[accountId] = {};\n }\n const nativeAssetId = this.#buildNativeAssetId(chainId);\n assetsBalance[accountId][nativeAssetId] = { amount: '0' };\n\n // Even on error, include native token metadata\n const chainStatus = this.#chainStatuses[chainId];\n if (chainStatus) {\n assetsMetadata[nativeAssetId] = {\n type: 'native',\n symbol: chainStatus.nativeCurrency,\n name: chainStatus.nativeCurrency,\n decimals: 18,\n };\n }\n\n if (!failedChains.includes(chainId)) {\n failedChains.push(chainId);\n }\n }\n }\n }\n\n if (failedChains.length > 0) {\n log('Fetch PARTIAL - some chains failed', {\n successChains: chainsToFetch.filter(\n (chain) => !failedChains.includes(chain),\n ),\n failedChains,\n });\n\n response.errors = {};\n for (const chainId of failedChains) {\n response.errors[chainId] = 'RPC fetch failed';\n }\n } else {\n log('Fetch SUCCESS', {\n chains: chainsToFetch,\n accountCount: Object.keys(assetsBalance).length,\n });\n }\n\n response.assetsBalance = assetsBalance;\n\n // Include metadata for native tokens if we have any\n if (Object.keys(assetsMetadata).length > 0) {\n response.assetsMetadata = assetsMetadata;\n }\n\n return response;\n }\n\n /**\n * Run token detection for an account on a chain.\n *\n * @param chainId - The chain ID to detect tokens on.\n * @param account - The account to detect tokens for.\n * @returns Promise resolving to a DataResponse with detected assets.\n */\n async detectTokens(\n chainId: ChainId,\n account: InternalAccount,\n ): Promise<DataResponse> {\n if (!this.#tokenDetectionEnabled) {\n return {};\n }\n\n const hexChainId = caipChainIdToHex(chainId);\n const { address, id: accountId } = account;\n\n log('Running token detection', { chainId, accountId });\n\n try {\n const result = await this.#tokenDetector.detectTokens(\n hexChainId,\n accountId,\n address as Address,\n );\n\n if (result.detectedAssets.length === 0) {\n log('No new tokens detected');\n return {};\n }\n\n log('Detected new tokens', {\n count: result.detectedAssets.length,\n chainId,\n accountId,\n });\n\n // Convert detected assets to DataResponse format\n const balances: Record<Caip19AssetId, AssetBalance> = {};\n const assetsMetadata: Record<Caip19AssetId, AssetMetadata> = {};\n\n // Build metadata from detected assets\n for (const asset of result.detectedAssets) {\n if (asset.symbol && asset.decimals !== undefined) {\n assetsMetadata[asset.assetId] = {\n type: 'erc20',\n symbol: asset.symbol,\n name: asset.name ?? asset.symbol,\n decimals: asset.decimals,\n image: asset.image,\n };\n }\n }\n\n // Add balances for detected tokens (converted to human-readable format)\n for (const balance of result.detectedBalances) {\n const detectedAsset = result.detectedAssets.find(\n (asset) => asset.assetId === balance.assetId,\n );\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = detectedAsset?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n balances[balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n\n const response: DataResponse = {\n detectedAssets: {\n [accountId]: result.detectedAssets.map((asset) => asset.assetId),\n },\n assetsBalance: {\n [accountId]: balances,\n },\n };\n\n // Include metadata if we have any\n if (Object.keys(assetsMetadata).length > 0) {\n response.assetsMetadata = assetsMetadata;\n }\n\n return response;\n } catch (error) {\n log('Token detection failed', { chainId, accountId, error });\n return {};\n }\n }\n\n get assetsMiddleware(): Middleware {\n return async (context, next) => {\n const { request } = context;\n\n const supportedChains = request.chainIds.filter((chainId) =>\n this.#activeChains.includes(chainId),\n );\n\n if (supportedChains.length === 0) {\n return next(context);\n }\n\n let successfullyHandledChains: ChainId[] = [];\n\n log('Middleware fetching', {\n chains: supportedChains,\n accounts: request.accountsWithSupportedChains.map((a) => a.account.id),\n });\n\n const response = await this.fetch({\n ...request,\n chainIds: supportedChains,\n });\n\n if (response.assetsBalance) {\n context.response.assetsBalance ??= {};\n for (const [accountId, accountBalances] of Object.entries(\n response.assetsBalance,\n )) {\n context.response.assetsBalance[accountId] ??= {};\n context.response.assetsBalance[accountId] = {\n ...context.response.assetsBalance[accountId],\n ...accountBalances,\n };\n }\n }\n\n if (response.assetsMetadata) {\n context.response.assetsMetadata ??= {};\n context.response.assetsMetadata = {\n ...context.response.assetsMetadata,\n ...response.assetsMetadata,\n };\n }\n\n const failedChains = new Set(Object.keys(response.errors ?? {}));\n successfullyHandledChains = supportedChains.filter(\n (chainId) => !failedChains.has(chainId),\n );\n\n if (successfullyHandledChains.length > 0) {\n const remainingChains = request.chainIds.filter(\n (chainId) => !successfullyHandledChains.includes(chainId),\n );\n\n return next({\n ...context,\n request: {\n ...request,\n chainIds: remainingChains,\n },\n });\n }\n\n return next(context);\n };\n }\n\n /**\n * Subscribe to updates for the given request.\n * Starts polling through BalanceFetcher and TokenDetector.\n *\n * @param subscriptionRequest - The subscription request details.\n */\n async subscribe(subscriptionRequest: SubscriptionRequest): Promise<void> {\n const { request, subscriptionId, isUpdate } = subscriptionRequest;\n\n const chainsToSubscribe = request.chainIds.filter((chainId) =>\n this.#activeChains.includes(chainId),\n );\n\n log('Subscribe requested', {\n subscriptionId,\n isUpdate,\n accounts: request.accountsWithSupportedChains.map((a) => a.account.id),\n chainsToSubscribe,\n });\n\n if (chainsToSubscribe.length === 0) {\n log('No active chains to subscribe');\n return;\n }\n\n // Handle subscription update - restart polling for new chains\n if (isUpdate) {\n const existing = this.#activeSubscriptions.get(subscriptionId);\n if (existing) {\n log('Updating existing subscription - restarting polling', {\n subscriptionId,\n existingChains: existing.chains,\n newChains: chainsToSubscribe,\n });\n // Don't return early - continue to unsubscribe and restart polling\n }\n }\n\n // Clean up existing subscription (stops old polling)\n await this.unsubscribe(subscriptionId);\n\n // Start polling through BalanceFetcher and TokenDetector (use pre-computed supportedChains per account)\n const balancePollingTokens: string[] = [];\n const detectionPollingTokens: string[] = [];\n\n for (const {\n account,\n supportedChains,\n } of request.accountsWithSupportedChains) {\n const chainsForAccount = chainsToSubscribe.filter((chain) =>\n supportedChains.includes(chain),\n );\n if (chainsForAccount.length === 0) {\n continue;\n }\n\n const { address, id: accountId } = account;\n\n for (const chainId of chainsForAccount) {\n const hexChainId = caipChainIdToHex(chainId);\n\n // Start balance polling\n const balanceInput: BalancePollingInput = {\n chainId: hexChainId,\n accountId,\n accountAddress: address as Address,\n };\n const balanceToken = this.#balanceFetcher.startPolling(balanceInput);\n balancePollingTokens.push(balanceToken);\n\n // Start detection polling if enabled\n if (this.#tokenDetectionEnabled) {\n const detectionInput: DetectionPollingInput = {\n chainId: hexChainId,\n accountId,\n accountAddress: address as Address,\n };\n const detectionToken =\n this.#tokenDetector.startPolling(detectionInput);\n detectionPollingTokens.push(detectionToken);\n }\n }\n }\n\n // Store subscription data\n const accounts = request.accountsWithSupportedChains.map(\n (entry) => entry.account,\n );\n this.#activeSubscriptions.set(subscriptionId, {\n balancePollingTokens,\n detectionPollingTokens,\n chains: chainsToSubscribe,\n accounts,\n onAssetsUpdate: subscriptionRequest.onAssetsUpdate,\n });\n\n log('Subscription SUCCESS', {\n subscriptionId,\n chains: chainsToSubscribe,\n balancePollingCount: balancePollingTokens.length,\n detectionPollingCount: detectionPollingTokens.length,\n });\n }\n\n /**\n * Unsubscribe from updates and stop polling.\n *\n * @param subscriptionId - The subscription ID to unsubscribe.\n */\n async unsubscribe(subscriptionId: string): Promise<void> {\n const subscription = this.#activeSubscriptions.get(subscriptionId);\n if (subscription) {\n // Stop balance polling\n for (const token of subscription.balancePollingTokens) {\n this.#balanceFetcher.stopPollingByPollingToken(token);\n }\n\n // Stop detection polling\n for (const token of subscription.detectionPollingTokens) {\n this.#tokenDetector.stopPollingByPollingToken(token);\n }\n\n this.#activeSubscriptions.delete(subscriptionId);\n log('Unsubscribed and stopped polling', { subscriptionId });\n }\n }\n\n /**\n * Build the native asset ID for a given chain using NetworkEnablementController state.\n *\n * @param chainId - The CAIP-2 chain ID (e.g., \"eip155:1\")\n * @returns The CAIP-19 native asset ID (e.g., \"eip155:1/slip44:60\")\n */\n #buildNativeAssetId(chainId: ChainId): Caip19AssetId {\n const { nativeAssetIdentifiers } = this.#messenger.call(\n 'NetworkEnablementController:getState',\n );\n\n return (nativeAssetIdentifiers[chainId] ??\n `${chainId}/slip44:60`) as Caip19AssetId;\n }\n\n /**\n * Get existing assets metadata from AssetsController state.\n * Used to include metadata for ERC20 tokens when returning balance updates.\n *\n * @returns Record of asset IDs to their metadata.\n */\n #getExistingAssetsMetadata(): Record<Caip19AssetId, AssetMetadata> {\n try {\n const state = this.#messenger.call('AssetsController:getState') as {\n assetsMetadata?: Record<Caip19AssetId, AssetMetadata>;\n };\n return (state.assetsMetadata ?? {}) as unknown as Record<\n Caip19AssetId,\n AssetMetadata\n >;\n } catch {\n // If AssetsController:getState fails, return empty metadata\n return {};\n }\n }\n\n /**\n * Get token metadata from TokenListController for an ERC20 token.\n * Used as a fallback when metadata is not in AssetsController state.\n *\n * @param assetId - The CAIP-19 asset ID (e.g., \"eip155:1/erc20:0x...\")\n * @returns Token metadata if found in token list, undefined otherwise.\n */\n #getTokenMetadataFromTokenList(\n assetId: Caip19AssetId,\n ): AssetMetadata | undefined {\n try {\n // Parse asset ID to get chain and token address\n // Format: eip155:{chainId}/erc20:{address}\n const [chainPart, assetPart] = assetId.split('/');\n if (!assetPart?.startsWith('erc20:')) {\n return undefined;\n }\n\n const tokenAddress = assetPart.slice(6); // Remove 'erc20:' prefix\n const chainIdDecimal = chainPart.split(':')[1];\n const hexChainId = `0x${parseInt(chainIdDecimal, 10).toString(16)}`;\n\n const tokenListState = (\n this.#messenger as unknown as { call: (a: string) => TokenListState }\n ).call('TokenListController:getState');\n const chainCacheEntry =\n tokenListState?.tokensChainsCache?.[hexChainId as `0x${string}`];\n const chainTokenList = chainCacheEntry?.data;\n\n if (!chainTokenList) {\n return undefined;\n }\n\n // Look up token by address (case-insensitive)\n const lowerAddress = tokenAddress.toLowerCase();\n for (const [address, tokenData] of Object.entries(chainTokenList)) {\n if (address.toLowerCase() === lowerAddress) {\n const token = tokenData as {\n symbol?: string;\n name?: string;\n decimals?: number;\n iconUrl?: string;\n };\n if (token.symbol && token.decimals !== undefined) {\n return {\n type: 'erc20',\n symbol: token.symbol,\n name: token.name ?? token.symbol,\n decimals: token.decimals,\n image: token.iconUrl,\n };\n }\n }\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Destroy the data source and clean up resources.\n */\n destroy(): void {\n log('Destroying RpcDataSource');\n\n // Stop all polling\n this.#balanceFetcher.stopAllPolling();\n this.#tokenDetector.stopAllPolling();\n\n // Clear subscriptions\n this.#activeSubscriptions.clear();\n\n // Clear caches\n this.#providerCache.clear();\n }\n}\n\nexport function createRpcDataSource(\n options: RpcDataSourceOptions,\n): RpcDataSource {\n return new RpcDataSource(options);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RpcDataSource.cjs","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"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","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport { toHex } from '@metamask/controller-utils';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { NetworkState, NetworkStatus } from '@metamask/network-controller';\nimport {\n isStrictHexString,\n isCaipChainId,\n parseCaipChainId,\n} from '@metamask/utils';\nimport type { Hex } from '@metamask/utils';\nimport BigNumberJS from 'bignumber.js';\n\nimport { AbstractDataSource } from './AbstractDataSource';\nimport type {\n DataSourceState,\n SubscriptionRequest,\n} from './AbstractDataSource';\nimport {\n BalanceFetcher,\n MulticallClient,\n TokenDetector,\n} from './evm-rpc-services';\nimport type {\n BalancePollingInput,\n DetectionPollingInput,\n} from './evm-rpc-services';\nimport type {\n Address,\n Provider as RpcProvider,\n TokenListState,\n BalanceFetchResult,\n TokenDetectionResult,\n} from './evm-rpc-services';\nimport type { AssetsControllerMessenger } from '../AssetsController';\nimport { projectLogger, createModuleLogger } from '../logger';\nimport type {\n ChainId,\n Caip19AssetId,\n AssetBalance,\n AssetMetadata,\n DataRequest,\n DataResponse,\n Middleware,\n} from '../types';\n\nconst CONTROLLER_NAME = 'RpcDataSource';\nconst DEFAULT_BALANCE_INTERVAL = 30_000; // 30 seconds\nconst DEFAULT_DETECTION_INTERVAL = 180_000; // 3 minutes\n\nconst log = createModuleLogger(projectLogger, CONTROLLER_NAME);\n\n// NetworkController action to get state\nexport type NetworkControllerGetStateAction = {\n type: 'NetworkController:getState';\n handler: () => NetworkState;\n};\n\n// NetworkController action to get network client by ID\nexport type NetworkControllerGetNetworkClientByIdAction = {\n type: 'NetworkController:getNetworkClientById';\n handler: (networkClientId: string) => NetworkClient;\n};\n\n// Network client returned by NetworkController\nexport type NetworkClient = {\n provider: EthereumProvider;\n configuration: {\n chainId: string;\n };\n};\n\n// Ethereum provider interface\nexport type EthereumProvider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n};\n\n// NetworkController state change event\nexport type NetworkControllerStateChangeEvent = {\n type: 'NetworkController:stateChange';\n payload: [NetworkState, Patch[]];\n};\n\n// Patch type for state changes\ntype Patch = {\n op: 'add' | 'remove' | 'replace';\n path: string[];\n value?: unknown;\n};\n\n// TokenListController:getState action\ntype TokenListControllerGetStateAction = {\n type: 'TokenListController:getState';\n handler: () => {\n tokensChainsCache: Record<\n string,\n { timestamp: number; data: Record<string, unknown> }\n >;\n };\n};\n\n// AssetsController:getState action (for assets balance and metadata)\ntype AssetsControllerGetStateAction = {\n type: 'AssetsController:getState';\n handler: () => {\n assetsInfo: Record<Caip19AssetId, AssetMetadata>;\n assetsBalance: Record<string, Record<string, { amount: string }>>;\n };\n};\n\n// NetworkEnablementController:getState action\ntype NetworkEnablementControllerGetStateAction = {\n type: 'NetworkEnablementController:getState';\n handler: () => {\n enabledNetworkMap: Record<string, Record<string, boolean>>;\n nativeAssetIdentifiers: Record<string, string>;\n };\n};\n\n// Allowed actions that RpcDataSource can call\nexport type RpcDataSourceAllowedActions =\n | NetworkControllerGetStateAction\n | NetworkControllerGetNetworkClientByIdAction\n | AssetsControllerGetStateAction\n | TokenListControllerGetStateAction\n | NetworkEnablementControllerGetStateAction;\n\n// Allowed events that RpcDataSource can subscribe to\nexport type RpcDataSourceAllowedEvents = NetworkControllerStateChangeEvent;\n\n/** Network status for each chain */\nexport type ChainStatus = {\n chainId: ChainId;\n status: NetworkStatus;\n name: string;\n nativeCurrency: string;\n /** Network client ID for getting the provider */\n networkClientId: string;\n};\n\n/** RpcDataSource is stateless */\nexport type RpcDataSourceState = Record<never, never>;\n\n/** Optional configuration for RpcDataSource when the controller instantiates it. */\nexport type RpcDataSourceConfig = {\n balanceInterval?: number;\n detectionInterval?: number;\n tokenDetectionEnabled?: boolean;\n timeout?: number;\n};\n\nexport type RpcDataSourceOptions = {\n /** The AssetsController messenger (shared by all data sources). */\n messenger: AssetsControllerMessenger;\n /** Called when active chains are updated. Pass dataSourceName so the controller knows the source. */\n onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n /** Request timeout in ms */\n timeout?: number;\n /** Balance polling interval in ms (default: 30s) */\n balanceInterval?: number;\n /** Token detection polling interval in ms (default: 180s / 3 min) */\n detectionInterval?: number;\n /** Whether token detection is enabled */\n tokenDetectionEnabled?: boolean;\n};\n\n/**\n * Subscription data stored for each active subscription.\n */\ntype SubscriptionData = {\n /** Polling tokens from BalanceFetcher */\n balancePollingTokens: string[];\n /** Polling tokens from TokenDetector */\n detectionPollingTokens: string[];\n /** Chain IDs being polled */\n chains: ChainId[];\n /** Accounts being polled */\n accounts: InternalAccount[];\n /** Callback to report asset updates to the controller */\n onAssetsUpdate: (response: DataResponse) => void | Promise<void>;\n};\n\n/**\n * Convert CAIP chain ID or hex chain ID to hex chain ID.\n *\n * @param chainId - CAIP chain ID or hex chain ID.\n * @returns Hex chain ID.\n */\nexport const caipChainIdToHex = (chainId: string): Hex => {\n if (isStrictHexString(chainId)) {\n return chainId;\n }\n\n if (isCaipChainId(chainId)) {\n return toHex(parseCaipChainId(chainId).reference);\n }\n\n throw new Error('caipChainIdToHex - Failed to provide CAIP-2 or Hex chainId');\n};\n\n/**\n * Data source for fetching balances via RPC calls.\n *\n * Orchestrates polling through BalanceFetcher and TokenDetector,\n * each of which handle their own polling intervals.\n *\n * Communicates with AssetsController via Messenger:\n *\n * Actions:\n * - RpcDataSource:getActiveChains\n * - RpcDataSource:fetch\n * - RpcDataSource:subscribe\n * - RpcDataSource:unsubscribe\n *\n * Events:\n * - RpcDataSource:activeChainsUpdated\n * - RpcDataSource:assetsUpdated\n */\nexport class RpcDataSource extends AbstractDataSource<\n typeof CONTROLLER_NAME,\n DataSourceState\n> {\n readonly #messenger: AssetsControllerMessenger;\n\n readonly #onActiveChainsUpdated: (\n dataSourceName: string,\n chains: ChainId[],\n previousChains: ChainId[],\n ) => void;\n\n readonly #timeout: number;\n\n readonly #tokenDetectionEnabled: boolean;\n\n /** Currently active chains */\n #activeChains: ChainId[] = [];\n\n /** Network status for each active chain */\n #chainStatuses: Record<ChainId, ChainStatus> = {};\n\n /** Cache of Web3Provider instances by chainId */\n readonly #providerCache: Map<ChainId, Web3Provider> = new Map();\n\n /** Active subscriptions by ID */\n readonly #activeSubscriptions: Map<string, SubscriptionData> = new Map();\n\n // Rpc-datasource components\n readonly #multicallClient: MulticallClient;\n\n readonly #balanceFetcher: BalanceFetcher;\n\n readonly #tokenDetector: TokenDetector;\n\n constructor(options: RpcDataSourceOptions) {\n super(CONTROLLER_NAME, { activeChains: [] });\n this.#messenger = options.messenger;\n this.#onActiveChainsUpdated = options.onActiveChainsUpdated;\n this.#timeout = options.timeout ?? 10_000;\n this.#tokenDetectionEnabled = options.tokenDetectionEnabled ?? false;\n\n const balanceInterval = options.balanceInterval ?? DEFAULT_BALANCE_INTERVAL;\n const detectionInterval =\n options.detectionInterval ?? DEFAULT_DETECTION_INTERVAL;\n\n log('Initializing RpcDataSource', {\n timeout: this.#timeout,\n balanceInterval,\n detectionInterval,\n tokenDetectionEnabled: this.#tokenDetectionEnabled,\n });\n\n // Initialize MulticallClient with a provider getter\n this.#multicallClient = new MulticallClient((hexChainId: string) => {\n return this.#getMulticallProvider(hexChainId);\n });\n\n // Create messenger adapters for BalanceFetcher and TokenDetector\n const balanceFetcherMessenger = {\n call: (\n _action: 'AssetsController:getState',\n ): {\n assetsBalance: Record<string, Record<string, { amount: string }>>;\n } => {\n const state = this.#messenger.call('AssetsController:getState');\n return {\n assetsBalance: (state.assetsBalance ?? {}) as Record<\n string,\n Record<string, { amount: string }>\n >,\n };\n },\n };\n\n const tokenDetectorMessenger = {\n call: (_action: 'TokenListController:getState'): TokenListState => {\n return (\n this.#messenger as unknown as { call: (a: string) => TokenListState }\n ).call('TokenListController:getState');\n },\n };\n\n // Initialize BalanceFetcher with polling interval\n this.#balanceFetcher = new BalanceFetcher(\n this.#multicallClient,\n balanceFetcherMessenger,\n { pollingInterval: balanceInterval },\n );\n this.#balanceFetcher.setOnBalanceUpdate(\n this.#handleBalanceUpdate.bind(this),\n );\n\n // Initialize TokenDetector with polling interval\n this.#tokenDetector = new TokenDetector(\n this.#multicallClient,\n tokenDetectorMessenger,\n { pollingInterval: detectionInterval },\n );\n this.#tokenDetector.setOnDetectionUpdate(\n this.#handleDetectionUpdate.bind(this),\n );\n\n this.#subscribeToNetworkController();\n this.#initializeFromNetworkController();\n }\n\n /**\n * Convert a raw balance to human-readable format using decimals.\n *\n * @param rawBalance - The raw balance string.\n * @param decimals - The number of decimals for the token.\n * @returns The human-readable balance string.\n */\n #convertToHumanReadable(rawBalance: string, decimals: number): string {\n const rawAmount = new BigNumberJS(rawBalance);\n const divisor = new BigNumberJS(10).pow(decimals);\n return rawAmount.dividedBy(divisor).toString();\n }\n\n /**\n * Collect metadata for a list of balance entries.\n * For native tokens, generates metadata from chain status.\n * For ERC20 tokens, looks up from existing state or token list.\n *\n * @param balances - Array of balance entries with assetId.\n * @param chainId - The CAIP-2 chain ID.\n * @returns Record of asset metadata keyed by asset ID.\n */\n #collectMetadataForBalances(\n balances: { assetId: Caip19AssetId }[],\n chainId: ChainId,\n ): Record<Caip19AssetId, AssetMetadata> {\n const assetsInfo: Record<Caip19AssetId, AssetMetadata> = {};\n const existingMetadata = this.#getExistingAssetsMetadata();\n\n for (const balance of balances) {\n const isNative = balance.assetId.includes('/slip44:');\n if (isNative) {\n const chainStatus = this.#chainStatuses[chainId];\n\n if (chainStatus) {\n assetsInfo[balance.assetId] = {\n type: 'native',\n symbol: chainStatus.nativeCurrency,\n name: chainStatus.nativeCurrency,\n decimals: 18,\n };\n }\n } else {\n // For ERC20 tokens, try existing metadata from state first\n const existingMeta = existingMetadata[balance.assetId];\n\n if (existingMeta) {\n assetsInfo[balance.assetId] = existingMeta;\n } else {\n // Fallback to token list if not in state\n const tokenListMeta = this.#getTokenMetadataFromTokenList(\n balance.assetId,\n );\n if (tokenListMeta) {\n assetsInfo[balance.assetId] = tokenListMeta;\n } else {\n // Default metadata for unknown ERC20 tokens.\n // Use 18 decimals (the standard for most ERC20 tokens)\n // to ensure consistent human-readable balance format.\n assetsInfo[balance.assetId] = {\n type: 'erc20',\n symbol: '',\n name: '',\n decimals: 18,\n };\n }\n }\n }\n }\n\n return assetsInfo;\n }\n\n /**\n * Handle balance update from BalanceFetcher.\n *\n * @param result - The balance fetch result.\n */\n #handleBalanceUpdate(result: BalanceFetchResult): void {\n const newBalances: Record<string, { amount: string }> = {};\n\n // Convert hex chain ID to CAIP-2 format\n const chainIdDecimal = parseInt(result.chainId, 16);\n const caipChainId = `eip155:${chainIdDecimal}` as ChainId;\n\n // Collect metadata for all balances\n const assetsInfo = this.#collectMetadataForBalances(\n result.balances,\n caipChainId,\n );\n\n // Convert balances to human-readable format using metadata\n for (const balance of result.balances) {\n const metadata = assetsInfo[balance.assetId];\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = metadata?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n newBalances[balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n\n // Only send new data to AssetsController - it handles merging atomically\n // to avoid race conditions when concurrent updates occur for the same account\n const response: DataResponse = {\n assetsBalance: {\n [result.accountId]: newBalances,\n },\n assetsInfo,\n };\n\n log('Balance update response', {\n accountId: result.accountId,\n newBalanceCount: Object.keys(newBalances).length,\n });\n\n for (const subscription of this.#activeSubscriptions.values()) {\n subscription.onAssetsUpdate(response)?.catch((error) => {\n log('Failed to update assets', { error });\n });\n }\n }\n\n /**\n * Handle detection update from TokenDetector.\n *\n * @param result - The token detection result.\n */\n #handleDetectionUpdate(result: TokenDetectionResult): void {\n log('Detected new tokens', {\n count: result.detectedAssets.length,\n });\n\n // Build new metadata from detected assets\n const newMetadata: Record<Caip19AssetId, AssetMetadata> = {};\n if (result.detectedAssets.length > 0) {\n for (const asset of result.detectedAssets) {\n // Only include if we have metadata (symbol and decimals at minimum)\n if (asset.symbol && asset.decimals !== undefined) {\n newMetadata[asset.assetId] = {\n type: 'erc20',\n symbol: asset.symbol,\n name: asset.name ?? asset.symbol,\n decimals: asset.decimals,\n image: asset.image,\n };\n }\n }\n }\n\n // Build new balances from detected tokens\n const newBalances: Record<string, { amount: string }> = {};\n if (result.detectedBalances.length > 0) {\n for (const balance of result.detectedBalances) {\n // Get decimals from the detected asset metadata\n const detectedAsset = result.detectedAssets.find(\n (asset) => asset.assetId === balance.assetId,\n );\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = detectedAsset?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n newBalances[balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n }\n\n // Only send new data to AssetsController - it handles merging atomically\n // to avoid race conditions when concurrent updates occur for the same account\n const response: DataResponse = {\n detectedAssets: {\n [result.accountId]: result.detectedAssets.map((asset) => asset.assetId),\n },\n assetsInfo: newMetadata,\n assetsBalance: {\n [result.accountId]: newBalances,\n },\n };\n\n for (const subscription of this.#activeSubscriptions.values()) {\n subscription.onAssetsUpdate(response)?.catch((error) => {\n log('Failed to update detected assets', { error });\n });\n }\n }\n\n #subscribeToNetworkController(): void {\n (\n this.#messenger as unknown as {\n subscribe: (e: string, h: (s: NetworkState) => void) => void;\n }\n ).subscribe(\n 'NetworkController:stateChange',\n (networkState: NetworkState) => {\n log('NetworkController state changed');\n this.#clearProviderCache();\n this.#updateFromNetworkState(networkState);\n },\n );\n }\n\n #initializeFromNetworkController(): void {\n log('Initializing from NetworkController');\n try {\n const networkState = (\n this.#messenger as unknown as { call: (a: string) => NetworkState }\n ).call('NetworkController:getState');\n this.#updateFromNetworkState(networkState);\n } catch (error) {\n log('Failed to initialize from NetworkController', error);\n }\n }\n\n #updateFromNetworkState(networkState: NetworkState): void {\n const { networkConfigurationsByChainId, networksMetadata } = networkState;\n\n const chainStatuses: Record<ChainId, ChainStatus> = {};\n const activeChains: ChainId[] = [];\n\n for (const [hexChainId, config] of Object.entries(\n networkConfigurationsByChainId,\n )) {\n const decimalChainId = parseInt(hexChainId, 16);\n const caip2ChainId = `eip155:${decimalChainId}` as ChainId;\n\n const defaultRpcEndpoint =\n config.rpcEndpoints[config.defaultRpcEndpointIndex];\n if (!defaultRpcEndpoint) {\n continue;\n }\n\n const { networkClientId } = defaultRpcEndpoint;\n const metadata = networksMetadata[networkClientId];\n\n const status: NetworkStatus =\n metadata?.status ?? ('unknown' as NetworkStatus);\n\n chainStatuses[caip2ChainId] = {\n chainId: caip2ChainId,\n status,\n name: config.name,\n nativeCurrency: config.nativeCurrency,\n networkClientId,\n };\n\n if (status === 'available' || status === 'unknown') {\n activeChains.push(caip2ChainId);\n }\n }\n\n log('Network state updated', {\n configuredChains: Object.keys(chainStatuses),\n activeChains,\n });\n\n // Check if chains changed\n const previousChains = [...this.#activeChains];\n const previousSet = new Set(previousChains);\n const hasChanges =\n previousChains.length !== activeChains.length ||\n activeChains.some((chain) => !previousSet.has(chain));\n\n // Update internal state and data source state before notifying, so that\n // when the controller handles the callback and calls getActiveChainsSync(),\n // it receives the updated chains (same order as AbstractDataSource.updateActiveChains).\n this.#chainStatuses = chainStatuses;\n this.#activeChains = activeChains;\n this.state.activeChains = activeChains;\n\n if (hasChanges) {\n this.#onActiveChainsUpdated(this.getName(), activeChains, previousChains);\n }\n }\n\n #getProvider(chainId: ChainId): Web3Provider | undefined {\n const cached = this.#providerCache.get(chainId);\n if (cached) {\n return cached;\n }\n\n const chainStatus = this.#chainStatuses[chainId];\n if (!chainStatus) {\n return undefined;\n }\n\n try {\n const networkClient = (\n this.#messenger as unknown as {\n call: (a: string, id: string) => NetworkClient;\n }\n ).call(\n 'NetworkController:getNetworkClientById',\n chainStatus.networkClientId,\n );\n if (!networkClient?.provider) {\n return undefined;\n }\n const web3Provider = new Web3Provider(networkClient.provider);\n this.#providerCache.set(chainId, web3Provider);\n\n return web3Provider;\n } catch (error) {\n log('Failed to get provider for chain', { chainId, error });\n return undefined;\n }\n }\n\n /**\n * Get provider for MulticallClient using a hex chainId.\n *\n * @param hexChainId - The hex string representation of the chain id.\n * @returns An RpcProvider instance for the specified chain.\n */\n #getMulticallProvider(hexChainId: string): RpcProvider {\n const decimalChainId = parseInt(hexChainId, 16);\n const caip2ChainId = `eip155:${decimalChainId}` as ChainId;\n\n const web3Provider = this.#getProvider(caip2ChainId);\n\n if (!web3Provider) {\n throw new Error(`No provider available for chain ${hexChainId}`);\n }\n\n return {\n call: async (params: { to: string; data: string }): Promise<string> => {\n return web3Provider.call({\n to: params.to,\n data: params.data,\n });\n },\n getBalance: async (address: string): Promise<{ toString(): string }> => {\n const balance = await web3Provider.getBalance(address);\n return balance;\n },\n };\n }\n\n #clearProviderCache(): void {\n this.#providerCache.clear();\n }\n\n /**\n * Get the data source name.\n *\n * @returns The name of this data source.\n */\n /**\n * Get the status of all configured chains.\n *\n * @returns Record of chain statuses keyed by chain ID.\n */\n getChainStatuses(): Record<ChainId, ChainStatus> {\n return { ...this.#chainStatuses };\n }\n\n /**\n * Get the status of a specific chain.\n *\n * @param chainId - The chain ID to get status for.\n * @returns The chain status or undefined if not found.\n */\n getChainStatus(chainId: ChainId): ChainStatus | undefined {\n return this.#chainStatuses[chainId];\n }\n\n /**\n * Set the balance polling interval.\n *\n * @param interval - The polling interval in milliseconds.\n */\n setBalancePollingInterval(interval: number): void {\n log('Setting balance polling interval', { interval });\n this.#balanceFetcher.setIntervalLength(interval);\n }\n\n /**\n * Get the current balance polling interval.\n *\n * @returns The polling interval in milliseconds, or undefined if not set.\n */\n getBalancePollingInterval(): number | undefined {\n return this.#balanceFetcher.getIntervalLength();\n }\n\n /**\n * Set the token detection polling interval.\n *\n * @param interval - The polling interval in milliseconds.\n */\n setDetectionPollingInterval(interval: number): void {\n log('Setting detection polling interval', { interval });\n this.#tokenDetector.setIntervalLength(interval);\n }\n\n /**\n * Get the current token detection polling interval.\n *\n * @returns The polling interval in milliseconds, or undefined if not set.\n */\n getDetectionPollingInterval(): number | undefined {\n return this.#tokenDetector.getIntervalLength();\n }\n\n async fetch(request: DataRequest): Promise<DataResponse> {\n const response: DataResponse = {};\n\n const chainsToFetch = request.chainIds.filter((chainId) =>\n this.#activeChains.includes(chainId),\n );\n\n log('Fetch requested', {\n accounts: request.accountsWithSupportedChains.map((a) => a.account.id),\n requestedChains: request.chainIds,\n chainsToFetch,\n });\n\n if (chainsToFetch.length === 0) {\n log('No active chains to fetch');\n return response;\n }\n\n const assetsBalance: Record<\n string,\n Record<Caip19AssetId, AssetBalance>\n > = {};\n const assetsInfo: Record<Caip19AssetId, AssetMetadata> = {};\n const failedChains: ChainId[] = [];\n\n // Fetch balances for each account and its supported chains (pre-computed in request)\n for (const {\n account,\n supportedChains,\n } of request.accountsWithSupportedChains) {\n const chainsForAccount = chainsToFetch.filter((chain) =>\n supportedChains.includes(chain),\n );\n if (chainsForAccount.length === 0) {\n continue;\n }\n\n const { address, id: accountId } = account;\n\n for (const chainId of chainsForAccount) {\n const hexChainId = caipChainIdToHex(chainId);\n\n try {\n // Use BalanceFetcher for batched balance fetching\n const result = await this.#balanceFetcher.fetchBalancesForTokens(\n hexChainId,\n accountId,\n address as Address,\n [], // Empty array means just native token\n { includeNative: true },\n );\n\n if (!assetsBalance[accountId]) {\n assetsBalance[accountId] = {};\n }\n\n // Collect metadata for all balances\n const balanceMetadata = this.#collectMetadataForBalances(\n result.balances,\n chainId,\n );\n Object.assign(assetsInfo, balanceMetadata);\n\n // Convert balances to human-readable format\n for (const balance of result.balances) {\n const metadata = assetsInfo[balance.assetId];\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = metadata?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n assetsBalance[accountId][balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n } catch (error) {\n log('Failed to fetch balance', { address, chainId, error });\n\n if (!assetsBalance[accountId]) {\n assetsBalance[accountId] = {};\n }\n const nativeAssetId = this.#buildNativeAssetId(chainId);\n assetsBalance[accountId][nativeAssetId] = { amount: '0' };\n\n // Even on error, include native token metadata\n const chainStatus = this.#chainStatuses[chainId];\n if (chainStatus) {\n assetsInfo[nativeAssetId] = {\n type: 'native',\n symbol: chainStatus.nativeCurrency,\n name: chainStatus.nativeCurrency,\n decimals: 18,\n };\n }\n\n if (!failedChains.includes(chainId)) {\n failedChains.push(chainId);\n }\n }\n }\n }\n\n if (failedChains.length > 0) {\n log('Fetch PARTIAL - some chains failed', {\n successChains: chainsToFetch.filter(\n (chain) => !failedChains.includes(chain),\n ),\n failedChains,\n });\n\n response.errors = {};\n for (const chainId of failedChains) {\n response.errors[chainId] = 'RPC fetch failed';\n }\n } else {\n log('Fetch SUCCESS', {\n chains: chainsToFetch,\n accountCount: Object.keys(assetsBalance).length,\n });\n }\n\n response.assetsBalance = assetsBalance;\n\n // Include metadata for native tokens if we have any\n if (Object.keys(assetsInfo).length > 0) {\n response.assetsInfo = assetsInfo;\n }\n\n return response;\n }\n\n /**\n * Run token detection for an account on a chain.\n *\n * @param chainId - The chain ID to detect tokens on.\n * @param account - The account to detect tokens for.\n * @returns Promise resolving to a DataResponse with detected assets.\n */\n async detectTokens(\n chainId: ChainId,\n account: InternalAccount,\n ): Promise<DataResponse> {\n if (!this.#tokenDetectionEnabled) {\n return {};\n }\n\n const hexChainId = caipChainIdToHex(chainId);\n const { address, id: accountId } = account;\n\n log('Running token detection', { chainId, accountId });\n\n try {\n const result = await this.#tokenDetector.detectTokens(\n hexChainId,\n accountId,\n address as Address,\n );\n\n if (result.detectedAssets.length === 0) {\n log('No new tokens detected');\n return {};\n }\n\n log('Detected new tokens', {\n count: result.detectedAssets.length,\n chainId,\n accountId,\n });\n\n // Convert detected assets to DataResponse format\n const balances: Record<Caip19AssetId, AssetBalance> = {};\n const assetsInfo: Record<Caip19AssetId, AssetMetadata> = {};\n\n // Build metadata from detected assets\n for (const asset of result.detectedAssets) {\n if (asset.symbol && asset.decimals !== undefined) {\n assetsInfo[asset.assetId] = {\n type: 'erc20',\n symbol: asset.symbol,\n name: asset.name ?? asset.symbol,\n decimals: asset.decimals,\n image: asset.image,\n };\n }\n }\n\n // Add balances for detected tokens (converted to human-readable format)\n for (const balance of result.detectedBalances) {\n const detectedAsset = result.detectedAssets.find(\n (asset) => asset.assetId === balance.assetId,\n );\n // Default to 18 decimals (ERC20 standard) for consistent human-readable format\n const decimals = detectedAsset?.decimals ?? 18;\n const humanReadableAmount = this.#convertToHumanReadable(\n balance.balance,\n decimals,\n );\n\n balances[balance.assetId] = {\n amount: humanReadableAmount,\n };\n }\n\n const response: DataResponse = {\n detectedAssets: {\n [accountId]: result.detectedAssets.map((asset) => asset.assetId),\n },\n assetsBalance: {\n [accountId]: balances,\n },\n };\n\n // Include metadata if we have any\n if (Object.keys(assetsInfo).length > 0) {\n response.assetsInfo = assetsInfo;\n }\n\n return response;\n } catch (error) {\n log('Token detection failed', { chainId, accountId, error });\n return {};\n }\n }\n\n get assetsMiddleware(): Middleware {\n return async (context, next) => {\n const { request } = context;\n\n const supportedChains = request.chainIds.filter((chainId) =>\n this.#activeChains.includes(chainId),\n );\n\n if (supportedChains.length === 0) {\n return next(context);\n }\n\n let successfullyHandledChains: ChainId[] = [];\n\n log('Middleware fetching', {\n chains: supportedChains,\n accounts: request.accountsWithSupportedChains.map((a) => a.account.id),\n });\n\n const response = await this.fetch({\n ...request,\n chainIds: supportedChains,\n });\n\n if (response.assetsBalance) {\n context.response.assetsBalance ??= {};\n for (const [accountId, accountBalances] of Object.entries(\n response.assetsBalance,\n )) {\n context.response.assetsBalance[accountId] ??= {};\n context.response.assetsBalance[accountId] = {\n ...context.response.assetsBalance[accountId],\n ...accountBalances,\n };\n }\n }\n\n if (response.assetsInfo) {\n context.response.assetsInfo ??= {};\n context.response.assetsInfo = {\n ...context.response.assetsInfo,\n ...response.assetsInfo,\n };\n }\n\n const failedChains = new Set(Object.keys(response.errors ?? {}));\n successfullyHandledChains = supportedChains.filter(\n (chainId) => !failedChains.has(chainId),\n );\n\n if (successfullyHandledChains.length > 0) {\n const remainingChains = request.chainIds.filter(\n (chainId) => !successfullyHandledChains.includes(chainId),\n );\n\n return next({\n ...context,\n request: {\n ...request,\n chainIds: remainingChains,\n },\n });\n }\n\n return next(context);\n };\n }\n\n /**\n * Subscribe to updates for the given request.\n * Starts polling through BalanceFetcher and TokenDetector.\n *\n * @param subscriptionRequest - The subscription request details.\n */\n async subscribe(subscriptionRequest: SubscriptionRequest): Promise<void> {\n const { request, subscriptionId, isUpdate } = subscriptionRequest;\n\n const chainsToSubscribe = request.chainIds.filter((chainId) =>\n this.#activeChains.includes(chainId),\n );\n\n log('Subscribe requested', {\n subscriptionId,\n isUpdate,\n accounts: request.accountsWithSupportedChains.map((a) => a.account.id),\n chainsToSubscribe,\n });\n\n if (chainsToSubscribe.length === 0) {\n log('No active chains to subscribe');\n return;\n }\n\n // Handle subscription update - restart polling for new chains\n if (isUpdate) {\n const existing = this.#activeSubscriptions.get(subscriptionId);\n if (existing) {\n log('Updating existing subscription - restarting polling', {\n subscriptionId,\n existingChains: existing.chains,\n newChains: chainsToSubscribe,\n });\n // Don't return early - continue to unsubscribe and restart polling\n }\n }\n\n // Clean up existing subscription (stops old polling)\n await this.unsubscribe(subscriptionId);\n\n // Start polling through BalanceFetcher and TokenDetector (use pre-computed supportedChains per account)\n const balancePollingTokens: string[] = [];\n const detectionPollingTokens: string[] = [];\n\n for (const {\n account,\n supportedChains,\n } of request.accountsWithSupportedChains) {\n const chainsForAccount = chainsToSubscribe.filter((chain) =>\n supportedChains.includes(chain),\n );\n if (chainsForAccount.length === 0) {\n continue;\n }\n\n const { address, id: accountId } = account;\n\n for (const chainId of chainsForAccount) {\n const hexChainId = caipChainIdToHex(chainId);\n\n // Start balance polling\n const balanceInput: BalancePollingInput = {\n chainId: hexChainId,\n accountId,\n accountAddress: address as Address,\n };\n const balanceToken = this.#balanceFetcher.startPolling(balanceInput);\n balancePollingTokens.push(balanceToken);\n\n // Start detection polling if enabled\n if (this.#tokenDetectionEnabled) {\n const detectionInput: DetectionPollingInput = {\n chainId: hexChainId,\n accountId,\n accountAddress: address as Address,\n };\n const detectionToken =\n this.#tokenDetector.startPolling(detectionInput);\n detectionPollingTokens.push(detectionToken);\n }\n }\n }\n\n // Store subscription data\n const accounts = request.accountsWithSupportedChains.map(\n (entry) => entry.account,\n );\n this.#activeSubscriptions.set(subscriptionId, {\n balancePollingTokens,\n detectionPollingTokens,\n chains: chainsToSubscribe,\n accounts,\n onAssetsUpdate: subscriptionRequest.onAssetsUpdate,\n });\n\n log('Subscription SUCCESS', {\n subscriptionId,\n chains: chainsToSubscribe,\n balancePollingCount: balancePollingTokens.length,\n detectionPollingCount: detectionPollingTokens.length,\n });\n }\n\n /**\n * Unsubscribe from updates and stop polling.\n *\n * @param subscriptionId - The subscription ID to unsubscribe.\n */\n async unsubscribe(subscriptionId: string): Promise<void> {\n const subscription = this.#activeSubscriptions.get(subscriptionId);\n if (subscription) {\n // Stop balance polling\n for (const token of subscription.balancePollingTokens) {\n this.#balanceFetcher.stopPollingByPollingToken(token);\n }\n\n // Stop detection polling\n for (const token of subscription.detectionPollingTokens) {\n this.#tokenDetector.stopPollingByPollingToken(token);\n }\n\n this.#activeSubscriptions.delete(subscriptionId);\n log('Unsubscribed and stopped polling', { subscriptionId });\n }\n }\n\n /**\n * Build the native asset ID for a given chain using NetworkEnablementController state.\n *\n * @param chainId - The CAIP-2 chain ID (e.g., \"eip155:1\")\n * @returns The CAIP-19 native asset ID (e.g., \"eip155:1/slip44:60\")\n */\n #buildNativeAssetId(chainId: ChainId): Caip19AssetId {\n const { nativeAssetIdentifiers } = this.#messenger.call(\n 'NetworkEnablementController:getState',\n );\n\n return (nativeAssetIdentifiers[chainId] ??\n `${chainId}/slip44:60`) as Caip19AssetId;\n }\n\n /**\n * Get existing assets metadata from AssetsController state.\n * Used to include metadata for ERC20 tokens when returning balance updates.\n *\n * @returns Record of asset IDs to their metadata.\n */\n #getExistingAssetsMetadata(): Record<Caip19AssetId, AssetMetadata> {\n try {\n const state = this.#messenger.call('AssetsController:getState') as {\n assetsInfo?: Record<Caip19AssetId, AssetMetadata>;\n };\n return (state.assetsInfo ?? {}) as unknown as Record<\n Caip19AssetId,\n AssetMetadata\n >;\n } catch {\n // If AssetsController:getState fails, return empty metadata\n return {};\n }\n }\n\n /**\n * Get token metadata from TokenListController for an ERC20 token.\n * Used as a fallback when metadata is not in AssetsController state.\n *\n * @param assetId - The CAIP-19 asset ID (e.g., \"eip155:1/erc20:0x...\")\n * @returns Token metadata if found in token list, undefined otherwise.\n */\n #getTokenMetadataFromTokenList(\n assetId: Caip19AssetId,\n ): AssetMetadata | undefined {\n try {\n // Parse asset ID to get chain and token address\n // Format: eip155:{chainId}/erc20:{address}\n const [chainPart, assetPart] = assetId.split('/');\n if (!assetPart?.startsWith('erc20:')) {\n return undefined;\n }\n\n const tokenAddress = assetPart.slice(6); // Remove 'erc20:' prefix\n const chainIdDecimal = chainPart.split(':')[1];\n const hexChainId = `0x${parseInt(chainIdDecimal, 10).toString(16)}`;\n\n const tokenListState = (\n this.#messenger as unknown as { call: (a: string) => TokenListState }\n ).call('TokenListController:getState');\n const chainCacheEntry =\n tokenListState?.tokensChainsCache?.[hexChainId as `0x${string}`];\n const chainTokenList = chainCacheEntry?.data;\n\n if (!chainTokenList) {\n return undefined;\n }\n\n // Look up token by address (case-insensitive)\n const lowerAddress = tokenAddress.toLowerCase();\n for (const [address, tokenData] of Object.entries(chainTokenList)) {\n if (address.toLowerCase() === lowerAddress) {\n const token = tokenData as {\n symbol?: string;\n name?: string;\n decimals?: number;\n iconUrl?: string;\n };\n if (token.symbol && token.decimals !== undefined) {\n return {\n type: 'erc20',\n symbol: token.symbol,\n name: token.name ?? token.symbol,\n decimals: token.decimals,\n image: token.iconUrl,\n };\n }\n }\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n /**\n * Destroy the data source and clean up resources.\n */\n destroy(): void {\n log('Destroying RpcDataSource');\n\n // Stop all polling\n this.#balanceFetcher.stopAllPolling();\n this.#tokenDetector.stopAllPolling();\n\n // Clear subscriptions\n this.#activeSubscriptions.clear();\n\n // Clear caches\n this.#providerCache.clear();\n }\n}\n\nexport function createRpcDataSource(\n options: RpcDataSourceOptions,\n): RpcDataSource {\n return new RpcDataSource(options);\n}\n"]}
|
|
@@ -47,7 +47,7 @@ type TokenListControllerGetStateAction = {
|
|
|
47
47
|
type AssetsControllerGetStateAction = {
|
|
48
48
|
type: 'AssetsController:getState';
|
|
49
49
|
handler: () => {
|
|
50
|
-
|
|
50
|
+
assetsInfo: Record<Caip19AssetId, AssetMetadata>;
|
|
51
51
|
assetsBalance: Record<string, Record<string, {
|
|
52
52
|
amount: string;
|
|
53
53
|
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcDataSource.d.cts","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,qCAAqC;AAMhF,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,EAAE,kBAAkB,EAAE,iCAA6B;AAC1D,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,iCAA6B;AAiB9B,OAAO,KAAK,EAAE,yBAAyB,EAAE,gCAA4B;AAErE,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EAEb,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACX,qBAAiB;AAElB,QAAA,MAAM,eAAe,kBAAkB,CAAC;AAOxC,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,4BAA4B,CAAC;IACnC,OAAO,EAAE,MAAM,YAAY,CAAC;CAC7B,CAAC;AAGF,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,wCAAwC,CAAC;IAC/C,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,aAAa,CAAC;CACrD,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAGF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,+BAA+B,CAAC;IACtC,OAAO,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAGF,KAAK,KAAK,GAAG;IACX,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAGF,KAAK,iCAAiC,GAAG;IACvC,IAAI,EAAE,8BAA8B,CAAC;IACrC,OAAO,EAAE,MAAM;QACb,iBAAiB,EAAE,MAAM,CACvB,MAAM,EACN;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CACrD,CAAC;KACH,CAAC;CACH,CAAC;AAGF,KAAK,8BAA8B,GAAG;IACpC,IAAI,EAAE,2BAA2B,CAAC;IAClC,OAAO,EAAE,MAAM;QACb,
|
|
1
|
+
{"version":3,"file":"RpcDataSource.d.cts","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,7 +47,7 @@ type TokenListControllerGetStateAction = {
|
|
|
47
47
|
type AssetsControllerGetStateAction = {
|
|
48
48
|
type: 'AssetsController:getState';
|
|
49
49
|
handler: () => {
|
|
50
|
-
|
|
50
|
+
assetsInfo: Record<Caip19AssetId, AssetMetadata>;
|
|
51
51
|
assetsBalance: Record<string, Record<string, {
|
|
52
52
|
amount: string;
|
|
53
53
|
}>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcDataSource.d.mts","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,qCAAqC;AAMhF,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAG3C,OAAO,EAAE,kBAAkB,EAAE,iCAA6B;AAC1D,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,iCAA6B;AAiB9B,OAAO,KAAK,EAAE,yBAAyB,EAAE,gCAA4B;AAErE,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EAEb,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACX,qBAAiB;AAElB,QAAA,MAAM,eAAe,kBAAkB,CAAC;AAOxC,MAAM,MAAM,+BAA+B,GAAG;IAC5C,IAAI,EAAE,4BAA4B,CAAC;IACnC,OAAO,EAAE,MAAM,YAAY,CAAC;CAC7B,CAAC;AAGF,MAAM,MAAM,2CAA2C,GAAG;IACxD,IAAI,EAAE,wCAAwC,CAAC;IAC/C,OAAO,EAAE,CAAC,eAAe,EAAE,MAAM,KAAK,aAAa,CAAC;CACrD,CAAC;AAGF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,aAAa,EAAE;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC;AAGF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7E,CAAC;AAGF,MAAM,MAAM,iCAAiC,GAAG;IAC9C,IAAI,EAAE,+BAA+B,CAAC;IACtC,OAAO,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;CAClC,CAAC;AAGF,KAAK,KAAK,GAAG;IACX,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC;AAGF,KAAK,iCAAiC,GAAG;IACvC,IAAI,EAAE,8BAA8B,CAAC;IACrC,OAAO,EAAE,MAAM;QACb,iBAAiB,EAAE,MAAM,CACvB,MAAM,EACN;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAE,CACrD,CAAC;KACH,CAAC;CACH,CAAC;AAGF,KAAK,8BAA8B,GAAG;IACpC,IAAI,EAAE,2BAA2B,CAAC;IAClC,OAAO,EAAE,MAAM;QACb,
|
|
1
|
+
{"version":3,"file":"RpcDataSource.d.mts","sourceRoot":"","sources":["../../src/data-sources/RpcDataSource.ts"],"names":[],"mappings":"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"}
|
|
@@ -182,7 +182,7 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
182
182
|
return response;
|
|
183
183
|
}
|
|
184
184
|
const assetsBalance = {};
|
|
185
|
-
const
|
|
185
|
+
const assetsInfo = {};
|
|
186
186
|
const failedChains = [];
|
|
187
187
|
// Fetch balances for each account and its supported chains (pre-computed in request)
|
|
188
188
|
for (const { account, supportedChains, } of request.accountsWithSupportedChains) {
|
|
@@ -202,10 +202,10 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
202
202
|
}
|
|
203
203
|
// Collect metadata for all balances
|
|
204
204
|
const balanceMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, chainId);
|
|
205
|
-
Object.assign(
|
|
205
|
+
Object.assign(assetsInfo, balanceMetadata);
|
|
206
206
|
// Convert balances to human-readable format
|
|
207
207
|
for (const balance of result.balances) {
|
|
208
|
-
const metadata =
|
|
208
|
+
const metadata = assetsInfo[balance.assetId];
|
|
209
209
|
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
210
210
|
const decimals = metadata?.decimals ?? 18;
|
|
211
211
|
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
@@ -224,7 +224,7 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
224
224
|
// Even on error, include native token metadata
|
|
225
225
|
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
226
226
|
if (chainStatus) {
|
|
227
|
-
|
|
227
|
+
assetsInfo[nativeAssetId] = {
|
|
228
228
|
type: 'native',
|
|
229
229
|
symbol: chainStatus.nativeCurrency,
|
|
230
230
|
name: chainStatus.nativeCurrency,
|
|
@@ -255,8 +255,8 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
255
255
|
}
|
|
256
256
|
response.assetsBalance = assetsBalance;
|
|
257
257
|
// Include metadata for native tokens if we have any
|
|
258
|
-
if (Object.keys(
|
|
259
|
-
response.
|
|
258
|
+
if (Object.keys(assetsInfo).length > 0) {
|
|
259
|
+
response.assetsInfo = assetsInfo;
|
|
260
260
|
}
|
|
261
261
|
return response;
|
|
262
262
|
}
|
|
@@ -287,11 +287,11 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
287
287
|
});
|
|
288
288
|
// Convert detected assets to DataResponse format
|
|
289
289
|
const balances = {};
|
|
290
|
-
const
|
|
290
|
+
const assetsInfo = {};
|
|
291
291
|
// Build metadata from detected assets
|
|
292
292
|
for (const asset of result.detectedAssets) {
|
|
293
293
|
if (asset.symbol && asset.decimals !== undefined) {
|
|
294
|
-
|
|
294
|
+
assetsInfo[asset.assetId] = {
|
|
295
295
|
type: 'erc20',
|
|
296
296
|
symbol: asset.symbol,
|
|
297
297
|
name: asset.name ?? asset.symbol,
|
|
@@ -319,8 +319,8 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
319
319
|
},
|
|
320
320
|
};
|
|
321
321
|
// Include metadata if we have any
|
|
322
|
-
if (Object.keys(
|
|
323
|
-
response.
|
|
322
|
+
if (Object.keys(assetsInfo).length > 0) {
|
|
323
|
+
response.assetsInfo = assetsInfo;
|
|
324
324
|
}
|
|
325
325
|
return response;
|
|
326
326
|
}
|
|
@@ -356,11 +356,11 @@ export class RpcDataSource extends AbstractDataSource {
|
|
|
356
356
|
};
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
|
-
if (response.
|
|
360
|
-
(_c = context.response).
|
|
361
|
-
context.response.
|
|
362
|
-
...context.response.
|
|
363
|
-
...response.
|
|
359
|
+
if (response.assetsInfo) {
|
|
360
|
+
(_c = context.response).assetsInfo ?? (_c.assetsInfo = {});
|
|
361
|
+
context.response.assetsInfo = {
|
|
362
|
+
...context.response.assetsInfo,
|
|
363
|
+
...response.assetsInfo,
|
|
364
364
|
};
|
|
365
365
|
}
|
|
366
366
|
const failedChains = new Set(Object.keys(response.errors ?? {}));
|
|
@@ -497,14 +497,14 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
|
|
|
497
497
|
const divisor = new BigNumberJS(10).pow(decimals);
|
|
498
498
|
return rawAmount.dividedBy(divisor).toString();
|
|
499
499
|
}, _RpcDataSource_collectMetadataForBalances = function _RpcDataSource_collectMetadataForBalances(balances, chainId) {
|
|
500
|
-
const
|
|
500
|
+
const assetsInfo = {};
|
|
501
501
|
const existingMetadata = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getExistingAssetsMetadata).call(this);
|
|
502
502
|
for (const balance of balances) {
|
|
503
503
|
const isNative = balance.assetId.includes('/slip44:');
|
|
504
504
|
if (isNative) {
|
|
505
505
|
const chainStatus = __classPrivateFieldGet(this, _RpcDataSource_chainStatuses, "f")[chainId];
|
|
506
506
|
if (chainStatus) {
|
|
507
|
-
|
|
507
|
+
assetsInfo[balance.assetId] = {
|
|
508
508
|
type: 'native',
|
|
509
509
|
symbol: chainStatus.nativeCurrency,
|
|
510
510
|
name: chainStatus.nativeCurrency,
|
|
@@ -516,19 +516,19 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
|
|
|
516
516
|
// For ERC20 tokens, try existing metadata from state first
|
|
517
517
|
const existingMeta = existingMetadata[balance.assetId];
|
|
518
518
|
if (existingMeta) {
|
|
519
|
-
|
|
519
|
+
assetsInfo[balance.assetId] = existingMeta;
|
|
520
520
|
}
|
|
521
521
|
else {
|
|
522
522
|
// Fallback to token list if not in state
|
|
523
523
|
const tokenListMeta = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_getTokenMetadataFromTokenList).call(this, balance.assetId);
|
|
524
524
|
if (tokenListMeta) {
|
|
525
|
-
|
|
525
|
+
assetsInfo[balance.assetId] = tokenListMeta;
|
|
526
526
|
}
|
|
527
527
|
else {
|
|
528
528
|
// Default metadata for unknown ERC20 tokens.
|
|
529
529
|
// Use 18 decimals (the standard for most ERC20 tokens)
|
|
530
530
|
// to ensure consistent human-readable balance format.
|
|
531
|
-
|
|
531
|
+
assetsInfo[balance.assetId] = {
|
|
532
532
|
type: 'erc20',
|
|
533
533
|
symbol: '',
|
|
534
534
|
name: '',
|
|
@@ -538,17 +538,17 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
|
|
|
538
538
|
}
|
|
539
539
|
}
|
|
540
540
|
}
|
|
541
|
-
return
|
|
541
|
+
return assetsInfo;
|
|
542
542
|
}, _RpcDataSource_handleBalanceUpdate = function _RpcDataSource_handleBalanceUpdate(result) {
|
|
543
543
|
const newBalances = {};
|
|
544
544
|
// Convert hex chain ID to CAIP-2 format
|
|
545
545
|
const chainIdDecimal = parseInt(result.chainId, 16);
|
|
546
546
|
const caipChainId = `eip155:${chainIdDecimal}`;
|
|
547
547
|
// Collect metadata for all balances
|
|
548
|
-
const
|
|
548
|
+
const assetsInfo = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_collectMetadataForBalances).call(this, result.balances, caipChainId);
|
|
549
549
|
// Convert balances to human-readable format using metadata
|
|
550
550
|
for (const balance of result.balances) {
|
|
551
|
-
const metadata =
|
|
551
|
+
const metadata = assetsInfo[balance.assetId];
|
|
552
552
|
// Default to 18 decimals (ERC20 standard) for consistent human-readable format
|
|
553
553
|
const decimals = metadata?.decimals ?? 18;
|
|
554
554
|
const humanReadableAmount = __classPrivateFieldGet(this, _RpcDataSource_instances, "m", _RpcDataSource_convertToHumanReadable).call(this, balance.balance, decimals);
|
|
@@ -562,7 +562,7 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
|
|
|
562
562
|
assetsBalance: {
|
|
563
563
|
[result.accountId]: newBalances,
|
|
564
564
|
},
|
|
565
|
-
|
|
565
|
+
assetsInfo,
|
|
566
566
|
};
|
|
567
567
|
log('Balance update response', {
|
|
568
568
|
accountId: result.accountId,
|
|
@@ -613,7 +613,7 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
|
|
|
613
613
|
detectedAssets: {
|
|
614
614
|
[result.accountId]: result.detectedAssets.map((asset) => asset.assetId),
|
|
615
615
|
},
|
|
616
|
-
|
|
616
|
+
assetsInfo: newMetadata,
|
|
617
617
|
assetsBalance: {
|
|
618
618
|
[result.accountId]: newBalances,
|
|
619
619
|
},
|
|
@@ -731,7 +731,7 @@ _RpcDataSource_messenger = new WeakMap(), _RpcDataSource_onActiveChainsUpdated =
|
|
|
731
731
|
}, _RpcDataSource_getExistingAssetsMetadata = function _RpcDataSource_getExistingAssetsMetadata() {
|
|
732
732
|
try {
|
|
733
733
|
const state = __classPrivateFieldGet(this, _RpcDataSource_messenger, "f").call('AssetsController:getState');
|
|
734
|
-
return (state.
|
|
734
|
+
return (state.assetsInfo ?? {});
|
|
735
735
|
}
|
|
736
736
|
catch {
|
|
737
737
|
// If AssetsController:getState fails, return empty metadata
|