{"version":3,"file":"MultichainAccountWallet.cjs","sourceRoot":"","sources":["../src/MultichainAccountWallet.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n  AccountGroupId,\n  Bip44Account,\n  MultichainAccountWalletId,\n  MultichainAccountWallet as MultichainAccountWalletDefinition,\n  MultichainAccountWalletStatus,\n} from '@metamask/account-api';\nimport {\n  AccountWalletType,\n  getGroupIndexFromMultichainAccountGroupId,\n  isMultichainAccountGroupId,\n  toDefaultAccountGroupId,\n  toMultichainAccountWalletId,\n} from '@metamask/account-api';\nimport type { TraceCallback, TraceRequest } from '@metamask/controller-utils';\nimport { AccountCreationType } from '@metamask/keyring-api';\nimport type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api';\nimport { assert } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\n\nimport { toProviderDataTraces, traceFallback, TraceName } from './analytics';\nimport { reportError } from './errors';\nimport type { Logger } from './logger';\nimport {\n  createModuleLogger,\n  ERROR_PREFIX,\n  projectLogger as log,\n  WARNING_PREFIX,\n} from './logger';\nimport type { GroupState } from './MultichainAccountGroup';\nimport { MultichainAccountGroup } from './MultichainAccountGroup';\nimport type { ServiceState, StateKeys } from './MultichainAccountService';\nimport type { Bip44AccountProvider } from './providers';\nimport { EvmAccountProvider } from './providers/EvmAccountProvider';\nimport type { MultichainAccountServiceMessenger } from './types';\nimport {\n  assertGroupIndexIsValid,\n  assertGroupIndexRangeIsValid,\n  GroupIndexRange,\n  toErrorMessage,\n} from './utils';\n\n/**\n * The context for a provider discovery.\n */\ntype AccountProviderDiscoveryContext<\n  Account extends Bip44Account<KeyringAccount>,\n> = {\n  provider: Bip44AccountProvider<Account>;\n  stopped: boolean;\n  groupIndex: number;\n  accounts: Account[];\n};\n\nexport type WalletState = ServiceState[StateKeys['entropySource']];\n\n// type alias to make clear this state is generated by discovery\ntype DiscoveredGroupsState = WalletState;\n\n/**\n * A multichain account wallet that holds multiple multichain accounts (one multichain account per\n * group index).\n */\nexport class MultichainAccountWallet<\n  Account extends Bip44Account<KeyringAccount>,\n> implements MultichainAccountWalletDefinition<Account> {\n  readonly #lock = new Mutex();\n\n  readonly #id: MultichainAccountWalletId;\n\n  readonly #providers: Bip44AccountProvider<Account>[];\n\n  readonly #entropySource: EntropySourceId;\n\n  readonly #accountGroups: Map<number, MultichainAccountGroup<Account>>;\n\n  readonly #messenger: MultichainAccountServiceMessenger;\n\n  readonly #trace: TraceCallback;\n\n  readonly #log: Logger;\n\n  #initialized = false;\n\n  #status: MultichainAccountWalletStatus;\n\n  constructor({\n    providers,\n    entropySource,\n    messenger,\n    trace,\n  }: {\n    providers: Bip44AccountProvider<Account>[];\n    entropySource: EntropySourceId;\n    messenger: MultichainAccountServiceMessenger;\n    trace?: TraceCallback;\n  }) {\n    this.#id = toMultichainAccountWalletId(entropySource);\n    this.#providers = providers;\n    this.#entropySource = entropySource;\n    this.#messenger = messenger;\n    this.#accountGroups = new Map();\n    this.#trace = trace ?? traceFallback;\n\n    this.#log = createModuleLogger(log, `[${this.#id}]`);\n\n    // Initial synchronization (don't emit events during initialization).\n    this.#status = 'uninitialized';\n  }\n\n  /**\n   * Initialize the wallet and construct the internal representation of multichain account groups.\n   *\n   * @param walletState - The wallet state.\n   */\n  init(walletState: WalletState): void {\n    this.#log('Initializing wallet state...');\n    for (const [groupIndexString, groupState] of Object.entries(walletState)) {\n      // Have to convert to number because the state keys become strings when we construct the state object in the service\n      const groupIndex = Number(groupIndexString);\n      const group = new MultichainAccountGroup({\n        groupIndex,\n        wallet: this,\n        providers: this.#providers,\n        messenger: this.#messenger,\n      });\n\n      this.#log(`Creating new group for index ${groupIndex}...`);\n\n      group.init(groupState);\n\n      this.#accountGroups.set(groupIndex, group);\n    }\n    if (!this.#initialized) {\n      this.#initialized = true;\n      this.#status = 'ready';\n    }\n\n    this.#log('Finished initializing wallet state...');\n  }\n\n  /**\n   * Gets the multichain account wallet ID.\n   *\n   * @returns The multichain account wallet ID.\n   */\n  get id(): MultichainAccountWalletId {\n    return this.#id;\n  }\n\n  /**\n   * Gets the multichain account wallet type, which is always {@link AccountWalletType.Entropy}.\n   *\n   * @returns The multichain account wallet type.\n   */\n  get type(): AccountWalletType.Entropy {\n    return AccountWalletType.Entropy;\n  }\n\n  /**\n   * Gets the multichain account wallet entropy source.\n   *\n   * @returns The multichain account wallet entropy source.\n   */\n  get entropySource(): EntropySourceId {\n    return this.#entropySource;\n  }\n\n  /**\n   * Gets the multichain account wallet current status.\n   *\n   * @returns The multichain account wallet current status.\n   */\n  get status(): MultichainAccountWalletStatus {\n    return this.#status;\n  }\n\n  /**\n   * Set the wallet status and run the associated operation callback.\n   *\n   * @param status - Wallet status associated with this operation.\n   * @param operation - Operation to run.\n   * @returns The operation's result.\n   * @throws {Error} If the wallet is already running a mutable operation.\n   */\n  async #withLock<Return>(\n    status: MultichainAccountWalletStatus,\n    operation: () => Promise<Return>,\n  ): Promise<Return> {\n    const release = await this.#lock.acquire();\n    try {\n      this.#log(`Locking wallet with status \"${status}\"...`);\n      this.#status = status;\n      this.#messenger.publish(\n        'MultichainAccountService:walletStatusChange',\n        this.id,\n        this.#status,\n      );\n      return await operation();\n    } finally {\n      this.#status = 'ready';\n      this.#messenger.publish(\n        'MultichainAccountService:walletStatusChange',\n        this.id,\n        this.#status,\n      );\n      release();\n      this.#log(`Releasing wallet lock (was \"${status}\")`);\n    }\n  }\n\n  /**\n   * Gets the providers and ensure the EVM provider is located at index 0.\n   *\n   * @returns The account providers.\n   */\n  #getProviders(): Bip44AccountProvider<Account>[] {\n    const [evmProvider, ...otherProviders] = this.#providers;\n    assert(\n      evmProvider instanceof EvmAccountProvider,\n      'EVM account provider must be first',\n    );\n\n    return [evmProvider, ...otherProviders];\n  }\n\n  /**\n   * Create accounts for a given provider and group index range.\n   *\n   * @param provider - The provider to create accounts for.\n   * @param from - The starting group index (inclusive).\n   * @param to - The ending group index (inclusive).\n   * @returns The created accounts.\n   */\n  async #createAccountsRangeForProvider(\n    provider: Bip44AccountProvider<Account>,\n    from: number,\n    to: number,\n  ): Promise<Bip44Account<Account>[]> {\n    const isBatching = to > from;\n\n    try {\n      return await provider.createAccounts({\n        type: AccountCreationType.Bip44DeriveIndexRange,\n        entropySource: this.#entropySource,\n        range: {\n          from,\n          to,\n        },\n      });\n    } catch (error) {\n      reportError(\n        this.#messenger,\n        `Unable to create ${isBatching ? 'some accounts (batch)' : 'some accounts'} with provider \"${provider.getName()}\"`,\n        error,\n        {\n          range: { from, to },\n          provider: provider.getName(),\n          isBatching,\n        },\n      );\n      throw error;\n    }\n  }\n\n  /**\n   * Create or update a multichain account group state for a given group index and group state.\n   *\n   * @param groupIndex The group's index.\n   * @param groupState The group's state to create or update the group with.\n   * @returns The created or updated multichain account group.\n   */\n  #createOrUpdateMultichainAccountGroup(\n    groupIndex: number,\n    groupState: GroupState,\n  ): MultichainAccountGroup<Account> {\n    let group = this.#accountGroups.get(groupIndex);\n    if (group) {\n      // NOTE: This will publish an update event automatically.\n      group.update(groupState);\n\n      this.#log(`Group updated: [${group.id}]`);\n    } else {\n      group = new MultichainAccountGroup({\n        wallet: this,\n        providers: this.#providers,\n        groupIndex,\n        messenger: this.#messenger,\n      });\n      group.init(groupState);\n\n      this.#accountGroups.set(groupIndex, group);\n\n      this.#log(`Group created: [${group.id}]`);\n\n      if (this.#initialized) {\n        this.#messenger.publish(\n          'MultichainAccountService:multichainAccountGroupCreated',\n          group,\n        );\n      }\n    }\n\n    return group;\n  }\n\n  /**\n   * Build group state by calling all providers in parallel.\n   *\n   * This is a non-locking shared core used by both creation and alignment paths.\n   * Each provider is asked which contiguous sub-ranges of group indices it needs\n   * accounts created for via `getSubRanges`, so callers can skip indices that are\n   * already satisfied (e.g. during alignment).\n   *\n   * @param providers - The providers to create accounts for.\n   * @param getSubRanges - Resolver returning the sub-ranges to create for a\n   * given provider. Returning an empty array means the provider is skipped.\n   * @returns The collected group state and any provider failure messages.\n   */\n  async #buildGroupState(\n    providers: Bip44AccountProvider<Account>[],\n    getSubRanges: (\n      provider: Bip44AccountProvider<Account>,\n    ) => Required<GroupIndexRange>[],\n  ): Promise<{\n    groupStateByGroupIndex: Map<number, GroupState>;\n    failures: string[];\n  }> {\n    const groupStateByGroupIndex = new Map<number, GroupState>();\n\n    const results = await Promise.allSettled(\n      providers.map(async (provider) => {\n        const providerName = provider.getName();\n        const subRanges = getSubRanges(provider);\n\n        for (const { from, to } of subRanges) {\n          const accounts = await this.#createAccountsRangeForProvider(\n            provider,\n            from,\n            to,\n          );\n          accounts.forEach((account) => {\n            const { groupIndex } = account.options.entropy;\n            let groupState = groupStateByGroupIndex.get(groupIndex);\n            if (!groupState) {\n              groupState = {};\n              groupStateByGroupIndex.set(groupIndex, groupState);\n            }\n            if (!groupState[providerName]) {\n              groupState[providerName] = [];\n            }\n            groupState[providerName].push(account.id);\n          });\n        }\n      }),\n    );\n\n    const failures = providers.reduce((messages: string[], provider, index) => {\n      const result = results[index];\n      if (result?.status === 'rejected') {\n        messages.push(\n          `[${provider.getName()}] ${toErrorMessage(result.reason)}`,\n        );\n      }\n      return messages;\n    }, []);\n\n    return { groupStateByGroupIndex, failures };\n  }\n\n  /**\n   * Compute the contiguous sub-ranges of group indices in `[from, to]` for which\n   * the given provider is NOT aligned (i.e. is missing an account).\n   *\n   * Already-aligned indices are skipped so alignment never re-creates (or\n   * re-traces) accounts that already exist. A group that does not exist yet is\n   * treated as unaligned.\n   *\n   * @param provider - The provider to compute missing sub-ranges for.\n   * @param from - Starting group index (inclusive).\n   * @param to - Ending group index (inclusive).\n   * @returns The contiguous sub-ranges where the provider needs accounts.\n   */\n  #getUnalignedSubRangesForProvider(\n    provider: Bip44AccountProvider<Account>,\n    from: number,\n    to: number,\n  ): Required<GroupIndexRange>[] {\n    const subRanges: Required<GroupIndexRange>[] = [];\n\n    let runStart: number | undefined;\n    for (let groupIndex = from; groupIndex <= to; groupIndex++) {\n      const group = this.getMultichainAccountGroup(groupIndex);\n      const aligned = group ? group.isProviderAligned(provider) : false;\n\n      if (!aligned) {\n        runStart ??= groupIndex;\n      } else if (runStart !== undefined) {\n        subRanges.push({ from: runStart, to: groupIndex - 1 });\n        runStart = undefined;\n      }\n    }\n\n    if (runStart !== undefined) {\n      subRanges.push({ from: runStart, to });\n    }\n\n    return subRanges;\n  }\n\n  /**\n   * Internal method to create a range of multichain account groups.\n   *\n   * This method acquires the wallet lock internally and creates accounts for all\n   * given providers synchronously. Callers decide which providers to pass.\n   *\n   * @param range - The range of group indices to create.\n   * @param range.from - Starting group index to create (inclusive).\n   * @param range.to - Maximum group index to create (inclusive).\n   * @param providers - The providers to create accounts for.\n   * @returns Array of created multichain account groups.\n   */\n  async #createMultichainAccountGroupsRange(\n    { from: rangeFrom, to }: Required<GroupIndexRange>,\n    providers: Bip44AccountProvider<Account>[],\n  ): Promise<MultichainAccountGroup<Account>[]> {\n    return await this.#withLock('in-progress:create-accounts', async () => {\n      const groups: MultichainAccountGroup<Account>[] = [];\n\n      // Get existing groups (fromGroupIndex to nextGroupIndex - 1).\n      let from = rangeFrom;\n      for (; from <= to; from++) {\n        const group = this.getMultichainAccountGroup(from);\n        if (group) {\n          groups.push(group);\n        } else {\n          break; // Assuming we have no gap, if the group does not exist, we can stop and create the remaining ones.\n        }\n      }\n\n      // Create new groups now.\n      if (from <= to) {\n        this.#log(`Creating groups from index ${from} to ${to}...`);\n\n        const { groupStateByGroupIndex, failures } =\n          await this.#buildGroupState(providers, () => [{ from, to }]);\n\n        // Check for provider failures — always treated as hard errors.\n        if (failures.length) {\n          throw new Error(\n            failures.reduce(\n              (message, failure) => `${message}\\n- ${failure}`,\n              'Unable to create some accounts. Providers threw the following errors:',\n            ),\n          );\n        }\n\n        // Create or update groups from the collected state.\n        for (let groupIndex = from; groupIndex <= to; groupIndex++) {\n          const groupState = groupStateByGroupIndex.get(groupIndex);\n\n          if (groupState) {\n            const group = this.#createOrUpdateMultichainAccountGroup(\n              groupIndex,\n              groupState,\n            );\n\n            groups.push(group);\n          } else {\n            this.#log(\n              `${WARNING_PREFIX} Failed to create new group for group index: ${groupIndex} because no accounts were created for it`,\n            );\n          }\n        }\n      }\n\n      return groups;\n    });\n  }\n\n  /**\n   * Align accounts for a range of group indices (non-locking).\n   *\n   * Calls all providers in parallel via the batch API. Provider failures are\n   * logged as warnings (best-effort); no error is thrown.\n   *\n   * @param range - The range of group indices to align.\n   * @param range.from - Starting group index (inclusive).\n   * @param range.to - Ending group index (inclusive).\n   * @param providers - The providers to align accounts for.\n   * @param options - Options.\n   * @param options.trace - Trace options.\n   * @param options.trace.data - Optional trace data.\n   */\n  async #alignAccountsForRange(\n    { from, to }: Required<GroupIndexRange>,\n    providers: Bip44AccountProvider<Account>[],\n    options: { trace?: { data?: TraceRequest['data'] } } = {},\n  ): Promise<void> {\n    await this.#trace(\n      {\n        name: TraceName.WalletAlignment,\n        data: {\n          from,\n          to,\n          ...toProviderDataTraces(providers),\n          ...options.trace?.data,\n        },\n      },\n      async () => {\n        const { groupStateByGroupIndex, failures } =\n          await this.#buildGroupState(providers, (provider) =>\n            this.#getUnalignedSubRangesForProvider(provider, from, to),\n          );\n\n        if (failures.length) {\n          const error = failures.reduce(\n            (message, failure) => `${message}\\n- ${failure}`,\n            'Unable to align some accounts. Providers threw the following errors:',\n          );\n          console.warn(error);\n          this.#log(`${WARNING_PREFIX} ${error}`);\n        }\n\n        for (let groupIndex = from; groupIndex <= to; groupIndex++) {\n          const groupState = groupStateByGroupIndex.get(groupIndex);\n          if (groupState) {\n            this.#createOrUpdateMultichainAccountGroup(groupIndex, groupState);\n          }\n        }\n      },\n    );\n  }\n\n  /**\n   * Gets multichain account for a given ID.\n   * The default group ID will default to the multichain account with index 0.\n   *\n   * @param id - Account group ID.\n   * @returns Account group.\n   */\n  getAccountGroup(\n    id: AccountGroupId,\n  ): MultichainAccountGroup<Account> | undefined {\n    // We consider the \"default case\" to be mapped to index 0.\n    if (id === toDefaultAccountGroupId(this.id)) {\n      return this.#accountGroups.get(0);\n    }\n\n    // If it is not a valid ID, we cannot extract the group index\n    // from it, so we fail fast.\n    if (!isMultichainAccountGroupId(id)) {\n      return undefined;\n    }\n\n    const groupIndex = getGroupIndexFromMultichainAccountGroupId(id);\n    return this.#accountGroups.get(groupIndex);\n  }\n\n  /**\n   * Gets all multichain accounts. Similar to {@link MultichainAccountWallet.getMultichainAccountGroups}.\n   *\n   * @returns The multichain accounts.\n   */\n  getAccountGroups(): MultichainAccountGroup<Account>[] {\n    return this.getMultichainAccountGroups();\n  }\n\n  /**\n   * Gets multichain account group for a given index.\n   *\n   * @param groupIndex - Multichain account index.\n   * @returns The multichain account associated with the given index.\n   */\n  getMultichainAccountGroup(\n    groupIndex: number,\n  ): MultichainAccountGroup<Account> | undefined {\n    return this.#accountGroups.get(groupIndex);\n  }\n\n  /**\n   * Gets all multichain account groups.\n   *\n   * @returns The multichain accounts.\n   */\n  getMultichainAccountGroups(): MultichainAccountGroup<Account>[] {\n    return Array.from(this.#accountGroups.values()); // TODO: Prevent copy here.\n  }\n\n  /**\n   * Gets next group index for this wallet.\n   *\n   * @returns The next group index of this wallet.\n   */\n  getNextGroupIndex(): number {\n    // We do not check for gaps.\n    return (\n      Math.max(\n        -1, // So it will default to 0 if no groups.\n        ...this.#accountGroups.keys(),\n      ) + 1\n    );\n  }\n\n  /**\n   * Creates a multichain account group for a given group index.\n   *\n   * NOTE: This operation WILL lock the wallet's mutex.\n   *\n   * @param groupIndex - The group index to use.\n   * @param options - Options to configure the account creation.\n   * @param options.waitForAllProvidersToFinishCreatingAccounts - Whether to wait for all\n   * account providers to finish creating their accounts before returning. If `false`, only\n   * the EVM provider is used and non-EVM account creation is deferred via\n   * {@link MultichainAccountWallet.alignAccountsOf}. Defaults to `false`.\n   * @throws If groupIndex is greater than the next available group index.\n   * @throws If any account provider fails to create accounts.\n   * @returns The multichain account group for this group index.\n   */\n  async createMultichainAccountGroup(\n    groupIndex: number,\n    options: {\n      waitForAllProvidersToFinishCreatingAccounts?: boolean;\n    } = {},\n  ): Promise<MultichainAccountGroup<Account>> {\n    // Use this to avoid having it as `boolean | undefined`.\n    const waitForAllProvidersToFinishCreatingAccounts =\n      options.waitForAllProvidersToFinishCreatingAccounts ?? false;\n\n    return await this.#trace(\n      {\n        name: TraceName.WalletCreateMultichainAccountGroup,\n        data: {\n          groupIndex,\n          waitForAllProvidersToFinishCreatingAccounts,\n        },\n      },\n      async () => {\n        assertGroupIndexIsValid(groupIndex, this.getNextGroupIndex());\n\n        // If the group already exists, return it.\n        const existingGroup = this.getMultichainAccountGroup(groupIndex);\n        if (existingGroup) {\n          this.#log(\n            `Trying to re-create existing group: [${existingGroup.id}] (idempotent)`,\n          );\n          return existingGroup;\n        }\n\n        // Create a single group with a range of 1 (so we can reuse the batch creation logic) for the\n        // given group index.\n        const groups = await this.#createMultichainAccountGroups(\n          { from: groupIndex, to: groupIndex },\n          options,\n        );\n\n        const group = groups[0];\n        assert(group, `Expected group at index ${groupIndex} to exist`);\n        return group;\n      },\n    );\n  }\n\n  /**\n   * Creates multiple multichain account groups up to maxGroupIndex.\n   *\n   * NOTE: This operation WILL lock the wallet's mutex.\n   *\n   * @param range - The range of group indices to create.\n   * @param range.from - Starting group index to create (inclusive) (defaults to 0).\n   * @param range.to - Maximum group index to create (inclusive).\n   * @param options - Options to configure the account creation.\n   * @param options.waitForAllProvidersToFinishCreatingAccounts - Whether to wait for all\n   * account providers to finish creating their accounts before returning. If `false`, only\n   * the EVM provider is used and non-EVM account creation is deferred via\n   * {@link MultichainAccountWallet.alignAccounts}. Defaults to false.\n   * @throws If range is invalid (e.g. from is greater than to, from or to is negative, etc.).\n   * @returns Array of created multichain account groups.\n   */\n  async createMultichainAccountGroups(\n    { from = 0, to }: GroupIndexRange,\n    options: {\n      waitForAllProvidersToFinishCreatingAccounts?: boolean;\n    } = {},\n  ): Promise<MultichainAccountGroup<Account>[]> {\n    // Use this to avoid having it as `boolean | undefined`.\n    const waitForAllProvidersToFinishCreatingAccounts =\n      options.waitForAllProvidersToFinishCreatingAccounts ?? false;\n\n    return await this.#trace(\n      {\n        name: TraceName.WalletCreateMultichainAccountGroups,\n        data: {\n          from,\n          to,\n          waitForAllProvidersToFinishCreatingAccounts,\n        },\n      },\n      async () =>\n        await this.#createMultichainAccountGroups({ from, to }, options),\n    );\n  }\n\n  /**\n   * Creates multiple multichain account groups up to maxGroupIndex.\n   *\n   * NOTE: This operation WILL lock the wallet's mutex.\n   *\n   * @param range - The range of group indices to create.\n   * @param range.from - Starting group index to create (inclusive).\n   * @param range.to - Maximum group index to create (inclusive).\n   * @param options - Options to configure the account creation.\n   * @param options.waitForAllProvidersToFinishCreatingAccounts - Whether to wait for all\n   * account providers to finish creating their accounts before returning. If `false`, only\n   * the EVM provider is used and non-EVM account creation is deferred via\n   * {@link MultichainAccountWallet.alignAccounts}. Defaults to false.\n   * @throws If range is invalid (e.g. from is greater than to, from or to is negative, etc.).\n   * @returns Array of created multichain account groups.\n   */\n  async #createMultichainAccountGroups(\n    { from, to }: Required<GroupIndexRange>,\n    options: {\n      waitForAllProvidersToFinishCreatingAccounts?: boolean;\n    },\n  ): Promise<MultichainAccountGroup<Account>[]> {\n    assertGroupIndexRangeIsValid({ from, to });\n    assertGroupIndexIsValid(from, this.getNextGroupIndex());\n\n    const waitForAllProvidersToFinishCreatingAccounts =\n      options.waitForAllProvidersToFinishCreatingAccounts ?? false;\n\n    const [evmProvider, ...otherProviders] = this.#getProviders();\n    const providers = waitForAllProvidersToFinishCreatingAccounts\n      ? this.#providers\n      : [evmProvider];\n\n    const groups = await this.#createMultichainAccountGroupsRange(\n      { from, to },\n      providers,\n    );\n\n    // We need to run a post-alignment since non-EVM accounts have not\n    // been created yet.\n    if (!waitForAllProvidersToFinishCreatingAccounts) {\n      const alignOtherAccounts = async (): Promise<void> => {\n        this.#log(`Aligning accounts... (post)`);\n\n        await this.#withLock('in-progress:alignment', async () => {\n          await this.#alignAccountsForRange({ from, to }, otherProviders, {\n            trace: {\n              data: {\n                post: true, // Tag to identify post-alignment traces in analytics.\n              },\n            },\n          });\n        });\n\n        this.#log('Aligned accounts! (post)');\n      };\n\n      // eslint-disable-next-line no-void\n      void alignOtherAccounts().catch((error) => {\n        const errorMessage = `Unable to align non-EVM accounts from group index ${from} to ${to}`;\n        this.#log(\n          `${ERROR_PREFIX} ${errorMessage}: ${toErrorMessage(error)} (post)`,\n        );\n        console.error(errorMessage, error);\n      });\n    }\n\n    return groups;\n  }\n\n  /**\n   * Creates the next multichain account group.\n   *\n   * @throws If any of the account providers fails to create their accounts.\n   * @returns The multichain account group for the next group index available.\n   */\n  async createNextMultichainAccountGroup(): Promise<\n    MultichainAccountGroup<Account>\n  > {\n    return this.createMultichainAccountGroup(this.getNextGroupIndex(), {\n      waitForAllProvidersToFinishCreatingAccounts: true,\n    });\n  }\n\n  /**\n   * Align all accounts from each existing multichain account groups.\n   *\n   * NOTE: This operation WILL lock the wallet's mutex.\n   */\n  async alignAccounts(): Promise<void> {\n    if (this.isAligned()) {\n      this.#log('Already aligned, skipping...');\n      return;\n    }\n\n    const nextGroupIndex = this.getNextGroupIndex();\n\n    if (nextGroupIndex > 0) {\n      this.#log('Aligning accounts...');\n\n      const from = 0;\n      const to = nextGroupIndex - 1;\n\n      await this.#withLock(\n        'in-progress:alignment',\n        async () =>\n          await this.#alignAccountsForRange({ from, to }, this.#providers),\n      );\n\n      this.#log('Aligned!');\n    }\n  }\n\n  /**\n   * Check whether every group in this wallet is aligned.\n   *\n   * A wallet is aligned when every multichain account group reports that all\n   * of its registered providers have contributed at least one account.\n   * Returns `true` if the wallet has no groups.\n   *\n   * @returns `true` when all groups are aligned.\n   */\n  isAligned(): boolean {\n    return this.getMultichainAccountGroups().every((group) =>\n      group.isAligned(),\n    );\n  }\n\n  /**\n   * Align a specific multichain account group.\n   *\n   * NOTE: This operation WILL lock the wallet's mutex.\n   *\n   * @param groupIndex - The group index to align.\n   */\n  async alignAccountsOf(groupIndex: number): Promise<void> {\n    const group = this.getMultichainAccountGroup(groupIndex);\n\n    if (group) {\n      if (group.isAligned()) {\n        this.#log(`Group \"${group.id}\" is already aligned, skipping...`);\n        return;\n      }\n\n      this.#log(`Aligning accounts for group \"${group.id}\"...`);\n\n      await this.#withLock(\n        'in-progress:alignment',\n        async () =>\n          await this.#alignAccountsForRange(\n            { from: groupIndex, to: groupIndex },\n            this.#providers,\n            { trace: { data: { groupIndex } } },\n          ),\n      );\n\n      this.#log(`Aligned accounts for group \"${group.id}\"!`);\n    }\n  }\n\n  /**\n   * Discover and create accounts for all providers.\n   *\n   * NOTE: This operation WILL lock the wallet's mutex.\n   *\n   * @returns The discovered accounts for each provider.\n   */\n  async discoverAccounts(): Promise<Account[]> {\n    return this.#withLock('in-progress:discovery', async () => {\n      // Start with the next available group index (so we can resume the discovery\n      // from there).\n      let maxGroupIndex = this.getNextGroupIndex();\n      const discoveredGroupsState: DiscoveredGroupsState = {};\n\n      const addDiscoveryResultToState = (\n        result: Account[],\n        providerName: string,\n        groupIndex: number,\n      ) => {\n        const accountIds = result.map((account) => account.id);\n        discoveredGroupsState[groupIndex] ??= {};\n        discoveredGroupsState[groupIndex][providerName] = accountIds;\n      };\n\n      // One serialized loop per provider; all run concurrently\n      const runProviderDiscovery = async (\n        context: AccountProviderDiscoveryContext<Account>,\n      ): Promise<void> => {\n        const providerName = context.provider.getName();\n        const message = (stepName: string, groupIndex: number) =>\n          `[${providerName}] Discovery ${stepName} for group index: ${groupIndex}`;\n\n        while (!context.stopped) {\n          // Fast‑forward to current high‑water mark\n          const targetGroupIndex = Math.max(context.groupIndex, maxGroupIndex);\n\n          log(message('started', targetGroupIndex));\n\n          let accounts: Account[] = [];\n          try {\n            accounts = await context.provider.discoverAccounts({\n              entropySource: this.#entropySource,\n              groupIndex: targetGroupIndex,\n            });\n          } catch (error) {\n            context.stopped = true;\n\n            log(\n              message(\n                `failed (with: \"${toErrorMessage(error)}\")`,\n                targetGroupIndex,\n              ),\n            );\n\n            reportError(\n              this.#messenger,\n              `Unable to discover accounts with provider \"${providerName}\"`,\n              error,\n              {\n                provider: providerName,\n                groupIndex: targetGroupIndex,\n              },\n            );\n            break;\n          }\n\n          if (!accounts.length) {\n            log(\n              message('stopped (no accounts got discovered)', targetGroupIndex),\n            );\n            context.stopped = true;\n            break;\n          }\n\n          log(message('**succeeded**', targetGroupIndex));\n\n          context.accounts = context.accounts.concat(accounts);\n\n          addDiscoveryResultToState(accounts, providerName, targetGroupIndex);\n\n          const nextGroupIndex = targetGroupIndex + 1;\n          context.groupIndex = nextGroupIndex;\n\n          if (nextGroupIndex > maxGroupIndex) {\n            maxGroupIndex = nextGroupIndex;\n          }\n        }\n      };\n\n      const providerContexts: AccountProviderDiscoveryContext<Account>[] =\n        this.#providers.map((provider) => ({\n          provider,\n          stopped: false,\n          groupIndex: maxGroupIndex,\n          accounts: [],\n        }));\n\n      // Start discovery for each providers.\n      await Promise.all(providerContexts.map(runProviderDiscovery));\n\n      // Create discovered groups\n      for (const [groupIndexString, groupState] of Object.entries(\n        discoveredGroupsState,\n      )) {\n        const groupIndex = Number(groupIndexString);\n        const group = new MultichainAccountGroup({\n          wallet: this,\n          providers: this.#providers,\n          groupIndex,\n          messenger: this.#messenger,\n        });\n        group.init(groupState);\n        this.#accountGroups.set(groupIndex, group);\n      }\n\n      // Align missing accounts from group. This is required to create missing account from non-discovered\n      // indexes for some providers.\n      const nextGroupIndex = this.getNextGroupIndex();\n      if (nextGroupIndex > 0) {\n        await this.#alignAccountsForRange(\n          { from: 0, to: nextGroupIndex - 1 },\n          this.#providers,\n          {\n            trace: {\n              data: {\n                discovery: true, // Tag to identify discovery-alignment traces in analytics.\n              },\n            },\n          },\n        );\n      }\n\n      return providerContexts.flatMap((context) => context.accounts);\n    });\n  }\n}\n"]}