@metamask/multichain-account-service 10.0.3 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/CHANGELOG.md +43 -2
  2. package/dist/MultichainAccountGroup.cjs +15 -0
  3. package/dist/MultichainAccountGroup.cjs.map +1 -1
  4. package/dist/MultichainAccountGroup.d.cts +10 -0
  5. package/dist/MultichainAccountGroup.d.cts.map +1 -1
  6. package/dist/MultichainAccountGroup.d.mts +10 -0
  7. package/dist/MultichainAccountGroup.d.mts.map +1 -1
  8. package/dist/MultichainAccountGroup.mjs +15 -0
  9. package/dist/MultichainAccountGroup.mjs.map +1 -1
  10. package/dist/MultichainAccountService-method-action-types.cjs.map +1 -1
  11. package/dist/MultichainAccountService-method-action-types.d.cts +10 -6
  12. package/dist/MultichainAccountService-method-action-types.d.cts.map +1 -1
  13. package/dist/MultichainAccountService-method-action-types.d.mts +10 -6
  14. package/dist/MultichainAccountService-method-action-types.d.mts.map +1 -1
  15. package/dist/MultichainAccountService-method-action-types.mjs.map +1 -1
  16. package/dist/MultichainAccountService.cjs +67 -8
  17. package/dist/MultichainAccountService.cjs.map +1 -1
  18. package/dist/MultichainAccountService.d.cts +31 -7
  19. package/dist/MultichainAccountService.d.cts.map +1 -1
  20. package/dist/MultichainAccountService.d.mts +31 -7
  21. package/dist/MultichainAccountService.d.mts.map +1 -1
  22. package/dist/MultichainAccountService.mjs +67 -8
  23. package/dist/MultichainAccountService.mjs.map +1 -1
  24. package/dist/MultichainAccountWallet.cjs +20 -0
  25. package/dist/MultichainAccountWallet.cjs.map +1 -1
  26. package/dist/MultichainAccountWallet.d.cts +10 -0
  27. package/dist/MultichainAccountWallet.d.cts.map +1 -1
  28. package/dist/MultichainAccountWallet.d.mts +10 -0
  29. package/dist/MultichainAccountWallet.d.mts.map +1 -1
  30. package/dist/MultichainAccountWallet.mjs +20 -0
  31. package/dist/MultichainAccountWallet.mjs.map +1 -1
  32. package/dist/index.cjs +3 -1
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +1 -1
  35. package/dist/index.d.cts.map +1 -1
  36. package/dist/index.d.mts +1 -1
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +1 -1
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/providers/AccountProviderWrapper.cjs +43 -0
  41. package/dist/providers/AccountProviderWrapper.cjs.map +1 -1
  42. package/dist/providers/AccountProviderWrapper.d.cts +37 -0
  43. package/dist/providers/AccountProviderWrapper.d.cts.map +1 -1
  44. package/dist/providers/AccountProviderWrapper.d.mts +37 -0
  45. package/dist/providers/AccountProviderWrapper.d.mts.map +1 -1
  46. package/dist/providers/AccountProviderWrapper.mjs +43 -0
  47. package/dist/providers/AccountProviderWrapper.mjs.map +1 -1
  48. package/dist/providers/BaseBip44AccountProvider.cjs +3 -18
  49. package/dist/providers/BaseBip44AccountProvider.cjs.map +1 -1
  50. package/dist/providers/BaseBip44AccountProvider.d.cts +36 -16
  51. package/dist/providers/BaseBip44AccountProvider.d.cts.map +1 -1
  52. package/dist/providers/BaseBip44AccountProvider.d.mts +36 -16
  53. package/dist/providers/BaseBip44AccountProvider.d.mts.map +1 -1
  54. package/dist/providers/BaseBip44AccountProvider.mjs +3 -18
  55. package/dist/providers/BaseBip44AccountProvider.mjs.map +1 -1
  56. package/dist/providers/EvmAccountProvider.cjs +19 -0
  57. package/dist/providers/EvmAccountProvider.cjs.map +1 -1
  58. package/dist/providers/EvmAccountProvider.d.cts +12 -0
  59. package/dist/providers/EvmAccountProvider.d.cts.map +1 -1
  60. package/dist/providers/EvmAccountProvider.d.mts +12 -0
  61. package/dist/providers/EvmAccountProvider.d.mts.map +1 -1
  62. package/dist/providers/EvmAccountProvider.mjs +19 -0
  63. package/dist/providers/EvmAccountProvider.mjs.map +1 -1
  64. package/dist/providers/SnapAccountProvider.cjs +28 -11
  65. package/dist/providers/SnapAccountProvider.cjs.map +1 -1
  66. package/dist/providers/SnapAccountProvider.d.cts +16 -4
  67. package/dist/providers/SnapAccountProvider.d.cts.map +1 -1
  68. package/dist/providers/SnapAccountProvider.d.mts +16 -4
  69. package/dist/providers/SnapAccountProvider.d.mts.map +1 -1
  70. package/dist/providers/SnapAccountProvider.mjs +28 -11
  71. package/dist/providers/SnapAccountProvider.mjs.map +1 -1
  72. package/dist/providers/XlmAccountProvider.cjs +83 -0
  73. package/dist/providers/XlmAccountProvider.cjs.map +1 -0
  74. package/dist/providers/XlmAccountProvider.d.cts +29 -0
  75. package/dist/providers/XlmAccountProvider.d.cts.map +1 -0
  76. package/dist/providers/XlmAccountProvider.d.mts +29 -0
  77. package/dist/providers/XlmAccountProvider.d.mts.map +1 -0
  78. package/dist/providers/XlmAccountProvider.mjs +79 -0
  79. package/dist/providers/XlmAccountProvider.mjs.map +1 -0
  80. package/dist/providers/index.cjs +1 -0
  81. package/dist/providers/index.cjs.map +1 -1
  82. package/dist/providers/index.d.cts +1 -0
  83. package/dist/providers/index.d.cts.map +1 -1
  84. package/dist/providers/index.d.mts +1 -0
  85. package/dist/providers/index.d.mts.map +1 -1
  86. package/dist/providers/index.mjs +1 -0
  87. package/dist/providers/index.mjs.map +1 -1
  88. package/dist/tests/accounts.cjs +29 -1
  89. package/dist/tests/accounts.cjs.map +1 -1
  90. package/dist/tests/accounts.d.cts +2 -0
  91. package/dist/tests/accounts.d.cts.map +1 -1
  92. package/dist/tests/accounts.d.mts +2 -0
  93. package/dist/tests/accounts.d.mts.map +1 -1
  94. package/dist/tests/accounts.mjs +29 -1
  95. package/dist/tests/accounts.mjs.map +1 -1
  96. package/dist/tests/providers.cjs +5 -0
  97. package/dist/tests/providers.cjs.map +1 -1
  98. package/dist/tests/providers.d.cts +2 -0
  99. package/dist/tests/providers.d.cts.map +1 -1
  100. package/dist/tests/providers.d.mts +2 -0
  101. package/dist/tests/providers.d.mts.map +1 -1
  102. package/dist/tests/providers.mjs +6 -1
  103. package/dist/tests/providers.mjs.map +1 -1
  104. package/dist/utils.cjs.map +1 -1
  105. package/dist/utils.d.cts +14 -1
  106. package/dist/utils.d.cts.map +1 -1
  107. package/dist/utils.d.mts +14 -1
  108. package/dist/utils.d.mts.map +1 -1
  109. package/dist/utils.mjs.map +1 -1
  110. package/package.json +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAccountService.cjs","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';\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.\n *\n * NOTE: This method should only be called in client code as a revert mechanism.\n * At the point that this code is called, discovery shouldn't have been triggered.\n * This is meant to be used in the scenario where a seed phrase backup is not successful.\n *\n * @param entropySource - The entropy source of the multichain account wallet.\n * @param accountAddress - The address of the account to remove.\n * @returns The removed multichain account wallet.\n */\n async removeMultichainAccountWallet(\n entropySource: EntropySourceId,\n accountAddress: string,\n ): Promise<void> {\n const wallet = this.#getWallet(entropySource);\n\n await this.#messenger.call(\n 'KeyringController:removeAccount',\n accountAddress,\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"]}
1
+ {"version":3,"file":"MultichainAccountService.cjs","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"]}
@@ -5,6 +5,26 @@ import { MultichainAccountWallet } from "./MultichainAccountWallet.cjs";
5
5
  import { EvmAccountProviderConfig, Bip44AccountProvider, EVM_ACCOUNT_PROVIDER_NAME, BtcAccountProviderConfig, TrxAccountProviderConfig, BTC_ACCOUNT_PROVIDER_NAME, TRX_ACCOUNT_PROVIDER_NAME } from "./providers/index.cjs";
