{"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"]}