UNPKG

@metamask/multichain-account-service

Version:
1 lines 38.8 kB
{"version":3,"file":"MultichainAccountService.mjs","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n isBip44Account,\n toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport type {\n MultichainAccountWalletId,\n Bip44Account,\n} from '@metamask/account-api';\nimport type { TraceCallback } from '@metamask/controller-utils';\nimport type { HdKeyring } from '@metamask/eth-hd-keyring';\nimport type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { areUint8ArraysEqual, assert } from '@metamask/utils';\n\nimport { traceFallback } from './analytics';\nimport { isPerfEnabled, withLocalPerfTrace } from './analytics/perf';\nimport { reportError } from './errors';\nimport { projectLogger as log } from './logger';\nimport type { MultichainAccountGroup } from './MultichainAccountGroup';\nimport { MultichainAccountWallet } from './MultichainAccountWallet';\nimport {\n EvmAccountProviderConfig,\n Bip44AccountProvider,\n EVM_ACCOUNT_PROVIDER_NAME,\n BtcAccountProviderConfig,\n TrxAccountProviderConfig,\n BTC_ACCOUNT_PROVIDER_NAME,\n TRX_ACCOUNT_PROVIDER_NAME,\n BtcAccountProvider,\n TrxAccountProvider,\n} from './providers';\nimport {\n AccountProviderWrapper,\n isAccountProviderWrapper,\n} from './providers/AccountProviderWrapper';\nimport { EvmAccountProvider } from './providers/EvmAccountProvider';\nimport { SolAccountProvider } from './providers/SolAccountProvider';\nimport {\n SOL_ACCOUNT_PROVIDER_NAME,\n SolAccountProviderConfig,\n} from './providers/SolAccountProvider';\nimport type {\n MultichainAccountServiceConfig,\n MultichainAccountServiceMessenger,\n} from './types';\nimport { toErrorMessage } from './utils';\n\n/**\n * Per-account failure detail attached to the aggregated Sentry report\n * produced by {@link MultichainAccountService.removeMultichainAccountWallet}.\n *\n * Names the on-the-wire shape so consumers reading the Sentry context (and\n * tests asserting on it) have one place to look.\n */\nexport type RemoveMultichainAccountWalletFailure = {\n provider: string;\n // Omitted for provider-level failures (e.g. enumerating a provider's\n // accounts threw before any specific account could be targeted).\n accountId?: Bip44Account<KeyringAccount>['id'];\n error: unknown;\n};\n\n/**\n * Aggregated context payload attached to the Sentry report produced by\n * {@link MultichainAccountService.removeMultichainAccountWallet} when one\n * or more per-account deletions fail.\n */\nexport type RemoveMultichainAccountWalletFailureContext = {\n failures: RemoveMultichainAccountWalletFailure[];\n};\n\nexport const serviceName = 'MultichainAccountService';\n\n/**\n * The options that {@link MultichainAccountService} takes.\n */\nexport type MultichainAccountServiceOptions = {\n messenger: MultichainAccountServiceMessenger;\n providers?: Bip44AccountProvider[];\n providerConfigs?: {\n [EVM_ACCOUNT_PROVIDER_NAME]?: EvmAccountProviderConfig;\n [SOL_ACCOUNT_PROVIDER_NAME]?: SolAccountProviderConfig;\n [BTC_ACCOUNT_PROVIDER_NAME]?: BtcAccountProviderConfig;\n [TRX_ACCOUNT_PROVIDER_NAME]?: TrxAccountProviderConfig;\n };\n config?: MultichainAccountServiceConfig;\n};\n\n/**\n * The keys used to identify an account in the service state.\n */\nexport type StateKeys = {\n entropySource: EntropySourceId;\n groupIndex: number;\n providerName: string;\n};\n\n/**\n * The service state.\n */\nexport type ServiceState = {\n [entropySource: StateKeys['entropySource']]: {\n [groupIndex: string]: {\n [providerName: StateKeys['providerName']]: Bip44Account<KeyringAccount>['id'][];\n };\n };\n};\n\nexport type CreateWalletParams =\n | {\n type: 'restore';\n password: string;\n mnemonic: Uint8Array;\n }\n | {\n type: 'import';\n mnemonic: Uint8Array;\n }\n | {\n type: 'create';\n password: string;\n };\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'getMultichainAccountGroup',\n 'getMultichainAccountGroups',\n 'getMultichainAccountWallet',\n 'getMultichainAccountWallets',\n 'createNextMultichainAccountGroup',\n 'createMultichainAccountGroup',\n 'createMultichainAccountGroups',\n 'setBasicFunctionality',\n 'alignWallets',\n 'alignWallet',\n 'createMultichainAccountWallet',\n 'resyncAccounts',\n 'removeMultichainAccountWallet',\n 'init',\n] as const;\n\n/**\n * Service to expose multichain accounts capabilities.\n */\nexport class MultichainAccountService {\n readonly #messenger: MultichainAccountServiceMessenger;\n\n readonly #providers: Bip44AccountProvider[];\n\n readonly #trace: TraceCallback;\n\n readonly #wallets: Map<\n MultichainAccountWalletId,\n MultichainAccountWallet<Bip44Account<KeyringAccount>>\n >;\n\n /**\n * The name of the service.\n */\n name: typeof serviceName = serviceName;\n\n /**\n * Constructs a new MultichainAccountService.\n *\n * @param options - The options.\n * @param options.messenger - The messenger suited to this\n * MultichainAccountService.\n * @param options.providers - Optional list of account\n * @param options.providerConfigs - Optional provider configs\n * @param options.config - Optional config.\n */\n constructor({\n messenger,\n providers = [],\n providerConfigs,\n config,\n }: MultichainAccountServiceOptions) {\n this.#messenger = messenger;\n this.#wallets = new Map();\n\n // Pass trace callback directly to preserve original 'this' context.\n // This avoids binding the callback to the MultichainAccountService instance.\n let trace: TraceCallback = config?.trace ?? traceFallback;\n\n // Wrap the trace callback with local performance tracing if performance logging is enabled.\n if (isPerfEnabled()) {\n trace = withLocalPerfTrace(trace);\n }\n\n // This trace is passed down to wallets and providers to be used for tracing operations within them.\n this.#trace = trace;\n\n // TODO: Rely on keyring capabilities once the keyring API is used by all keyrings.\n this.#providers = [\n new EvmAccountProvider(\n this.#messenger,\n providerConfigs?.[EVM_ACCOUNT_PROVIDER_NAME],\n trace,\n ),\n new AccountProviderWrapper(\n this.#messenger,\n new SolAccountProvider(\n this.#messenger,\n providerConfigs?.[SOL_ACCOUNT_PROVIDER_NAME],\n trace,\n ),\n ),\n new AccountProviderWrapper(\n this.#messenger,\n new BtcAccountProvider(\n this.#messenger,\n providerConfigs?.[BTC_ACCOUNT_PROVIDER_NAME],\n trace,\n ),\n ),\n new AccountProviderWrapper(\n this.#messenger,\n new TrxAccountProvider(\n this.#messenger,\n providerConfigs?.[TRX_ACCOUNT_PROVIDER_NAME],\n trace,\n ),\n ),\n // Custom account providers that can be provided by the MetaMask client.\n ...providers,\n ];\n\n this.#messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n }\n\n /**\n * Get the keys used to identify an account in the service state.\n *\n * @param account - The account to get the keys for.\n * @returns The keys used to identify an account in the service state.\n * Returns null if the account is not compatible with any provider.\n */\n #getStateKeys(account: InternalAccount): StateKeys | null {\n for (const provider of this.#providers) {\n if (isBip44Account(account) && provider.isAccountCompatible(account)) {\n return {\n entropySource: account.options.entropy.id,\n groupIndex: account.options.entropy.groupIndex,\n providerName: provider.getName(),\n };\n }\n }\n return null;\n }\n\n /**\n * Construct the service and provider state.\n *\n * @returns The service and provider state.\n */\n #constructServiceState(): {\n serviceState: ServiceState;\n providerState: Record<string, Bip44Account<KeyringAccount>['id'][]>;\n } {\n const accounts = this.#messenger.call(\n 'AccountsController:listMultichainAccounts',\n );\n\n const serviceState: ServiceState = {};\n\n const providerState: Record<string, Bip44Account<KeyringAccount>['id'][]> =\n {};\n\n for (const account of accounts) {\n const keys = this.#getStateKeys(account);\n if (keys) {\n const { entropySource, groupIndex, providerName } = keys;\n serviceState[entropySource] ??= {};\n serviceState[entropySource][groupIndex] ??= {};\n serviceState[entropySource][groupIndex][providerName] ??= [];\n serviceState[entropySource][groupIndex][providerName].push(account.id);\n providerState[providerName] ??= [];\n providerState[providerName].push(account.id);\n }\n }\n return { serviceState, providerState };\n }\n\n /**\n * Initialize the service and constructs the internal reprensentation of\n * multichain accounts and wallets.\n */\n async init(): Promise<void> {\n log('Initializing...');\n\n this.#wallets.clear();\n\n const { serviceState, providerState } = this.#constructServiceState();\n\n for (const provider of this.#providers) {\n const providerName = provider.getName();\n // Initialize providers even if there are no accounts yet.\n // Passing an empty array ensures providers start in a valid state.\n const state = providerState[providerName] ?? [];\n provider.init(state);\n }\n\n for (const entropySource of Object.keys(serviceState)) {\n const wallet = new MultichainAccountWallet({\n entropySource,\n providers: this.#providers,\n messenger: this.#messenger,\n trace: this.#trace,\n });\n wallet.init(serviceState[entropySource]);\n this.#wallets.set(wallet.id, wallet);\n }\n\n log('Initialized');\n }\n\n /**\n * Re-synchronize MetaMask accounts and the providers accounts if needed.\n *\n * NOTE: This is mostly required if one of the providers (keyrings or Snaps)\n * have different sets of accounts. This method would ensure that both are\n * in-sync and use the same accounts (and same IDs).\n *\n * READ THIS CAREFULLY (State inconsistency bugs/de-sync)\n * We've seen some problems were keyring accounts on some Snaps were not synchronized\n * with the accounts on MM side. This causes problems where we cannot interact with\n * those accounts because the Snap does know about them.\n * To \"workaround\" this de-sync problem for now, we make sure that both parties are\n * in-sync when the service boots up.\n * ----------------------------------------------------------------------------------\n */\n async resyncAccounts(): Promise<void> {\n log('Re-sync provider accounts if needed...');\n const accounts = this.#messenger\n .call('AccountsController:listMultichainAccounts')\n .filter(isBip44Account);\n // We use `Promise.all` + `try-catch` combo, since we don't wanna block the wallet\n // from being used even if some accounts are not sync (best-effort).\n await Promise.all(\n this.#providers.map(async (provider) => {\n try {\n await provider.resyncAccounts(accounts);\n } catch (error) {\n reportError(\n this.#messenger,\n `Unable to re-sync provider \"${provider.getName()}\"`,\n error,\n {\n provider: provider.getName(),\n },\n );\n }\n }),\n );\n log('Providers got re-synced!');\n }\n\n /**\n * Get the wallet matching the given entropy source.\n *\n * @param entropySource - The entropy source of the wallet.\n * @returns The wallet matching the given entropy source.\n * @throws If no wallet matches the given entropy source.\n */\n #getWallet(\n entropySource: EntropySourceId,\n ): MultichainAccountWallet<Bip44Account<KeyringAccount>> {\n const wallet = this.#wallets.get(\n toMultichainAccountWalletId(entropySource),\n );\n\n if (!wallet) {\n throw new Error('Unknown wallet, no wallet matching this entropy source');\n }\n\n return wallet;\n }\n\n /**\n * Gets a reference to the multichain account wallet matching this entropy source.\n *\n * @param options - Options.\n * @param options.entropySource - The entropy source of the multichain account.\n * @throws If none multichain account match this entropy.\n * @returns A reference to the multichain account wallet.\n */\n getMultichainAccountWallet({\n entropySource,\n }: {\n entropySource: EntropySourceId;\n }): MultichainAccountWallet<Bip44Account<KeyringAccount>> {\n return this.#getWallet(entropySource);\n }\n\n /**\n * Gets an array of all multichain account wallets.\n *\n * @returns An array of all multichain account wallets.\n */\n getMultichainAccountWallets(): MultichainAccountWallet<\n Bip44Account<KeyringAccount>\n >[] {\n return Array.from(this.#wallets.values());\n }\n\n #getPrimaryEntropySourceId(): EntropySourceId {\n const { keyrings } = this.#messenger.call('KeyringController:getState');\n const primaryKeyring = keyrings.find(\n (keyring) => keyring.type === KeyringTypes.hd,\n );\n assert(primaryKeyring, 'Primary keyring not found');\n return primaryKeyring.metadata.id;\n }\n\n /**\n * Creates a new multichain account wallet by importing an existing mnemonic.\n *\n * @param mnemonic - The mnemonic to use to create the new wallet.\n * @returns The new multichain account wallet.\n */\n async #createWalletByImport(\n mnemonic: Uint8Array,\n ): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>> {\n log(`Creating new wallet by importing an existing mnemonic...`);\n const existingKeyrings = this.#messenger.call(\n 'KeyringController:getKeyringsByType',\n KeyringTypes.hd,\n ) as HdKeyring[];\n\n const alreadyHasImportedSrp = existingKeyrings.some((keyring) => {\n if (!keyring.mnemonic) {\n return false;\n }\n return areUint8ArraysEqual(keyring.mnemonic, mnemonic);\n });\n\n if (alreadyHasImportedSrp) {\n throw new Error('This Secret Recovery Phrase has already been imported.');\n }\n\n const result = await this.#messenger.call(\n 'KeyringController:addNewKeyring',\n KeyringTypes.hd,\n { mnemonic, numberOfAccounts: 1 },\n );\n\n return new MultichainAccountWallet({\n providers: this.#providers,\n entropySource: result.id,\n messenger: this.#messenger,\n trace: this.#trace,\n });\n }\n\n /**\n * Creates a new multichain account wallet by creating a new vault and keychain.\n *\n * @param password - The password to encrypt the vault with.\n * @returns The new multichain account wallet.\n */\n async #createWalletByNewVault(\n password: string,\n ): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>> {\n log(`Creating new wallet by creating a new vault and keychain...`);\n await this.#messenger.call(\n 'KeyringController:createNewVaultAndKeychain',\n password,\n );\n\n const entropySourceId = this.#getPrimaryEntropySourceId();\n\n return new MultichainAccountWallet({\n providers: this.#providers,\n entropySource: entropySourceId,\n messenger: this.#messenger,\n trace: this.#trace,\n });\n }\n\n /**\n * Creates a new multichain account wallet by restoring a vault and keyring.\n *\n * @param password - The password to encrypt the vault with.\n * @param mnemonic - The mnemonic to use to restore the new wallet.\n * @returns The new multichain account wallet.\n */\n async #createWalletByRestore(\n password: string,\n mnemonic: Uint8Array,\n ): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>> {\n log(`Creating new wallet by restoring vault and keyring...`);\n await this.#messenger.call(\n 'KeyringController:createNewVaultAndRestore',\n password,\n mnemonic,\n );\n\n const entropySourceId = this.#getPrimaryEntropySourceId();\n\n return new MultichainAccountWallet({\n providers: this.#providers,\n entropySource: entropySourceId,\n messenger: this.#messenger,\n trace: this.#trace,\n });\n }\n\n /**\n * Creates a new multichain account wallet by either importing an existing mnemonic,\n * creating a new vault and keychain, or restoring a vault and keyring.\n *\n * NOTE: This method should only be called in client code where a mutex lock is acquired.\n * `discoverAccounts` should be called after this method to discover and create accounts.\n *\n * @param params - The parameters to use to create the new wallet.\n * @param params.mnemonic - The mnemonic to use to create the new wallet.\n * @param params.password - The password to encrypt the vault with.\n * @param params.type - The flow type to use to create the new wallet.\n * @throws If the mnemonic has already been imported.\n * @returns The new multichain account wallet.\n */\n async createMultichainAccountWallet(\n params: CreateWalletParams,\n ): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>> {\n let wallet:\n | MultichainAccountWallet<Bip44Account<KeyringAccount>>\n | undefined;\n\n if (params.type === 'import') {\n wallet = await this.#createWalletByImport(params.mnemonic);\n } else if (params.type === 'create') {\n wallet = await this.#createWalletByNewVault(params.password);\n } else if (params.type === 'restore') {\n wallet = await this.#createWalletByRestore(\n params.password,\n params.mnemonic,\n );\n }\n\n assert(wallet, 'Failed to create wallet.');\n\n wallet.init({});\n // READ THIS CAREFULLY:\n // We do not await for non-EVM account creations as they\n // are depending on the Snap platform to be ready (which is, waiting for onboarding to be completed).\n // Awaiting for this might cause a deadlock otherwise (during onboarding at least).\n await wallet.createMultichainAccountGroup(0, {\n waitForAllProvidersToFinishCreatingAccounts: false,\n });\n\n this.#wallets.set(wallet.id, wallet);\n\n log(`Wallet created: [${wallet.id}]`);\n\n return wallet;\n }\n\n /**\n * Removes a multichain account wallet, deleting all of its accounts across\n * every registered provider (EVM and snap-based).\n *\n * The deletion iterates providers (the source of truth for their own\n * account lists) and filters each provider's accounts to those matching\n * the wallet's entropy source. Cleanup is best-effort end-to-end: neither\n * a single account deletion failure nor a failure to enumerate a given\n * provider's accounts aborts cleanup of the remaining providers. If one or\n * more operations fail, a single aggregated error is reported via\n * `reportError` with all per-failure details in its context. The wallet is\n * always removed from the service's internal map at the end.\n *\n * @param entropySource - The entropy source of the multichain account wallet.\n */\n async removeMultichainAccountWallet(\n entropySource: EntropySourceId,\n ): Promise<void> {\n const wallet = this.#getWallet(entropySource);\n const failures: RemoveMultichainAccountWalletFailure[] = [];\n\n for (const provider of this.#providers) {\n // Enumerating a provider's owned accounts can itself throw (e.g.\n // `unwrap()`, `getAccounts()`, or reading account options). Catch it as\n // a provider-level failure and move on so one bad provider does not\n // abort cleanup of the others or skip the always-remove step below.\n let owned: Bip44Account<KeyringAccount>[];\n try {\n // For wrapped providers, enumerate via the underlying provider so we\n // also see accounts when the wrapper has been disabled (i.e. basic\n // functionality is off). The wrapper's `deleteAccount` itself forwards\n // unconditionally, but its `getAccounts()` returns `[]` when disabled,\n // which would otherwise leave snap-backed accounts orphaned in their\n // underlying keyrings.\n const source = isAccountProviderWrapper(provider)\n ? provider.unwrap()\n : provider;\n owned = source\n .getAccounts()\n .filter((account) => account.options.entropy.id === entropySource);\n } catch (error) {\n failures.push({\n provider: provider.getName(),\n error,\n });\n continue;\n }\n\n for (const account of owned) {\n try {\n await provider.deleteAccount(account.id);\n } catch (error) {\n failures.push({\n provider: provider.getName(),\n accountId: account.id,\n error,\n });\n }\n }\n }\n\n if (failures.length > 0) {\n // One aggregated report per wallet-removal action: keeps the Sentry\n // message stable for grouping while still surfacing every per-account\n // failure in `context`. The shape is pinned by\n // `RemoveMultichainAccountWalletFailureContext`.\n const context: RemoveMultichainAccountWalletFailureContext = {\n failures: failures.map(({ provider, accountId, error }) => ({\n provider,\n accountId,\n error: toErrorMessage(error),\n })),\n };\n reportError(\n this.#messenger,\n `Failed to delete one or more accounts during wallet removal`,\n new Error('Wallet removal partially failed'),\n context,\n );\n }\n\n this.#wallets.delete(wallet.id);\n }\n\n /**\n * Gets a reference to the multichain account group matching this entropy source\n * and a group index.\n *\n * @param options - Options.\n * @param options.entropySource - The entropy source of the multichain account.\n * @param options.groupIndex - The group index of the multichain account.\n * @throws If none multichain account match this entropy source and group index.\n * @returns A reference to the multichain account.\n */\n getMultichainAccountGroup({\n entropySource,\n groupIndex,\n }: {\n entropySource: EntropySourceId;\n groupIndex: number;\n }): MultichainAccountGroup<Bip44Account<KeyringAccount>> {\n const multichainAccount =\n this.#getWallet(entropySource).getMultichainAccountGroup(groupIndex);\n\n if (!multichainAccount) {\n throw new Error(`No multichain account for index: ${groupIndex}`);\n }\n\n return multichainAccount;\n }\n\n /**\n * Gets all multichain account groups for a given entropy source.\n *\n * @param options - Options.\n * @param options.entropySource - The entropy source to query.\n * @throws If no multichain accounts match this entropy source.\n * @returns A list of all multichain accounts.\n */\n getMultichainAccountGroups({\n entropySource,\n }: {\n entropySource: EntropySourceId;\n }): MultichainAccountGroup<Bip44Account<KeyringAccount>>[] {\n return this.#getWallet(entropySource).getMultichainAccountGroups();\n }\n\n /**\n * Creates the next multichain account group.\n *\n * @param options - Options.\n * @param options.entropySource - The wallet's entropy source.\n * @returns The next multichain account group.\n */\n async createNextMultichainAccountGroup({\n entropySource,\n }: {\n entropySource: EntropySourceId;\n }): Promise<MultichainAccountGroup<Bip44Account<KeyringAccount>>> {\n return await this.#getWallet(\n entropySource,\n ).createNextMultichainAccountGroup();\n }\n\n /**\n * Creates a multichain account group.\n *\n * @param options - Options.\n * @param options.groupIndex - The group index to use.\n * @param options.entropySource - The wallet's entropy source.\n * @returns The multichain account group for this group index.\n */\n async createMultichainAccountGroup({\n groupIndex,\n entropySource,\n }: {\n groupIndex: number;\n entropySource: EntropySourceId;\n }): Promise<MultichainAccountGroup<Bip44Account<KeyringAccount>>> {\n return await this.#getWallet(entropySource).createMultichainAccountGroup(\n groupIndex,\n );\n }\n\n /**\n * Creates multiple multichain account groups up to maxGroupIndex.\n *\n * @param params - Parameters for creating account groups.\n * @param params.fromGroupIndex - Starting group index to create (inclusive) (defaults to 0).\n * @param params.toGroupIndex - Maximum group index to create (inclusive).\n * @param params.entropySource - The entropy source ID.\n * @returns Array of created multichain account groups.\n */\n async createMultichainAccountGroups({\n fromGroupIndex = 0,\n toGroupIndex,\n entropySource,\n }: {\n fromGroupIndex?: number;\n toGroupIndex: number;\n entropySource: EntropySourceId;\n }): Promise<MultichainAccountGroup<Bip44Account<KeyringAccount>>[]> {\n return await this.#getWallet(entropySource).createMultichainAccountGroups(\n { from: fromGroupIndex, to: toGroupIndex },\n { waitForAllProvidersToFinishCreatingAccounts: false },\n );\n }\n\n /**\n * Set basic functionality state and trigger alignment if enabled.\n * When basic functionality is disabled, snap-based providers are disabled.\n * When enabled, all snap providers are enabled and wallet alignment is triggered.\n * EVM providers are never disabled as they're required for basic wallet functionality.\n *\n * @param enabled - Whether basic functionality is enabled.\n */\n async setBasicFunctionality(enabled: boolean): Promise<void> {\n log(`Turning basic functionality: ${enabled ? 'ON' : 'OFF'}`);\n\n // Loop through providers and enable/disable only wrapped ones when basic functionality changes\n for (const provider of this.#providers) {\n if (isAccountProviderWrapper(provider)) {\n log(\n `${enabled ? 'Enabling' : 'Disabling'} account provider: \"${provider.getName()}\"`,\n );\n provider.setEnabled(enabled);\n }\n // Regular providers (like EVM) are never disabled for basic functionality\n }\n\n // Trigger alignment only when basic functionality is enabled\n if (enabled) {\n await this.alignWallets();\n }\n }\n\n /**\n * Align all multichain account wallets.\n */\n async alignWallets(): Promise<void> {\n log(`Triggering alignment on all wallets...`);\n\n const wallets = this.getMultichainAccountWallets();\n await Promise.all(wallets.map((w) => w.alignAccounts()));\n\n log(`Wallets aligned`);\n }\n\n /**\n * Align a specific multichain account wallet.\n *\n * @param entropySource - The entropy source of the multichain account wallet.\n */\n async alignWallet(entropySource: EntropySourceId): Promise<void> {\n const wallet = this.getMultichainAccountWallet({ entropySource });\n\n log(`Triggering alignment for wallet: [${wallet.id}]`);\n await wallet.alignAccounts();\n log(`Wallet [${wallet.id}] aligned`);\n }\n}\n"]}