6
6
  import { SOL_ACCOUNT_PROVIDER_NAME, SolAccountProviderConfig } from "./providers/SolAccountProvider.cjs";
7
7
  import type { MultichainAccountServiceConfig, MultichainAccountServiceMessenger } from "./types.cjs";
8
+ /**
9
+ * Per-account failure detail attached to the aggregated Sentry report
10
+ * produced by {@link MultichainAccountService.removeMultichainAccountWallet}.
11
+ *
12
+ * Names the on-the-wire shape so consumers reading the Sentry context (and
13
+ * tests asserting on it) have one place to look.
14
+ */
15
+ export type RemoveMultichainAccountWalletFailure = {
16
+ provider: string;
17
+ accountId?: Bip44Account<KeyringAccount>['id'];
18
+ error: unknown;
19
+ };
20
+ /**
21
+ * Aggregated context payload attached to the Sentry report produced by
22
+ * {@link MultichainAccountService.removeMultichainAccountWallet} when one
23
+ * or more per-account deletions fail.
24
+ */
25
+ export type RemoveMultichainAccountWalletFailureContext = {
26
+ failures: RemoveMultichainAccountWalletFailure[];
27
+ };
8
28
  export declare const serviceName = "MultichainAccountService";
9
29
  /**
10
30
  * The options that {@link MultichainAccountService} takes.
@@ -123,17 +143,21 @@ export declare class MultichainAccountService {
123
143
  */
