UNPKG

@metamask/multichain-account-service

Version:
1 lines 50.4 kB
{"version":3,"file":"MultichainAccountWallet.mjs","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