@metamask-previews/accounts-controller 27.0.0-preview-714dae1 → 27.0.0-preview-c7dcfd5a
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.
- package/CHANGELOG.md +7 -0
- package/dist/AccountsController.cjs +6 -4
- package/dist/AccountsController.cjs.map +1 -1
- package/dist/AccountsController.d.cts.map +1 -1
- package/dist/AccountsController.d.mts.map +1 -1
- package/dist/AccountsController.mjs +6 -4
- package/dist/AccountsController.mjs.map +1 -1
- package/package.json +7 -7
package/CHANGELOG.md
CHANGED
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
### Changed
|
11
|
+
|
12
|
+
- **BREAKING:** Bump `@metamask/snaps-controllers` peer dependency from `^9.19.0` to `^11.10.0` ([#5611](https://github.com/MetaMask/core/pull/5611))
|
13
|
+
- **BREAKING:** Bump `@metamask/providers` peer dependency from `^18.1.0` to `^21.0.0` ([#5611](https://github.com/MetaMask/core/pull/5611))
|
14
|
+
- Bump `@metamask/snaps-utils` dependency from `^8.10.0` to `^9.2.0` ([#5611](https://github.com/MetaMask/core/pull/5611))
|
15
|
+
- Bump `@metamask/snaps-sdk` dependency from `^6.17.1` to `^6.22.0` ([#5611](https://github.com/MetaMask/core/pull/5611))
|
16
|
+
|
10
17
|
## [27.0.0]
|
11
18
|
|
12
19
|
### Changed
|
@@ -222,10 +222,12 @@ class AccountsController extends base_controller_1.BaseController {
|
|
222
222
|
metadata: { ...account.metadata, ...metadata },
|
223
223
|
};
|
224
224
|
__classPrivateFieldGet(this, _AccountsController_instances, "m", _AccountsController_update).call(this, (state) => {
|
225
|
-
// FIXME:
|
226
|
-
//
|
227
|
-
//
|
228
|
-
|
225
|
+
// FIXME: Using the state as-is cause the following error: "Type instantiation is excessively
|
226
|
+
// deep and possibly infinite.ts(2589)" (https://github.com/MetaMask/utils/issues/168)
|
227
|
+
// Using a type-cast workaround this error and is slightly better than using a @ts-expect-error
|
228
|
+
// which sometimes fail when compiling locally.
|
229
|
+
state.internalAccounts.accounts[accountId] =
|
230
|
+
internalAccount;
|
229
231
|
});
|
230
232
|
if (metadata.name) {
|
231
233
|
this.messagingSystem.publish('AccountsController:accountRenamed', internalAccount);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AccountsController.cjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type ExtractEventPayload,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport {\n type SnapKeyringAccountAssetListUpdatedEvent,\n type SnapKeyringAccountBalancesUpdatedEvent,\n type SnapKeyringAccountTransactionsUpdatedEvent,\n SnapKeyring,\n} from '@metamask/eth-snap-keyring';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n} from '@metamask/keyring-api';\nimport {\n type KeyringControllerState,\n type KeyringControllerGetKeyringsByTypeAction,\n type KeyringControllerStateChangeEvent,\n type KeyringControllerGetStateAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n SnapControllerState,\n SnapStateChange,\n} from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport { type CaipChainId, isCaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\n\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport {\n getUUIDFromAddressOfNormalAccount,\n isNormalKeyringType,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountId = string;\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSetSelectedAccountAction = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountNameAction = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccountsAction = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerListMultichainAccountsAction = {\n type: `${typeof controllerName}:listMultichainAccounts`;\n handler: AccountsController['listMultichainAccounts'];\n};\n\nexport type AccountsControllerUpdateAccountsAction = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerGetSelectedAccountAction = {\n type: `${typeof controllerName}:getSelectedAccount`;\n handler: AccountsController['getSelectedAccount'];\n};\n\nexport type AccountsControllerGetSelectedMultichainAccountAction = {\n type: `${typeof controllerName}:getSelectedMultichainAccount`;\n handler: AccountsController['getSelectedMultichainAccount'];\n};\n\nexport type AccountsControllerGetAccountByAddressAction = {\n type: `${typeof controllerName}:getAccountByAddress`;\n handler: AccountsController['getAccountByAddress'];\n};\n\nexport type AccountsControllerGetNextAvailableAccountNameAction = {\n type: `${typeof controllerName}:getNextAvailableAccountName`;\n handler: AccountsController['getNextAvailableAccountName'];\n};\n\nexport type AccountsControllerGetAccountAction = {\n type: `${typeof controllerName}:getAccount`;\n handler: AccountsController['getAccount'];\n};\n\nexport type AccountsControllerUpdateAccountMetadataAction = {\n type: `${typeof controllerName}:updateAccountMetadata`;\n handler: AccountsController['updateAccountMetadata'];\n};\n\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccountAction\n | AccountsControllerListAccountsAction\n | AccountsControllerListMultichainAccountsAction\n | AccountsControllerSetAccountNameAction\n | AccountsControllerUpdateAccountsAction\n | AccountsControllerGetAccountByAddressAction\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetNextAvailableAccountNameAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedMultichainAccountAction\n | AccountsControllerUpdateAccountMetadataAction;\n\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\nexport type AllowedEvents =\n | SnapStateChange\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\nexport type AccountsControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n persist: true,\n anonymous: false,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n};\n\nexport const EMPTY_ACCOUNT = {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n scopes: [EthScope.Eoa],\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n importTime: 0,\n },\n};\n\n/**\n * Controller that manages internal accounts.\n * The accounts controller is responsible for creating and managing internal accounts.\n * It also provides convenience methods for accessing and updating the internal accounts.\n * The accounts controller also listens for keyring state changes and updates the internal accounts accordingly.\n * The accounts controller also listens for snap state changes and updates the internal accounts accordingly.\n *\n */\nexport class AccountsController extends BaseController<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n /**\n * Constructor for AccountsController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object, or undefined if the account does not exist.\n */\n getAccount(accountId: string): InternalAccount | undefined {\n return this.state.internalAccounts.accounts[accountId];\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n return accounts.filter((account) => isEvmAccountType(account.type));\n }\n\n /**\n * Returns an array of all internal accounts.\n *\n * @param chainId - The chain ID.\n * @returns An array of InternalAccount objects.\n */\n listMultichainAccounts(chainId?: CaipChainId): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n if (!chainId) {\n return accounts;\n }\n\n if (!isCaipChainId(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${String(chainId)}`);\n }\n\n return accounts.filter((account) =>\n isScopeEqualToAny(chainId, account.scopes),\n );\n }\n\n /**\n * Returns the internal account object for the given account ID.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object.\n * @throws An error if the account ID is not found.\n */\n getAccountExpect(accountId: string): InternalAccount {\n const account = this.getAccount(accountId);\n if (account === undefined) {\n throw new Error(`Account Id \"${accountId}\" not found`);\n }\n return account;\n }\n\n /**\n * Returns the last selected EVM account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n const account = this.getAccountExpect(selectedAccount);\n if (isEvmAccountType(account.type)) {\n return account;\n }\n\n const accounts = this.listAccounts();\n if (!accounts.length) {\n // ! Should never reach this.\n throw new Error('No EVM accounts');\n }\n\n // This will never be undefined because we have already checked if accounts.length is > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#getLastSelectedAccount(accounts)!;\n }\n\n /**\n * __WARNING The return value may be undefined if there isn't an account for that chain id.__\n *\n * Retrieves the last selected account by chain ID.\n *\n * @param chainId - The chain ID to filter the accounts.\n * @returns The last selected account compatible with the specified chain ID or undefined.\n */\n getSelectedMultichainAccount(\n chainId?: CaipChainId,\n ): InternalAccount | undefined {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n if (!chainId) {\n return this.getAccountExpect(selectedAccount);\n }\n\n const accounts = this.listMultichainAccounts(chainId);\n return this.#getLastSelectedAccount(accounts);\n }\n\n /**\n * Returns the account with the specified address.\n * ! This method will only return the first account that matches the address\n *\n * @param address - The address of the account to retrieve.\n * @returns The account with the specified address, or undefined if not found.\n */\n getAccountByAddress(address: string): InternalAccount | undefined {\n return this.listMultichainAccounts().find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n );\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @param accountId - The ID of the account to be selected.\n */\n setSelectedAccount(accountId: string): void {\n const account = this.getAccountExpect(accountId);\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n internalAccounts.accounts[account.id].metadata.lastSelected = Date.now();\n internalAccounts.selectedAccount = account.id;\n });\n }\n\n /**\n * Sets the name of the account with the given ID.\n *\n * @param accountId - The ID of the account to set the name for.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountName(accountId: string, accountName: string): void {\n // This will check for name uniqueness and fire the `accountRenamed` event\n // if the account has been renamed.\n this.updateAccountMetadata(accountId, {\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n });\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @param accountId - The ID of the account for which the metadata will be updated.\n * @param metadata - The new metadata for the account.\n */\n updateAccountMetadata(\n accountId: string,\n metadata: Partial<InternalAccount['metadata']>,\n ): void {\n const account = this.getAccountExpect(accountId);\n\n if (\n metadata.name &&\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === metadata.name &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n // FIXME: Do not remove this comment - This error is flaky: Comment out or restore the `ts-expect-error` directive below as needed.\n // See: https://github.com/MetaMask/utils/issues/168\n // // @ts-expect-error Known issue - `Json` causes recursive error in immer `Draft`/`WritableDraft` types\n state.internalAccounts.accounts[accountId] = internalAccount;\n });\n\n if (metadata.name) {\n this.messagingSystem.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n }\n\n /**\n * Updates the internal accounts list by retrieving normal and snap accounts,\n * removing duplicates, and updating the metadata of each account.\n *\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n const snapAccounts = await this.#listSnapAccounts();\n const normalAccounts = await this.#listNormalAccounts();\n\n // keyring type map.\n const keyringTypes = new Map<string, number>();\n const previousAccounts = this.state.internalAccounts.accounts;\n\n const accounts: Record<string, InternalAccount> = [\n ...normalAccounts,\n ...snapAccounts,\n ].reduce(\n (internalAccountMap, internalAccount) => {\n const keyringTypeName = keyringTypeToName(\n internalAccount.metadata.keyring.type,\n );\n const keyringAccountIndex = keyringTypes.get(keyringTypeName) ?? 0;\n if (keyringAccountIndex) {\n keyringTypes.set(keyringTypeName, keyringAccountIndex + 1);\n } else {\n keyringTypes.set(keyringTypeName, 1);\n }\n\n const existingAccount = previousAccounts[internalAccount.id];\n\n internalAccountMap[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n name:\n this.#populateExistingMetadata(existingAccount?.id, 'name') ??\n `${keyringTypeName} ${keyringAccountIndex + 1}`,\n importTime:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'importTime',\n ) ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'lastSelected',\n ) ?? 0,\n },\n };\n\n return internalAccountMap;\n },\n {} as Record<string, InternalAccount>,\n );\n\n this.#update((state) => {\n state.internalAccounts.accounts = accounts;\n });\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n this.update((currentState) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\n }\n\n /**\n * Generates an internal account for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param type - The type of the account.\n * @returns The generated internal account.\n */\n #generateInternalAccountForNonSnapAccount(\n address: string,\n type: string,\n ): InternalAccount {\n return {\n id: getUUIDFromAddressOfNormalAccount(address),\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n importTime: Date.now(),\n keyring: {\n type,\n },\n },\n };\n }\n\n /**\n * Get Snap keyring from the keyring controller.\n *\n * @returns The Snap keyring if available.\n */\n #getSnapKeyring(): SnapKeyring | undefined {\n const [snapKeyring] = this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n\n // Snap keyring is not available until the first account is created in the keyring\n // controller, so this might be undefined.\n return snapKeyring as SnapKeyring | undefined;\n }\n\n /**\n * Returns a list of internal accounts created using the SnapKeyring.\n *\n * @returns A promise that resolves to an array of InternalAccount objects.\n */\n async #listSnapAccounts(): Promise<InternalAccount[]> {\n const keyring = this.#getSnapKeyring();\n\n if (!keyring) {\n return [];\n }\n\n return keyring.listAccounts();\n }\n\n /**\n * Returns a list of normal accounts.\n * Note: listNormalAccounts is a temporary method until the keyrings all implement the InternalAccount interface.\n * Once all keyrings implement the InternalAccount interface, this method can be removed and getAccounts can be used instead.\n *\n * @returns A Promise that resolves to an array of InternalAccount objects.\n */\n async #listNormalAccounts(): Promise<InternalAccount[]> {\n const internalAccounts: InternalAccount[] = [];\n const { keyrings } = await this.messagingSystem.call(\n 'KeyringController:getState',\n );\n for (const keyring of keyrings) {\n const keyringType = keyring.type;\n if (!isNormalKeyringType(keyringType as KeyringTypes)) {\n // We only consider \"normal accounts\" here, so keep looping\n continue;\n }\n\n for (const address of keyring.accounts) {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n const nameLastUpdatedAt = this.#populateExistingMetadata(\n id,\n 'nameLastUpdatedAt',\n );\n\n internalAccounts.push({\n id,\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: this.#populateExistingMetadata(id, 'name') ?? '',\n ...(nameLastUpdatedAt && { nameLastUpdatedAt }),\n importTime:\n this.#populateExistingMetadata(id, 'importTime') ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(id, 'lastSelected') ?? 0,\n keyring: {\n type: keyringType,\n },\n },\n });\n }\n }\n\n return internalAccounts;\n }\n\n /**\n * Re-publish an account event.\n *\n * @param event - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A Snap keyring event type.\n */\n #handleOnSnapKeyringAccountEvent<\n EventType extends AccountsControllerEvents['type'],\n >(\n event: EventType,\n ...payload: ExtractEventPayload<AccountsControllerEvents, EventType>\n ): void {\n this.messagingSystem.publish(event, ...payload);\n }\n\n /**\n * Handles changes in the keyring state, specifically when new accounts are added or removed.\n *\n * @param keyringState - The new state of the keyring controller.\n * @param keyringState.isUnlocked - True if the keyrings are unlocked, false otherwise.\n * @param keyringState.keyrings - List of all keyrings.\n */\n #handleOnKeyringStateChange({\n isUnlocked,\n keyrings,\n }: KeyringControllerState): void {\n // TODO: Change when accountAdded event is added to the keyring controller.\n\n // We check for keyrings length to be greater than 0 because the extension client may try execute\n // submit password twice and clear the keyring state.\n // https://github.com/MetaMask/KeyringController/blob/2d73a4deed8d013913f6ef0c9f5c0bb7c614f7d3/src/KeyringController.ts#L910\n if (!isUnlocked || keyrings.length === 0) {\n return;\n }\n\n // State patches.\n const generatePatch = () => {\n return {\n previous: {} as Record<string, InternalAccount>,\n added: [] as {\n address: string;\n type: string;\n }[],\n updated: [] as InternalAccount[],\n removed: [] as InternalAccount[],\n };\n };\n const patches = {\n snap: generatePatch(),\n normal: generatePatch(),\n };\n\n // Gets the patch object based on the keyring type (since Snap accounts and other accounts\n // are handled differently).\n const patchOf = (type: string) => {\n if (type === KeyringTypes.snap) {\n return patches.snap;\n }\n return patches.normal;\n };\n\n // Create a map (with lower-cased addresses) of all existing accounts.\n for (const account of this.listMultichainAccounts()) {\n const address = account.address.toLowerCase();\n const patch = patchOf(account.metadata.keyring.type);\n\n patch.previous[address] = account;\n }\n\n // Go over all keyring changes and create patches out of it.\n const addresses = new Set<string>();\n for (const keyring of keyrings) {\n const patch = patchOf(keyring.type);\n\n for (const accountAddress of keyring.accounts) {\n // Lower-case address to use it in the `previous` map.\n const address = accountAddress.toLowerCase();\n const account = patch.previous[address];\n\n if (account) {\n // If the account exists before, this might be an update.\n patch.updated.push(account);\n } else {\n // Otherwise, that's a new account.\n patch.added.push({\n address,\n type: keyring.type,\n });\n }\n\n // Keep track of those address to check for removed accounts later.\n addresses.add(address);\n }\n }\n\n // We might have accounts associated with removed keyrings, so we iterate\n // over all previous known accounts and check against the keyring addresses.\n for (const patch of [patches.snap, patches.normal]) {\n for (const [address, account] of Object.entries(patch.previous)) {\n // If a previous address is not part of the new addesses, then it got removed.\n if (!addresses.has(address)) {\n patch.removed.push(account);\n }\n }\n }\n\n // Diff that we will use to publish events afterward.\n const diff = {\n removed: [] as string[],\n added: [] as InternalAccount[],\n };\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n for (const patch of [patches.snap, patches.normal]) {\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n\n diff.removed.push(account.id);\n }\n\n for (const added of patch.added) {\n const account = this.#getInternalAccountFromAddressAndType(\n added.address,\n added.type,\n );\n\n if (account) {\n // Re-compute the list of accounts everytime, so we can make sure new names\n // are also considered.\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get next account name available for this given keyring.\n const name = this.getNextAvailableAccountName(\n account.metadata.keyring.type,\n accounts,\n );\n\n // If it's the first account, we need to select it.\n const lastSelected =\n accounts.length === 0 ? this.#getLastSelectedIndex() : 0;\n\n internalAccounts.accounts[account.id] = {\n ...account,\n metadata: {\n ...account.metadata,\n name,\n importTime: Date.now(),\n lastSelected,\n },\n };\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n }\n });\n\n // Now publish events\n for (const id of diff.removed) {\n this.messagingSystem.publish('AccountsController:accountRemoved', id);\n }\n\n for (const account of diff.added) {\n this.messagingSystem.publish('AccountsController:accountAdded', account);\n }\n\n // NOTE: Since we also track \"updated\" accounts with our patches, we could fire a new event\n // like `accountUpdated` (we would still need to check if anything really changed on the account).\n }\n\n /**\n * Update the state and fixup the currently selected account.\n *\n * @param callback - Callback for updating state, passed a draft state object.\n */\n #update(callback: (state: WritableDraft<AccountsControllerState>) => void) {\n // The currently selected account might get deleted during the update, so keep track\n // of it before doing any change.\n const previouslySelectedAccount =\n this.state.internalAccounts.selectedAccount;\n\n this.update((state) => {\n callback(state);\n\n // If the account no longer exists (or none is selected), we need to re-select another one.\n const { internalAccounts } = state;\n if (!internalAccounts.accounts[previouslySelectedAccount]) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get the lastly selected account (according to the current accounts).\n const lastSelectedAccount = this.#getLastSelectedAccount(accounts);\n if (lastSelectedAccount) {\n internalAccounts.selectedAccount = lastSelectedAccount.id;\n internalAccounts.accounts[\n lastSelectedAccount.id\n ].metadata.lastSelected = this.#getLastSelectedIndex();\n } else {\n // It will be undefined if there are no accounts.\n internalAccounts.selectedAccount = '';\n }\n }\n });\n\n // Now, we compare the newly selected account, and we send event if different.\n const { selectedAccount } = this.state.internalAccounts;\n if (selectedAccount && selectedAccount !== previouslySelectedAccount) {\n const account = this.getSelectedMultichainAccount();\n\n // The account should always be defined at this point, since we have already checked for\n // `selectedAccount` to be non-empty.\n if (account) {\n if (isEvmAccountType(account.type)) {\n this.messagingSystem.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messagingSystem.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\n }\n }\n }\n\n /**\n * Handles the change in SnapControllerState by updating the metadata of accounts that have a snap enabled.\n *\n * @param snapState - The new SnapControllerState.\n */\n #handleOnSnapStateChange(snapState: SnapControllerState) {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listMultichainAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n const snapId = currentAccount.metadata.snap.id;\n const storedSnap: Snap = snaps[snapId as SnapId];\n if (storedSnap) {\n currentAccount.metadata.snap.enabled =\n storedSnap.enabled && !storedSnap.blocked;\n }\n }\n });\n });\n }\n\n /**\n * Returns the list of accounts for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Accounts to filter by keyring type.\n * @returns The list of accounts associcated with this keyring type.\n */\n #getAccountsByKeyringType(keyringType: string, accounts?: InternalAccount[]) {\n return (accounts ?? this.listMultichainAccounts()).filter(\n (internalAccount) => {\n // We do consider `hd` and `simple` keyrings to be of same type. So we check those 2 types\n // to group those accounts together!\n if (\n keyringType === KeyringTypes.hd ||\n keyringType === KeyringTypes.simple\n ) {\n return (\n internalAccount.metadata.keyring.type === KeyringTypes.hd ||\n internalAccount.metadata.keyring.type === KeyringTypes.simple\n );\n }\n\n return internalAccount.metadata.keyring.type === keyringType;\n },\n );\n }\n\n /**\n * Returns the last selected account from the given array of accounts.\n *\n * @param accounts - An array of InternalAccount objects.\n * @returns The InternalAccount object that was last selected, or undefined if the array is empty.\n */\n #getLastSelectedAccount(\n accounts: InternalAccount[],\n ): InternalAccount | undefined {\n const [accountToSelect] = accounts.sort((accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n });\n\n return accountToSelect;\n }\n\n /**\n * Returns the next account number for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Existing accounts to check for the next available account number.\n * @returns An object containing the account prefix and index to use.\n */\n getNextAvailableAccountName(\n keyringType: string = KeyringTypes.hd,\n accounts?: InternalAccount[],\n ): string {\n const keyringName = keyringTypeToName(keyringType);\n const keyringAccounts = this.#getAccountsByKeyringType(\n keyringType,\n accounts,\n );\n const lastDefaultIndexUsedForKeyringType = keyringAccounts.reduce(\n (maxInternalAccountIndex, internalAccount) => {\n // We **DO NOT USE** `\\d+` here to only consider valid \"human\"\n // number (rounded decimal number)\n const match = new RegExp(`${keyringName} ([0-9]+)$`, 'u').exec(\n internalAccount.metadata.name,\n );\n\n if (match) {\n // Quoting `RegExp.exec` documentation:\n // > The returned array has the matched text as the first item, and then one item for\n // > each capturing group of the matched text.\n // So use `match[1]` to get the captured value\n const internalAccountIndex = parseInt(match[1], 10);\n return Math.max(maxInternalAccountIndex, internalAccountIndex);\n }\n\n return maxInternalAccountIndex;\n },\n 0,\n );\n\n const index = Math.max(\n keyringAccounts.length + 1,\n lastDefaultIndexUsedForKeyringType + 1,\n );\n\n return `${keyringName} ${index}`;\n }\n\n /**\n * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex() {\n // NOTE: For now we use the current date, since we know this value\n // will always be higher than any already selected account index.\n return Date.now();\n }\n\n /**\n * Get an internal account given an address and a keyring type.\n *\n * If the account is not a Snap Keyring account, generates an internal account for it and adds it to the controller.\n * If the account is a Snap Keyring account, retrieves the account from the keyring and adds it to the controller.\n *\n * @param address - The address of the new account.\n * @param type - The keyring type of the new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n type: string,\n ): InternalAccount | undefined {\n if (type === KeyringTypes.snap) {\n const keyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!keyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return keyring.getAccountByAddress(address);\n }\n\n return this.#generateInternalAccountForNonSnapAccount(address, type);\n }\n\n /**\n * Handles the change in multichain network by updating the selected account.\n *\n * @param id - The EVM client ID or non-EVM chain ID that changed.\n */\n #handleOnMultichainNetworkDidChange(id: NetworkClientId | CaipChainId) {\n let accountId: string;\n\n // We only support non-EVM Caip chain IDs at the moment. Ex Solana and Bitcoin\n // MultichainNetworkController will handle throwing an error if the Caip chain ID is not supported\n if (isCaipChainId(id)) {\n // Update selected account to non evm account\n const lastSelectedNonEvmAccount = this.getSelectedMultichainAccount(id);\n // @ts-expect-error - This should never be undefined, otherwise it's a bug that should be handled\n accountId = lastSelectedNonEvmAccount.id;\n } else {\n // Update selected account to evm account\n const lastSelectedEvmAccount = this.getSelectedAccount();\n accountId = lastSelectedEvmAccount.id;\n }\n\n this.update((currentState) => {\n currentState.internalAccounts.accounts[accountId].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = accountId;\n });\n\n // DO NOT publish AccountsController:setSelectedAccount to prevent circular listener loops\n }\n\n /**\n * Retrieves the value of a specific metadata key for an existing account.\n *\n * @param accountId - The ID of the account.\n * @param metadataKey - The key of the metadata to retrieve.\n * @param account - The account object to retrieve the metadata key from.\n * @returns The value of the specified metadata key, or undefined if the account or metadata key does not exist.\n */\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n #populateExistingMetadata<T extends keyof InternalAccount['metadata']>(\n accountId: string,\n metadataKey: T,\n account?: InternalAccount,\n ): InternalAccount['metadata'][T] | undefined {\n const internalAccount = account ?? this.getAccount(accountId);\n return internalAccount ? internalAccount.metadata[metadataKey] : undefined;\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n (snapStateState) => this.#handleOnSnapStateChange(snapStateState),\n );\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n (keyringState) => this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountTransactionsUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountTransactionsUpdated',\n snapAccountEvent,\n ),\n );\n\n // Handle account change when multichain network is changed\n this.messagingSystem.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n\n /**\n * Registers message handlers for the AccountsController.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setSelectedAccount`,\n this.setSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listAccounts`,\n this.listAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listMultichainAccounts`,\n this.listMultichainAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedAccount`,\n this.getSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedMultichainAccount`,\n this.getSelectedMultichainAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getAccountByAddress`,\n this.getAccountByAddress.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getNextAvailableAccountName`,\n this.getNextAvailableAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:getAccount`,\n this.getAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:updateAccountMetadata`,\n this.updateAccountMetadata.bind(this),\n );\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"AccountsController.cjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":";;;;;;;;;AAAA,+DAMmC;AACnC,iEAKoC;AACpC,uDAK+B;AAC/B,qEAMsC;AAEtC,2DAA4D;AAQ5D,2CAAkE;AAIlE,uCAIiB;AAEjB,MAAM,cAAc,GAAG,oBAAoB,CAAC;AAiK5C,MAAM,0BAA0B,GAAG;IACjC,gBAAgB,EAAE;QAChB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,KAAK;KACjB;CACF,CAAC;AAEF,MAAM,YAAY,GAA4B;IAC5C,gBAAgB,EAAE;QAChB,QAAQ,EAAE,EAAE;QACZ,eAAe,EAAE,EAAE;KACpB;CACF,CAAC;AAEW,QAAA,aAAa,GAAG;IAC3B,EAAE,EAAE,EAAE;IACN,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,IAAI,EAAE,4BAAc,CAAC,GAAG;IACxB,MAAM,EAAE,CAAC,sBAAQ,CAAC,GAAG,CAAC;IACtB,QAAQ,EAAE;QACR,IAAI,EAAE,EAAE;QACR,OAAO,EAAE;YACP,IAAI,EAAE,EAAE;SACT;QACD,UAAU,EAAE,CAAC;KACd;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAa,kBAAmB,SAAQ,gCAIvC;IACC;;;;;;OAMG;IACH,YAAY,EACV,SAAS,EACT,KAAK,GAIN;QACC,KAAK,CAAC;YACJ,SAAS;YACT,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,0BAA0B;YACpC,KAAK,EAAE;gBACL,GAAG,YAAY;gBACf,GAAG,KAAK;aACT;SACF,CAAC,CAAC;;QAEH,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,CAA4B,CAAC;QACjC,uBAAA,IAAI,kFAAyB,MAA7B,IAAI,CAA2B,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,SAAiB;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACrE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED;;;;;OAKG;IACH,sBAAsB,CAAC,OAAqB;QAC1C,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,QAAQ,CAAC;SACjB;QAED,IAAI,CAAC,IAAA,qBAAa,EAAC,OAAO,CAAC,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;SAChE;QAED,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACjC,IAAA,iCAAiB,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAC3C,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,gBAAgB,CAAC,SAAiB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,SAAS,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,eAAe,SAAS,aAAa,CAAC,CAAC;SACxD;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,MAAM,EACJ,gBAAgB,EAAE,EAAE,eAAe,EAAE,GACtC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,wEAAwE;QACxE,uFAAuF;QACvF,IAAI,eAAe,KAAK,EAAE,EAAE;YAC1B,OAAO,qBAAa,CAAC;SACtB;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;QACvD,IAAI,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAClC,OAAO,OAAO,CAAC;SAChB;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACpB,6BAA6B;YAC7B,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;SACpC;QAED,yFAAyF;QACzF,oEAAoE;QACpE,OAAO,uBAAA,IAAI,iFAAwB,MAA5B,IAAI,EAAyB,QAAQ,CAAE,CAAC;IACjD,CAAC;IAED;;;;;;;OAOG;IACH,4BAA4B,CAC1B,OAAqB;QAErB,MAAM,EACJ,gBAAgB,EAAE,EAAE,eAAe,EAAE,GACtC,GAAG,IAAI,CAAC,KAAK,CAAC;QAEf,wEAAwE;QACxE,uFAAuF;QACvF,IAAI,eAAe,KAAK,EAAE,EAAE;YAC1B,OAAO,qBAAa,CAAC;SACtB;QAED,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;SAC/C;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACtD,OAAO,uBAAA,IAAI,iFAAwB,MAA5B,IAAI,EAAyB,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED;;;;;;OAMG;IACH,mBAAmB,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CACvC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC,WAAW,EAAE,CACrE,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,kBAAkB,CAAC,SAAiB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEjD,uBAAA,IAAI,iEAAQ,MAAZ,IAAI,EAAS,CAAC,KAAK,EAAE,EAAE;YACrB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;YAEnC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzE,gBAAgB,CAAC,eAAe,GAAG,OAAO,CAAC,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CAAC,SAAiB,EAAE,WAAmB;QACnD,0EAA0E;QAC1E,mCAAmC;QACnC,IAAI,CAAC,qBAAqB,CAAC,SAAS,EAAE;YACpC,IAAI,EAAE,WAAW;YACjB,iBAAiB,EAAE,IAAI,CAAC,GAAG,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,qBAAqB,CACnB,SAAiB,EACjB,QAA8C;QAE9C,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;QAEjD,IACE,QAAQ,CAAC,IAAI;YACb,IAAI,CAAC,sBAAsB,EAAE,CAAC,IAAI,CAChC,CAAC,eAAe,EAAE,EAAE,CAClB,eAAe,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;gBAC/C,eAAe,CAAC,EAAE,KAAK,SAAS,CACnC,EACD;YACA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;SAChD;QAED,MAAM,eAAe,GAAG;YACtB,GAAG,OAAO;YACV,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,QAAQ,EAAE;SAC/C,CAAC;QAEF,uBAAA,IAAI,iEAAQ,MAAZ,IAAI,EAAS,CAAC,KAAK,EAAE,EAAE;YACrB,6FAA6F;YAC7F,sFAAsF;YACtF,+FAA+F;YAC/F,+CAA+C;YAC9C,KAAiC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACrE,eAAe,CAAC;QACpB,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,EAAE;YACjB,IAAI,CAAC,eAAe,CAAC,OAAO,CAC1B,mCAAmC,EACnC,eAAe,CAChB,CAAC;SACH;IACH,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,YAAY,GAAG,MAAM,uBAAA,IAAI,2EAAkB,MAAtB,IAAI,CAAoB,CAAC;QACpD,MAAM,cAAc,GAAG,MAAM,uBAAA,IAAI,6EAAoB,MAAxB,IAAI,CAAsB,CAAC;QAExD,oBAAoB;QACpB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAE9D,MAAM,QAAQ,GAAoC;YAChD,GAAG,cAAc;YACjB,GAAG,YAAY;SAChB,CAAC,MAAM,CACN,CAAC,kBAAkB,EAAE,eAAe,EAAE,EAAE;YACtC,MAAM,eAAe,GAAG,IAAA,yBAAiB,EACvC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CACtC,CAAC;YACF,MAAM,mBAAmB,GAAG,YAAY,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnE,IAAI,mBAAmB,EAAE;gBACvB,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,mBAAmB,GAAG,CAAC,CAAC,CAAC;aAC5D;iBAAM;gBACL,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;aACtC;YAED,MAAM,eAAe,GAAG,gBAAgB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAE7D,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC,GAAG;gBACvC,GAAG,eAAe;gBAElB,QAAQ,EAAE;oBACR,GAAG,eAAe,CAAC,QAAQ;oBAC3B,IAAI,EACF,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EAA2B,eAAe,EAAE,EAAE,EAAE,MAAM,CAAC;wBAC3D,GAAG,eAAe,IAAI,mBAAmB,GAAG,CAAC,EAAE;oBACjD,UAAU,EACR,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EACF,eAAe,EAAE,EAAE,EACnB,YAAY,CACb,IAAI,IAAI,CAAC,GAAG,EAAE;oBACjB,YAAY,EACV,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EACF,eAAe,EAAE,EAAE,EACnB,cAAc,CACf,IAAI,CAAC;iBACT;aACF,CAAC;YAEF,OAAO,kBAAkB,CAAC;QAC5B,CAAC,EACD,EAAqC,CACtC,CAAC;QAEF,uBAAA,IAAI,iEAAQ,MAAZ,IAAI,EAAS,CAAC,KAAK,EAAE,EAAE;YACrB,KAAK,CAAC,gBAAgB,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,MAA+B;QACxC,IAAI,MAAM,CAAC,gBAAgB,EAAE;YAC3B,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;gBAC3B,YAAY,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;YAC1D,CAAC,CAAC,CAAC;SACJ;IACH,CAAC;IAmbD;;;;;;OAMG;IACH,2BAA2B,CACzB,cAAsB,iCAAY,CAAC,EAAE,EACrC,QAA4B;QAE5B,MAAM,WAAW,GAAG,IAAA,yBAAiB,EAAC,WAAW,CAAC,CAAC;QACnD,MAAM,eAAe,GAAG,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EAC1B,WAAW,EACX,QAAQ,CACT,CAAC;QACF,MAAM,kCAAkC,GAAG,eAAe,CAAC,MAAM,CAC/D,CAAC,uBAAuB,EAAE,eAAe,EAAE,EAAE;YAC3C,8DAA8D;YAC9D,kCAAkC;YAClC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,GAAG,WAAW,YAAY,EAAE,GAAG,CAAC,CAAC,IAAI,CAC5D,eAAe,CAAC,QAAQ,CAAC,IAAI,CAC9B,CAAC;YAEF,IAAI,KAAK,EAAE;gBACT,uCAAuC;gBACvC,qFAAqF;gBACrF,8CAA8C;gBAC9C,8CAA8C;gBAC9C,MAAM,oBAAoB,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpD,OAAO,IAAI,CAAC,GAAG,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,CAAC;aAChE;YAED,OAAO,uBAAuB,CAAC;QACjC,CAAC,EACD,CAAC,CACF,CAAC;QAEF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,eAAe,CAAC,MAAM,GAAG,CAAC,EAC1B,kCAAkC,GAAG,CAAC,CACvC,CAAC;QAEF,OAAO,GAAG,WAAW,IAAI,KAAK,EAAE,CAAC;IACnC,CAAC;CAsMF;AA99BD,gDA89BC;oLA3pBG,OAAe,EACf,IAAY;IAEZ,OAAO;QACL,EAAE,EAAE,IAAA,yCAAiC,EAAC,OAAO,CAAC;QAC9C,OAAO;QACP,OAAO,EAAE,EAAE;QACX,OAAO,EAAE;YACP,uBAAS,CAAC,YAAY;YACtB,uBAAS,CAAC,IAAI;YACd,uBAAS,CAAC,eAAe;YACzB,uBAAS,CAAC,eAAe;YACzB,uBAAS,CAAC,eAAe;YACzB,uBAAS,CAAC,eAAe;SAC1B;QACD,MAAM,EAAE,CAAC,sBAAQ,CAAC,GAAG,CAAC;QACtB,IAAI,EAAE,4BAAc,CAAC,GAAG;QACxB,QAAQ,EAAE;YACR,IAAI,EAAE,EAAE;YACR,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;YACtB,OAAO,EAAE;gBACP,IAAI;aACL;SACF;KACF,CAAC;AACJ,CAAC;IAQC,MAAM,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAC7C,qCAAqC,EACrC,8BAAW,CAAC,IAAI,CACjB,CAAC;IAEF,kFAAkF;IAClF,0CAA0C;IAC1C,OAAO,WAAsC,CAAC;AAChD,CAAC;AAED;;;;GAIG;AACH,KAAK;IACH,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAgB,MAApB,IAAI,CAAkB,CAAC;IAEvC,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,EAAE,CAAC;KACX;IAED,OAAO,OAAO,CAAC,YAAY,EAAE,CAAC;AAChC,CAAC;AAED;;;;;;GAMG;AACH,KAAK;IACH,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAC/C,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAClD,4BAA4B,CAC7B,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,IAAA,2BAAmB,EAAC,WAA2B,CAAC,EAAE;YACrD,2DAA2D;YAC3D,SAAS;SACV;QAED,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE;YACtC,MAAM,EAAE,GAAG,IAAA,yCAAiC,EAAC,OAAO,CAAC,CAAC;YAEtD,MAAM,iBAAiB,GAAG,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EAC5B,EAAE,EACF,mBAAmB,CACpB,CAAC;YAEF,gBAAgB,CAAC,IAAI,CAAC;gBACpB,EAAE;gBACF,OAAO;gBACP,OAAO,EAAE,EAAE;gBACX,OAAO,EAAE;oBACP,uBAAS,CAAC,YAAY;oBACtB,uBAAS,CAAC,IAAI;oBACd,uBAAS,CAAC,eAAe;oBACzB,uBAAS,CAAC,eAAe;oBACzB,uBAAS,CAAC,eAAe;oBACzB,uBAAS,CAAC,eAAe;iBAC1B;gBACD,MAAM,EAAE,CAAC,sBAAQ,CAAC,GAAG,CAAC;gBACtB,IAAI,EAAE,4BAAc,CAAC,GAAG;gBACxB,QAAQ,EAAE;oBACR,IAAI,EAAE,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EAA2B,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE;oBACtD,GAAG,CAAC,iBAAiB,IAAI,EAAE,iBAAiB,EAAE,CAAC;oBAC/C,UAAU,EACR,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EAA2B,EAAE,EAAE,YAAY,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE;oBAChE,YAAY,EACV,uBAAA,IAAI,mFAA0B,MAA9B,IAAI,EAA2B,EAAE,EAAE,cAAc,CAAC,IAAI,CAAC;oBACzD,OAAO,EAAE;wBACP,IAAI,EAAE,WAAW;qBAClB;iBACF;aACF,CAAC,CAAC;SACJ;KACF;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC,qHAaC,KAAgB,EAChB,GAAG,OAAiE;IAEpE,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;AAClD,CAAC,2GAS2B,EAC1B,UAAU,EACV,QAAQ,GACe;IACvB,2EAA2E;IAE3E,iGAAiG;IACjG,qDAAqD;IACrD,4HAA4H;IAC5H,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACxC,OAAO;KACR;IAED,iBAAiB;IACjB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,OAAO;YACL,QAAQ,EAAE,EAAqC;YAC/C,KAAK,EAAE,EAGJ;YACH,OAAO,EAAE,EAAuB;YAChC,OAAO,EAAE,EAAuB;SACjC,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,aAAa,EAAE;QACrB,MAAM,EAAE,aAAa,EAAE;KACxB,CAAC;IAEF,0FAA0F;IAC1F,4BAA4B;IAC5B,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAE;QAC/B,IAAI,IAAI,KAAK,iCAAY,CAAC,IAAI,EAAE;YAC9B,OAAO,OAAO,CAAC,IAAI,CAAC;SACrB;QACD,OAAO,OAAO,CAAC,MAAM,CAAC;IACxB,CAAC,CAAC;IAEF,sEAAsE;IACtE,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,sBAAsB,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAErD,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;KACnC;IAED,4DAA4D;IAC5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;IACpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEpC,KAAK,MAAM,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE;YAC7C,sDAAsD;YACtD,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAExC,IAAI,OAAO,EAAE;gBACX,yDAAyD;gBACzD,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC7B;iBAAM;gBACL,mCAAmC;gBACnC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;oBACf,OAAO;oBACP,IAAI,EAAE,OAAO,CAAC,IAAI;iBACnB,CAAC,CAAC;aACJ;YAED,mEAAmE;YACnE,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SACxB;KACF;IAED,yEAAyE;IACzE,4EAA4E;IAC5E,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;QAClD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;YAC/D,8EAA8E;YAC9E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBAC3B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aAC7B;SACF;KACF;IAED,qDAAqD;IACrD,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,EAAc;QACvB,KAAK,EAAE,EAAuB;KAC/B,CAAC;IAEF,uBAAA,IAAI,iEAAQ,MAAZ,IAAI,EAAS,CAAC,KAAK,EAAE,EAAE;QACrB,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;QAEnC,KAAK,MAAM,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;YAClD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;gBACnC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAE7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;aAC/B;YAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;gBAC/B,MAAM,OAAO,GAAG,uBAAA,IAAI,+FAAsC,MAA1C,IAAI,EAClB,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,IAAI,CACX,CAAC;gBAEF,IAAI,OAAO,EAAE;oBACX,2EAA2E;oBAC3E,uBAAuB;oBACvB,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,gBAAgB,CAAC,QAAQ,CACL,CAAC;oBAEvB,0DAA0D;oBAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,2BAA2B,CAC3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAC7B,QAAQ,CACT,CAAC;oBAEF,mDAAmD;oBACnD,MAAM,YAAY,GAChB,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,uBAAA,IAAI,+EAAsB,MAA1B,IAAI,CAAwB,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE3D,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;wBACtC,GAAG,OAAO;wBACV,QAAQ,EAAE;4BACR,GAAG,OAAO,CAAC,QAAQ;4BACnB,IAAI;4BACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;4BACtB,YAAY;yBACb;qBACF,CAAC;oBAEF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;iBACxD;aACF;SACF;IACH,CAAC,CAAC,CAAC;IAEH,qBAAqB;IACrB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE;QAC7B,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,mCAAmC,EAAE,EAAE,CAAC,CAAC;KACvE;IAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE;QAChC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;KAC1E;IAED,2FAA2F;IAC3F,kGAAkG;AACpG,CAAC,mEAOO,QAAiE;IACvE,oFAAoF;IACpF,iCAAiC;IACjC,MAAM,yBAAyB,GAC7B,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,eAAe,CAAC;IAE9C,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACpB,QAAQ,CAAC,KAAK,CAAC,CAAC;QAEhB,2FAA2F;QAC3F,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;QACnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,yBAAyB,CAAC,EAAE;YACzD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAC5B,gBAAgB,CAAC,QAAQ,CACL,CAAC;YAEvB,uEAAuE;YACvE,MAAM,mBAAmB,GAAG,uBAAA,IAAI,iFAAwB,MAA5B,IAAI,EAAyB,QAAQ,CAAC,CAAC;YACnE,IAAI,mBAAmB,EAAE;gBACvB,gBAAgB,CAAC,eAAe,GAAG,mBAAmB,CAAC,EAAE,CAAC;gBAC1D,gBAAgB,CAAC,QAAQ,CACvB,mBAAmB,CAAC,EAAE,CACvB,CAAC,QAAQ,CAAC,YAAY,GAAG,uBAAA,IAAI,+EAAsB,MAA1B,IAAI,CAAwB,CAAC;aACxD;iBAAM;gBACL,iDAAiD;gBACjD,gBAAgB,CAAC,eAAe,GAAG,EAAE,CAAC;aACvC;SACF;IACH,CAAC,CAAC,CAAC;IAEH,8EAA8E;IAC9E,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACxD,IAAI,eAAe,IAAI,eAAe,KAAK,yBAAyB,EAAE;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,4BAA4B,EAAE,CAAC;QAEpD,wFAAwF;QACxF,qCAAqC;QACrC,IAAI,OAAO,EAAE;YACX,IAAI,IAAA,8BAAgB,EAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAClC,IAAI,CAAC,eAAe,CAAC,OAAO,CAC1B,6CAA6C,EAC7C,OAAO,CACR,CAAC;aACH;YACD,IAAI,CAAC,eAAe,CAAC,OAAO,CAC1B,0CAA0C,EAC1C,OAAO,CACR,CAAC;SACH;KACF;AACH,CAAC,qGAOwB,SAA8B;IACrD,wCAAwC;IACxC,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,MAAM,CACnD,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CACnC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;QAC3B,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC3B,MAAM,cAAc,GAClB,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACrD,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAChC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAS,KAAK,CAAC,MAAgB,CAAC,CAAC;gBACjD,IAAI,UAAU,EAAE;oBACd,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO;wBAClC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;iBAC7C;aACF;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,uGASyB,WAAmB,EAAE,QAA4B;IACzE,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,MAAM,CACvD,CAAC,eAAe,EAAE,EAAE;QAClB,0FAA0F;QAC1F,oCAAoC;QACpC,IACE,WAAW,KAAK,iCAAY,CAAC,EAAE;YAC/B,WAAW,KAAK,iCAAY,CAAC,MAAM,EACnC;YACA,OAAO,CACL,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,iCAAY,CAAC,EAAE;gBACzD,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,iCAAY,CAAC,MAAM,CAC9D,CAAC;SACH;QAED,OAAO,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;IAC/D,CAAC,CACF,CAAC;AACJ,CAAC,mGASC,QAA2B;IAE3B,MAAM,CAAC,eAAe,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE;QAC7D,kCAAkC;QAClC,OAAO,CACL,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC;YACrC,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,IAAI,CAAC,CAAC,CACtC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,eAAe,CAAC;AACzB,CAAC;IAsDC,kEAAkE;IAClE,iEAAiE;IACjE,OAAO,IAAI,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC,+HAaC,OAAe,EACf,IAAY;IAEZ,IAAI,IAAI,KAAK,iCAAY,CAAC,IAAI,EAAE;QAC9B,MAAM,OAAO,GAAG,uBAAA,IAAI,yEAAgB,MAApB,IAAI,CAAkB,CAAC;QAEvC,qEAAqE;QACrE,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,SAAS,CAAC;SAClB;QAED,iEAAiE;QACjE,uBAAuB;QACvB,OAAO,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;KAC7C;IAED,OAAO,uBAAA,IAAI,mGAA0C,MAA9C,IAAI,EAA2C,OAAO,EAAE,IAAI,CAAC,CAAC;AACvE,CAAC,2HAOmC,EAAiC;IACnE,IAAI,SAAiB,CAAC;IAEtB,8EAA8E;IAC9E,kGAAkG;IAClG,IAAI,IAAA,qBAAa,EAAC,EAAE,CAAC,EAAE;QACrB,6CAA6C;QAC7C,MAAM,yBAAyB,GAAG,IAAI,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC;QACxE,iGAAiG;QACjG,SAAS,GAAG,yBAAyB,CAAC,EAAE,CAAC;KAC1C;SAAM;QACL,yCAAyC;QACzC,MAAM,sBAAsB,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzD,SAAS,GAAG,sBAAsB,CAAC,EAAE,CAAC;KACvC;IAED,IAAI,CAAC,MAAM,CAAC,CAAC,YAAY,EAAE,EAAE;QAC3B,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,YAAY;YACrE,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,YAAY,CAAC,gBAAgB,CAAC,eAAe,GAAG,SAAS,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,0FAA0F;AAC5F,CAAC,uGAYC,SAAiB,EACjB,WAAc,EACd,OAAyB;IAEzB,MAAM,eAAe,GAAG,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC9D,OAAO,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC;IAMC,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,4BAA4B,EAC5B,CAAC,cAAc,EAAE,EAAE,CAAC,uBAAA,IAAI,kFAAyB,MAA7B,IAAI,EAA0B,cAAc,CAAC,CAClE,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,+BAA+B,EAC/B,CAAC,YAAY,EAAE,EAAE,CAAC,uBAAA,IAAI,qFAA4B,MAAhC,IAAI,EAA6B,YAAY,CAAC,CACjE,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,qCAAqC,EACrC,CAAC,gBAAgB,EAAE,EAAE,CACnB,uBAAA,IAAI,0FAAiC,MAArC,IAAI,EACF,4CAA4C,EAC5C,gBAAgB,CACjB,CACJ,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,oCAAoC,EACpC,CAAC,gBAAgB,EAAE,EAAE,CACnB,uBAAA,IAAI,0FAAiC,MAArC,IAAI,EACF,2CAA2C,EAC3C,gBAAgB,CACjB,CACJ,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,wCAAwC,EACxC,CAAC,gBAAgB,EAAE,EAAE,CACnB,uBAAA,IAAI,0FAAiC,MAArC,IAAI,EACF,+CAA+C,EAC/C,gBAAgB,CACjB,CACJ,CAAC;IAEF,2DAA2D;IAC3D,IAAI,CAAC,eAAe,CAAC,SAAS,CAC5B,8CAA8C,EAC9C,CAAC,EAAE,EAAE,EAAE,CAAC,uBAAA,IAAI,6FAAoC,MAAxC,IAAI,EAAqC,EAAE,CAAC,CACrD,CAAC;AACJ,CAAC;IAMC,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,qBAAqB,EACtC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CACnC,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,eAAe,EAChC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7B,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,yBAAyB,EAC1C,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CACvC,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,iBAAiB,EAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,iBAAiB,EAClC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAC/B,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,qBAAqB,EACtC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CACnC,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,+BAA+B,EAChD,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC7C,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,sBAAsB,EACvC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CACpC,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,GAAG,cAAc,8BAA8B,EAC/C,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC5C,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,+BAA+B,EAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3B,CAAC;IAEF,IAAI,CAAC,eAAe,CAAC,qBAAqB,CACxC,0CAA0C,EAC1C,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CACtC,CAAC;AACJ,CAAC","sourcesContent":["import {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type ExtractEventPayload,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport {\n type SnapKeyringAccountAssetListUpdatedEvent,\n type SnapKeyringAccountBalancesUpdatedEvent,\n type SnapKeyringAccountTransactionsUpdatedEvent,\n SnapKeyring,\n} from '@metamask/eth-snap-keyring';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n} from '@metamask/keyring-api';\nimport {\n type KeyringControllerState,\n type KeyringControllerGetKeyringsByTypeAction,\n type KeyringControllerStateChangeEvent,\n type KeyringControllerGetStateAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n SnapControllerState,\n SnapStateChange,\n} from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport { type CaipChainId, isCaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\n\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport {\n getUUIDFromAddressOfNormalAccount,\n isNormalKeyringType,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountId = string;\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSetSelectedAccountAction = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountNameAction = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccountsAction = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerListMultichainAccountsAction = {\n type: `${typeof controllerName}:listMultichainAccounts`;\n handler: AccountsController['listMultichainAccounts'];\n};\n\nexport type AccountsControllerUpdateAccountsAction = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerGetSelectedAccountAction = {\n type: `${typeof controllerName}:getSelectedAccount`;\n handler: AccountsController['getSelectedAccount'];\n};\n\nexport type AccountsControllerGetSelectedMultichainAccountAction = {\n type: `${typeof controllerName}:getSelectedMultichainAccount`;\n handler: AccountsController['getSelectedMultichainAccount'];\n};\n\nexport type AccountsControllerGetAccountByAddressAction = {\n type: `${typeof controllerName}:getAccountByAddress`;\n handler: AccountsController['getAccountByAddress'];\n};\n\nexport type AccountsControllerGetNextAvailableAccountNameAction = {\n type: `${typeof controllerName}:getNextAvailableAccountName`;\n handler: AccountsController['getNextAvailableAccountName'];\n};\n\nexport type AccountsControllerGetAccountAction = {\n type: `${typeof controllerName}:getAccount`;\n handler: AccountsController['getAccount'];\n};\n\nexport type AccountsControllerUpdateAccountMetadataAction = {\n type: `${typeof controllerName}:updateAccountMetadata`;\n handler: AccountsController['updateAccountMetadata'];\n};\n\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccountAction\n | AccountsControllerListAccountsAction\n | AccountsControllerListMultichainAccountsAction\n | AccountsControllerSetAccountNameAction\n | AccountsControllerUpdateAccountsAction\n | AccountsControllerGetAccountByAddressAction\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetNextAvailableAccountNameAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedMultichainAccountAction\n | AccountsControllerUpdateAccountMetadataAction;\n\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\nexport type AllowedEvents =\n | SnapStateChange\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\nexport type AccountsControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n persist: true,\n anonymous: false,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n};\n\nexport const EMPTY_ACCOUNT = {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n scopes: [EthScope.Eoa],\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n importTime: 0,\n },\n};\n\n/**\n * Controller that manages internal accounts.\n * The accounts controller is responsible for creating and managing internal accounts.\n * It also provides convenience methods for accessing and updating the internal accounts.\n * The accounts controller also listens for keyring state changes and updates the internal accounts accordingly.\n * The accounts controller also listens for snap state changes and updates the internal accounts accordingly.\n *\n */\nexport class AccountsController extends BaseController<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n /**\n * Constructor for AccountsController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object, or undefined if the account does not exist.\n */\n getAccount(accountId: string): InternalAccount | undefined {\n return this.state.internalAccounts.accounts[accountId];\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n return accounts.filter((account) => isEvmAccountType(account.type));\n }\n\n /**\n * Returns an array of all internal accounts.\n *\n * @param chainId - The chain ID.\n * @returns An array of InternalAccount objects.\n */\n listMultichainAccounts(chainId?: CaipChainId): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n if (!chainId) {\n return accounts;\n }\n\n if (!isCaipChainId(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${String(chainId)}`);\n }\n\n return accounts.filter((account) =>\n isScopeEqualToAny(chainId, account.scopes),\n );\n }\n\n /**\n * Returns the internal account object for the given account ID.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object.\n * @throws An error if the account ID is not found.\n */\n getAccountExpect(accountId: string): InternalAccount {\n const account = this.getAccount(accountId);\n if (account === undefined) {\n throw new Error(`Account Id \"${accountId}\" not found`);\n }\n return account;\n }\n\n /**\n * Returns the last selected EVM account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n const account = this.getAccountExpect(selectedAccount);\n if (isEvmAccountType(account.type)) {\n return account;\n }\n\n const accounts = this.listAccounts();\n if (!accounts.length) {\n // ! Should never reach this.\n throw new Error('No EVM accounts');\n }\n\n // This will never be undefined because we have already checked if accounts.length is > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#getLastSelectedAccount(accounts)!;\n }\n\n /**\n * __WARNING The return value may be undefined if there isn't an account for that chain id.__\n *\n * Retrieves the last selected account by chain ID.\n *\n * @param chainId - The chain ID to filter the accounts.\n * @returns The last selected account compatible with the specified chain ID or undefined.\n */\n getSelectedMultichainAccount(\n chainId?: CaipChainId,\n ): InternalAccount | undefined {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n if (!chainId) {\n return this.getAccountExpect(selectedAccount);\n }\n\n const accounts = this.listMultichainAccounts(chainId);\n return this.#getLastSelectedAccount(accounts);\n }\n\n /**\n * Returns the account with the specified address.\n * ! This method will only return the first account that matches the address\n *\n * @param address - The address of the account to retrieve.\n * @returns The account with the specified address, or undefined if not found.\n */\n getAccountByAddress(address: string): InternalAccount | undefined {\n return this.listMultichainAccounts().find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n );\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @param accountId - The ID of the account to be selected.\n */\n setSelectedAccount(accountId: string): void {\n const account = this.getAccountExpect(accountId);\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n internalAccounts.accounts[account.id].metadata.lastSelected = Date.now();\n internalAccounts.selectedAccount = account.id;\n });\n }\n\n /**\n * Sets the name of the account with the given ID.\n *\n * @param accountId - The ID of the account to set the name for.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountName(accountId: string, accountName: string): void {\n // This will check for name uniqueness and fire the `accountRenamed` event\n // if the account has been renamed.\n this.updateAccountMetadata(accountId, {\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n });\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @param accountId - The ID of the account for which the metadata will be updated.\n * @param metadata - The new metadata for the account.\n */\n updateAccountMetadata(\n accountId: string,\n metadata: Partial<InternalAccount['metadata']>,\n ): void {\n const account = this.getAccountExpect(accountId);\n\n if (\n metadata.name &&\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === metadata.name &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n // FIXME: Using the state as-is cause the following error: \"Type instantiation is excessively\n // deep and possibly infinite.ts(2589)\" (https://github.com/MetaMask/utils/issues/168)\n // Using a type-cast workaround this error and is slightly better than using a @ts-expect-error\n // which sometimes fail when compiling locally.\n (state as AccountsControllerState).internalAccounts.accounts[accountId] =\n internalAccount;\n });\n\n if (metadata.name) {\n this.messagingSystem.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n }\n\n /**\n * Updates the internal accounts list by retrieving normal and snap accounts,\n * removing duplicates, and updating the metadata of each account.\n *\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n const snapAccounts = await this.#listSnapAccounts();\n const normalAccounts = await this.#listNormalAccounts();\n\n // keyring type map.\n const keyringTypes = new Map<string, number>();\n const previousAccounts = this.state.internalAccounts.accounts;\n\n const accounts: Record<string, InternalAccount> = [\n ...normalAccounts,\n ...snapAccounts,\n ].reduce(\n (internalAccountMap, internalAccount) => {\n const keyringTypeName = keyringTypeToName(\n internalAccount.metadata.keyring.type,\n );\n const keyringAccountIndex = keyringTypes.get(keyringTypeName) ?? 0;\n if (keyringAccountIndex) {\n keyringTypes.set(keyringTypeName, keyringAccountIndex + 1);\n } else {\n keyringTypes.set(keyringTypeName, 1);\n }\n\n const existingAccount = previousAccounts[internalAccount.id];\n\n internalAccountMap[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n name:\n this.#populateExistingMetadata(existingAccount?.id, 'name') ??\n `${keyringTypeName} ${keyringAccountIndex + 1}`,\n importTime:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'importTime',\n ) ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'lastSelected',\n ) ?? 0,\n },\n };\n\n return internalAccountMap;\n },\n {} as Record<string, InternalAccount>,\n );\n\n this.#update((state) => {\n state.internalAccounts.accounts = accounts;\n });\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n this.update((currentState) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\n }\n\n /**\n * Generates an internal account for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param type - The type of the account.\n * @returns The generated internal account.\n */\n #generateInternalAccountForNonSnapAccount(\n address: string,\n type: string,\n ): InternalAccount {\n return {\n id: getUUIDFromAddressOfNormalAccount(address),\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n importTime: Date.now(),\n keyring: {\n type,\n },\n },\n };\n }\n\n /**\n * Get Snap keyring from the keyring controller.\n *\n * @returns The Snap keyring if available.\n */\n #getSnapKeyring(): SnapKeyring | undefined {\n const [snapKeyring] = this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n\n // Snap keyring is not available until the first account is created in the keyring\n // controller, so this might be undefined.\n return snapKeyring as SnapKeyring | undefined;\n }\n\n /**\n * Returns a list of internal accounts created using the SnapKeyring.\n *\n * @returns A promise that resolves to an array of InternalAccount objects.\n */\n async #listSnapAccounts(): Promise<InternalAccount[]> {\n const keyring = this.#getSnapKeyring();\n\n if (!keyring) {\n return [];\n }\n\n return keyring.listAccounts();\n }\n\n /**\n * Returns a list of normal accounts.\n * Note: listNormalAccounts is a temporary method until the keyrings all implement the InternalAccount interface.\n * Once all keyrings implement the InternalAccount interface, this method can be removed and getAccounts can be used instead.\n *\n * @returns A Promise that resolves to an array of InternalAccount objects.\n */\n async #listNormalAccounts(): Promise<InternalAccount[]> {\n const internalAccounts: InternalAccount[] = [];\n const { keyrings } = await this.messagingSystem.call(\n 'KeyringController:getState',\n );\n for (const keyring of keyrings) {\n const keyringType = keyring.type;\n if (!isNormalKeyringType(keyringType as KeyringTypes)) {\n // We only consider \"normal accounts\" here, so keep looping\n continue;\n }\n\n for (const address of keyring.accounts) {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n const nameLastUpdatedAt = this.#populateExistingMetadata(\n id,\n 'nameLastUpdatedAt',\n );\n\n internalAccounts.push({\n id,\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: this.#populateExistingMetadata(id, 'name') ?? '',\n ...(nameLastUpdatedAt && { nameLastUpdatedAt }),\n importTime:\n this.#populateExistingMetadata(id, 'importTime') ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(id, 'lastSelected') ?? 0,\n keyring: {\n type: keyringType,\n },\n },\n });\n }\n }\n\n return internalAccounts;\n }\n\n /**\n * Re-publish an account event.\n *\n * @param event - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A Snap keyring event type.\n */\n #handleOnSnapKeyringAccountEvent<\n EventType extends AccountsControllerEvents['type'],\n >(\n event: EventType,\n ...payload: ExtractEventPayload<AccountsControllerEvents, EventType>\n ): void {\n this.messagingSystem.publish(event, ...payload);\n }\n\n /**\n * Handles changes in the keyring state, specifically when new accounts are added or removed.\n *\n * @param keyringState - The new state of the keyring controller.\n * @param keyringState.isUnlocked - True if the keyrings are unlocked, false otherwise.\n * @param keyringState.keyrings - List of all keyrings.\n */\n #handleOnKeyringStateChange({\n isUnlocked,\n keyrings,\n }: KeyringControllerState): void {\n // TODO: Change when accountAdded event is added to the keyring controller.\n\n // We check for keyrings length to be greater than 0 because the extension client may try execute\n // submit password twice and clear the keyring state.\n // https://github.com/MetaMask/KeyringController/blob/2d73a4deed8d013913f6ef0c9f5c0bb7c614f7d3/src/KeyringController.ts#L910\n if (!isUnlocked || keyrings.length === 0) {\n return;\n }\n\n // State patches.\n const generatePatch = () => {\n return {\n previous: {} as Record<string, InternalAccount>,\n added: [] as {\n address: string;\n type: string;\n }[],\n updated: [] as InternalAccount[],\n removed: [] as InternalAccount[],\n };\n };\n const patches = {\n snap: generatePatch(),\n normal: generatePatch(),\n };\n\n // Gets the patch object based on the keyring type (since Snap accounts and other accounts\n // are handled differently).\n const patchOf = (type: string) => {\n if (type === KeyringTypes.snap) {\n return patches.snap;\n }\n return patches.normal;\n };\n\n // Create a map (with lower-cased addresses) of all existing accounts.\n for (const account of this.listMultichainAccounts()) {\n const address = account.address.toLowerCase();\n const patch = patchOf(account.metadata.keyring.type);\n\n patch.previous[address] = account;\n }\n\n // Go over all keyring changes and create patches out of it.\n const addresses = new Set<string>();\n for (const keyring of keyrings) {\n const patch = patchOf(keyring.type);\n\n for (const accountAddress of keyring.accounts) {\n // Lower-case address to use it in the `previous` map.\n const address = accountAddress.toLowerCase();\n const account = patch.previous[address];\n\n if (account) {\n // If the account exists before, this might be an update.\n patch.updated.push(account);\n } else {\n // Otherwise, that's a new account.\n patch.added.push({\n address,\n type: keyring.type,\n });\n }\n\n // Keep track of those address to check for removed accounts later.\n addresses.add(address);\n }\n }\n\n // We might have accounts associated with removed keyrings, so we iterate\n // over all previous known accounts and check against the keyring addresses.\n for (const patch of [patches.snap, patches.normal]) {\n for (const [address, account] of Object.entries(patch.previous)) {\n // If a previous address is not part of the new addesses, then it got removed.\n if (!addresses.has(address)) {\n patch.removed.push(account);\n }\n }\n }\n\n // Diff that we will use to publish events afterward.\n const diff = {\n removed: [] as string[],\n added: [] as InternalAccount[],\n };\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n for (const patch of [patches.snap, patches.normal]) {\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n\n diff.removed.push(account.id);\n }\n\n for (const added of patch.added) {\n const account = this.#getInternalAccountFromAddressAndType(\n added.address,\n added.type,\n );\n\n if (account) {\n // Re-compute the list of accounts everytime, so we can make sure new names\n // are also considered.\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get next account name available for this given keyring.\n const name = this.getNextAvailableAccountName(\n account.metadata.keyring.type,\n accounts,\n );\n\n // If it's the first account, we need to select it.\n const lastSelected =\n accounts.length === 0 ? this.#getLastSelectedIndex() : 0;\n\n internalAccounts.accounts[account.id] = {\n ...account,\n metadata: {\n ...account.metadata,\n name,\n importTime: Date.now(),\n lastSelected,\n },\n };\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n }\n });\n\n // Now publish events\n for (const id of diff.removed) {\n this.messagingSystem.publish('AccountsController:accountRemoved', id);\n }\n\n for (const account of diff.added) {\n this.messagingSystem.publish('AccountsController:accountAdded', account);\n }\n\n // NOTE: Since we also track \"updated\" accounts with our patches, we could fire a new event\n // like `accountUpdated` (we would still need to check if anything really changed on the account).\n }\n\n /**\n * Update the state and fixup the currently selected account.\n *\n * @param callback - Callback for updating state, passed a draft state object.\n */\n #update(callback: (state: WritableDraft<AccountsControllerState>) => void) {\n // The currently selected account might get deleted during the update, so keep track\n // of it before doing any change.\n const previouslySelectedAccount =\n this.state.internalAccounts.selectedAccount;\n\n this.update((state) => {\n callback(state);\n\n // If the account no longer exists (or none is selected), we need to re-select another one.\n const { internalAccounts } = state;\n if (!internalAccounts.accounts[previouslySelectedAccount]) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get the lastly selected account (according to the current accounts).\n const lastSelectedAccount = this.#getLastSelectedAccount(accounts);\n if (lastSelectedAccount) {\n internalAccounts.selectedAccount = lastSelectedAccount.id;\n internalAccounts.accounts[\n lastSelectedAccount.id\n ].metadata.lastSelected = this.#getLastSelectedIndex();\n } else {\n // It will be undefined if there are no accounts.\n internalAccounts.selectedAccount = '';\n }\n }\n });\n\n // Now, we compare the newly selected account, and we send event if different.\n const { selectedAccount } = this.state.internalAccounts;\n if (selectedAccount && selectedAccount !== previouslySelectedAccount) {\n const account = this.getSelectedMultichainAccount();\n\n // The account should always be defined at this point, since we have already checked for\n // `selectedAccount` to be non-empty.\n if (account) {\n if (isEvmAccountType(account.type)) {\n this.messagingSystem.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messagingSystem.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\n }\n }\n }\n\n /**\n * Handles the change in SnapControllerState by updating the metadata of accounts that have a snap enabled.\n *\n * @param snapState - The new SnapControllerState.\n */\n #handleOnSnapStateChange(snapState: SnapControllerState) {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listMultichainAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n const snapId = currentAccount.metadata.snap.id;\n const storedSnap: Snap = snaps[snapId as SnapId];\n if (storedSnap) {\n currentAccount.metadata.snap.enabled =\n storedSnap.enabled && !storedSnap.blocked;\n }\n }\n });\n });\n }\n\n /**\n * Returns the list of accounts for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Accounts to filter by keyring type.\n * @returns The list of accounts associcated with this keyring type.\n */\n #getAccountsByKeyringType(keyringType: string, accounts?: InternalAccount[]) {\n return (accounts ?? this.listMultichainAccounts()).filter(\n (internalAccount) => {\n // We do consider `hd` and `simple` keyrings to be of same type. So we check those 2 types\n // to group those accounts together!\n if (\n keyringType === KeyringTypes.hd ||\n keyringType === KeyringTypes.simple\n ) {\n return (\n internalAccount.metadata.keyring.type === KeyringTypes.hd ||\n internalAccount.metadata.keyring.type === KeyringTypes.simple\n );\n }\n\n return internalAccount.metadata.keyring.type === keyringType;\n },\n );\n }\n\n /**\n * Returns the last selected account from the given array of accounts.\n *\n * @param accounts - An array of InternalAccount objects.\n * @returns The InternalAccount object that was last selected, or undefined if the array is empty.\n */\n #getLastSelectedAccount(\n accounts: InternalAccount[],\n ): InternalAccount | undefined {\n const [accountToSelect] = accounts.sort((accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n });\n\n return accountToSelect;\n }\n\n /**\n * Returns the next account number for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Existing accounts to check for the next available account number.\n * @returns An object containing the account prefix and index to use.\n */\n getNextAvailableAccountName(\n keyringType: string = KeyringTypes.hd,\n accounts?: InternalAccount[],\n ): string {\n const keyringName = keyringTypeToName(keyringType);\n const keyringAccounts = this.#getAccountsByKeyringType(\n keyringType,\n accounts,\n );\n const lastDefaultIndexUsedForKeyringType = keyringAccounts.reduce(\n (maxInternalAccountIndex, internalAccount) => {\n // We **DO NOT USE** `\\d+` here to only consider valid \"human\"\n // number (rounded decimal number)\n const match = new RegExp(`${keyringName} ([0-9]+)$`, 'u').exec(\n internalAccount.metadata.name,\n );\n\n if (match) {\n // Quoting `RegExp.exec` documentation:\n // > The returned array has the matched text as the first item, and then one item for\n // > each capturing group of the matched text.\n // So use `match[1]` to get the captured value\n const internalAccountIndex = parseInt(match[1], 10);\n return Math.max(maxInternalAccountIndex, internalAccountIndex);\n }\n\n return maxInternalAccountIndex;\n },\n 0,\n );\n\n const index = Math.max(\n keyringAccounts.length + 1,\n lastDefaultIndexUsedForKeyringType + 1,\n );\n\n return `${keyringName} ${index}`;\n }\n\n /**\n * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex() {\n // NOTE: For now we use the current date, since we know this value\n // will always be higher than any already selected account index.\n return Date.now();\n }\n\n /**\n * Get an internal account given an address and a keyring type.\n *\n * If the account is not a Snap Keyring account, generates an internal account for it and adds it to the controller.\n * If the account is a Snap Keyring account, retrieves the account from the keyring and adds it to the controller.\n *\n * @param address - The address of the new account.\n * @param type - The keyring type of the new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n type: string,\n ): InternalAccount | undefined {\n if (type === KeyringTypes.snap) {\n const keyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!keyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return keyring.getAccountByAddress(address);\n }\n\n return this.#generateInternalAccountForNonSnapAccount(address, type);\n }\n\n /**\n * Handles the change in multichain network by updating the selected account.\n *\n * @param id - The EVM client ID or non-EVM chain ID that changed.\n */\n #handleOnMultichainNetworkDidChange(id: NetworkClientId | CaipChainId) {\n let accountId: string;\n\n // We only support non-EVM Caip chain IDs at the moment. Ex Solana and Bitcoin\n // MultichainNetworkController will handle throwing an error if the Caip chain ID is not supported\n if (isCaipChainId(id)) {\n // Update selected account to non evm account\n const lastSelectedNonEvmAccount = this.getSelectedMultichainAccount(id);\n // @ts-expect-error - This should never be undefined, otherwise it's a bug that should be handled\n accountId = lastSelectedNonEvmAccount.id;\n } else {\n // Update selected account to evm account\n const lastSelectedEvmAccount = this.getSelectedAccount();\n accountId = lastSelectedEvmAccount.id;\n }\n\n this.update((currentState) => {\n currentState.internalAccounts.accounts[accountId].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = accountId;\n });\n\n // DO NOT publish AccountsController:setSelectedAccount to prevent circular listener loops\n }\n\n /**\n * Retrieves the value of a specific metadata key for an existing account.\n *\n * @param accountId - The ID of the account.\n * @param metadataKey - The key of the metadata to retrieve.\n * @param account - The account object to retrieve the metadata key from.\n * @returns The value of the specified metadata key, or undefined if the account or metadata key does not exist.\n */\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n #populateExistingMetadata<T extends keyof InternalAccount['metadata']>(\n accountId: string,\n metadataKey: T,\n account?: InternalAccount,\n ): InternalAccount['metadata'][T] | undefined {\n const internalAccount = account ?? this.getAccount(accountId);\n return internalAccount ? internalAccount.metadata[metadataKey] : undefined;\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n (snapStateState) => this.#handleOnSnapStateChange(snapStateState),\n );\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n (keyringState) => this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountTransactionsUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountTransactionsUpdated',\n snapAccountEvent,\n ),\n );\n\n // Handle account change when multichain network is changed\n this.messagingSystem.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n\n /**\n * Registers message handlers for the AccountsController.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setSelectedAccount`,\n this.setSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listAccounts`,\n this.listAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listMultichainAccounts`,\n this.listMultichainAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedAccount`,\n this.getSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedMultichainAccount`,\n this.getSelectedMultichainAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getAccountByAddress`,\n this.getAccountByAddress.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getNextAvailableAccountName`,\n this.getNextAvailableAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:getAccount`,\n this.getAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:updateAccountMetadata`,\n this.updateAccountMetadata.bind(this),\n );\n }\n}\n"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AccountsController.d.cts","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"AccountsController.d.cts","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AccountsController.d.mts","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"AccountsController.d.mts","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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"}
|
@@ -219,10 +219,12 @@ export class AccountsController extends BaseController {
|
|
219
219
|
metadata: { ...account.metadata, ...metadata },
|
220
220
|
};
|
221
221
|
__classPrivateFieldGet(this, _AccountsController_instances, "m", _AccountsController_update).call(this, (state) => {
|
222
|
-
// FIXME:
|
223
|
-
//
|
224
|
-
//
|
225
|
-
|
222
|
+
// FIXME: Using the state as-is cause the following error: "Type instantiation is excessively
|
223
|
+
// deep and possibly infinite.ts(2589)" (https://github.com/MetaMask/utils/issues/168)
|
224
|
+
// Using a type-cast workaround this error and is slightly better than using a @ts-expect-error
|
225
|
+
// which sometimes fail when compiling locally.
|
226
|
+
state.internalAccounts.accounts[accountId] =
|
227
|
+
internalAccount;
|
226
228
|
});
|
227
229
|
if (metadata.name) {
|
228
230
|
this.messagingSystem.publish('AccountsController:accountRenamed', internalAccount);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"AccountsController.mjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type ExtractEventPayload,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport {\n type SnapKeyringAccountAssetListUpdatedEvent,\n type SnapKeyringAccountBalancesUpdatedEvent,\n type SnapKeyringAccountTransactionsUpdatedEvent,\n SnapKeyring,\n} from '@metamask/eth-snap-keyring';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n} from '@metamask/keyring-api';\nimport {\n type KeyringControllerState,\n type KeyringControllerGetKeyringsByTypeAction,\n type KeyringControllerStateChangeEvent,\n type KeyringControllerGetStateAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n SnapControllerState,\n SnapStateChange,\n} from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport { type CaipChainId, isCaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\n\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport {\n getUUIDFromAddressOfNormalAccount,\n isNormalKeyringType,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountId = string;\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSetSelectedAccountAction = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountNameAction = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccountsAction = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerListMultichainAccountsAction = {\n type: `${typeof controllerName}:listMultichainAccounts`;\n handler: AccountsController['listMultichainAccounts'];\n};\n\nexport type AccountsControllerUpdateAccountsAction = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerGetSelectedAccountAction = {\n type: `${typeof controllerName}:getSelectedAccount`;\n handler: AccountsController['getSelectedAccount'];\n};\n\nexport type AccountsControllerGetSelectedMultichainAccountAction = {\n type: `${typeof controllerName}:getSelectedMultichainAccount`;\n handler: AccountsController['getSelectedMultichainAccount'];\n};\n\nexport type AccountsControllerGetAccountByAddressAction = {\n type: `${typeof controllerName}:getAccountByAddress`;\n handler: AccountsController['getAccountByAddress'];\n};\n\nexport type AccountsControllerGetNextAvailableAccountNameAction = {\n type: `${typeof controllerName}:getNextAvailableAccountName`;\n handler: AccountsController['getNextAvailableAccountName'];\n};\n\nexport type AccountsControllerGetAccountAction = {\n type: `${typeof controllerName}:getAccount`;\n handler: AccountsController['getAccount'];\n};\n\nexport type AccountsControllerUpdateAccountMetadataAction = {\n type: `${typeof controllerName}:updateAccountMetadata`;\n handler: AccountsController['updateAccountMetadata'];\n};\n\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccountAction\n | AccountsControllerListAccountsAction\n | AccountsControllerListMultichainAccountsAction\n | AccountsControllerSetAccountNameAction\n | AccountsControllerUpdateAccountsAction\n | AccountsControllerGetAccountByAddressAction\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetNextAvailableAccountNameAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedMultichainAccountAction\n | AccountsControllerUpdateAccountMetadataAction;\n\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\nexport type AllowedEvents =\n | SnapStateChange\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\nexport type AccountsControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n persist: true,\n anonymous: false,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n};\n\nexport const EMPTY_ACCOUNT = {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n scopes: [EthScope.Eoa],\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n importTime: 0,\n },\n};\n\n/**\n * Controller that manages internal accounts.\n * The accounts controller is responsible for creating and managing internal accounts.\n * It also provides convenience methods for accessing and updating the internal accounts.\n * The accounts controller also listens for keyring state changes and updates the internal accounts accordingly.\n * The accounts controller also listens for snap state changes and updates the internal accounts accordingly.\n *\n */\nexport class AccountsController extends BaseController<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n /**\n * Constructor for AccountsController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object, or undefined if the account does not exist.\n */\n getAccount(accountId: string): InternalAccount | undefined {\n return this.state.internalAccounts.accounts[accountId];\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n return accounts.filter((account) => isEvmAccountType(account.type));\n }\n\n /**\n * Returns an array of all internal accounts.\n *\n * @param chainId - The chain ID.\n * @returns An array of InternalAccount objects.\n */\n listMultichainAccounts(chainId?: CaipChainId): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n if (!chainId) {\n return accounts;\n }\n\n if (!isCaipChainId(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${String(chainId)}`);\n }\n\n return accounts.filter((account) =>\n isScopeEqualToAny(chainId, account.scopes),\n );\n }\n\n /**\n * Returns the internal account object for the given account ID.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object.\n * @throws An error if the account ID is not found.\n */\n getAccountExpect(accountId: string): InternalAccount {\n const account = this.getAccount(accountId);\n if (account === undefined) {\n throw new Error(`Account Id \"${accountId}\" not found`);\n }\n return account;\n }\n\n /**\n * Returns the last selected EVM account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n const account = this.getAccountExpect(selectedAccount);\n if (isEvmAccountType(account.type)) {\n return account;\n }\n\n const accounts = this.listAccounts();\n if (!accounts.length) {\n // ! Should never reach this.\n throw new Error('No EVM accounts');\n }\n\n // This will never be undefined because we have already checked if accounts.length is > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#getLastSelectedAccount(accounts)!;\n }\n\n /**\n * __WARNING The return value may be undefined if there isn't an account for that chain id.__\n *\n * Retrieves the last selected account by chain ID.\n *\n * @param chainId - The chain ID to filter the accounts.\n * @returns The last selected account compatible with the specified chain ID or undefined.\n */\n getSelectedMultichainAccount(\n chainId?: CaipChainId,\n ): InternalAccount | undefined {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n if (!chainId) {\n return this.getAccountExpect(selectedAccount);\n }\n\n const accounts = this.listMultichainAccounts(chainId);\n return this.#getLastSelectedAccount(accounts);\n }\n\n /**\n * Returns the account with the specified address.\n * ! This method will only return the first account that matches the address\n *\n * @param address - The address of the account to retrieve.\n * @returns The account with the specified address, or undefined if not found.\n */\n getAccountByAddress(address: string): InternalAccount | undefined {\n return this.listMultichainAccounts().find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n );\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @param accountId - The ID of the account to be selected.\n */\n setSelectedAccount(accountId: string): void {\n const account = this.getAccountExpect(accountId);\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n internalAccounts.accounts[account.id].metadata.lastSelected = Date.now();\n internalAccounts.selectedAccount = account.id;\n });\n }\n\n /**\n * Sets the name of the account with the given ID.\n *\n * @param accountId - The ID of the account to set the name for.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountName(accountId: string, accountName: string): void {\n // This will check for name uniqueness and fire the `accountRenamed` event\n // if the account has been renamed.\n this.updateAccountMetadata(accountId, {\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n });\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @param accountId - The ID of the account for which the metadata will be updated.\n * @param metadata - The new metadata for the account.\n */\n updateAccountMetadata(\n accountId: string,\n metadata: Partial<InternalAccount['metadata']>,\n ): void {\n const account = this.getAccountExpect(accountId);\n\n if (\n metadata.name &&\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === metadata.name &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n // FIXME: Do not remove this comment - This error is flaky: Comment out or restore the `ts-expect-error` directive below as needed.\n // See: https://github.com/MetaMask/utils/issues/168\n // // @ts-expect-error Known issue - `Json` causes recursive error in immer `Draft`/`WritableDraft` types\n state.internalAccounts.accounts[accountId] = internalAccount;\n });\n\n if (metadata.name) {\n this.messagingSystem.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n }\n\n /**\n * Updates the internal accounts list by retrieving normal and snap accounts,\n * removing duplicates, and updating the metadata of each account.\n *\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n const snapAccounts = await this.#listSnapAccounts();\n const normalAccounts = await this.#listNormalAccounts();\n\n // keyring type map.\n const keyringTypes = new Map<string, number>();\n const previousAccounts = this.state.internalAccounts.accounts;\n\n const accounts: Record<string, InternalAccount> = [\n ...normalAccounts,\n ...snapAccounts,\n ].reduce(\n (internalAccountMap, internalAccount) => {\n const keyringTypeName = keyringTypeToName(\n internalAccount.metadata.keyring.type,\n );\n const keyringAccountIndex = keyringTypes.get(keyringTypeName) ?? 0;\n if (keyringAccountIndex) {\n keyringTypes.set(keyringTypeName, keyringAccountIndex + 1);\n } else {\n keyringTypes.set(keyringTypeName, 1);\n }\n\n const existingAccount = previousAccounts[internalAccount.id];\n\n internalAccountMap[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n name:\n this.#populateExistingMetadata(existingAccount?.id, 'name') ??\n `${keyringTypeName} ${keyringAccountIndex + 1}`,\n importTime:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'importTime',\n ) ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'lastSelected',\n ) ?? 0,\n },\n };\n\n return internalAccountMap;\n },\n {} as Record<string, InternalAccount>,\n );\n\n this.#update((state) => {\n state.internalAccounts.accounts = accounts;\n });\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n this.update((currentState) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\n }\n\n /**\n * Generates an internal account for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param type - The type of the account.\n * @returns The generated internal account.\n */\n #generateInternalAccountForNonSnapAccount(\n address: string,\n type: string,\n ): InternalAccount {\n return {\n id: getUUIDFromAddressOfNormalAccount(address),\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n importTime: Date.now(),\n keyring: {\n type,\n },\n },\n };\n }\n\n /**\n * Get Snap keyring from the keyring controller.\n *\n * @returns The Snap keyring if available.\n */\n #getSnapKeyring(): SnapKeyring | undefined {\n const [snapKeyring] = this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n\n // Snap keyring is not available until the first account is created in the keyring\n // controller, so this might be undefined.\n return snapKeyring as SnapKeyring | undefined;\n }\n\n /**\n * Returns a list of internal accounts created using the SnapKeyring.\n *\n * @returns A promise that resolves to an array of InternalAccount objects.\n */\n async #listSnapAccounts(): Promise<InternalAccount[]> {\n const keyring = this.#getSnapKeyring();\n\n if (!keyring) {\n return [];\n }\n\n return keyring.listAccounts();\n }\n\n /**\n * Returns a list of normal accounts.\n * Note: listNormalAccounts is a temporary method until the keyrings all implement the InternalAccount interface.\n * Once all keyrings implement the InternalAccount interface, this method can be removed and getAccounts can be used instead.\n *\n * @returns A Promise that resolves to an array of InternalAccount objects.\n */\n async #listNormalAccounts(): Promise<InternalAccount[]> {\n const internalAccounts: InternalAccount[] = [];\n const { keyrings } = await this.messagingSystem.call(\n 'KeyringController:getState',\n );\n for (const keyring of keyrings) {\n const keyringType = keyring.type;\n if (!isNormalKeyringType(keyringType as KeyringTypes)) {\n // We only consider \"normal accounts\" here, so keep looping\n continue;\n }\n\n for (const address of keyring.accounts) {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n const nameLastUpdatedAt = this.#populateExistingMetadata(\n id,\n 'nameLastUpdatedAt',\n );\n\n internalAccounts.push({\n id,\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: this.#populateExistingMetadata(id, 'name') ?? '',\n ...(nameLastUpdatedAt && { nameLastUpdatedAt }),\n importTime:\n this.#populateExistingMetadata(id, 'importTime') ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(id, 'lastSelected') ?? 0,\n keyring: {\n type: keyringType,\n },\n },\n });\n }\n }\n\n return internalAccounts;\n }\n\n /**\n * Re-publish an account event.\n *\n * @param event - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A Snap keyring event type.\n */\n #handleOnSnapKeyringAccountEvent<\n EventType extends AccountsControllerEvents['type'],\n >(\n event: EventType,\n ...payload: ExtractEventPayload<AccountsControllerEvents, EventType>\n ): void {\n this.messagingSystem.publish(event, ...payload);\n }\n\n /**\n * Handles changes in the keyring state, specifically when new accounts are added or removed.\n *\n * @param keyringState - The new state of the keyring controller.\n * @param keyringState.isUnlocked - True if the keyrings are unlocked, false otherwise.\n * @param keyringState.keyrings - List of all keyrings.\n */\n #handleOnKeyringStateChange({\n isUnlocked,\n keyrings,\n }: KeyringControllerState): void {\n // TODO: Change when accountAdded event is added to the keyring controller.\n\n // We check for keyrings length to be greater than 0 because the extension client may try execute\n // submit password twice and clear the keyring state.\n // https://github.com/MetaMask/KeyringController/blob/2d73a4deed8d013913f6ef0c9f5c0bb7c614f7d3/src/KeyringController.ts#L910\n if (!isUnlocked || keyrings.length === 0) {\n return;\n }\n\n // State patches.\n const generatePatch = () => {\n return {\n previous: {} as Record<string, InternalAccount>,\n added: [] as {\n address: string;\n type: string;\n }[],\n updated: [] as InternalAccount[],\n removed: [] as InternalAccount[],\n };\n };\n const patches = {\n snap: generatePatch(),\n normal: generatePatch(),\n };\n\n // Gets the patch object based on the keyring type (since Snap accounts and other accounts\n // are handled differently).\n const patchOf = (type: string) => {\n if (type === KeyringTypes.snap) {\n return patches.snap;\n }\n return patches.normal;\n };\n\n // Create a map (with lower-cased addresses) of all existing accounts.\n for (const account of this.listMultichainAccounts()) {\n const address = account.address.toLowerCase();\n const patch = patchOf(account.metadata.keyring.type);\n\n patch.previous[address] = account;\n }\n\n // Go over all keyring changes and create patches out of it.\n const addresses = new Set<string>();\n for (const keyring of keyrings) {\n const patch = patchOf(keyring.type);\n\n for (const accountAddress of keyring.accounts) {\n // Lower-case address to use it in the `previous` map.\n const address = accountAddress.toLowerCase();\n const account = patch.previous[address];\n\n if (account) {\n // If the account exists before, this might be an update.\n patch.updated.push(account);\n } else {\n // Otherwise, that's a new account.\n patch.added.push({\n address,\n type: keyring.type,\n });\n }\n\n // Keep track of those address to check for removed accounts later.\n addresses.add(address);\n }\n }\n\n // We might have accounts associated with removed keyrings, so we iterate\n // over all previous known accounts and check against the keyring addresses.\n for (const patch of [patches.snap, patches.normal]) {\n for (const [address, account] of Object.entries(patch.previous)) {\n // If a previous address is not part of the new addesses, then it got removed.\n if (!addresses.has(address)) {\n patch.removed.push(account);\n }\n }\n }\n\n // Diff that we will use to publish events afterward.\n const diff = {\n removed: [] as string[],\n added: [] as InternalAccount[],\n };\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n for (const patch of [patches.snap, patches.normal]) {\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n\n diff.removed.push(account.id);\n }\n\n for (const added of patch.added) {\n const account = this.#getInternalAccountFromAddressAndType(\n added.address,\n added.type,\n );\n\n if (account) {\n // Re-compute the list of accounts everytime, so we can make sure new names\n // are also considered.\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get next account name available for this given keyring.\n const name = this.getNextAvailableAccountName(\n account.metadata.keyring.type,\n accounts,\n );\n\n // If it's the first account, we need to select it.\n const lastSelected =\n accounts.length === 0 ? this.#getLastSelectedIndex() : 0;\n\n internalAccounts.accounts[account.id] = {\n ...account,\n metadata: {\n ...account.metadata,\n name,\n importTime: Date.now(),\n lastSelected,\n },\n };\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n }\n });\n\n // Now publish events\n for (const id of diff.removed) {\n this.messagingSystem.publish('AccountsController:accountRemoved', id);\n }\n\n for (const account of diff.added) {\n this.messagingSystem.publish('AccountsController:accountAdded', account);\n }\n\n // NOTE: Since we also track \"updated\" accounts with our patches, we could fire a new event\n // like `accountUpdated` (we would still need to check if anything really changed on the account).\n }\n\n /**\n * Update the state and fixup the currently selected account.\n *\n * @param callback - Callback for updating state, passed a draft state object.\n */\n #update(callback: (state: WritableDraft<AccountsControllerState>) => void) {\n // The currently selected account might get deleted during the update, so keep track\n // of it before doing any change.\n const previouslySelectedAccount =\n this.state.internalAccounts.selectedAccount;\n\n this.update((state) => {\n callback(state);\n\n // If the account no longer exists (or none is selected), we need to re-select another one.\n const { internalAccounts } = state;\n if (!internalAccounts.accounts[previouslySelectedAccount]) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get the lastly selected account (according to the current accounts).\n const lastSelectedAccount = this.#getLastSelectedAccount(accounts);\n if (lastSelectedAccount) {\n internalAccounts.selectedAccount = lastSelectedAccount.id;\n internalAccounts.accounts[\n lastSelectedAccount.id\n ].metadata.lastSelected = this.#getLastSelectedIndex();\n } else {\n // It will be undefined if there are no accounts.\n internalAccounts.selectedAccount = '';\n }\n }\n });\n\n // Now, we compare the newly selected account, and we send event if different.\n const { selectedAccount } = this.state.internalAccounts;\n if (selectedAccount && selectedAccount !== previouslySelectedAccount) {\n const account = this.getSelectedMultichainAccount();\n\n // The account should always be defined at this point, since we have already checked for\n // `selectedAccount` to be non-empty.\n if (account) {\n if (isEvmAccountType(account.type)) {\n this.messagingSystem.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messagingSystem.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\n }\n }\n }\n\n /**\n * Handles the change in SnapControllerState by updating the metadata of accounts that have a snap enabled.\n *\n * @param snapState - The new SnapControllerState.\n */\n #handleOnSnapStateChange(snapState: SnapControllerState) {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listMultichainAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n const snapId = currentAccount.metadata.snap.id;\n const storedSnap: Snap = snaps[snapId as SnapId];\n if (storedSnap) {\n currentAccount.metadata.snap.enabled =\n storedSnap.enabled && !storedSnap.blocked;\n }\n }\n });\n });\n }\n\n /**\n * Returns the list of accounts for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Accounts to filter by keyring type.\n * @returns The list of accounts associcated with this keyring type.\n */\n #getAccountsByKeyringType(keyringType: string, accounts?: InternalAccount[]) {\n return (accounts ?? this.listMultichainAccounts()).filter(\n (internalAccount) => {\n // We do consider `hd` and `simple` keyrings to be of same type. So we check those 2 types\n // to group those accounts together!\n if (\n keyringType === KeyringTypes.hd ||\n keyringType === KeyringTypes.simple\n ) {\n return (\n internalAccount.metadata.keyring.type === KeyringTypes.hd ||\n internalAccount.metadata.keyring.type === KeyringTypes.simple\n );\n }\n\n return internalAccount.metadata.keyring.type === keyringType;\n },\n );\n }\n\n /**\n * Returns the last selected account from the given array of accounts.\n *\n * @param accounts - An array of InternalAccount objects.\n * @returns The InternalAccount object that was last selected, or undefined if the array is empty.\n */\n #getLastSelectedAccount(\n accounts: InternalAccount[],\n ): InternalAccount | undefined {\n const [accountToSelect] = accounts.sort((accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n });\n\n return accountToSelect;\n }\n\n /**\n * Returns the next account number for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Existing accounts to check for the next available account number.\n * @returns An object containing the account prefix and index to use.\n */\n getNextAvailableAccountName(\n keyringType: string = KeyringTypes.hd,\n accounts?: InternalAccount[],\n ): string {\n const keyringName = keyringTypeToName(keyringType);\n const keyringAccounts = this.#getAccountsByKeyringType(\n keyringType,\n accounts,\n );\n const lastDefaultIndexUsedForKeyringType = keyringAccounts.reduce(\n (maxInternalAccountIndex, internalAccount) => {\n // We **DO NOT USE** `\\d+` here to only consider valid \"human\"\n // number (rounded decimal number)\n const match = new RegExp(`${keyringName} ([0-9]+)$`, 'u').exec(\n internalAccount.metadata.name,\n );\n\n if (match) {\n // Quoting `RegExp.exec` documentation:\n // > The returned array has the matched text as the first item, and then one item for\n // > each capturing group of the matched text.\n // So use `match[1]` to get the captured value\n const internalAccountIndex = parseInt(match[1], 10);\n return Math.max(maxInternalAccountIndex, internalAccountIndex);\n }\n\n return maxInternalAccountIndex;\n },\n 0,\n );\n\n const index = Math.max(\n keyringAccounts.length + 1,\n lastDefaultIndexUsedForKeyringType + 1,\n );\n\n return `${keyringName} ${index}`;\n }\n\n /**\n * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex() {\n // NOTE: For now we use the current date, since we know this value\n // will always be higher than any already selected account index.\n return Date.now();\n }\n\n /**\n * Get an internal account given an address and a keyring type.\n *\n * If the account is not a Snap Keyring account, generates an internal account for it and adds it to the controller.\n * If the account is a Snap Keyring account, retrieves the account from the keyring and adds it to the controller.\n *\n * @param address - The address of the new account.\n * @param type - The keyring type of the new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n type: string,\n ): InternalAccount | undefined {\n if (type === KeyringTypes.snap) {\n const keyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!keyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return keyring.getAccountByAddress(address);\n }\n\n return this.#generateInternalAccountForNonSnapAccount(address, type);\n }\n\n /**\n * Handles the change in multichain network by updating the selected account.\n *\n * @param id - The EVM client ID or non-EVM chain ID that changed.\n */\n #handleOnMultichainNetworkDidChange(id: NetworkClientId | CaipChainId) {\n let accountId: string;\n\n // We only support non-EVM Caip chain IDs at the moment. Ex Solana and Bitcoin\n // MultichainNetworkController will handle throwing an error if the Caip chain ID is not supported\n if (isCaipChainId(id)) {\n // Update selected account to non evm account\n const lastSelectedNonEvmAccount = this.getSelectedMultichainAccount(id);\n // @ts-expect-error - This should never be undefined, otherwise it's a bug that should be handled\n accountId = lastSelectedNonEvmAccount.id;\n } else {\n // Update selected account to evm account\n const lastSelectedEvmAccount = this.getSelectedAccount();\n accountId = lastSelectedEvmAccount.id;\n }\n\n this.update((currentState) => {\n currentState.internalAccounts.accounts[accountId].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = accountId;\n });\n\n // DO NOT publish AccountsController:setSelectedAccount to prevent circular listener loops\n }\n\n /**\n * Retrieves the value of a specific metadata key for an existing account.\n *\n * @param accountId - The ID of the account.\n * @param metadataKey - The key of the metadata to retrieve.\n * @param account - The account object to retrieve the metadata key from.\n * @returns The value of the specified metadata key, or undefined if the account or metadata key does not exist.\n */\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n #populateExistingMetadata<T extends keyof InternalAccount['metadata']>(\n accountId: string,\n metadataKey: T,\n account?: InternalAccount,\n ): InternalAccount['metadata'][T] | undefined {\n const internalAccount = account ?? this.getAccount(accountId);\n return internalAccount ? internalAccount.metadata[metadataKey] : undefined;\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n (snapStateState) => this.#handleOnSnapStateChange(snapStateState),\n );\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n (keyringState) => this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountTransactionsUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountTransactionsUpdated',\n snapAccountEvent,\n ),\n );\n\n // Handle account change when multichain network is changed\n this.messagingSystem.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n\n /**\n * Registers message handlers for the AccountsController.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setSelectedAccount`,\n this.setSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listAccounts`,\n this.listAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listMultichainAccounts`,\n this.listMultichainAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedAccount`,\n this.getSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedMultichainAccount`,\n this.getSelectedMultichainAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getAccountByAddress`,\n this.getAccountByAddress.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getNextAvailableAccountName`,\n this.getNextAvailableAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:getAccount`,\n this.getAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:updateAccountMetadata`,\n this.updateAccountMetadata.bind(this),\n );\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"AccountsController.mjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type ExtractEventPayload,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport {\n type SnapKeyringAccountAssetListUpdatedEvent,\n type SnapKeyringAccountBalancesUpdatedEvent,\n type SnapKeyringAccountTransactionsUpdatedEvent,\n SnapKeyring,\n} from '@metamask/eth-snap-keyring';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n} from '@metamask/keyring-api';\nimport {\n type KeyringControllerState,\n type KeyringControllerGetKeyringsByTypeAction,\n type KeyringControllerStateChangeEvent,\n type KeyringControllerGetStateAction,\n KeyringTypes,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n SnapControllerState,\n SnapStateChange,\n} from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport { type CaipChainId, isCaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\n\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport {\n getUUIDFromAddressOfNormalAccount,\n isNormalKeyringType,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountId = string;\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSetSelectedAccountAction = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountNameAction = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccountsAction = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerListMultichainAccountsAction = {\n type: `${typeof controllerName}:listMultichainAccounts`;\n handler: AccountsController['listMultichainAccounts'];\n};\n\nexport type AccountsControllerUpdateAccountsAction = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerGetSelectedAccountAction = {\n type: `${typeof controllerName}:getSelectedAccount`;\n handler: AccountsController['getSelectedAccount'];\n};\n\nexport type AccountsControllerGetSelectedMultichainAccountAction = {\n type: `${typeof controllerName}:getSelectedMultichainAccount`;\n handler: AccountsController['getSelectedMultichainAccount'];\n};\n\nexport type AccountsControllerGetAccountByAddressAction = {\n type: `${typeof controllerName}:getAccountByAddress`;\n handler: AccountsController['getAccountByAddress'];\n};\n\nexport type AccountsControllerGetNextAvailableAccountNameAction = {\n type: `${typeof controllerName}:getNextAvailableAccountName`;\n handler: AccountsController['getNextAvailableAccountName'];\n};\n\nexport type AccountsControllerGetAccountAction = {\n type: `${typeof controllerName}:getAccount`;\n handler: AccountsController['getAccount'];\n};\n\nexport type AccountsControllerUpdateAccountMetadataAction = {\n type: `${typeof controllerName}:updateAccountMetadata`;\n handler: AccountsController['updateAccountMetadata'];\n};\n\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccountAction\n | AccountsControllerListAccountsAction\n | AccountsControllerListMultichainAccountsAction\n | AccountsControllerSetAccountNameAction\n | AccountsControllerUpdateAccountsAction\n | AccountsControllerGetAccountByAddressAction\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetNextAvailableAccountNameAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedMultichainAccountAction\n | AccountsControllerUpdateAccountMetadataAction;\n\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\nexport type AllowedEvents =\n | SnapStateChange\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\nexport type AccountsControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n persist: true,\n anonymous: false,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n};\n\nexport const EMPTY_ACCOUNT = {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n scopes: [EthScope.Eoa],\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n importTime: 0,\n },\n};\n\n/**\n * Controller that manages internal accounts.\n * The accounts controller is responsible for creating and managing internal accounts.\n * It also provides convenience methods for accessing and updating the internal accounts.\n * The accounts controller also listens for keyring state changes and updates the internal accounts accordingly.\n * The accounts controller also listens for snap state changes and updates the internal accounts accordingly.\n *\n */\nexport class AccountsController extends BaseController<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n /**\n * Constructor for AccountsController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.#subscribeToMessageEvents();\n this.#registerMessageHandlers();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object, or undefined if the account does not exist.\n */\n getAccount(accountId: string): InternalAccount | undefined {\n return this.state.internalAccounts.accounts[accountId];\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n return accounts.filter((account) => isEvmAccountType(account.type));\n }\n\n /**\n * Returns an array of all internal accounts.\n *\n * @param chainId - The chain ID.\n * @returns An array of InternalAccount objects.\n */\n listMultichainAccounts(chainId?: CaipChainId): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n if (!chainId) {\n return accounts;\n }\n\n if (!isCaipChainId(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${String(chainId)}`);\n }\n\n return accounts.filter((account) =>\n isScopeEqualToAny(chainId, account.scopes),\n );\n }\n\n /**\n * Returns the internal account object for the given account ID.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object.\n * @throws An error if the account ID is not found.\n */\n getAccountExpect(accountId: string): InternalAccount {\n const account = this.getAccount(accountId);\n if (account === undefined) {\n throw new Error(`Account Id \"${accountId}\" not found`);\n }\n return account;\n }\n\n /**\n * Returns the last selected EVM account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n const account = this.getAccountExpect(selectedAccount);\n if (isEvmAccountType(account.type)) {\n return account;\n }\n\n const accounts = this.listAccounts();\n if (!accounts.length) {\n // ! Should never reach this.\n throw new Error('No EVM accounts');\n }\n\n // This will never be undefined because we have already checked if accounts.length is > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#getLastSelectedAccount(accounts)!;\n }\n\n /**\n * __WARNING The return value may be undefined if there isn't an account for that chain id.__\n *\n * Retrieves the last selected account by chain ID.\n *\n * @param chainId - The chain ID to filter the accounts.\n * @returns The last selected account compatible with the specified chain ID or undefined.\n */\n getSelectedMultichainAccount(\n chainId?: CaipChainId,\n ): InternalAccount | undefined {\n const {\n internalAccounts: { selectedAccount },\n } = this.state;\n\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (selectedAccount === '') {\n return EMPTY_ACCOUNT;\n }\n\n if (!chainId) {\n return this.getAccountExpect(selectedAccount);\n }\n\n const accounts = this.listMultichainAccounts(chainId);\n return this.#getLastSelectedAccount(accounts);\n }\n\n /**\n * Returns the account with the specified address.\n * ! This method will only return the first account that matches the address\n *\n * @param address - The address of the account to retrieve.\n * @returns The account with the specified address, or undefined if not found.\n */\n getAccountByAddress(address: string): InternalAccount | undefined {\n return this.listMultichainAccounts().find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n );\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @param accountId - The ID of the account to be selected.\n */\n setSelectedAccount(accountId: string): void {\n const account = this.getAccountExpect(accountId);\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n internalAccounts.accounts[account.id].metadata.lastSelected = Date.now();\n internalAccounts.selectedAccount = account.id;\n });\n }\n\n /**\n * Sets the name of the account with the given ID.\n *\n * @param accountId - The ID of the account to set the name for.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountName(accountId: string, accountName: string): void {\n // This will check for name uniqueness and fire the `accountRenamed` event\n // if the account has been renamed.\n this.updateAccountMetadata(accountId, {\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n });\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @param accountId - The ID of the account for which the metadata will be updated.\n * @param metadata - The new metadata for the account.\n */\n updateAccountMetadata(\n accountId: string,\n metadata: Partial<InternalAccount['metadata']>,\n ): void {\n const account = this.getAccountExpect(accountId);\n\n if (\n metadata.name &&\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === metadata.name &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n // FIXME: Using the state as-is cause the following error: \"Type instantiation is excessively\n // deep and possibly infinite.ts(2589)\" (https://github.com/MetaMask/utils/issues/168)\n // Using a type-cast workaround this error and is slightly better than using a @ts-expect-error\n // which sometimes fail when compiling locally.\n (state as AccountsControllerState).internalAccounts.accounts[accountId] =\n internalAccount;\n });\n\n if (metadata.name) {\n this.messagingSystem.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n }\n\n /**\n * Updates the internal accounts list by retrieving normal and snap accounts,\n * removing duplicates, and updating the metadata of each account.\n *\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n const snapAccounts = await this.#listSnapAccounts();\n const normalAccounts = await this.#listNormalAccounts();\n\n // keyring type map.\n const keyringTypes = new Map<string, number>();\n const previousAccounts = this.state.internalAccounts.accounts;\n\n const accounts: Record<string, InternalAccount> = [\n ...normalAccounts,\n ...snapAccounts,\n ].reduce(\n (internalAccountMap, internalAccount) => {\n const keyringTypeName = keyringTypeToName(\n internalAccount.metadata.keyring.type,\n );\n const keyringAccountIndex = keyringTypes.get(keyringTypeName) ?? 0;\n if (keyringAccountIndex) {\n keyringTypes.set(keyringTypeName, keyringAccountIndex + 1);\n } else {\n keyringTypes.set(keyringTypeName, 1);\n }\n\n const existingAccount = previousAccounts[internalAccount.id];\n\n internalAccountMap[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n name:\n this.#populateExistingMetadata(existingAccount?.id, 'name') ??\n `${keyringTypeName} ${keyringAccountIndex + 1}`,\n importTime:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'importTime',\n ) ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'lastSelected',\n ) ?? 0,\n },\n };\n\n return internalAccountMap;\n },\n {} as Record<string, InternalAccount>,\n );\n\n this.#update((state) => {\n state.internalAccounts.accounts = accounts;\n });\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n this.update((currentState) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\n }\n\n /**\n * Generates an internal account for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param type - The type of the account.\n * @returns The generated internal account.\n */\n #generateInternalAccountForNonSnapAccount(\n address: string,\n type: string,\n ): InternalAccount {\n return {\n id: getUUIDFromAddressOfNormalAccount(address),\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n importTime: Date.now(),\n keyring: {\n type,\n },\n },\n };\n }\n\n /**\n * Get Snap keyring from the keyring controller.\n *\n * @returns The Snap keyring if available.\n */\n #getSnapKeyring(): SnapKeyring | undefined {\n const [snapKeyring] = this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n\n // Snap keyring is not available until the first account is created in the keyring\n // controller, so this might be undefined.\n return snapKeyring as SnapKeyring | undefined;\n }\n\n /**\n * Returns a list of internal accounts created using the SnapKeyring.\n *\n * @returns A promise that resolves to an array of InternalAccount objects.\n */\n async #listSnapAccounts(): Promise<InternalAccount[]> {\n const keyring = this.#getSnapKeyring();\n\n if (!keyring) {\n return [];\n }\n\n return keyring.listAccounts();\n }\n\n /**\n * Returns a list of normal accounts.\n * Note: listNormalAccounts is a temporary method until the keyrings all implement the InternalAccount interface.\n * Once all keyrings implement the InternalAccount interface, this method can be removed and getAccounts can be used instead.\n *\n * @returns A Promise that resolves to an array of InternalAccount objects.\n */\n async #listNormalAccounts(): Promise<InternalAccount[]> {\n const internalAccounts: InternalAccount[] = [];\n const { keyrings } = await this.messagingSystem.call(\n 'KeyringController:getState',\n );\n for (const keyring of keyrings) {\n const keyringType = keyring.type;\n if (!isNormalKeyringType(keyringType as KeyringTypes)) {\n // We only consider \"normal accounts\" here, so keep looping\n continue;\n }\n\n for (const address of keyring.accounts) {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n const nameLastUpdatedAt = this.#populateExistingMetadata(\n id,\n 'nameLastUpdatedAt',\n );\n\n internalAccounts.push({\n id,\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n scopes: [EthScope.Eoa],\n type: EthAccountType.Eoa,\n metadata: {\n name: this.#populateExistingMetadata(id, 'name') ?? '',\n ...(nameLastUpdatedAt && { nameLastUpdatedAt }),\n importTime:\n this.#populateExistingMetadata(id, 'importTime') ?? Date.now(),\n lastSelected:\n this.#populateExistingMetadata(id, 'lastSelected') ?? 0,\n keyring: {\n type: keyringType,\n },\n },\n });\n }\n }\n\n return internalAccounts;\n }\n\n /**\n * Re-publish an account event.\n *\n * @param event - The event type. This is a unique identifier for this event.\n * @param payload - The event payload. The type of the parameters for each event handler must\n * match the type of this payload.\n * @template EventType - A Snap keyring event type.\n */\n #handleOnSnapKeyringAccountEvent<\n EventType extends AccountsControllerEvents['type'],\n >(\n event: EventType,\n ...payload: ExtractEventPayload<AccountsControllerEvents, EventType>\n ): void {\n this.messagingSystem.publish(event, ...payload);\n }\n\n /**\n * Handles changes in the keyring state, specifically when new accounts are added or removed.\n *\n * @param keyringState - The new state of the keyring controller.\n * @param keyringState.isUnlocked - True if the keyrings are unlocked, false otherwise.\n * @param keyringState.keyrings - List of all keyrings.\n */\n #handleOnKeyringStateChange({\n isUnlocked,\n keyrings,\n }: KeyringControllerState): void {\n // TODO: Change when accountAdded event is added to the keyring controller.\n\n // We check for keyrings length to be greater than 0 because the extension client may try execute\n // submit password twice and clear the keyring state.\n // https://github.com/MetaMask/KeyringController/blob/2d73a4deed8d013913f6ef0c9f5c0bb7c614f7d3/src/KeyringController.ts#L910\n if (!isUnlocked || keyrings.length === 0) {\n return;\n }\n\n // State patches.\n const generatePatch = () => {\n return {\n previous: {} as Record<string, InternalAccount>,\n added: [] as {\n address: string;\n type: string;\n }[],\n updated: [] as InternalAccount[],\n removed: [] as InternalAccount[],\n };\n };\n const patches = {\n snap: generatePatch(),\n normal: generatePatch(),\n };\n\n // Gets the patch object based on the keyring type (since Snap accounts and other accounts\n // are handled differently).\n const patchOf = (type: string) => {\n if (type === KeyringTypes.snap) {\n return patches.snap;\n }\n return patches.normal;\n };\n\n // Create a map (with lower-cased addresses) of all existing accounts.\n for (const account of this.listMultichainAccounts()) {\n const address = account.address.toLowerCase();\n const patch = patchOf(account.metadata.keyring.type);\n\n patch.previous[address] = account;\n }\n\n // Go over all keyring changes and create patches out of it.\n const addresses = new Set<string>();\n for (const keyring of keyrings) {\n const patch = patchOf(keyring.type);\n\n for (const accountAddress of keyring.accounts) {\n // Lower-case address to use it in the `previous` map.\n const address = accountAddress.toLowerCase();\n const account = patch.previous[address];\n\n if (account) {\n // If the account exists before, this might be an update.\n patch.updated.push(account);\n } else {\n // Otherwise, that's a new account.\n patch.added.push({\n address,\n type: keyring.type,\n });\n }\n\n // Keep track of those address to check for removed accounts later.\n addresses.add(address);\n }\n }\n\n // We might have accounts associated with removed keyrings, so we iterate\n // over all previous known accounts and check against the keyring addresses.\n for (const patch of [patches.snap, patches.normal]) {\n for (const [address, account] of Object.entries(patch.previous)) {\n // If a previous address is not part of the new addesses, then it got removed.\n if (!addresses.has(address)) {\n patch.removed.push(account);\n }\n }\n }\n\n // Diff that we will use to publish events afterward.\n const diff = {\n removed: [] as string[],\n added: [] as InternalAccount[],\n };\n\n this.#update((state) => {\n const { internalAccounts } = state;\n\n for (const patch of [patches.snap, patches.normal]) {\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n\n diff.removed.push(account.id);\n }\n\n for (const added of patch.added) {\n const account = this.#getInternalAccountFromAddressAndType(\n added.address,\n added.type,\n );\n\n if (account) {\n // Re-compute the list of accounts everytime, so we can make sure new names\n // are also considered.\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get next account name available for this given keyring.\n const name = this.getNextAvailableAccountName(\n account.metadata.keyring.type,\n accounts,\n );\n\n // If it's the first account, we need to select it.\n const lastSelected =\n accounts.length === 0 ? this.#getLastSelectedIndex() : 0;\n\n internalAccounts.accounts[account.id] = {\n ...account,\n metadata: {\n ...account.metadata,\n name,\n importTime: Date.now(),\n lastSelected,\n },\n };\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n }\n });\n\n // Now publish events\n for (const id of diff.removed) {\n this.messagingSystem.publish('AccountsController:accountRemoved', id);\n }\n\n for (const account of diff.added) {\n this.messagingSystem.publish('AccountsController:accountAdded', account);\n }\n\n // NOTE: Since we also track \"updated\" accounts with our patches, we could fire a new event\n // like `accountUpdated` (we would still need to check if anything really changed on the account).\n }\n\n /**\n * Update the state and fixup the currently selected account.\n *\n * @param callback - Callback for updating state, passed a draft state object.\n */\n #update(callback: (state: WritableDraft<AccountsControllerState>) => void) {\n // The currently selected account might get deleted during the update, so keep track\n // of it before doing any change.\n const previouslySelectedAccount =\n this.state.internalAccounts.selectedAccount;\n\n this.update((state) => {\n callback(state);\n\n // If the account no longer exists (or none is selected), we need to re-select another one.\n const { internalAccounts } = state;\n if (!internalAccounts.accounts[previouslySelectedAccount]) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\n\n // Get the lastly selected account (according to the current accounts).\n const lastSelectedAccount = this.#getLastSelectedAccount(accounts);\n if (lastSelectedAccount) {\n internalAccounts.selectedAccount = lastSelectedAccount.id;\n internalAccounts.accounts[\n lastSelectedAccount.id\n ].metadata.lastSelected = this.#getLastSelectedIndex();\n } else {\n // It will be undefined if there are no accounts.\n internalAccounts.selectedAccount = '';\n }\n }\n });\n\n // Now, we compare the newly selected account, and we send event if different.\n const { selectedAccount } = this.state.internalAccounts;\n if (selectedAccount && selectedAccount !== previouslySelectedAccount) {\n const account = this.getSelectedMultichainAccount();\n\n // The account should always be defined at this point, since we have already checked for\n // `selectedAccount` to be non-empty.\n if (account) {\n if (isEvmAccountType(account.type)) {\n this.messagingSystem.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messagingSystem.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\n }\n }\n }\n\n /**\n * Handles the change in SnapControllerState by updating the metadata of accounts that have a snap enabled.\n *\n * @param snapState - The new SnapControllerState.\n */\n #handleOnSnapStateChange(snapState: SnapControllerState) {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listMultichainAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n const snapId = currentAccount.metadata.snap.id;\n const storedSnap: Snap = snaps[snapId as SnapId];\n if (storedSnap) {\n currentAccount.metadata.snap.enabled =\n storedSnap.enabled && !storedSnap.blocked;\n }\n }\n });\n });\n }\n\n /**\n * Returns the list of accounts for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Accounts to filter by keyring type.\n * @returns The list of accounts associcated with this keyring type.\n */\n #getAccountsByKeyringType(keyringType: string, accounts?: InternalAccount[]) {\n return (accounts ?? this.listMultichainAccounts()).filter(\n (internalAccount) => {\n // We do consider `hd` and `simple` keyrings to be of same type. So we check those 2 types\n // to group those accounts together!\n if (\n keyringType === KeyringTypes.hd ||\n keyringType === KeyringTypes.simple\n ) {\n return (\n internalAccount.metadata.keyring.type === KeyringTypes.hd ||\n internalAccount.metadata.keyring.type === KeyringTypes.simple\n );\n }\n\n return internalAccount.metadata.keyring.type === keyringType;\n },\n );\n }\n\n /**\n * Returns the last selected account from the given array of accounts.\n *\n * @param accounts - An array of InternalAccount objects.\n * @returns The InternalAccount object that was last selected, or undefined if the array is empty.\n */\n #getLastSelectedAccount(\n accounts: InternalAccount[],\n ): InternalAccount | undefined {\n const [accountToSelect] = accounts.sort((accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n });\n\n return accountToSelect;\n }\n\n /**\n * Returns the next account number for a given keyring type.\n *\n * @param keyringType - The type of keyring.\n * @param accounts - Existing accounts to check for the next available account number.\n * @returns An object containing the account prefix and index to use.\n */\n getNextAvailableAccountName(\n keyringType: string = KeyringTypes.hd,\n accounts?: InternalAccount[],\n ): string {\n const keyringName = keyringTypeToName(keyringType);\n const keyringAccounts = this.#getAccountsByKeyringType(\n keyringType,\n accounts,\n );\n const lastDefaultIndexUsedForKeyringType = keyringAccounts.reduce(\n (maxInternalAccountIndex, internalAccount) => {\n // We **DO NOT USE** `\\d+` here to only consider valid \"human\"\n // number (rounded decimal number)\n const match = new RegExp(`${keyringName} ([0-9]+)$`, 'u').exec(\n internalAccount.metadata.name,\n );\n\n if (match) {\n // Quoting `RegExp.exec` documentation:\n // > The returned array has the matched text as the first item, and then one item for\n // > each capturing group of the matched text.\n // So use `match[1]` to get the captured value\n const internalAccountIndex = parseInt(match[1], 10);\n return Math.max(maxInternalAccountIndex, internalAccountIndex);\n }\n\n return maxInternalAccountIndex;\n },\n 0,\n );\n\n const index = Math.max(\n keyringAccounts.length + 1,\n lastDefaultIndexUsedForKeyringType + 1,\n );\n\n return `${keyringName} ${index}`;\n }\n\n /**\n * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex() {\n // NOTE: For now we use the current date, since we know this value\n // will always be higher than any already selected account index.\n return Date.now();\n }\n\n /**\n * Get an internal account given an address and a keyring type.\n *\n * If the account is not a Snap Keyring account, generates an internal account for it and adds it to the controller.\n * If the account is a Snap Keyring account, retrieves the account from the keyring and adds it to the controller.\n *\n * @param address - The address of the new account.\n * @param type - The keyring type of the new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n type: string,\n ): InternalAccount | undefined {\n if (type === KeyringTypes.snap) {\n const keyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!keyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return keyring.getAccountByAddress(address);\n }\n\n return this.#generateInternalAccountForNonSnapAccount(address, type);\n }\n\n /**\n * Handles the change in multichain network by updating the selected account.\n *\n * @param id - The EVM client ID or non-EVM chain ID that changed.\n */\n #handleOnMultichainNetworkDidChange(id: NetworkClientId | CaipChainId) {\n let accountId: string;\n\n // We only support non-EVM Caip chain IDs at the moment. Ex Solana and Bitcoin\n // MultichainNetworkController will handle throwing an error if the Caip chain ID is not supported\n if (isCaipChainId(id)) {\n // Update selected account to non evm account\n const lastSelectedNonEvmAccount = this.getSelectedMultichainAccount(id);\n // @ts-expect-error - This should never be undefined, otherwise it's a bug that should be handled\n accountId = lastSelectedNonEvmAccount.id;\n } else {\n // Update selected account to evm account\n const lastSelectedEvmAccount = this.getSelectedAccount();\n accountId = lastSelectedEvmAccount.id;\n }\n\n this.update((currentState) => {\n currentState.internalAccounts.accounts[accountId].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = accountId;\n });\n\n // DO NOT publish AccountsController:setSelectedAccount to prevent circular listener loops\n }\n\n /**\n * Retrieves the value of a specific metadata key for an existing account.\n *\n * @param accountId - The ID of the account.\n * @param metadataKey - The key of the metadata to retrieve.\n * @param account - The account object to retrieve the metadata key from.\n * @returns The value of the specified metadata key, or undefined if the account or metadata key does not exist.\n */\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n #populateExistingMetadata<T extends keyof InternalAccount['metadata']>(\n accountId: string,\n metadataKey: T,\n account?: InternalAccount,\n ): InternalAccount['metadata'][T] | undefined {\n const internalAccount = account ?? this.getAccount(accountId);\n return internalAccount ? internalAccount.metadata[metadataKey] : undefined;\n }\n\n /**\n * Subscribes to message events.\n */\n #subscribeToMessageEvents() {\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n (snapStateState) => this.#handleOnSnapStateChange(snapStateState),\n );\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n (keyringState) => this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'SnapKeyring:accountTransactionsUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountTransactionsUpdated',\n snapAccountEvent,\n ),\n );\n\n // Handle account change when multichain network is changed\n this.messagingSystem.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n\n /**\n * Registers message handlers for the AccountsController.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setSelectedAccount`,\n this.setSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listAccounts`,\n this.listAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listMultichainAccounts`,\n this.listMultichainAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedAccount`,\n this.getSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedMultichainAccount`,\n this.getSelectedMultichainAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getAccountByAddress`,\n this.getAccountByAddress.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getNextAvailableAccountName`,\n this.getNextAvailableAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:getAccount`,\n this.getAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:updateAccountMetadata`,\n this.updateAccountMetadata.bind(this),\n );\n }\n}\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@metamask-previews/accounts-controller",
|
3
|
-
"version": "27.0.0-preview-
|
3
|
+
"version": "27.0.0-preview-c7dcfd5a",
|
4
4
|
"description": "Manages internal accounts",
|
5
5
|
"keywords": [
|
6
6
|
"MetaMask",
|
@@ -53,8 +53,8 @@
|
|
53
53
|
"@metamask/keyring-api": "^17.4.0",
|
54
54
|
"@metamask/keyring-internal-api": "^6.0.1",
|
55
55
|
"@metamask/keyring-utils": "^3.0.0",
|
56
|
-
"@metamask/snaps-sdk": "^6.
|
57
|
-
"@metamask/snaps-utils": "^
|
56
|
+
"@metamask/snaps-sdk": "^6.22.0",
|
57
|
+
"@metamask/snaps-utils": "^9.2.0",
|
58
58
|
"@metamask/utils": "^11.2.0",
|
59
59
|
"deepmerge": "^4.2.2",
|
60
60
|
"ethereum-cryptography": "^2.1.2",
|
@@ -65,8 +65,8 @@
|
|
65
65
|
"@metamask/auto-changelog": "^3.4.4",
|
66
66
|
"@metamask/keyring-controller": "^21.0.1",
|
67
67
|
"@metamask/network-controller": "^23.2.0",
|
68
|
-
"@metamask/providers": "^
|
69
|
-
"@metamask/snaps-controllers": "^
|
68
|
+
"@metamask/providers": "^21.0.0",
|
69
|
+
"@metamask/snaps-controllers": "^11.2.0",
|
70
70
|
"@types/jest": "^27.4.1",
|
71
71
|
"@types/readable-stream": "^2.3.0",
|
72
72
|
"jest": "^27.5.1",
|
@@ -79,8 +79,8 @@
|
|
79
79
|
"peerDependencies": {
|
80
80
|
"@metamask/keyring-controller": "^21.0.0",
|
81
81
|
"@metamask/network-controller": "^23.0.0",
|
82
|
-
"@metamask/providers": "^
|
83
|
-
"@metamask/snaps-controllers": "^
|
82
|
+
"@metamask/providers": "^21.0.0",
|
83
|
+
"@metamask/snaps-controllers": "^11.0.0",
|
84
84
|
"webextension-polyfill": "^0.10.0 || ^0.11.0 || ^0.12.0"
|
85
85
|
},
|
86
86
|
"engines": {
|