124
144
  createMultichainAccountWallet(params: CreateWalletParams): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
125
145
  /**
126
- * Removes a multichain account wallet.
146
+ * Removes a multichain account wallet, deleting all of its accounts across
147
+ * every registered provider (EVM and snap-based).
127
148
  *
128
- * NOTE: This method should only be called in client code as a revert mechanism.
129
- * At the point that this code is called, discovery shouldn't have been triggered.
130
- * This is meant to be used in the scenario where a seed phrase backup is not successful.
149
+ * The deletion iterates providers (the source of truth for their own
150
+ * account lists) and filters each provider's accounts to those matching
151
+ * the wallet's entropy source. Cleanup is best-effort end-to-end: neither
152
+ * a single account deletion failure nor a failure to enumerate a given
153
+ * provider's accounts aborts cleanup of the remaining providers. If one or
154
+ * more operations fail, a single aggregated error is reported via
155
+ * `reportError` with all per-failure details in its context. The wallet is
156
+ * always removed from the service's internal map at the end.
131
157
  *
132
158
  * @param entropySource - The entropy source of the multichain account wallet.
133
- * @param accountAddress - The address of the account to remove.
134
- * @returns The removed multichain account wallet.
135
159
  */
136
- removeMultichainAccountWallet(entropySource: EntropySourceId, accountAddress: string): Promise<void>;
160
+ removeMultichainAccountWallet(entropySource: EntropySourceId): Promise<void>;
137
161
  /**
138
162
  * Gets a reference to the multichain account group matching this entropy source
139
163
  * and a group index.
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAccountService.d.cts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultichainAccountService.d.cts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,26 @@ import { MultichainAccountWallet } from "./MultichainAccountWallet.mjs";
5
5
  import { EvmAccountProviderConfig, Bip44AccountProvider, EVM_ACCOUNT_PROVIDER_NAME, BtcAccountProviderConfig, TrxAccountProviderConfig, BTC_ACCOUNT_PROVIDER_NAME, TRX_ACCOUNT_PROVIDER_NAME } from "./providers/index.mjs";
6
6
  import { SOL_ACCOUNT_PROVIDER_NAME, SolAccountProviderConfig } from "./providers/SolAccountProvider.mjs";
7
7
  import type { MultichainAccountServiceConfig, MultichainAccountServiceMessenger } from "./types.mjs";
8
+ /**
9
+ * Per-account failure detail attached to the aggregated Sentry report
10
+ * produced by {@link MultichainAccountService.removeMultichainAccountWallet}.
11
+ *
12
+ * Names the on-the-wire shape so consumers reading the Sentry context (and
13
+ * tests asserting on it) have one place to look.
14
+ */
15
+ export type RemoveMultichainAccountWalletFailure = {
16
+ provider: string;
17
+ accountId?: Bip44Account<KeyringAccount>['id'];
18
+ error: unknown;
19
+ };
20
+ /**
21
+ * Aggregated context payload attached to the Sentry report produced by
22
+ * {@link MultichainAccountService.removeMultichainAccountWallet} when one
23
+ * or more per-account deletions fail.
24
+ */
25
+ export type RemoveMultichainAccountWalletFailureContext = {
26
+ failures: RemoveMultichainAccountWalletFailure[];
27
+ };
8
28
  export declare const serviceName = "MultichainAccountService";
