@metamask/accounts-controller 2.0.0 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [2.0.2]
10
+ ### Changed
11
+ - Bump dependency on `@metamask/utils` to ^8.1.0 ([#1639](https://github.com/MetaMask/core/pull/1639))
12
+ - Bump dependency on `@metamask/base-controller` to ^3.2.3
13
+ - Bump peer dependency on `@metamask/keyring-controller` to ^8.0.2
14
+
15
+ ## [2.0.1]
16
+ ### Changed
17
+ - Update TypeScript to v4.8.x ([#1718](https://github.com/MetaMask/core/pull/1718))
18
+
19
+ ### Fixed
20
+ - Remove unused `selectedAccount` from state metadata ([#1734](https://github.com/MetaMask/core/pull/1734))
21
+
9
22
  ## [2.0.0]
10
23
  ### Changed
11
24
  - **BREAKING:** Bump peer dependency on `@metamask/keyring-controller` to ^8.0.0
@@ -14,6 +27,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
14
27
  ### Added
15
28
  - Initial release ([#1637](https://github.com/MetaMask/core/pull/1637))
16
29
 
17
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@2.0.0...HEAD
30
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@2.0.2...HEAD
31
+ [2.0.2]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@2.0.1...@metamask/accounts-controller@2.0.2
32
+ [2.0.1]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@2.0.0...@metamask/accounts-controller@2.0.1
18
33
  [2.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@1.0.0...@metamask/accounts-controller@2.0.0
19
34
  [1.0.0]: https://github.com/MetaMask/core/releases/tag/@metamask/accounts-controller@1.0.0
@@ -1 +1 @@
1
- {"version":3,"file":"AccountsController.d.ts","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccountsController.d.ts","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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"}
@@ -27,10 +27,6 @@ const accountsControllerMetadata = {
27
27
  persist: true,
28
28
  anonymous: false,
29
29
  },
30
- selectedAccount: {
31
- persist: true,
32
- anonymous: false,
33
- },
34
30
  };
35
31
  const defaultState = {
36
32
  internalAccounts: {
@@ -146,7 +142,7 @@ class AccountsController extends base_controller_1.BaseControllerV2 {
146
142
  Date.now();
147
143
  currentState.internalAccounts.selectedAccount = account.id;
148
144
  });
149
- this.messagingSystem.publish(`${this.name}:selectedAccountChange`, account);
145
+ this.messagingSystem.publish('AccountsController:selectedAccountChange', account);
150
146
  }
151
147
  /**
152
148
  * Sets the name of the account with the given ID.
@@ -1 +1 @@
1
- {"version":3,"file":"AccountsController.js","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport { EthAccountType } from '@metamask/keyring-api';\nimport type {\n KeyringControllerState,\n KeyringControllerEvents,\n KeyringControllerGetKeyringForAccountAction,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerGetAccountsAction,\n} from '@metamask/keyring-controller';\nimport type {\n SnapControllerEvents,\n SnapControllerState,\n} from '@metamask/snaps-controllers';\nimport type { Keyring, Json } from '@metamask/utils';\nimport { sha256FromString } from 'ethereumjs-util';\nimport type { Patch } from 'immer';\nimport { v4 as uuid } from 'uuid';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<string, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = {\n type: `${typeof controllerName}:getState`;\n handler: () => AccountsControllerState;\n};\n\nexport type AccountsControllerSetSelectedAccount = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountName = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccounts = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerUpdateAccounts = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccount\n | AccountsControllerListAccounts\n | AccountsControllerSetAccountName\n | AccountsControllerUpdateAccounts\n | KeyringControllerGetKeyringForAccountAction\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetAccountsAction;\n\nexport type AccountsControllerChangeEvent = {\n type: `${typeof controllerName}:stateChange`;\n payload: [AccountsControllerState, Patch[]];\n};\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | SnapControllerEvents\n | KeyringControllerEvents;\n\nexport type AccountsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AccountsControllerActions,\n AccountsControllerEvents,\n string,\n string\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n persist: true,\n anonymous: false,\n },\n selectedAccount: {\n persist: true,\n anonymous: false,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\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 BaseControllerV2<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n keyringApiEnabled: boolean;\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 * @param [options.keyringApiEnabled] - The keyring API enabled flag.\n */\n constructor({\n messenger,\n state,\n keyringApiEnabled,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n keyringApiEnabled?: boolean;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.keyringApiEnabled = Boolean(keyringApiEnabled);\n\n if (this.keyringApiEnabled) {\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n async (snapStateState) =>\n await this.#handleOnSnapStateChange(snapStateState),\n );\n }\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n async (keyringState) =>\n await this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.#registerMessageHandlers();\n\n // if somehow the selected account becomes lost then select the first account\n if (\n this.state.internalAccounts.selectedAccount !== '' &&\n !this.getAccount(this.state.internalAccounts.selectedAccount) &&\n this.listAccounts().length > 0\n ) {\n this.setSelectedAccount(this.listAccounts()[0].id);\n }\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 internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n return Object.values(this.state.internalAccounts.accounts);\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 // 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 (!accountId) {\n return {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n },\n };\n }\n\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 selected internal account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n return this.getAccountExpect(this.state.internalAccounts.selectedAccount);\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 // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Type instantiation is excessively deep and possibly infinite.\n this.update((currentState: AccountsControllerState) => {\n currentState.internalAccounts.accounts[account.id].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = account.id;\n });\n\n this.messagingSystem.publish(`${this.name}:selectedAccountChange`, account);\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 const account = this.getAccountExpect(accountId);\n\n if (\n this.listAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n this.update((currentState: AccountsControllerState) => {\n currentState.internalAccounts.accounts[accountId] = {\n ...account,\n metadata: {\n ...account.metadata,\n name: accountName,\n },\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 let normalAccounts = await this.#listNormalAccounts();\n let snapAccounts: InternalAccount[] = [];\n if (this.keyringApiEnabled) {\n snapAccounts = await this.#listSnapAccounts();\n // remove duplicate accounts that are retrieved from the snap keyring.\n normalAccounts = normalAccounts.filter(\n (account) =>\n !snapAccounts.find(\n (snapAccount) => snapAccount.address === account.address,\n ),\n );\n }\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((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 existingAccount && existingAccount.metadata.name !== ''\n ? existingAccount.metadata.name\n : `${keyringTypeName} ${keyringAccountIndex + 1}`,\n lastSelected: existingAccount?.metadata?.lastSelected,\n },\n };\n\n return internalAccountMap;\n }, {} as Record<string, InternalAccount>);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Type instantiation is excessively deep and possibly infinite.\n this.update((currentState: AccountsControllerState) => {\n currentState.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: AccountsControllerState) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\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 [snapKeyring] = await this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n // snap keyring is not available until the first account is created in the keyring controller\n if (!snapKeyring) {\n return [];\n }\n\n const snapAccounts = await (snapKeyring as SnapKeyring).listAccounts();\n\n return snapAccounts;\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 addresses = await this.messagingSystem.call(\n 'KeyringController:getAccounts',\n );\n const internalAccounts: InternalAccount[] = [];\n for (const address of addresses) {\n const keyring = await this.messagingSystem.call(\n 'KeyringController:getKeyringForAccount',\n address,\n );\n const v4options = {\n random: sha256FromString(address).slice(0, 16),\n };\n\n internalAccounts.push({\n id: uuid(v4options),\n address,\n options: {},\n methods: [\n 'personal_sign',\n 'eth_sign',\n 'eth_signTransaction',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4',\n ],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n keyring: {\n type: (keyring as Keyring<Json>).type,\n },\n },\n });\n }\n\n return internalAccounts.filter(\n (account) => account.metadata.keyring.type !== 'Snap Keyring',\n );\n }\n\n /**\n * Handles the removal of the currently selected account by selecting the previous account in the list.\n */\n #handleSelectedAccountRemoved() {\n const previousAccount = this.listAccounts()\n .filter(\n (account) => account.id !== this.state.internalAccounts.selectedAccount,\n )\n .sort((accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n })[0];\n\n this.setSelectedAccount(previousAccount.id);\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 * @returns A Promise that resolves when the function has finished executing.\n */\n async #handleOnKeyringStateChange(\n keyringState: KeyringControllerState,\n ): Promise<void> {\n // check if there are any new accounts added\n // TODO: change when accountAdded event is added to the keyring controller\n\n if (keyringState.isUnlocked) {\n // TODO: ACCOUNTS_CONTROLLER keyring will return accounts instead of addresses, remove this flatMap after and just get the latest id\n const updatedKeyringAddresses = keyringState.keyrings.flatMap(\n (keyring) => keyring.accounts,\n );\n const previousAccounts = this.listAccounts();\n\n // if there are no overlaps between the addresses in the keyring and previous accounts,\n // it means the keyring is being reinitialized because the vault is being restored with the same SRP\n const overlaps = updatedKeyringAddresses.filter((address) =>\n previousAccounts.find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n ),\n );\n\n await this.updateAccounts();\n\n if (updatedKeyringAddresses.length > previousAccounts.length) {\n this.#handleNewAccountAdded(updatedKeyringAddresses, previousAccounts);\n } else if (updatedKeyringAddresses.length > 0 && overlaps.length === 0) {\n // if the keyring is being reinitialized, the selected account will be reset to the first account\n this.setSelectedAccount(this.listAccounts()[0].id);\n } else if (\n updatedKeyringAddresses.length < previousAccounts.length &&\n overlaps.length > 0 &&\n !this.getAccount(this.state.internalAccounts.selectedAccount)\n ) {\n this.#handleSelectedAccountRemoved();\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 * @returns A Promise that resolves when the update is complete.\n */\n async #handleOnSnapStateChange(\n snapState: SnapControllerState,\n ): Promise<void> {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState: AccountsControllerState) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n currentAccount.metadata.snap.enabled =\n snaps[currentAccount.metadata.snap.id].enabled &&\n !snaps[currentAccount.metadata.snap.id].blocked;\n }\n });\n });\n }\n\n /**\n * Handles the event when a new account is added to the keyring.\n *\n * @param updatedKeyringAddresses - An array of updated keyring addresses.\n * @param previousAccounts - An array of previous internal accounts.\n */\n #handleNewAccountAdded(\n updatedKeyringAddresses: string[],\n previousAccounts: InternalAccount[],\n ) {\n const [newAddress] = updatedKeyringAddresses.filter(\n (address) =>\n !previousAccounts.find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n ),\n );\n\n const [newAccount] = this.listAccounts().filter(\n (account) => account.address.toLowerCase() === newAddress.toLowerCase(),\n );\n\n this.setSelectedAccount(newAccount.id);\n }\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}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n }\n}\n\n/**\n * Returns the name of the keyring type.\n *\n * @param keyringType - The type of the keyring.\n * @returns The name of the keyring type.\n */\nexport function keyringTypeToName(keyringType: string): string {\n switch (keyringType) {\n case 'Simple Key Pair': {\n return 'Account';\n }\n case 'HD Key Tree': {\n return 'Account';\n }\n case 'Trezor Hardware': {\n return 'Trezor';\n }\n case 'Ledger Hardware': {\n return 'Ledger';\n }\n case 'Lattice Hardware': {\n return 'Lattice';\n }\n case 'QR Hardware Wallet Device': {\n return 'QR';\n }\n case 'Snap Keyring': {\n return 'Snap Account';\n }\n case 'Custody': {\n return 'Custody';\n }\n default: {\n throw new Error(`Unknown keyring ${keyringType}`);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"AccountsController.js","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport { EthAccountType } from '@metamask/keyring-api';\nimport type {\n KeyringControllerState,\n KeyringControllerEvents,\n KeyringControllerGetKeyringForAccountAction,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerGetAccountsAction,\n} from '@metamask/keyring-controller';\nimport type {\n SnapControllerEvents,\n SnapControllerState,\n} from '@metamask/snaps-controllers';\nimport type { Keyring, Json } from '@metamask/utils';\nimport { sha256FromString } from 'ethereumjs-util';\nimport type { Patch } from 'immer';\nimport { v4 as uuid } from 'uuid';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<string, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = {\n type: `${typeof controllerName}:getState`;\n handler: () => AccountsControllerState;\n};\n\nexport type AccountsControllerSetSelectedAccount = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountName = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccounts = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerUpdateAccounts = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccount\n | AccountsControllerListAccounts\n | AccountsControllerSetAccountName\n | AccountsControllerUpdateAccounts\n | KeyringControllerGetKeyringForAccountAction\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetAccountsAction;\n\nexport type AccountsControllerChangeEvent = {\n type: `${typeof controllerName}:stateChange`;\n payload: [AccountsControllerState, Patch[]];\n};\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | SnapControllerEvents\n | KeyringControllerEvents;\n\nexport type AccountsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AccountsControllerActions,\n AccountsControllerEvents,\n string,\n string\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\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 BaseControllerV2<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n keyringApiEnabled: boolean;\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 * @param [options.keyringApiEnabled] - The keyring API enabled flag.\n */\n constructor({\n messenger,\n state,\n keyringApiEnabled,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n keyringApiEnabled?: boolean;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.keyringApiEnabled = Boolean(keyringApiEnabled);\n\n if (this.keyringApiEnabled) {\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n async (snapStateState) =>\n await this.#handleOnSnapStateChange(snapStateState),\n );\n }\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n async (keyringState) =>\n await this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.#registerMessageHandlers();\n\n // if somehow the selected account becomes lost then select the first account\n if (\n this.state.internalAccounts.selectedAccount !== '' &&\n !this.getAccount(this.state.internalAccounts.selectedAccount) &&\n this.listAccounts().length > 0\n ) {\n this.setSelectedAccount(this.listAccounts()[0].id);\n }\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 internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n return Object.values(this.state.internalAccounts.accounts);\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 // 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 (!accountId) {\n return {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n },\n };\n }\n\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 selected internal account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n return this.getAccountExpect(this.state.internalAccounts.selectedAccount);\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 // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Type instantiation is excessively deep and possibly infinite.\n this.update((currentState: AccountsControllerState) => {\n currentState.internalAccounts.accounts[account.id].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = account.id;\n });\n\n this.messagingSystem.publish(\n 'AccountsController:selectedAccountChange',\n account,\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 const account = this.getAccountExpect(accountId);\n\n if (\n this.listAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n this.update((currentState: AccountsControllerState) => {\n currentState.internalAccounts.accounts[accountId] = {\n ...account,\n metadata: {\n ...account.metadata,\n name: accountName,\n },\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 let normalAccounts = await this.#listNormalAccounts();\n let snapAccounts: InternalAccount[] = [];\n if (this.keyringApiEnabled) {\n snapAccounts = await this.#listSnapAccounts();\n // remove duplicate accounts that are retrieved from the snap keyring.\n normalAccounts = normalAccounts.filter(\n (account) =>\n !snapAccounts.find(\n (snapAccount) => snapAccount.address === account.address,\n ),\n );\n }\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((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 existingAccount && existingAccount.metadata.name !== ''\n ? existingAccount.metadata.name\n : `${keyringTypeName} ${keyringAccountIndex + 1}`,\n lastSelected: existingAccount?.metadata?.lastSelected,\n },\n };\n\n return internalAccountMap;\n }, {} as Record<string, InternalAccount>);\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore Type instantiation is excessively deep and possibly infinite.\n this.update((currentState: AccountsControllerState) => {\n currentState.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: AccountsControllerState) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\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 [snapKeyring] = await this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n // snap keyring is not available until the first account is created in the keyring controller\n if (!snapKeyring) {\n return [];\n }\n\n const snapAccounts = await (snapKeyring as SnapKeyring).listAccounts();\n\n return snapAccounts;\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 addresses = await this.messagingSystem.call(\n 'KeyringController:getAccounts',\n );\n const internalAccounts: InternalAccount[] = [];\n for (const address of addresses) {\n const keyring = await this.messagingSystem.call(\n 'KeyringController:getKeyringForAccount',\n address,\n );\n const v4options = {\n random: sha256FromString(address).slice(0, 16),\n };\n\n internalAccounts.push({\n id: uuid(v4options),\n address,\n options: {},\n methods: [\n 'personal_sign',\n 'eth_sign',\n 'eth_signTransaction',\n 'eth_signTypedData_v1',\n 'eth_signTypedData_v3',\n 'eth_signTypedData_v4',\n ],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n keyring: {\n type: (keyring as Keyring<Json>).type,\n },\n },\n });\n }\n\n return internalAccounts.filter(\n (account) => account.metadata.keyring.type !== 'Snap Keyring',\n );\n }\n\n /**\n * Handles the removal of the currently selected account by selecting the previous account in the list.\n */\n #handleSelectedAccountRemoved() {\n const previousAccount = this.listAccounts()\n .filter(\n (account) => account.id !== this.state.internalAccounts.selectedAccount,\n )\n .sort((accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n })[0];\n\n this.setSelectedAccount(previousAccount.id);\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 * @returns A Promise that resolves when the function has finished executing.\n */\n async #handleOnKeyringStateChange(\n keyringState: KeyringControllerState,\n ): Promise<void> {\n // check if there are any new accounts added\n // TODO: change when accountAdded event is added to the keyring controller\n\n if (keyringState.isUnlocked) {\n // TODO: ACCOUNTS_CONTROLLER keyring will return accounts instead of addresses, remove this flatMap after and just get the latest id\n const updatedKeyringAddresses = keyringState.keyrings.flatMap(\n (keyring) => keyring.accounts,\n );\n const previousAccounts = this.listAccounts();\n\n // if there are no overlaps between the addresses in the keyring and previous accounts,\n // it means the keyring is being reinitialized because the vault is being restored with the same SRP\n const overlaps = updatedKeyringAddresses.filter((address) =>\n previousAccounts.find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n ),\n );\n\n await this.updateAccounts();\n\n if (updatedKeyringAddresses.length > previousAccounts.length) {\n this.#handleNewAccountAdded(updatedKeyringAddresses, previousAccounts);\n } else if (updatedKeyringAddresses.length > 0 && overlaps.length === 0) {\n // if the keyring is being reinitialized, the selected account will be reset to the first account\n this.setSelectedAccount(this.listAccounts()[0].id);\n } else if (\n updatedKeyringAddresses.length < previousAccounts.length &&\n overlaps.length > 0 &&\n !this.getAccount(this.state.internalAccounts.selectedAccount)\n ) {\n this.#handleSelectedAccountRemoved();\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 * @returns A Promise that resolves when the update is complete.\n */\n async #handleOnSnapStateChange(\n snapState: SnapControllerState,\n ): Promise<void> {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState: AccountsControllerState) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n currentAccount.metadata.snap.enabled =\n snaps[currentAccount.metadata.snap.id].enabled &&\n !snaps[currentAccount.metadata.snap.id].blocked;\n }\n });\n });\n }\n\n /**\n * Handles the event when a new account is added to the keyring.\n *\n * @param updatedKeyringAddresses - An array of updated keyring addresses.\n * @param previousAccounts - An array of previous internal accounts.\n */\n #handleNewAccountAdded(\n updatedKeyringAddresses: string[],\n previousAccounts: InternalAccount[],\n ) {\n const [newAddress] = updatedKeyringAddresses.filter(\n (address) =>\n !previousAccounts.find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n ),\n );\n\n const [newAccount] = this.listAccounts().filter(\n (account) => account.address.toLowerCase() === newAddress.toLowerCase(),\n );\n\n this.setSelectedAccount(newAccount.id);\n }\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}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n }\n}\n\n/**\n * Returns the name of the keyring type.\n *\n * @param keyringType - The type of the keyring.\n * @returns The name of the keyring type.\n */\nexport function keyringTypeToName(keyringType: string): string {\n switch (keyringType) {\n case 'Simple Key Pair': {\n return 'Account';\n }\n case 'HD Key Tree': {\n return 'Account';\n }\n case 'Trezor Hardware': {\n return 'Trezor';\n }\n case 'Ledger Hardware': {\n return 'Ledger';\n }\n case 'Lattice Hardware': {\n return 'Lattice';\n }\n case 'QR Hardware Wallet Device': {\n return 'QR';\n }\n case 'Snap Keyring': {\n return 'Snap Account';\n }\n case 'Custody': {\n return 'Custody';\n }\n default: {\n throw new Error(`Unknown keyring ${keyringType}`);\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/accounts-controller",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "description": "Manages internal accounts",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -25,14 +25,15 @@
25
25
  "changelog:validate": "../../scripts/validate-changelog.sh @metamask/accounts-controller",
26
26
  "publish:preview": "yarn npm publish --tag preview",
27
27
  "test": "jest",
28
+ "test:clean": "jest --clearCache",
28
29
  "test:watch": "jest --watch"
29
30
  },
30
31
  "dependencies": {
31
- "@metamask/base-controller": "^3.2.1",
32
+ "@metamask/base-controller": "^3.2.3",
32
33
  "@metamask/eth-snap-keyring": "^0.2.2",
33
34
  "@metamask/keyring-api": "^0.2.5",
34
35
  "@metamask/snaps-utils": "^1.0.1",
35
- "@metamask/utils": "^6.2.0",
36
+ "@metamask/utils": "^8.1.0",
36
37
  "deepmerge": "^4.2.2",
37
38
  "eth-rpc-errors": "^4.0.2",
38
39
  "ethereumjs-util": "^7.0.10",
@@ -42,18 +43,18 @@
42
43
  },
43
44
  "devDependencies": {
44
45
  "@metamask/auto-changelog": "^3.1.0",
45
- "@metamask/keyring-controller": "^8.0.0",
46
+ "@metamask/keyring-controller": "^8.0.2",
46
47
  "@metamask/snaps-controllers": "^1.0.1",
47
48
  "@types/jest": "^27.4.1",
48
49
  "@types/readable-stream": "^2.3.0",
49
50
  "jest": "^27.5.1",
50
51
  "ts-jest": "^27.1.4",
51
- "typedoc": "^0.22.15",
52
- "typedoc-plugin-missing-exports": "^0.22.6",
53
- "typescript": "~4.6.3"
52
+ "typedoc": "^0.24.8",
53
+ "typedoc-plugin-missing-exports": "^2.0.0",
54
+ "typescript": "~4.8.4"
54
55
  },
55
56
  "peerDependencies": {
56
- "@metamask/keyring-controller": "^8.0.0"
57
+ "@metamask/keyring-controller": "^8.0.2"
57
58
  },
58
59
  "engines": {
59
60
  "node": ">=16.0.0"