{"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 { AccountProvider } from '@metamask/account-api';\nimport type { EntropySourceId, KeyringAccount } from '@metamask/keyring-api';\nimport { KeyringTypes } from '@metamask/keyring-controller';\n\nimport type { MultichainAccountGroup } from './MultichainAccountGroup';\nimport { MultichainAccountWallet } from './MultichainAccountWallet';\nimport { EvmAccountProvider } from './providers/EvmAccountProvider';\nimport { SolAccountProvider } from './providers/SolAccountProvider';\nimport type { MultichainAccountServiceMessenger } from './types';\n\nexport const serviceName = 'MultichainAccountService';\n\n/**\n * The options that {@link MultichainAccountService} takes.\n */\ntype MultichainAccountServiceOptions<\n  Account extends Bip44Account<KeyringAccount>,\n> = {\n  messenger: MultichainAccountServiceMessenger;\n  providers?: AccountProvider<Account>[];\n};\n\n/** Reverse mapping object used to map account IDs and their wallet/multichain account. */\ntype AccountContext<Account extends Bip44Account<KeyringAccount>> = {\n  wallet: MultichainAccountWallet<Account>;\n  group: MultichainAccountGroup<Account>;\n};\n\n/**\n * Service to expose multichain accounts capabilities.\n */\nexport class MultichainAccountService {\n  readonly #messenger: MultichainAccountServiceMessenger;\n\n  readonly #providers: AccountProvider<Bip44Account<KeyringAccount>>[];\n\n  readonly #wallets: Map<\n    MultichainAccountWalletId,\n    MultichainAccountWallet<Bip44Account<KeyringAccount>>\n  >;\n\n  readonly #accountIdToContext: Map<\n    Bip44Account<KeyringAccount>['id'],\n    AccountContext<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   * providers.\n   */\n  constructor({\n    messenger,\n    providers = [],\n  }: MultichainAccountServiceOptions<Bip44Account<KeyringAccount>>) {\n    this.#messenger = messenger;\n    this.#wallets = new Map();\n    this.#accountIdToContext = new Map();\n    // TODO: Rely on keyring capabilities once the keyring API is used by all keyrings.\n    this.#providers = [\n      new EvmAccountProvider(this.#messenger),\n      new SolAccountProvider(this.#messenger),\n      // Custom account providers that can be provided by the MetaMask client.\n      ...providers,\n    ];\n\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:getMultichainAccountGroup',\n      (...args) => this.getMultichainAccountGroup(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:getMultichainAccountGroups',\n      (...args) => this.getMultichainAccountGroups(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:getMultichainAccountWallet',\n      (...args) => this.getMultichainAccountWallet(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:getMultichainAccountWallets',\n      (...args) => this.getMultichainAccountWallets(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:createNextMultichainAccountGroup',\n      (...args) => this.createNextMultichainAccountGroup(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:createMultichainAccountGroup',\n      (...args) => this.createMultichainAccountGroup(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:alignWallets',\n      (...args) => this.alignWallets(...args),\n    );\n    this.#messenger.registerActionHandler(\n      'MultichainAccountService:alignWallet',\n      (...args) => this.alignWallet(...args),\n    );\n  }\n\n  /**\n   * Initialize the service and constructs the internal reprensentation of\n   * multichain accounts and wallets.\n   */\n  init(): void {\n    // Create initial wallets.\n    const { keyrings } = this.#messenger.call('KeyringController:getState');\n    for (const keyring of keyrings) {\n      if (keyring.type === (KeyringTypes.hd as string)) {\n        // Only HD keyrings have an entropy source/SRP.\n        const entropySource = keyring.metadata.id;\n\n        // This will automatically \"associate\" all multichain accounts for that wallet\n        // (based on the accounts owned by each account providers).\n        const wallet = new MultichainAccountWallet({\n          entropySource,\n          providers: this.#providers,\n        });\n        this.#wallets.set(wallet.id, wallet);\n\n        // Reverse mapping between account ID and their multichain wallet/account:\n        for (const group of wallet.getMultichainAccountGroups()) {\n          for (const account of group.getAccounts()) {\n            this.#accountIdToContext.set(account.id, {\n              wallet,\n              group,\n            });\n          }\n        }\n      }\n    }\n\n    this.#messenger.subscribe('AccountsController:accountAdded', (account) =>\n      this.#handleOnAccountAdded(account),\n    );\n    this.#messenger.subscribe('AccountsController:accountRemoved', (id) =>\n      this.#handleOnAccountRemoved(id),\n    );\n  }\n\n  #handleOnAccountAdded(account: KeyringAccount): void {\n    // We completely omit non-BIP-44 accounts!\n    if (!isBip44Account(account)) {\n      return;\n    }\n\n    let sync = true;\n\n    let wallet = this.#wallets.get(\n      toMultichainAccountWalletId(account.options.entropy.id),\n    );\n    if (!wallet) {\n      // That's a new wallet.\n      wallet = new MultichainAccountWallet({\n        entropySource: account.options.entropy.id,\n        providers: this.#providers,\n      });\n      this.#wallets.set(wallet.id, wallet);\n\n      // If that's a new wallet wallet. There's nothing to \"force-sync\".\n      sync = false;\n    }\n\n    let group = wallet.getMultichainAccountGroup(\n      account.options.entropy.groupIndex,\n    );\n    if (!group) {\n      // This new account is a new multichain account, let the wallet know\n      // it has to re-sync with its providers.\n      if (sync) {\n        wallet.sync();\n      }\n\n      group = wallet.getMultichainAccountGroup(\n        account.options.entropy.groupIndex,\n      );\n\n      // If that's a new multichain account. There's nothing to \"force-sync\".\n      sync = false;\n    }\n\n    // We have to check against `undefined` in case `getMultichainAccount` is\n    // not able to find this multichain account (which should not be possible...)\n    if (group) {\n      if (sync) {\n        group.sync();\n      }\n\n      // Same here, this account should have been already grouped in that\n      // multichain account.\n      this.#accountIdToContext.set(account.id, {\n        wallet,\n        group,\n      });\n    }\n  }\n\n  #handleOnAccountRemoved(id: KeyringAccount['id']): void {\n    // Force sync of the appropriate wallet if an account got removed.\n    const found = this.#accountIdToContext.get(id);\n    if (found) {\n      const { wallet } = found;\n\n      wallet.sync();\n    }\n\n    // Safe to call delete even if the `id` was not referencing a BIP-44 account.\n    this.#accountIdToContext.delete(id);\n  }\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 the account's context which contains its multichain wallet and\n   * multichain account group references.\n   *\n   * @param id - Account ID.\n   * @returns The account context if any, undefined otherwise.\n   */\n  getAccountContext(\n    id: KeyringAccount['id'],\n  ): AccountContext<Bip44Account<KeyringAccount>> | undefined {\n    return this.#accountIdToContext.get(id);\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  /**\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   * Align all multichain account wallets.\n   */\n  async alignWallets(): Promise<void> {\n    const wallets = this.getMultichainAccountWallets();\n    await Promise.all(wallets.map((w) => w.alignGroups()));\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    await wallet.alignGroups();\n  }\n}\n"]}