9
29
  /**
10
30
  * The options that {@link MultichainAccountService} takes.
@@ -123,17 +143,21 @@ export declare class MultichainAccountService {
123
143
  */
124
144
  createMultichainAccountWallet(params: CreateWalletParams): Promise<MultichainAccountWallet<Bip44Account<KeyringAccount>>>;
125
145
  /**
126
- * Removes a multichain account wallet.
146
+ * Removes a multichain account wallet, deleting all of its accounts across
147
+ * every registered provider (EVM and snap-based).
127
148
  *
128
- * NOTE: This method should only be called in client code as a revert mechanism.
129
- * At the point that this code is called, discovery shouldn't have been triggered.
130
- * This is meant to be used in the scenario where a seed phrase backup is not successful.
149
+ * The deletion iterates providers (the source of truth for their own
150
+ * account lists) and filters each provider's accounts to those matching
151
+ * the wallet's entropy source. Cleanup is best-effort end-to-end: neither
152
+ * a single account deletion failure nor a failure to enumerate a given
153
+ * provider's accounts aborts cleanup of the remaining providers. If one or
154
+ * more operations fail, a single aggregated error is reported via
155
+ * `reportError` with all per-failure details in its context. The wallet is
156
+ * always removed from the service's internal map at the end.
131
157
  *
132
158
  * @param entropySource - The entropy source of the multichain account wallet.
133
- * @param accountAddress - The address of the account to remove.
134
- * @returns The removed multichain account wallet.
135
159
  */
136
- removeMultichainAccountWallet(entropySource: EntropySourceId, accountAddress: string): Promise<void>;
160
+ removeMultichainAccountWallet(entropySource: EntropySourceId): Promise<void>;
137
161
  /**
138
162
  * Gets a reference to the multichain account group matching this entropy source
139
163
  * and a group index.
@@ -1 +1 @@
1
- {"version":3,"file":"MultichainAccountService.d.mts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MultichainAccountService.d.mts","sourceRoot":"","sources":["../src/MultichainAccountService.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,YAAY,EACb,8BAA8B;AAG/B,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,8BAA8B;AAS7E,OAAO,KAAK,EAAE,sBAAsB,EAAE,qCAAiC;AACvE,OAAO,EAAE,uBAAuB,EAAE,sCAAkC;AACpE,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EACzB,yBAAyB,EAG1B,8BAAoB;AAOrB,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACzB,2CAAuC;AACxC,OAAO,KAAK,EACV,8BAA8B,EAC9B,iCAAiC,EAClC,oBAAgB;AAGjB;;;;;;GAMG;AACH,MAAM,MAAM,oCAAoC,GAAG;IACjD,QAAQ,EAAE,MAAM,CAAC;IAGjB,SAAS,CAAC,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/C,KAAK,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,2CAA2C,GAAG;IACxD,QAAQ,EAAE,oCAAoC,EAAE,CAAC;CAClD,CAAC;AAEF,eAAO,MAAM,WAAW,6BAA6B,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,+BAA+B,GAAG;IAC5C,SAAS,EAAE,iCAAiC,CAAC;IAC7C,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE;QAChB,CAAC,yBAAyB,CAAC,CAAC,EAAE,wBAAwB,CAAC;QACvD,CAAC,yBAAyB,CAAC,CAAC,EAAE,wBAAwB,CAAC;QACvD,CAAC,yBAAyB,CAAC,CAAC,EAAE,wBAAwB,CAAC;QACvD,CAAC,yBAAyB,CAAC,CAAC,EAAE,wBAAwB,CAAC;KACxD,CAAC;IACF,MAAM,CAAC,EAAE,8BAA8B,CAAC;CACzC,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,aAAa,EAAE,eAAe,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,aAAa,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG;QAC3C,CAAC,UAAU,EAAE,MAAM,GAAG;YACpB,CAAC,YAAY,EAAE,SAAS,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;SACjF,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,CAAC;CACtB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,UAAU,CAAC;CACtB,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAmBN;;GAEG;AACH,qBAAa,wBAAwB;;IAYnC;;OAEG;IACH,IAAI,EAAE,OAAO,WAAW,CAAe;IAEvC;;;;;;;;;OASG;gBACS,EACV,SAAS,EACT,SAAc,EACd,eAAe,EACf,MAAM,GACP,EAAE,+BAA+B;IA8GlC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6B3B;;;;;;;;;;;;;;OAcG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IA+CrC;;;;;;;OAOG;IACH,0BAA0B,CAAC,EACzB,aAAa,GACd,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,uBAAuB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAIzD;;;;OAIG;IACH,2BAA2B,IAAI,uBAAuB,CACpD,YAAY,CAAC,cAAc,CAAC,CAC7B,EAAE;IA0GH;;;;;;;;;;;;;OAaG;IACG,6BAA6B,CACjC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,uBAAuB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAkCjE;;;;;;;;;;;;;;OAcG;IACG,6BAA6B,CACjC,aAAa,EAAE,eAAe,GAC7B,OAAO,CAAC,IAAI,CAAC;IAmEhB;;;;;;;;;OASG;IACH,yBAAyB,CAAC,EACxB,aAAa,EACb,UAAU,GACX,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAWxD;;;;;;;OAOG;IACH,0BAA0B,CAAC,EACzB,aAAa,GACd,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,EAAE;IAI1D;;;;;;OAMG;IACG,gCAAgC,CAAC,EACrC,aAAa,GACd,EAAE;QACD,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAMjE;;;;;;;OAOG;IACG,4BAA4B,CAAC,EACjC,UAAU,EACV,aAAa,GACd,EAAE;QACD,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,CAAC;IAMjE;;;;;;;;OAQG;IACG,6BAA6B,CAAC,EAClC,cAAkB,EAClB,YAAY,EACZ,aAAa,GACd,EAAE;QACD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,eAAe,CAAC;KAChC,GAAG,OAAO,CAAC,sBAAsB,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;IAOnE;;;;;;;OAOG;IACG,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB5D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IASnC;;;;OAIG;IACG,WAAW,CAAC,aAAa,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAOjE"}
@@ -23,6 +23,7 @@ import { AccountProviderWrapper, isAccountProviderWrapper } from "./providers/Ac
23
23
  import { EvmAccountProvider } from "./providers/EvmAccountProvider.mjs";
24
24
  import { SolAccountProvider } from "./providers/SolAccountProvider.mjs";
25
25
  import { SOL_ACCOUNT_PROVIDER_NAME } from "./providers/SolAccountProvider.mjs";
26
+ import { toErrorMessage } from "./utils.mjs";
26
27
  export const serviceName = 'MultichainAccountService';
27
28
  const MESSENGER_EXPOSED_METHODS = [
28
29
  'getMultichainAccountGroup',
@@ -205,19 +206,77 @@ export class MultichainAccountService {
205
206
  return wallet;
206
207
  }
207
208
  /**
208
- * Removes a multichain account wallet.
209
+ * Removes a multichain account wallet, deleting all of its accounts across
210
+ * every registered provider (EVM and snap-based).
209
211
  *
210
- * NOTE: This method should only be called in client code as a revert mechanism.
211
- * At the point that this code is called, discovery shouldn't have been triggered.
212
- * This is meant to be used in the scenario where a seed phrase backup is not successful.
212
+ * The deletion iterates providers (the source of truth for their own
213
+ * account lists) and filters each provider's accounts to those matching
214
+ * the wallet's entropy source. Cleanup is best-effort end-to-end: neither
215
+ * a single account deletion failure nor a failure to enumerate a given
216
+ * provider's accounts aborts cleanup of the remaining providers. If one or
217
+ * more operations fail, a single aggregated error is reported via
218
+ * `reportError` with all per-failure details in its context. The wallet is
219
+ * always removed from the service's internal map at the end.
213
220
  *
214
221
  * @param entropySource - The entropy source of the multichain account wallet.
215
- * @param accountAddress - The address of the account to remove.
216
- * @returns The removed multichain account wallet.
217
222
  */
218
- async removeMultichainAccountWallet(entropySource, accountAddress) {
223
+ async removeMultichainAccountWallet(entropySource) {
219
224
  const wallet = __classPrivateFieldGet(this, _MultichainAccountService_instances, "m", _MultichainAccountService_getWallet).call(this, entropySource);
220
- await __classPrivateFieldGet(this, _MultichainAccountService_messenger, "f").call('KeyringController:removeAccount', accountAddress);
225
+ const failures = [];
226
+ for (const provider of __classPrivateFieldGet(this, _MultichainAccountService_providers, "f")) {
227
+ // Enumerating a provider's owned accounts can itself throw (e.g.
228
+ // `unwrap()`, `getAccounts()`, or reading account options). Catch it as
229
+ // a provider-level failure and move on so one bad provider does not
230
+ // abort cleanup of the others or skip the always-remove step below.
231
+ let owned;
232
+ try {
233
+ // For wrapped providers, enumerate via the underlying provider so we
234
+ // also see accounts when the wrapper has been disabled (i.e. basic
235
+ // functionality is off). The wrapper's `deleteAccount` itself forwards
236
+ // unconditionally, but its `getAccounts()` returns `[]` when disabled,
237
+ // which would otherwise leave snap-backed accounts orphaned in their
238
+ // underlying keyrings.
239
+ const source = isAccountProviderWrapper(provider)
240
+ ? provider.unwrap()
241
+ : provider;
242
+ owned = source
243
+ .getAccounts()
244
+ .filter((account) => account.options.entropy.id === entropySource);
245
+ }
246
+ catch (error) {
247
+ failures.push({
248
+ provider: provider.getName(),
249
+ error,
250
+ });
251
+ continue;
252
+ }
253
+ for (const account of owned) {
254
+ try {
255
+ await provider.deleteAccount(account.id);
256
+ }
257
+ catch (error) {
258
+ failures.push({
259
+ provider: provider.getName(),
260
+ accountId: account.id,
261
+ error,
262
+ });
263
+ }
264
+ }
265
+ }
266
+ if (failures.length > 0) {
267
+ // One aggregated report per wallet-removal action: keeps the Sentry
268
+ // message stable for grouping while still surfacing every per-account
269
+ // failure in `context`. The shape is pinned by
270
+ // `RemoveMultichainAccountWalletFailureContext`.
271
+ const context = {
272
+ failures: failures.map(({ provider, accountId, error }) => ({
273
+ provider,
274
+ accountId,
275
+ error: toErrorMessage(error),
276
+ })),
277
+ };
278
+ reportError(__classPrivateFieldGet(this, _MultichainAccountService_messenger, "f"), `Failed to delete one or more accounts during wallet removal`, new Error('Wallet removal partially failed'), context);
279
+ }
221
280
  __classPrivateFieldGet(this, _MultichainAccountService_wallets, "f").delete(wallet.id);
222
281
  }
223
282
  /**
@@ -1 +1 @@
1
- {"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';\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.\n *\n * NOTE: This method should only be called in client code as a revert mechanism.\n * At the point that this code is called, discovery shouldn't have been triggered.\n * This is meant to be used in the scenario where a seed phrase backup is not successful.\n *\n * @param entropySource - The entropy source of the multichain account wallet.\n * @param accountAddress - The address of the account to remove.\n * @returns The removed multichain account wallet.\n */\n async removeMultichainAccountWallet(\n entropySource: EntropySourceId,\n accountAddress: string,\n ): Promise<void> {\n const wallet = this.#getWallet(entropySource);\n\n await this.#messenger.call(\n 'KeyringController:removeAccount',\n accountAddress,\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"]}
1
+ {"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"]}