@metamask/accounts-controller 38.0.0 → 38.1.1

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 CHANGED
@@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [38.1.1]
11
+
12
+ ### Changed
13
+
14
+ - Bump `@metamask/network-controller` from `^31.0.0` to `^32.0.0` ([#8765](https://github.com/MetaMask/core/pull/8765), [#8774](https://github.com/MetaMask/core/pull/8774))
15
+
16
+ ## [38.1.0]
17
+
18
+ ### Changed
19
+
20
+ - Use `KeyringV1Adapter` for `SnapKeyring` v2 accounts ([#8703](https://github.com/MetaMask/core/pull/8703))
21
+ - `SnapKeyring` v2 instances will be adapted/wrapped by a v1 keyring adapter, making it compatible with the current `KeyringController` keyrings management.
22
+ - Bump `@metamask/keyring-utils` from `^3.1.0` to `^3.2.1` ([#8703](https://github.com/MetaMask/core/pull/8703))
23
+ - Bump `@metamask/keyring-controller` from `^25.4.0` to `^25.5.0` ([#8722](https://github.com/MetaMask/core/pull/8722))
24
+ - Bump `@metamask/network-controller` from `^30.1.0` to `^31.0.0` ([#8755](https://github.com/MetaMask/core/pull/8755))
25
+
10
26
  ## [38.0.0]
11
27
 
12
28
  ### Added
@@ -76,8 +92,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
76
92
  - Add `accountIdByAddress` mapping to state ([#7893](https://github.com/MetaMask/core/pull/7893))
77
93
  - This state was added to improve lookup times for an account by address from O(n) to O(1).
78
94
  - `getAccountByAddress` also leverages this new map, thus, should be slightly faster too.
79
- - Add logging capabilities ([#8118](https://github.com/MetaMask/core/pull/8118/))
80
- - Expose missing public `AccountsController` methods through its messenger ([#7976](https://github.com/MetaMask/core/pull/7976/))
95
+ - Add logging capabilities ([#8118](https://github.com/MetaMask/core/pull/8118))
96
+ - Expose missing public `AccountsController` methods through its messenger ([#7976](https://github.com/MetaMask/core/pull/7976))
81
97
  - The following actions are now available:
82
98
  - `AccountController:loadBackupAction`
83
99
  - Corresponding action types (e.g. `AccountControllerLoadBackupAction`) are available as well.
@@ -222,7 +238,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
222
238
 
223
239
  ### Added
224
240
 
225
- - Use new typed `KeyringAccount.options` for BIP-44 compatible accounts ([#6122](https://github.com/MetaMask/core/pull/6122)), ([#6147](https://github.com/MetaMask/core/pull/6147))
241
+ - Use new typed `KeyringAccount.options` for BIP-44 compatible accounts, ([#6122](https://github.com/MetaMask/core/pull/6122), [#6147](https://github.com/MetaMask/core/pull/6147))
226
242
 
227
243
  ### Changed
228
244
 
@@ -293,7 +309,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
293
309
 
294
310
  ### Fixed
295
311
 
296
- - `@metamask/network-controller` peer dependency is no longer also a direct dependency ([#5464](https://github.com/MetaMask/core/pull/5464)))
312
+ - `@metamask/network-controller` peer dependency is no longer also a direct dependency) ([#5464](https://github.com/MetaMask/core/pull/5464))
297
313
 
298
314
  ## [26.1.0]
299
315
 
@@ -331,7 +347,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
331
347
 
332
348
  - Bump `@metamask/keyring-controller"` from `^19.1.0` to `^19.2.0` ([#5357](https://github.com/MetaMask/core/pull/5357))
333
349
  - Bump `@metamask/keyring-api"` from `^17.0.0` to `^17.2.0` ([#5366](https://github.com/MetaMask/core/pull/5366))
334
- - Bump `@metamask/keyring-internal-api` from `^4.0.1` to `^4.0.3` ([#5356](https://github.com/MetaMask/core/pull/5356)), ([#5366](https://github.com/MetaMask/core/pull/5366))
350
+ - Bump `@metamask/keyring-internal-api` from `^4.0.1` to `^4.0.3`, ([#5356](https://github.com/MetaMask/core/pull/5356), [#5366](https://github.com/MetaMask/core/pull/5366))
335
351
  - Bump `@metamask/eth-snap-keyring` from `^10.0.0` to `^11.1.0` ([#5366](https://github.com/MetaMask/core/pull/5366))
336
352
  - Bump `@metamask/utils` from `^11.1.0` to `^11.2.0` ([#5301](https://github.com/MetaMask/core/pull/5301))
337
353
 
@@ -344,7 +360,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
344
360
 
345
361
  ### Changed
346
362
 
347
- - **BREAKING:** Add `@metamask/network-controller@^22.0.0` peer dependency ([#5215](https://github.com/MetaMask/core/pull/5215)), ([#5327](https://github.com/MetaMask/core/pull/5327))
363
+ - **BREAKING:** Add `@metamask/network-controller@^22.0.0` peer dependency, ([#5215](https://github.com/MetaMask/core/pull/5215), [#5327](https://github.com/MetaMask/core/pull/5327))
348
364
 
349
365
  ## [23.1.0]
350
366
 
@@ -365,7 +381,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
365
381
  - **BREAKING:** Bump `@metamask/snaps-controllers` peer dependency from `^9.7.0` to `^9.19.0` ([#5265](https://github.com/MetaMask/core/pull/5265))
366
382
  - Bump `@metamask/keyring-api"` from `^16.1.0` to `^17.0.0` ([#5280](https://github.com/MetaMask/core/pull/5280))
367
383
  - Bump `@metamask/eth-snap-keyring` from `^9.1.1` to `^10.0.0` ([#5280](https://github.com/MetaMask/core/pull/5280))
368
- - Bump `@metamask/snaps-sdk` from `^6.7.0` to `^6.17.1` ([#5220](https://github.com/MetaMask/core/pull/5220)), ([#5265](https://github.com/MetaMask/core/pull/5265))
384
+ - Bump `@metamask/snaps-sdk` from `^6.7.0` to `^6.17.1`, ([#5220](https://github.com/MetaMask/core/pull/5220), [#5265](https://github.com/MetaMask/core/pull/5265))
369
385
  - Bump `@metamask/snaps-utils` from `^8.9.0` to `^8.10.0` ([#5265](https://github.com/MetaMask/core/pull/5265))
370
386
  - Bump `@metamask/utils` from `^11.0.1` to `^11.1.0` ([#5223](https://github.com/MetaMask/core/pull/5223))
371
387
 
@@ -384,9 +400,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
384
400
  ### Changed
385
401
 
386
402
  - **BREAKING:** Now requires `SnapKeyring:account{AssetList,Balances,Transactions}Updated` events to be registered on the messenger ([#5190](https://github.com/MetaMask/core/pull/5190))
387
- - Bump `@metamask/keyring-api` from `^14.0.0` to `^16.1.0` ([#5190](https://github.com/MetaMask/core/pull/5190)), ([#5208](https://github.com/MetaMask/core/pull/5208))
388
- - Bump `@metamask/keyring-internal-api` from `^2.0.1` to `^4.0.1` ([#5190](https://github.com/MetaMask/core/pull/5190)), ([#5208](https://github.com/MetaMask/core/pull/5208))
389
- - Bump `@metamask/eth-snap-keyring` from `^8.1.1` to `^9.1.1` ([#5190](https://github.com/MetaMask/core/pull/5190)), ([#5208](https://github.com/MetaMask/core/pull/5208))
403
+ - Bump `@metamask/keyring-api` from `^14.0.0` to `^16.1.0`, ([#5190](https://github.com/MetaMask/core/pull/5190), [#5208](https://github.com/MetaMask/core/pull/5208))
404
+ - Bump `@metamask/keyring-internal-api` from `^2.0.1` to `^4.0.1`, ([#5190](https://github.com/MetaMask/core/pull/5190), [#5208](https://github.com/MetaMask/core/pull/5208))
405
+ - Bump `@metamask/eth-snap-keyring` from `^8.1.1` to `^9.1.1`, ([#5190](https://github.com/MetaMask/core/pull/5190), [#5208](https://github.com/MetaMask/core/pull/5208))
390
406
 
391
407
  ## [21.0.2]
392
408
 
@@ -406,9 +422,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
406
422
 
407
423
  ### Changed
408
424
 
409
- - **BREAKING:** Add `scopes` field to `KeyringAccount` ([#5066](https://github.com/MetaMask/core/pull/5066)), ([#5136](https://github.com/MetaMask/core/pull/5136))
425
+ - **BREAKING:** Add `scopes` field to `KeyringAccount`, ([#5066](https://github.com/MetaMask/core/pull/5066), [#5136](https://github.com/MetaMask/core/pull/5136))
410
426
  - This field is now required and will be used to identify the supported chains (using CAIP-2 chain IDs) for every accounts.
411
- - Bump `@metamask/base-controller` from `^7.0.0` to `^7.1.1` ([#5079](https://github.com/MetaMask/core/pull/5079)), ([#5135](https://github.com/MetaMask/core/pull/5135))
427
+ - Bump `@metamask/base-controller` from `^7.0.0` to `^7.1.1`, ([#5079](https://github.com/MetaMask/core/pull/5079), [#5135](https://github.com/MetaMask/core/pull/5135))
412
428
  - Bump `@metamask/utils` to `^11.0.1` ([#5080](https://github.com/MetaMask/core/pull/5080))
413
429
  - Bump `@metamask/rpc-errors` to `^7.0.2` ([#5080](https://github.com/MetaMask/core/pull/5080))
414
430
 
@@ -440,7 +456,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
440
456
 
441
457
  ### Changed
442
458
 
443
- - **BREAKING:** Bump peer dependency `@metamask/keyring-controller` from `^18.0.0` to `^19.0.0` ([#4915](https://github.com/MetaMask/core/pull/4956))
459
+ - **BREAKING:** Bump peer dependency `@metamask/keyring-controller` from `^18.0.0` to `^19.0.0` ([#4915](https://github.com/MetaMask/core/pull/4915))
444
460
  - **BREAKING:** Bump `@metamask/keyring-api` from `^8.1.3` to `^10.1.0` ([#4948](https://github.com/MetaMask/core/pull/4948))
445
461
  - If you are depending on `@metamask/providers` directly, you will need to upgrade to `18.1.0`.
446
462
  - Bump `@metamask/eth-snap-keyring` from `^4.3.6` to `^5.0.1` ([#4948](https://github.com/MetaMask/core/pull/4948))
@@ -465,7 +481,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
465
481
 
466
482
  ### Changed
467
483
 
468
- - Bump accounts related packages ([#4713](https://github.com/MetaMask/core/pull/4713)), ([#4728](https://github.com/MetaMask/core/pull/4728))
484
+ - Bump accounts related packages, ([#4713](https://github.com/MetaMask/core/pull/4713), [#4728](https://github.com/MetaMask/core/pull/4728))
469
485
  - Those packages are now built slightly differently and are part of the [accounts monorepo](https://github.com/MetaMask/accounts).
470
486
  - Bump `@metamask/keyring-api` from `^8.1.0` to `^8.1.4`
471
487
  - Bump `@metamask/eth-snap-keyring` from `^4.3.3` to `^4.3.6`
@@ -489,7 +505,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
489
505
  ["Are the Types Wrong?"](https://arethetypeswrong.github.io/) tool as
490
506
  ["masquerading as CJS"](https://github.com/arethetypeswrong/arethetypeswrong.github.io/blob/main/docs/problems/FalseCJS.md).
491
507
  All of the ATTW checks now pass.
492
- - Remove chunk files ([#4648](https://github.com/MetaMask/core/pull/4648)).
508
+ - Remove chunk files. ([#4648](https://github.com/MetaMask/core/pull/4648))
493
509
  - Previously, the build tool we used to generate JavaScript files extracted
494
510
  common code to "chunk" files. While this was intended to make this package
495
511
  more tree-shakeable, it also made debugging more difficult for our
@@ -499,7 +515,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
499
515
 
500
516
  ### Added
501
517
 
502
- - Add event `AccountsController:accountRenamed` and export corresponding event type `AccountsControllerAccountRenamedEvent` ([#4664](https://github.com/MetaMask/core/pull/4664)), ([#4660](https://github.com/MetaMask/core/pull/4660))
518
+ - Add event `AccountsController:accountRenamed` and export corresponding event type `AccountsControllerAccountRenamedEvent`, ([#4664](https://github.com/MetaMask/core/pull/4664), [#4660](https://github.com/MetaMask/core/pull/4660))
503
519
  - Add new `nameLastUpdatedAt` timestamp to account's metadata ([#4589](https://github.com/MetaMask/core/pull/4589))
504
520
 
505
521
  ### Changed
@@ -783,7 +799,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
783
799
 
784
800
  - Initial release ([#1637](https://github.com/MetaMask/core/pull/1637))
785
801
 
786
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@38.0.0...HEAD
802
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@38.1.1...HEAD
803
+ [38.1.1]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@38.1.0...@metamask/accounts-controller@38.1.1
804
+ [38.1.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@38.0.0...@metamask/accounts-controller@38.1.0
787
805
  [38.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@37.2.0...@metamask/accounts-controller@38.0.0
788
806
  [37.2.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@37.1.1...@metamask/accounts-controller@37.2.0
789
807
  [37.1.1]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@37.1.0...@metamask/accounts-controller@37.1.1
@@ -12,6 +12,7 @@ const eth_snap_keyring_1 = require("@metamask/eth-snap-keyring");
12
12
  const v2_1 = require("@metamask/eth-snap-keyring/v2");
13
13
  const keyring_api_1 = require("@metamask/keyring-api");
14
14
  const v2_2 = require("@metamask/keyring-api/v2");
15
+ const v2_3 = require("@metamask/keyring-sdk/v2");
15
16
  const keyring_utils_1 = require("@metamask/keyring-utils");
16
17
  const utils_1 = require("@metamask/utils");
17
18
  const lodash_1 = require("lodash");
@@ -488,12 +489,19 @@ _AccountsController_instances = new WeakSet(), _AccountsController_getAccountExp
488
489
  return snapKeyring.getAccountByAddress(address);
489
490
  }, _AccountsController_getAccountFromSnapKeyringV2 = function _AccountsController_getAccountFromSnapKeyringV2(address) {
490
491
  const keyrings = this.messenger.call('KeyringController:getKeyringsByType', v2_2.KeyringType.Snap);
491
- // Snap keyring v2 are "per-Snaps", so we need to iterate over all of them to find the account.
492
+ // Snap keyring v2 are "per-Snaps" (and can be accessed using their v1 adapter), so we need to
493
+ // iterate over all of them to find the account.
494
+ // NOTE: `:getKeyringsByType` will only return v1 instances, that's why we need to use their v1
495
+ // adapter + `unwrap` method to get the reference to their v2 instance.
492
496
  for (const keyring of keyrings) {
493
- if (keyring instanceof v2_1.SnapKeyring) {
497
+ if (keyring instanceof v2_3.KeyringV1Adapter) {
498
+ // NOTE: We already filtering by `KeyringType.Snap`, so we are sure that those adapters
499
+ // are wrapping a Snap keyring v2.
500
+ const adapter = keyring;
501
+ const keyringV2 = adapter.unwrap();
494
502
  // We use the synchronous method here since this method is used during `:stateChange` that are
495
503
  // use synchronous handlers.
496
- const account = keyring.lookupByAddress(address);
504
+ const account = keyringV2.lookupByAddress(address);
497
505
  if (account) {
498
506
  return {
499
507
  ...account,
@@ -506,7 +514,7 @@ _AccountsController_instances = new WeakSet(), _AccountsController_getAccountExp
506
514
  type: v2_2.KeyringType.Snap,
507
515
  },
508
516
  snap: {
509
- id: keyring.snapId,
517
+ id: keyringV2.snapId,
510
518
  },
511
519
  },
512
520
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AccountsController.cjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type {\n SnapKeyringAccountAssetListUpdatedEvent,\n SnapKeyringAccountBalancesUpdatedEvent,\n SnapKeyringAccountTransactionsUpdatedEvent,\n} from '@metamask/eth-snap-keyring';\nimport { SnapKeyring as SnapKeyringV2 } from '@metamask/eth-snap-keyring/v2';\nimport type { KeyringAccountEntropyOptions } from '@metamask/keyring-api';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n KeyringAccountEntropyTypeOption,\n} from '@metamask/keyring-api';\nimport { KeyringType } from '@metamask/keyring-api/v2';\nimport type {\n KeyringControllerState,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerStateChangeEvent,\n KeyringControllerGetStateAction,\n KeyringObject,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { Messenger, ExtractEventPayload } from '@metamask/messenger';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\nimport type { CaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { cloneDeep } from 'lodash';\n\nimport { AccountsControllerMethodActions } from './AccountsController-method-action-types';\nimport { projectLogger as log } from './logger';\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport type { AccountsControllerStrictState } from './typing';\nimport type { HdSnapKeyringAccount } from './utils';\nimport {\n constructAccountIdByAddress,\n getEvmDerivationPathForIndex,\n getEvmGroupIndexFromAddressIndex,\n getUUIDFromAddressOfNormalAccount,\n isHdKeyringType,\n isHdSnapKeyringAccount,\n isMoneyKeyringType,\n isSnapKeyringType,\n isSnapKeyringV2Type,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountId = string;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n accountIdByAddress: Record<InternalAccount['address'], AccountId>;\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'setSelectedAccount',\n 'setAccountName',\n 'setAccountNameAndSelectAccount',\n 'listAccounts',\n 'listMultichainAccounts',\n 'updateAccounts',\n 'getSelectedAccount',\n 'getSelectedMultichainAccount',\n 'getAccountByAddress',\n 'getAccount',\n 'getAccounts',\n 'updateAccountMetadata',\n 'loadBackup',\n] as const;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerMethodActions;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountsAddedEvent = {\n type: `${typeof controllerName}:accountsAdded`;\n payload: [InternalAccount[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountsRemovedEvent = {\n type: `${typeof controllerName}:accountsRemoved`;\n payload: [AccountId[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedEvents =\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountsAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountsRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerMessenger = Messenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n accountIdByAddress: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n accountIdByAddress: {},\n};\n\n/**\n * @deprecated This constant is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * A patch representing a keyring state change.\n */\ntype StatePatch = {\n previous: Record<string, InternalAccount>;\n added: {\n address: string;\n keyring: KeyringObject;\n }[];\n updated: InternalAccount[];\n removed: InternalAccount[];\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 * @deprecated This class is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 const accountIdByAddress = constructAccountIdByAddress(\n state?.internalAccounts?.accounts ?? {},\n );\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n accountIdByAddress,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n this.#subscribeToMessageEvents();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 the internal account objects for the given account IDs, if they exist.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountIds - The IDs of the accounts to retrieve.\n * @returns The internal account objects, or undefined if the account(s) do not exist.\n */\n getAccounts(accountIds: string[]): (InternalAccount | undefined)[] {\n return accountIds.map((accountId) => this.getAccount(accountId));\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 // We need to have a fallback as a cache miss might be attributed to a checksummed address being passed.\n let accountId = this.state.accountIdByAddress[address];\n if (!accountId) {\n // FIXME: We should not need lower-cased addresses, but some consumers might\n // still be using non-normalized addresses. For now we keep it\n // for convenience, but we will need to remove this fallback\n // at some point.\n // NOTE: We should only hit that branch for EVM accounts only.\n const lowercasedAddress = address.toLowerCase();\n accountId = this.state.accountIdByAddress[lowercasedAddress];\n if (accountId) {\n log(\n `Cache missed for account ID: ${accountId}, received address: \"${address}\", matched address: \"${lowercasedAddress}\"`,\n );\n }\n }\n return accountId ? this.getAccount(accountId) : undefined;\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 if (this.state.internalAccounts.selectedAccount === account.id) {\n return;\n }\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * Sets the name of the account with the given ID and select it.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountId - The ID of the account to set the name for and select.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountNameAndSelectAccount(accountId: string, accountName: string): void {\n const account = this.#getAccountExpect(accountId);\n\n this.#assertAccountCanBeRenamed(account, accountName);\n\n const internalAccount = {\n ...account,\n metadata: {\n ...account.metadata,\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n lastSelected: this.#getLastSelectedIndex(),\n },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[account.id] = internalAccount;\n state.internalAccounts.selectedAccount = account.id;\n });\n\n this.messenger.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n\n #assertAccountCanBeRenamed(\n account: InternalAccount,\n accountName: string,\n ): void {\n if (\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== account.id,\n )\n ) {\n throw new Error('Account name already exists');\n }\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 (metadata.name) {\n this.#assertAccountCanBeRenamed(account, metadata.name);\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[accountId] = internalAccount;\n });\n\n if (metadata.name) {\n this.messenger.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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n log('Synchronizing accounts with keyrings...');\n\n const keyringAccountIndexes = new Map<string, number>();\n\n const existingInternalAccounts = this.state.internalAccounts.accounts;\n const internalAccounts: AccountsControllerState['internalAccounts']['accounts'] =\n {};\n\n const { keyrings } = this.messenger.call('KeyringController:getState');\n for (const keyring of keyrings) {\n // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\n\n const keyringTypeName = keyringTypeToName(keyring.type);\n\n for (const address of keyring.accounts) {\n const internalAccount = this.#getInternalAccountFromAddressAndType(\n address,\n keyring,\n );\n\n // This should never really happen, but if for some reason we're not\n // able to get the Snap keyring reference, this would return an\n // undefined account.\n // So we just skip it, even though, this should not really happen.\n if (!internalAccount) {\n continue;\n }\n\n // Get current index for this keyring (we use human indexing, so start at 1).\n const keyringAccountIndex =\n keyringAccountIndexes.get(keyringTypeName) ?? 1;\n\n const existingAccount = existingInternalAccounts[internalAccount.id];\n internalAccounts[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n\n // Re-use existing metadata if any.\n name:\n existingAccount?.metadata.name ??\n `${keyringTypeName} ${keyringAccountIndex}`,\n importTime: existingAccount?.metadata.importTime ?? Date.now(),\n lastSelected: existingAccount?.metadata.lastSelected ?? 0,\n },\n };\n\n // Increment the account index for this keyring.\n keyringAccountIndexes.set(keyringTypeName, keyringAccountIndex + 1);\n }\n }\n\n this.#update((state) => {\n state.internalAccounts.accounts = internalAccounts;\n state.accountIdByAddress = constructAccountIdByAddress(internalAccounts);\n });\n\n log('Accounts synchronized!');\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n const accountIdByAddress = constructAccountIdByAddress(\n backup.internalAccounts.accounts,\n );\n this.update(\n (currentState: WritableDraft<AccountsControllerStrictState>) => {\n currentState.internalAccounts = backup.internalAccounts;\n currentState.accountIdByAddress = accountIdByAddress;\n },\n );\n }\n }\n\n /**\n * Gets an internal account representation for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param keyring - The keyring object of the account.\n * @returns The generated internal account.\n */\n #getInternalAccountForNonSnapAccount(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n // We might have an account for this ID already, so we'll just re-use\n // the same metadata\n const account = this.getAccount(id);\n const metadata: InternalAccount['metadata'] = {\n name: account?.metadata.name ?? '',\n ...(account?.metadata.nameLastUpdatedAt\n ? {\n nameLastUpdatedAt: account?.metadata.nameLastUpdatedAt,\n }\n : {}),\n importTime: account?.metadata.importTime ?? Date.now(),\n lastSelected: account?.metadata.lastSelected ?? 0,\n keyring: {\n type: keyring.type,\n },\n };\n\n let options: InternalAccount['options'] = {};\n if (isHdKeyringType(keyring.type)) {\n // We need to find the account index from its HD keyring.\n const groupIndex = getEvmGroupIndexFromAddressIndex(keyring, address);\n\n // If for some reason, we cannot find this address, then the caller made a mistake\n // and it did not use the proper keyring object. For now, we do not fail and just\n // consider this account as \"simple account\".\n if (groupIndex !== undefined) {\n // NOTE: We are not using the `hdPath` from the associated keyring here and\n // getting the keyring instance here feels a bit overkill.\n // This will be naturally fixed once every keyring start using `KeyringAccount` and implement the keyring API.\n const derivationPath = getEvmDerivationPathForIndex(groupIndex);\n\n // Those are \"legacy options\" and they were used before `KeyringAccount` added\n // support for type options. We keep those temporarily until we update everything\n // to use the new typed options.\n const legacyOptions = {\n entropySource: keyring.metadata.id,\n derivationPath,\n groupIndex,\n };\n\n // New typed entropy options. This is required for multichain accounts.\n const entropyOptions: { entropy: KeyringAccountEntropyOptions } = {\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: keyring.metadata.id,\n derivationPath,\n groupIndex,\n },\n };\n\n options = {\n ...legacyOptions,\n ...entropyOptions,\n };\n }\n }\n\n return {\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 };\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.messenger.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 * Get an account from a Snap keyring v1.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV1(address: string): InternalAccount | undefined {\n const snapKeyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!snapKeyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return snapKeyring.getAccountByAddress(address);\n }\n\n /**\n * Get an account from a Snap keyring v2.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV2(address: string): InternalAccount | undefined {\n const keyrings = this.messenger.call(\n 'KeyringController:getKeyringsByType',\n KeyringType.Snap,\n );\n\n // Snap keyring v2 are \"per-Snaps\", so we need to iterate over all of them to find the account.\n for (const keyring of keyrings) {\n if (keyring instanceof SnapKeyringV2) {\n // We use the synchronous method here since this method is used during `:stateChange` that are\n // use synchronous handlers.\n const account = keyring.lookupByAddress(address);\n if (account) {\n return {\n ...account,\n // We still have to use internal account for now, so we inject some metadata.\n metadata: {\n name: '',\n importTime: Date.now(),\n lastSelected: 0,\n keyring: {\n type: KeyringType.Snap,\n },\n snap: {\n id: keyring.snapId,\n },\n },\n };\n }\n }\n }\n\n return undefined;\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.messenger.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 log('Synchronizing accounts with keyrings (through :stateChange)...');\n\n // State patches.\n const patch: StatePatch = {\n previous: {},\n added: [],\n updated: [],\n removed: [],\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\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 // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\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 keyring,\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 [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 // Diff that we will use to publish events afterward.\n const diff: { removed: string[]; added: InternalAccount[] } = {\n removed: [],\n added: [],\n };\n\n this.#update(\n (state) => {\n const { internalAccounts, accountIdByAddress } = state;\n\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n delete accountIdByAddress[account.address];\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.keyring,\n );\n\n if (account) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\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 importTime: Date.now(),\n lastSelected,\n },\n };\n\n accountIdByAddress[account.address] = account.id;\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n },\n // Will get executed after the update, but before re-selecting an account in case\n // the current one is not valid anymore.\n () => {\n // Now publish events\n for (const id of diff.removed) {\n this.messenger.publish('AccountsController:accountRemoved', id);\n }\n if (diff.removed.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsRemoved',\n diff.removed,\n );\n }\n\n for (const account of diff.added) {\n this.messenger.publish('AccountsController:accountAdded', account);\n }\n if (diff.added.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsAdded',\n diff.added,\n );\n }\n },\n );\n\n log('Accounts synchronized (through :stateChange)!');\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 * @param beforeAutoSelectAccount - Callback to be executed before auto-selecting an account\n * if the current one is no longer available.\n */\n #update(\n callback: (state: WritableDraft<AccountsControllerStrictState>) => void,\n beforeAutoSelectAccount?: () => void,\n ): 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: WritableDraft<AccountsControllerStrictState>) => {\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 // We might want to do some pre-work before selecting a new account.\n beforeAutoSelectAccount?.();\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.messenger.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messenger.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\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 * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex(): number {\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 keyring - The keyring object of that new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount | undefined {\n const isSnapKeyringV1 = isSnapKeyringType(keyring.type);\n const isSnapKeyringV2 = isSnapKeyringV2Type(keyring.type);\n\n if (isSnapKeyringV1 || isSnapKeyringV2) {\n let account: InternalAccount | undefined;\n\n if (isSnapKeyringV1) {\n account = this.#getAccountFromSnapKeyringV1(address);\n } else {\n account = this.#getAccountFromSnapKeyringV2(address);\n }\n\n if (account) {\n // We force the copy here, to avoid mutating the reference returned by the Snap keyring.\n account = cloneDeep(account);\n\n // MIGRATION: To avoid any existing Snap account migration, we are\n // just \"adding\" the new typed options that we need for multichain\n // accounts. Ultimately, we would need a real Snap account migrations\n // (being handled by each Snaps).\n if (isHdSnapKeyringAccount(account)) {\n const options: HdSnapKeyringAccount['options'] = {\n ...account.options,\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: account.options.entropySource,\n groupIndex: account.options.index,\n derivationPath: account.options.derivationPath,\n },\n };\n // Inject the new typed options to the internal account copy.\n account.options = options;\n }\n }\n\n return account;\n }\n\n return this.#getInternalAccountForNonSnapAccount(address, keyring);\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): void {\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 if (this.state.internalAccounts.selectedAccount === accountId) {\n return;\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 * Subscribes to message events.\n */\n #subscribeToMessageEvents(): void {\n this.messenger.subscribe('KeyringController:stateChange', (keyringState) =>\n this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.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.messenger.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"AccountsController.cjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type {\n SnapKeyringAccountAssetListUpdatedEvent,\n SnapKeyringAccountBalancesUpdatedEvent,\n SnapKeyringAccountTransactionsUpdatedEvent,\n} from '@metamask/eth-snap-keyring';\nimport { SnapKeyring as SnapKeyringV2 } from '@metamask/eth-snap-keyring/v2';\nimport type { KeyringAccountEntropyOptions } from '@metamask/keyring-api';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n KeyringAccountEntropyTypeOption,\n} from '@metamask/keyring-api';\nimport { KeyringType } from '@metamask/keyring-api/v2';\nimport type {\n KeyringControllerState,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerStateChangeEvent,\n KeyringControllerGetStateAction,\n KeyringObject,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringV1Adapter } from '@metamask/keyring-sdk/v2';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { Messenger, ExtractEventPayload } from '@metamask/messenger';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\nimport type { CaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { cloneDeep } from 'lodash';\n\nimport { AccountsControllerMethodActions } from './AccountsController-method-action-types';\nimport { projectLogger as log } from './logger';\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport type { AccountsControllerStrictState } from './typing';\nimport type { HdSnapKeyringAccount } from './utils';\nimport {\n constructAccountIdByAddress,\n getEvmDerivationPathForIndex,\n getEvmGroupIndexFromAddressIndex,\n getUUIDFromAddressOfNormalAccount,\n isHdKeyringType,\n isHdSnapKeyringAccount,\n isMoneyKeyringType,\n isSnapKeyringType,\n isSnapKeyringV2Type,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountId = string;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n accountIdByAddress: Record<InternalAccount['address'], AccountId>;\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'setSelectedAccount',\n 'setAccountName',\n 'setAccountNameAndSelectAccount',\n 'listAccounts',\n 'listMultichainAccounts',\n 'updateAccounts',\n 'getSelectedAccount',\n 'getSelectedMultichainAccount',\n 'getAccountByAddress',\n 'getAccount',\n 'getAccounts',\n 'updateAccountMetadata',\n 'loadBackup',\n] as const;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerMethodActions;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountsAddedEvent = {\n type: `${typeof controllerName}:accountsAdded`;\n payload: [InternalAccount[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountsRemovedEvent = {\n type: `${typeof controllerName}:accountsRemoved`;\n payload: [AccountId[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedEvents =\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountsAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountsRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerMessenger = Messenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n accountIdByAddress: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n accountIdByAddress: {},\n};\n\n/**\n * @deprecated This constant is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * A patch representing a keyring state change.\n */\ntype StatePatch = {\n previous: Record<string, InternalAccount>;\n added: {\n address: string;\n keyring: KeyringObject;\n }[];\n updated: InternalAccount[];\n removed: InternalAccount[];\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 * @deprecated This class is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 const accountIdByAddress = constructAccountIdByAddress(\n state?.internalAccounts?.accounts ?? {},\n );\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n accountIdByAddress,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n this.#subscribeToMessageEvents();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 the internal account objects for the given account IDs, if they exist.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountIds - The IDs of the accounts to retrieve.\n * @returns The internal account objects, or undefined if the account(s) do not exist.\n */\n getAccounts(accountIds: string[]): (InternalAccount | undefined)[] {\n return accountIds.map((accountId) => this.getAccount(accountId));\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 // We need to have a fallback as a cache miss might be attributed to a checksummed address being passed.\n let accountId = this.state.accountIdByAddress[address];\n if (!accountId) {\n // FIXME: We should not need lower-cased addresses, but some consumers might\n // still be using non-normalized addresses. For now we keep it\n // for convenience, but we will need to remove this fallback\n // at some point.\n // NOTE: We should only hit that branch for EVM accounts only.\n const lowercasedAddress = address.toLowerCase();\n accountId = this.state.accountIdByAddress[lowercasedAddress];\n if (accountId) {\n log(\n `Cache missed for account ID: ${accountId}, received address: \"${address}\", matched address: \"${lowercasedAddress}\"`,\n );\n }\n }\n return accountId ? this.getAccount(accountId) : undefined;\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 if (this.state.internalAccounts.selectedAccount === account.id) {\n return;\n }\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * Sets the name of the account with the given ID and select it.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountId - The ID of the account to set the name for and select.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountNameAndSelectAccount(accountId: string, accountName: string): void {\n const account = this.#getAccountExpect(accountId);\n\n this.#assertAccountCanBeRenamed(account, accountName);\n\n const internalAccount = {\n ...account,\n metadata: {\n ...account.metadata,\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n lastSelected: this.#getLastSelectedIndex(),\n },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[account.id] = internalAccount;\n state.internalAccounts.selectedAccount = account.id;\n });\n\n this.messenger.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n\n #assertAccountCanBeRenamed(\n account: InternalAccount,\n accountName: string,\n ): void {\n if (\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== account.id,\n )\n ) {\n throw new Error('Account name already exists');\n }\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 (metadata.name) {\n this.#assertAccountCanBeRenamed(account, metadata.name);\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[accountId] = internalAccount;\n });\n\n if (metadata.name) {\n this.messenger.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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n log('Synchronizing accounts with keyrings...');\n\n const keyringAccountIndexes = new Map<string, number>();\n\n const existingInternalAccounts = this.state.internalAccounts.accounts;\n const internalAccounts: AccountsControllerState['internalAccounts']['accounts'] =\n {};\n\n const { keyrings } = this.messenger.call('KeyringController:getState');\n for (const keyring of keyrings) {\n // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\n\n const keyringTypeName = keyringTypeToName(keyring.type);\n\n for (const address of keyring.accounts) {\n const internalAccount = this.#getInternalAccountFromAddressAndType(\n address,\n keyring,\n );\n\n // This should never really happen, but if for some reason we're not\n // able to get the Snap keyring reference, this would return an\n // undefined account.\n // So we just skip it, even though, this should not really happen.\n if (!internalAccount) {\n continue;\n }\n\n // Get current index for this keyring (we use human indexing, so start at 1).\n const keyringAccountIndex =\n keyringAccountIndexes.get(keyringTypeName) ?? 1;\n\n const existingAccount = existingInternalAccounts[internalAccount.id];\n internalAccounts[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n\n // Re-use existing metadata if any.\n name:\n existingAccount?.metadata.name ??\n `${keyringTypeName} ${keyringAccountIndex}`,\n importTime: existingAccount?.metadata.importTime ?? Date.now(),\n lastSelected: existingAccount?.metadata.lastSelected ?? 0,\n },\n };\n\n // Increment the account index for this keyring.\n keyringAccountIndexes.set(keyringTypeName, keyringAccountIndex + 1);\n }\n }\n\n this.#update((state) => {\n state.internalAccounts.accounts = internalAccounts;\n state.accountIdByAddress = constructAccountIdByAddress(internalAccounts);\n });\n\n log('Accounts synchronized!');\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n const accountIdByAddress = constructAccountIdByAddress(\n backup.internalAccounts.accounts,\n );\n this.update(\n (currentState: WritableDraft<AccountsControllerStrictState>) => {\n currentState.internalAccounts = backup.internalAccounts;\n currentState.accountIdByAddress = accountIdByAddress;\n },\n );\n }\n }\n\n /**\n * Gets an internal account representation for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param keyring - The keyring object of the account.\n * @returns The generated internal account.\n */\n #getInternalAccountForNonSnapAccount(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n // We might have an account for this ID already, so we'll just re-use\n // the same metadata\n const account = this.getAccount(id);\n const metadata: InternalAccount['metadata'] = {\n name: account?.metadata.name ?? '',\n ...(account?.metadata.nameLastUpdatedAt\n ? {\n nameLastUpdatedAt: account?.metadata.nameLastUpdatedAt,\n }\n : {}),\n importTime: account?.metadata.importTime ?? Date.now(),\n lastSelected: account?.metadata.lastSelected ?? 0,\n keyring: {\n type: keyring.type,\n },\n };\n\n let options: InternalAccount['options'] = {};\n if (isHdKeyringType(keyring.type)) {\n // We need to find the account index from its HD keyring.\n const groupIndex = getEvmGroupIndexFromAddressIndex(keyring, address);\n\n // If for some reason, we cannot find this address, then the caller made a mistake\n // and it did not use the proper keyring object. For now, we do not fail and just\n // consider this account as \"simple account\".\n if (groupIndex !== undefined) {\n // NOTE: We are not using the `hdPath` from the associated keyring here and\n // getting the keyring instance here feels a bit overkill.\n // This will be naturally fixed once every keyring start using `KeyringAccount` and implement the keyring API.\n const derivationPath = getEvmDerivationPathForIndex(groupIndex);\n\n // Those are \"legacy options\" and they were used before `KeyringAccount` added\n // support for type options. We keep those temporarily until we update everything\n // to use the new typed options.\n const legacyOptions = {\n entropySource: keyring.metadata.id,\n derivationPath,\n groupIndex,\n };\n\n // New typed entropy options. This is required for multichain accounts.\n const entropyOptions: { entropy: KeyringAccountEntropyOptions } = {\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: keyring.metadata.id,\n derivationPath,\n groupIndex,\n },\n };\n\n options = {\n ...legacyOptions,\n ...entropyOptions,\n };\n }\n }\n\n return {\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 };\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.messenger.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 * Get an account from a Snap keyring v1.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV1(address: string): InternalAccount | undefined {\n const snapKeyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!snapKeyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return snapKeyring.getAccountByAddress(address);\n }\n\n /**\n * Get an account from a Snap keyring v2.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV2(address: string): InternalAccount | undefined {\n const keyrings = this.messenger.call(\n 'KeyringController:getKeyringsByType',\n KeyringType.Snap,\n );\n\n // Snap keyring v2 are \"per-Snaps\" (and can be accessed using their v1 adapter), so we need to\n // iterate over all of them to find the account.\n // NOTE: `:getKeyringsByType` will only return v1 instances, that's why we need to use their v1\n // adapter + `unwrap` method to get the reference to their v2 instance.\n for (const keyring of keyrings) {\n if (keyring instanceof KeyringV1Adapter) {\n // NOTE: We already filtering by `KeyringType.Snap`, so we are sure that those adapters\n // are wrapping a Snap keyring v2.\n const adapter = keyring as KeyringV1Adapter<SnapKeyringV2>;\n const keyringV2 = adapter.unwrap();\n\n // We use the synchronous method here since this method is used during `:stateChange` that are\n // use synchronous handlers.\n const account = keyringV2.lookupByAddress(address);\n if (account) {\n return {\n ...account,\n // We still have to use internal account for now, so we inject some metadata.\n metadata: {\n name: '',\n importTime: Date.now(),\n lastSelected: 0,\n keyring: {\n type: KeyringType.Snap,\n },\n snap: {\n id: keyringV2.snapId,\n },\n },\n };\n }\n }\n }\n\n return undefined;\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.messenger.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 log('Synchronizing accounts with keyrings (through :stateChange)...');\n\n // State patches.\n const patch: StatePatch = {\n previous: {},\n added: [],\n updated: [],\n removed: [],\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\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 // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\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 keyring,\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 [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 // Diff that we will use to publish events afterward.\n const diff: { removed: string[]; added: InternalAccount[] } = {\n removed: [],\n added: [],\n };\n\n this.#update(\n (state) => {\n const { internalAccounts, accountIdByAddress } = state;\n\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n delete accountIdByAddress[account.address];\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.keyring,\n );\n\n if (account) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\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 importTime: Date.now(),\n lastSelected,\n },\n };\n\n accountIdByAddress[account.address] = account.id;\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n },\n // Will get executed after the update, but before re-selecting an account in case\n // the current one is not valid anymore.\n () => {\n // Now publish events\n for (const id of diff.removed) {\n this.messenger.publish('AccountsController:accountRemoved', id);\n }\n if (diff.removed.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsRemoved',\n diff.removed,\n );\n }\n\n for (const account of diff.added) {\n this.messenger.publish('AccountsController:accountAdded', account);\n }\n if (diff.added.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsAdded',\n diff.added,\n );\n }\n },\n );\n\n log('Accounts synchronized (through :stateChange)!');\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 * @param beforeAutoSelectAccount - Callback to be executed before auto-selecting an account\n * if the current one is no longer available.\n */\n #update(\n callback: (state: WritableDraft<AccountsControllerStrictState>) => void,\n beforeAutoSelectAccount?: () => void,\n ): 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: WritableDraft<AccountsControllerStrictState>) => {\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 // We might want to do some pre-work before selecting a new account.\n beforeAutoSelectAccount?.();\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.messenger.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messenger.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\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 * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex(): number {\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 keyring - The keyring object of that new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount | undefined {\n const isSnapKeyringV1 = isSnapKeyringType(keyring.type);\n const isSnapKeyringV2 = isSnapKeyringV2Type(keyring.type);\n\n if (isSnapKeyringV1 || isSnapKeyringV2) {\n let account: InternalAccount | undefined;\n\n if (isSnapKeyringV1) {\n account = this.#getAccountFromSnapKeyringV1(address);\n } else {\n account = this.#getAccountFromSnapKeyringV2(address);\n }\n\n if (account) {\n // We force the copy here, to avoid mutating the reference returned by the Snap keyring.\n account = cloneDeep(account);\n\n // MIGRATION: To avoid any existing Snap account migration, we are\n // just \"adding\" the new typed options that we need for multichain\n // accounts. Ultimately, we would need a real Snap account migrations\n // (being handled by each Snaps).\n if (isHdSnapKeyringAccount(account)) {\n const options: HdSnapKeyringAccount['options'] = {\n ...account.options,\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: account.options.entropySource,\n groupIndex: account.options.index,\n derivationPath: account.options.derivationPath,\n },\n };\n // Inject the new typed options to the internal account copy.\n account.options = options;\n }\n }\n\n return account;\n }\n\n return this.#getInternalAccountForNonSnapAccount(address, keyring);\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): void {\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 if (this.state.internalAccounts.selectedAccount === accountId) {\n return;\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 * Subscribes to message events.\n */\n #subscribeToMessageEvents(): void {\n this.messenger.subscribe('KeyringController:stateChange', (keyringState) =>\n this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.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.messenger.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\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":"AAAA,OAAO,EAAE,cAAc,EAAE,kCAAkC;AAC3D,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC3B,kCAAkC;AAEnC,OAAO,KAAK,EACV,uCAAuC,EACvC,sCAAsC,EACtC,0CAA0C,EAC3C,mCAAmC;AAGpC,OAAO,EACL,cAAc,EAEd,QAAQ,EAGT,8BAA8B;AAE/B,OAAO,KAAK,EAEV,wCAAwC,EACxC,iCAAiC,EACjC,+BAA+B,EAEhC,qCAAqC;AACtC,OAAO,KAAK,EAAE,eAAe,EAAE,uCAAuC;AAGtE,OAAO,KAAK,EAAE,SAAS,EAAuB,4BAA4B;AAG1E,OAAO,KAAK,EAAE,WAAW,EAAE,wBAAwB;AAInD,OAAO,EAAE,+BAA+B,EAAE,qDAAiD;AAE3F,OAAO,KAAK,EAAE,gDAAgD,EAAE,oBAAgB;AAgBhF,QAAA,MAAM,cAAc,uBAAuB,CAAC;AAE5C;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;;;GAGG;AACH,MAAM,MAAM,uBAAuB,GAAG;IACpC,gBAAgB,EAAE;QAChB,QAAQ,EAAE,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAC7C,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;CACnE,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,gCAAgC,GAAG,wBAAwB,CACrE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAkBF;;;GAGG;AACH,MAAM,MAAM,cAAc,GACtB,wCAAwC,GACxC,+BAA+B,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GACjC,gCAAgC,GAChC,+BAA+B,CAAC;AAEpC;;;GAGG;AACH,MAAM,MAAM,6BAA6B,GAAG,0BAA0B,CACpE,OAAO,cAAc,EACrB,uBAAuB,CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,4CAA4C,GAAG;IACzD,IAAI,EAAE,GAAG,OAAO,cAAc,wBAAwB,CAAC;IACvD,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,+CAA+C,GAAG;IAC5D,IAAI,EAAE,GAAG,OAAO,cAAc,2BAA2B,CAAC;IAC1D,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,mCAAmC,GAAG;IAChD,IAAI,EAAE,GAAG,OAAO,cAAc,eAAe,CAAC;IAC9C,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,oCAAoC,GAAG;IACjD,IAAI,EAAE,GAAG,OAAO,cAAc,gBAAgB,CAAC;IAC/C,OAAO,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC;CAC9B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,GAAG,OAAO,cAAc,iBAAiB,CAAC;IAChD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,sCAAsC,GAAG;IACnD,IAAI,EAAE,GAAG,OAAO,cAAc,kBAAkB,CAAC;IACjD,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;CACxB,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,GAAG,OAAO,cAAc,iBAAiB,CAAC;IAChD,OAAO,EAAE,CAAC,eAAe,CAAC,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,6CAA6C,GAAG;IAC1D,IAAI,EAAE,GAAG,OAAO,cAAc,yBAAyB,CAAC;IACxD,OAAO,EAAE,sCAAsC,CAAC,SAAS,CAAC,CAAC;CAC5D,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,iDAAiD,GAAG;IAC9D,IAAI,EAAE,GAAG,OAAO,cAAc,6BAA6B,CAAC;IAC5D,OAAO,EAAE,0CAA0C,CAAC,SAAS,CAAC,CAAC;CAChE,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,8CAA8C,GAAG;IAC3D,IAAI,EAAE,GAAG,OAAO,cAAc,0BAA0B,CAAC;IACzD,OAAO,EAAE,uCAAuC,CAAC,SAAS,CAAC,CAAC;CAC7D,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,iCAAiC,GACjC,uCAAuC,GACvC,sCAAsC,GACtC,0CAA0C,GAC1C,gDAAgD,CAAC;AAErD;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAChC,6BAA6B,GAC7B,4CAA4C,GAC5C,+CAA+C,GAC/C,mCAAmC,GACnC,oCAAoC,GACpC,qCAAqC,GACrC,sCAAsC,GACtC,qCAAqC,GACrC,6CAA6C,GAC7C,iDAAiD,GACjD,8CAA8C,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG,SAAS,CACjD,OAAO,cAAc,EACrB,yBAAyB,GAAG,cAAc,EAC1C,wBAAwB,GAAG,aAAa,CACzC,CAAC;AAyBF;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;CAczB,CAAC;AAeF;;;;;;;;;GASG;AACH,qBAAa,kBAAmB,SAAQ,cAAc,CACpD,OAAO,cAAc,EACrB,uBAAuB,EACvB,2BAA2B,CAC5B;;IACC;;;;;;OAMG;gBACS,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,2BAA2B,CAAC;QACvC,KAAK,EAAE,uBAAuB,CAAC;KAChC;IAuBD;;;;;;;OAOG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI1D;;;;;;;OAOG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,eAAe,GAAG,SAAS,CAAC,EAAE;IAIlE;;;;;;OAMG;IACH,YAAY,IAAI,eAAe,EAAE;IAKjC;;;;;;;OAOG;IACH,sBAAsB,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,eAAe,EAAE;IAgChE;;;;;;OAMG;IACH,kBAAkB,IAAI,eAAe;IA2BrC;;;;;;;;;OASG;IACH,4BAA4B,CAC1B,OAAO,CAAC,EAAE,WAAW,GACpB,eAAe,GAAG,SAAS;IAmB9B;;;;;;;;OAQG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAoBjE;;;;;;OAMG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAe3C;;;;;;;;OAQG;IACH,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAS5D;;;;;;;;OAQG;IACH,8BAA8B,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAyC5E;;;;;;;OAOG;IACH,qBAAqB,CACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,GAC7C,IAAI;IAwBP;;;;;;;OAOG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAkErC;;;;;;OAMG;IACH,UAAU,CAAC,MAAM,EAAE,uBAAuB,GAAG,IAAI;CAwkBlD"}
@@ -9,6 +9,7 @@ import { SnapKeyring } from "@metamask/eth-snap-keyring";
9
9
  import { SnapKeyring as SnapKeyringV2 } from "@metamask/eth-snap-keyring/v2";
10
10
  import { EthAccountType, EthMethod, EthScope, isEvmAccountType, KeyringAccountEntropyTypeOption } from "@metamask/keyring-api";
11
11
  import { KeyringType } from "@metamask/keyring-api/v2";
12
+ import { KeyringV1Adapter } from "@metamask/keyring-sdk/v2";
12
13
  import { isScopeEqualToAny } from "@metamask/keyring-utils";
13
14
  import { isCaipChainId } from "@metamask/utils";
14
15
  import $lodash from "lodash";
@@ -485,12 +486,19 @@ _AccountsController_instances = new WeakSet(), _AccountsController_getAccountExp
485
486
  return snapKeyring.getAccountByAddress(address);
486
487
  }, _AccountsController_getAccountFromSnapKeyringV2 = function _AccountsController_getAccountFromSnapKeyringV2(address) {
487
488
  const keyrings = this.messenger.call('KeyringController:getKeyringsByType', KeyringType.Snap);
488
- // Snap keyring v2 are "per-Snaps", so we need to iterate over all of them to find the account.
489
+ // Snap keyring v2 are "per-Snaps" (and can be accessed using their v1 adapter), so we need to
490
+ // iterate over all of them to find the account.
491
+ // NOTE: `:getKeyringsByType` will only return v1 instances, that's why we need to use their v1
492
+ // adapter + `unwrap` method to get the reference to their v2 instance.
489
493
  for (const keyring of keyrings) {
490
- if (keyring instanceof SnapKeyringV2) {
494
+ if (keyring instanceof KeyringV1Adapter) {
495
+ // NOTE: We already filtering by `KeyringType.Snap`, so we are sure that those adapters
496
+ // are wrapping a Snap keyring v2.
497
+ const adapter = keyring;
498
+ const keyringV2 = adapter.unwrap();
491
499
  // We use the synchronous method here since this method is used during `:stateChange` that are
492
500
  // use synchronous handlers.
493
- const account = keyring.lookupByAddress(address);
501
+ const account = keyringV2.lookupByAddress(address);
494
502
  if (account) {
495
503
  return {
496
504
  ...account,
@@ -503,7 +511,7 @@ _AccountsController_instances = new WeakSet(), _AccountsController_getAccountExp
503
511
  type: KeyringType.Snap,
504
512
  },
505
513
  snap: {
506
- id: keyring.snapId,
514
+ id: keyringV2.snapId,
507
515
  },
508
516
  },
509
517
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AccountsController.mjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type {\n SnapKeyringAccountAssetListUpdatedEvent,\n SnapKeyringAccountBalancesUpdatedEvent,\n SnapKeyringAccountTransactionsUpdatedEvent,\n} from '@metamask/eth-snap-keyring';\nimport { SnapKeyring as SnapKeyringV2 } from '@metamask/eth-snap-keyring/v2';\nimport type { KeyringAccountEntropyOptions } from '@metamask/keyring-api';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n KeyringAccountEntropyTypeOption,\n} from '@metamask/keyring-api';\nimport { KeyringType } from '@metamask/keyring-api/v2';\nimport type {\n KeyringControllerState,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerStateChangeEvent,\n KeyringControllerGetStateAction,\n KeyringObject,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { Messenger, ExtractEventPayload } from '@metamask/messenger';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\nimport type { CaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { cloneDeep } from 'lodash';\n\nimport { AccountsControllerMethodActions } from './AccountsController-method-action-types';\nimport { projectLogger as log } from './logger';\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport type { AccountsControllerStrictState } from './typing';\nimport type { HdSnapKeyringAccount } from './utils';\nimport {\n constructAccountIdByAddress,\n getEvmDerivationPathForIndex,\n getEvmGroupIndexFromAddressIndex,\n getUUIDFromAddressOfNormalAccount,\n isHdKeyringType,\n isHdSnapKeyringAccount,\n isMoneyKeyringType,\n isSnapKeyringType,\n isSnapKeyringV2Type,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountId = string;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n accountIdByAddress: Record<InternalAccount['address'], AccountId>;\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'setSelectedAccount',\n 'setAccountName',\n 'setAccountNameAndSelectAccount',\n 'listAccounts',\n 'listMultichainAccounts',\n 'updateAccounts',\n 'getSelectedAccount',\n 'getSelectedMultichainAccount',\n 'getAccountByAddress',\n 'getAccount',\n 'getAccounts',\n 'updateAccountMetadata',\n 'loadBackup',\n] as const;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerMethodActions;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountsAddedEvent = {\n type: `${typeof controllerName}:accountsAdded`;\n payload: [InternalAccount[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountsRemovedEvent = {\n type: `${typeof controllerName}:accountsRemoved`;\n payload: [AccountId[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedEvents =\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountsAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountsRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerMessenger = Messenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n accountIdByAddress: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n accountIdByAddress: {},\n};\n\n/**\n * @deprecated This constant is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * A patch representing a keyring state change.\n */\ntype StatePatch = {\n previous: Record<string, InternalAccount>;\n added: {\n address: string;\n keyring: KeyringObject;\n }[];\n updated: InternalAccount[];\n removed: InternalAccount[];\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 * @deprecated This class is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 const accountIdByAddress = constructAccountIdByAddress(\n state?.internalAccounts?.accounts ?? {},\n );\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n accountIdByAddress,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n this.#subscribeToMessageEvents();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 the internal account objects for the given account IDs, if they exist.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountIds - The IDs of the accounts to retrieve.\n * @returns The internal account objects, or undefined if the account(s) do not exist.\n */\n getAccounts(accountIds: string[]): (InternalAccount | undefined)[] {\n return accountIds.map((accountId) => this.getAccount(accountId));\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 // We need to have a fallback as a cache miss might be attributed to a checksummed address being passed.\n let accountId = this.state.accountIdByAddress[address];\n if (!accountId) {\n // FIXME: We should not need lower-cased addresses, but some consumers might\n // still be using non-normalized addresses. For now we keep it\n // for convenience, but we will need to remove this fallback\n // at some point.\n // NOTE: We should only hit that branch for EVM accounts only.\n const lowercasedAddress = address.toLowerCase();\n accountId = this.state.accountIdByAddress[lowercasedAddress];\n if (accountId) {\n log(\n `Cache missed for account ID: ${accountId}, received address: \"${address}\", matched address: \"${lowercasedAddress}\"`,\n );\n }\n }\n return accountId ? this.getAccount(accountId) : undefined;\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 if (this.state.internalAccounts.selectedAccount === account.id) {\n return;\n }\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * Sets the name of the account with the given ID and select it.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountId - The ID of the account to set the name for and select.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountNameAndSelectAccount(accountId: string, accountName: string): void {\n const account = this.#getAccountExpect(accountId);\n\n this.#assertAccountCanBeRenamed(account, accountName);\n\n const internalAccount = {\n ...account,\n metadata: {\n ...account.metadata,\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n lastSelected: this.#getLastSelectedIndex(),\n },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[account.id] = internalAccount;\n state.internalAccounts.selectedAccount = account.id;\n });\n\n this.messenger.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n\n #assertAccountCanBeRenamed(\n account: InternalAccount,\n accountName: string,\n ): void {\n if (\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== account.id,\n )\n ) {\n throw new Error('Account name already exists');\n }\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 (metadata.name) {\n this.#assertAccountCanBeRenamed(account, metadata.name);\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[accountId] = internalAccount;\n });\n\n if (metadata.name) {\n this.messenger.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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n log('Synchronizing accounts with keyrings...');\n\n const keyringAccountIndexes = new Map<string, number>();\n\n const existingInternalAccounts = this.state.internalAccounts.accounts;\n const internalAccounts: AccountsControllerState['internalAccounts']['accounts'] =\n {};\n\n const { keyrings } = this.messenger.call('KeyringController:getState');\n for (const keyring of keyrings) {\n // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\n\n const keyringTypeName = keyringTypeToName(keyring.type);\n\n for (const address of keyring.accounts) {\n const internalAccount = this.#getInternalAccountFromAddressAndType(\n address,\n keyring,\n );\n\n // This should never really happen, but if for some reason we're not\n // able to get the Snap keyring reference, this would return an\n // undefined account.\n // So we just skip it, even though, this should not really happen.\n if (!internalAccount) {\n continue;\n }\n\n // Get current index for this keyring (we use human indexing, so start at 1).\n const keyringAccountIndex =\n keyringAccountIndexes.get(keyringTypeName) ?? 1;\n\n const existingAccount = existingInternalAccounts[internalAccount.id];\n internalAccounts[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n\n // Re-use existing metadata if any.\n name:\n existingAccount?.metadata.name ??\n `${keyringTypeName} ${keyringAccountIndex}`,\n importTime: existingAccount?.metadata.importTime ?? Date.now(),\n lastSelected: existingAccount?.metadata.lastSelected ?? 0,\n },\n };\n\n // Increment the account index for this keyring.\n keyringAccountIndexes.set(keyringTypeName, keyringAccountIndex + 1);\n }\n }\n\n this.#update((state) => {\n state.internalAccounts.accounts = internalAccounts;\n state.accountIdByAddress = constructAccountIdByAddress(internalAccounts);\n });\n\n log('Accounts synchronized!');\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n const accountIdByAddress = constructAccountIdByAddress(\n backup.internalAccounts.accounts,\n );\n this.update(\n (currentState: WritableDraft<AccountsControllerStrictState>) => {\n currentState.internalAccounts = backup.internalAccounts;\n currentState.accountIdByAddress = accountIdByAddress;\n },\n );\n }\n }\n\n /**\n * Gets an internal account representation for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param keyring - The keyring object of the account.\n * @returns The generated internal account.\n */\n #getInternalAccountForNonSnapAccount(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n // We might have an account for this ID already, so we'll just re-use\n // the same metadata\n const account = this.getAccount(id);\n const metadata: InternalAccount['metadata'] = {\n name: account?.metadata.name ?? '',\n ...(account?.metadata.nameLastUpdatedAt\n ? {\n nameLastUpdatedAt: account?.metadata.nameLastUpdatedAt,\n }\n : {}),\n importTime: account?.metadata.importTime ?? Date.now(),\n lastSelected: account?.metadata.lastSelected ?? 0,\n keyring: {\n type: keyring.type,\n },\n };\n\n let options: InternalAccount['options'] = {};\n if (isHdKeyringType(keyring.type)) {\n // We need to find the account index from its HD keyring.\n const groupIndex = getEvmGroupIndexFromAddressIndex(keyring, address);\n\n // If for some reason, we cannot find this address, then the caller made a mistake\n // and it did not use the proper keyring object. For now, we do not fail and just\n // consider this account as \"simple account\".\n if (groupIndex !== undefined) {\n // NOTE: We are not using the `hdPath` from the associated keyring here and\n // getting the keyring instance here feels a bit overkill.\n // This will be naturally fixed once every keyring start using `KeyringAccount` and implement the keyring API.\n const derivationPath = getEvmDerivationPathForIndex(groupIndex);\n\n // Those are \"legacy options\" and they were used before `KeyringAccount` added\n // support for type options. We keep those temporarily until we update everything\n // to use the new typed options.\n const legacyOptions = {\n entropySource: keyring.metadata.id,\n derivationPath,\n groupIndex,\n };\n\n // New typed entropy options. This is required for multichain accounts.\n const entropyOptions: { entropy: KeyringAccountEntropyOptions } = {\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: keyring.metadata.id,\n derivationPath,\n groupIndex,\n },\n };\n\n options = {\n ...legacyOptions,\n ...entropyOptions,\n };\n }\n }\n\n return {\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 };\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.messenger.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 * Get an account from a Snap keyring v1.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV1(address: string): InternalAccount | undefined {\n const snapKeyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!snapKeyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return snapKeyring.getAccountByAddress(address);\n }\n\n /**\n * Get an account from a Snap keyring v2.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV2(address: string): InternalAccount | undefined {\n const keyrings = this.messenger.call(\n 'KeyringController:getKeyringsByType',\n KeyringType.Snap,\n );\n\n // Snap keyring v2 are \"per-Snaps\", so we need to iterate over all of them to find the account.\n for (const keyring of keyrings) {\n if (keyring instanceof SnapKeyringV2) {\n // We use the synchronous method here since this method is used during `:stateChange` that are\n // use synchronous handlers.\n const account = keyring.lookupByAddress(address);\n if (account) {\n return {\n ...account,\n // We still have to use internal account for now, so we inject some metadata.\n metadata: {\n name: '',\n importTime: Date.now(),\n lastSelected: 0,\n keyring: {\n type: KeyringType.Snap,\n },\n snap: {\n id: keyring.snapId,\n },\n },\n };\n }\n }\n }\n\n return undefined;\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.messenger.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 log('Synchronizing accounts with keyrings (through :stateChange)...');\n\n // State patches.\n const patch: StatePatch = {\n previous: {},\n added: [],\n updated: [],\n removed: [],\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\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 // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\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 keyring,\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 [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 // Diff that we will use to publish events afterward.\n const diff: { removed: string[]; added: InternalAccount[] } = {\n removed: [],\n added: [],\n };\n\n this.#update(\n (state) => {\n const { internalAccounts, accountIdByAddress } = state;\n\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n delete accountIdByAddress[account.address];\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.keyring,\n );\n\n if (account) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\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 importTime: Date.now(),\n lastSelected,\n },\n };\n\n accountIdByAddress[account.address] = account.id;\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n },\n // Will get executed after the update, but before re-selecting an account in case\n // the current one is not valid anymore.\n () => {\n // Now publish events\n for (const id of diff.removed) {\n this.messenger.publish('AccountsController:accountRemoved', id);\n }\n if (diff.removed.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsRemoved',\n diff.removed,\n );\n }\n\n for (const account of diff.added) {\n this.messenger.publish('AccountsController:accountAdded', account);\n }\n if (diff.added.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsAdded',\n diff.added,\n );\n }\n },\n );\n\n log('Accounts synchronized (through :stateChange)!');\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 * @param beforeAutoSelectAccount - Callback to be executed before auto-selecting an account\n * if the current one is no longer available.\n */\n #update(\n callback: (state: WritableDraft<AccountsControllerStrictState>) => void,\n beforeAutoSelectAccount?: () => void,\n ): 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: WritableDraft<AccountsControllerStrictState>) => {\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 // We might want to do some pre-work before selecting a new account.\n beforeAutoSelectAccount?.();\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.messenger.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messenger.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\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 * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex(): number {\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 keyring - The keyring object of that new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount | undefined {\n const isSnapKeyringV1 = isSnapKeyringType(keyring.type);\n const isSnapKeyringV2 = isSnapKeyringV2Type(keyring.type);\n\n if (isSnapKeyringV1 || isSnapKeyringV2) {\n let account: InternalAccount | undefined;\n\n if (isSnapKeyringV1) {\n account = this.#getAccountFromSnapKeyringV1(address);\n } else {\n account = this.#getAccountFromSnapKeyringV2(address);\n }\n\n if (account) {\n // We force the copy here, to avoid mutating the reference returned by the Snap keyring.\n account = cloneDeep(account);\n\n // MIGRATION: To avoid any existing Snap account migration, we are\n // just \"adding\" the new typed options that we need for multichain\n // accounts. Ultimately, we would need a real Snap account migrations\n // (being handled by each Snaps).\n if (isHdSnapKeyringAccount(account)) {\n const options: HdSnapKeyringAccount['options'] = {\n ...account.options,\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: account.options.entropySource,\n groupIndex: account.options.index,\n derivationPath: account.options.derivationPath,\n },\n };\n // Inject the new typed options to the internal account copy.\n account.options = options;\n }\n }\n\n return account;\n }\n\n return this.#getInternalAccountForNonSnapAccount(address, keyring);\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): void {\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 if (this.state.internalAccounts.selectedAccount === accountId) {\n return;\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 * Subscribes to message events.\n */\n #subscribeToMessageEvents(): void {\n this.messenger.subscribe('KeyringController:stateChange', (keyringState) =>\n this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.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.messenger.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n}\n"]}
1
+ {"version":3,"file":"AccountsController.mjs","sourceRoot":"","sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseController } from '@metamask/base-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n} from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type {\n SnapKeyringAccountAssetListUpdatedEvent,\n SnapKeyringAccountBalancesUpdatedEvent,\n SnapKeyringAccountTransactionsUpdatedEvent,\n} from '@metamask/eth-snap-keyring';\nimport { SnapKeyring as SnapKeyringV2 } from '@metamask/eth-snap-keyring/v2';\nimport type { KeyringAccountEntropyOptions } from '@metamask/keyring-api';\nimport {\n EthAccountType,\n EthMethod,\n EthScope,\n isEvmAccountType,\n KeyringAccountEntropyTypeOption,\n} from '@metamask/keyring-api';\nimport { KeyringType } from '@metamask/keyring-api/v2';\nimport type {\n KeyringControllerState,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerStateChangeEvent,\n KeyringControllerGetStateAction,\n KeyringObject,\n} from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport { KeyringV1Adapter } from '@metamask/keyring-sdk/v2';\nimport { isScopeEqualToAny } from '@metamask/keyring-utils';\nimport type { Messenger, ExtractEventPayload } from '@metamask/messenger';\nimport type { NetworkClientId } from '@metamask/network-controller';\nimport { isCaipChainId } from '@metamask/utils';\nimport type { CaipChainId } from '@metamask/utils';\nimport type { WritableDraft } from 'immer/dist/internal.js';\nimport { cloneDeep } from 'lodash';\n\nimport { AccountsControllerMethodActions } from './AccountsController-method-action-types';\nimport { projectLogger as log } from './logger';\nimport type { MultichainNetworkControllerNetworkDidChangeEvent } from './types';\nimport type { AccountsControllerStrictState } from './typing';\nimport type { HdSnapKeyringAccount } from './utils';\nimport {\n constructAccountIdByAddress,\n getEvmDerivationPathForIndex,\n getEvmGroupIndexFromAddressIndex,\n getUUIDFromAddressOfNormalAccount,\n isHdKeyringType,\n isHdSnapKeyringAccount,\n isMoneyKeyringType,\n isSnapKeyringType,\n isSnapKeyringV2Type,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountId = string;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<AccountId, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n accountIdByAddress: Record<InternalAccount['address'], AccountId>;\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'setSelectedAccount',\n 'setAccountName',\n 'setAccountNameAndSelectAccount',\n 'listAccounts',\n 'listMultichainAccounts',\n 'updateAccounts',\n 'getSelectedAccount',\n 'getSelectedMultichainAccount',\n 'getAccountByAddress',\n 'getAccount',\n 'getAccounts',\n 'updateAccountMetadata',\n 'loadBackup',\n] as const;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedActions =\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetStateAction;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerMethodActions;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAddedEvent = {\n type: `${typeof controllerName}:accountAdded`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerAccountsAddedEvent = {\n type: `${typeof controllerName}:accountsAdded`;\n payload: [InternalAccount[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRemovedEvent = {\n type: `${typeof controllerName}:accountRemoved`;\n payload: [AccountId];\n};\n\nexport type AccountsControllerAccountsRemovedEvent = {\n type: `${typeof controllerName}:accountsRemoved`;\n payload: [AccountId[]];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountRenamedEvent = {\n type: `${typeof controllerName}:accountRenamed`;\n payload: [InternalAccount];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountBalancesUpdatesEvent = {\n type: `${typeof controllerName}:accountBalancesUpdated`;\n payload: SnapKeyringAccountBalancesUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountTransactionsUpdatedEvent = {\n type: `${typeof controllerName}:accountTransactionsUpdated`;\n payload: SnapKeyringAccountTransactionsUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerAccountAssetListUpdatedEvent = {\n type: `${typeof controllerName}:accountAssetListUpdated`;\n payload: SnapKeyringAccountAssetListUpdatedEvent['payload'];\n};\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AllowedEvents =\n | KeyringControllerStateChangeEvent\n | SnapKeyringAccountAssetListUpdatedEvent\n | SnapKeyringAccountBalancesUpdatedEvent\n | SnapKeyringAccountTransactionsUpdatedEvent\n | MultichainNetworkControllerNetworkDidChangeEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountsAddedEvent\n | AccountsControllerAccountRemovedEvent\n | AccountsControllerAccountsRemovedEvent\n | AccountsControllerAccountRenamedEvent\n | AccountsControllerAccountBalancesUpdatesEvent\n | AccountsControllerAccountTransactionsUpdatedEvent\n | AccountsControllerAccountAssetListUpdatedEvent;\n\n/**\n * @deprecated This type is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n */\nexport type AccountsControllerMessenger = Messenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents\n>;\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n includeInStateLogs: true,\n persist: true,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n accountIdByAddress: {\n includeInStateLogs: false,\n persist: false,\n includeInDebugSnapshot: false,\n usedInUi: true,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n accountIdByAddress: {},\n};\n\n/**\n * @deprecated This constant is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * A patch representing a keyring state change.\n */\ntype StatePatch = {\n previous: Record<string, InternalAccount>;\n added: {\n address: string;\n keyring: KeyringObject;\n }[];\n updated: InternalAccount[];\n removed: InternalAccount[];\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 * @deprecated This class is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 const accountIdByAddress = constructAccountIdByAddress(\n state?.internalAccounts?.accounts ?? {},\n );\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n accountIdByAddress,\n },\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n this.#subscribeToMessageEvents();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 the internal account objects for the given account IDs, if they exist.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountIds - The IDs of the accounts to retrieve.\n * @returns The internal account objects, or undefined if the account(s) do not exist.\n */\n getAccounts(accountIds: string[]): (InternalAccount | undefined)[] {\n return accountIds.map((accountId) => this.getAccount(accountId));\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 // We need to have a fallback as a cache miss might be attributed to a checksummed address being passed.\n let accountId = this.state.accountIdByAddress[address];\n if (!accountId) {\n // FIXME: We should not need lower-cased addresses, but some consumers might\n // still be using non-normalized addresses. For now we keep it\n // for convenience, but we will need to remove this fallback\n // at some point.\n // NOTE: We should only hit that branch for EVM accounts only.\n const lowercasedAddress = address.toLowerCase();\n accountId = this.state.accountIdByAddress[lowercasedAddress];\n if (accountId) {\n log(\n `Cache missed for account ID: ${accountId}, received address: \"${address}\", matched address: \"${lowercasedAddress}\"`,\n );\n }\n }\n return accountId ? this.getAccount(accountId) : undefined;\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 if (this.state.internalAccounts.selectedAccount === account.id) {\n return;\n }\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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 * Sets the name of the account with the given ID and select it.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param accountId - The ID of the account to set the name for and select.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountNameAndSelectAccount(accountId: string, accountName: string): void {\n const account = this.#getAccountExpect(accountId);\n\n this.#assertAccountCanBeRenamed(account, accountName);\n\n const internalAccount = {\n ...account,\n metadata: {\n ...account.metadata,\n name: accountName,\n nameLastUpdatedAt: Date.now(),\n lastSelected: this.#getLastSelectedIndex(),\n },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[account.id] = internalAccount;\n state.internalAccounts.selectedAccount = account.id;\n });\n\n this.messenger.publish(\n 'AccountsController:accountRenamed',\n internalAccount,\n );\n }\n\n #assertAccountCanBeRenamed(\n account: InternalAccount,\n accountName: string,\n ): void {\n if (\n this.listMultichainAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== account.id,\n )\n ) {\n throw new Error('Account name already exists');\n }\n }\n\n /**\n * Updates the metadata of the account with the given ID.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\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 (metadata.name) {\n this.#assertAccountCanBeRenamed(account, metadata.name);\n }\n\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, ...metadata },\n };\n\n this.#update((state) => {\n state.internalAccounts.accounts[accountId] = internalAccount;\n });\n\n if (metadata.name) {\n this.messenger.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 * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n log('Synchronizing accounts with keyrings...');\n\n const keyringAccountIndexes = new Map<string, number>();\n\n const existingInternalAccounts = this.state.internalAccounts.accounts;\n const internalAccounts: AccountsControllerState['internalAccounts']['accounts'] =\n {};\n\n const { keyrings } = this.messenger.call('KeyringController:getState');\n for (const keyring of keyrings) {\n // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\n\n const keyringTypeName = keyringTypeToName(keyring.type);\n\n for (const address of keyring.accounts) {\n const internalAccount = this.#getInternalAccountFromAddressAndType(\n address,\n keyring,\n );\n\n // This should never really happen, but if for some reason we're not\n // able to get the Snap keyring reference, this would return an\n // undefined account.\n // So we just skip it, even though, this should not really happen.\n if (!internalAccount) {\n continue;\n }\n\n // Get current index for this keyring (we use human indexing, so start at 1).\n const keyringAccountIndex =\n keyringAccountIndexes.get(keyringTypeName) ?? 1;\n\n const existingAccount = existingInternalAccounts[internalAccount.id];\n internalAccounts[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n\n // Re-use existing metadata if any.\n name:\n existingAccount?.metadata.name ??\n `${keyringTypeName} ${keyringAccountIndex}`,\n importTime: existingAccount?.metadata.importTime ?? Date.now(),\n lastSelected: existingAccount?.metadata.lastSelected ?? 0,\n },\n };\n\n // Increment the account index for this keyring.\n keyringAccountIndexes.set(keyringTypeName, keyringAccountIndex + 1);\n }\n }\n\n this.#update((state) => {\n state.internalAccounts.accounts = internalAccounts;\n state.accountIdByAddress = constructAccountIdByAddress(internalAccounts);\n });\n\n log('Accounts synchronized!');\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @deprecated This method is deprecated and will be removed in a future version.\n * Use `AccountTreeController`, `MultichainAccountService`, or the Keyring API v2 instead.\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n const accountIdByAddress = constructAccountIdByAddress(\n backup.internalAccounts.accounts,\n );\n this.update(\n (currentState: WritableDraft<AccountsControllerStrictState>) => {\n currentState.internalAccounts = backup.internalAccounts;\n currentState.accountIdByAddress = accountIdByAddress;\n },\n );\n }\n }\n\n /**\n * Gets an internal account representation for a non-Snap account.\n *\n * @param address - The address of the account.\n * @param keyring - The keyring object of the account.\n * @returns The generated internal account.\n */\n #getInternalAccountForNonSnapAccount(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount {\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n // We might have an account for this ID already, so we'll just re-use\n // the same metadata\n const account = this.getAccount(id);\n const metadata: InternalAccount['metadata'] = {\n name: account?.metadata.name ?? '',\n ...(account?.metadata.nameLastUpdatedAt\n ? {\n nameLastUpdatedAt: account?.metadata.nameLastUpdatedAt,\n }\n : {}),\n importTime: account?.metadata.importTime ?? Date.now(),\n lastSelected: account?.metadata.lastSelected ?? 0,\n keyring: {\n type: keyring.type,\n },\n };\n\n let options: InternalAccount['options'] = {};\n if (isHdKeyringType(keyring.type)) {\n // We need to find the account index from its HD keyring.\n const groupIndex = getEvmGroupIndexFromAddressIndex(keyring, address);\n\n // If for some reason, we cannot find this address, then the caller made a mistake\n // and it did not use the proper keyring object. For now, we do not fail and just\n // consider this account as \"simple account\".\n if (groupIndex !== undefined) {\n // NOTE: We are not using the `hdPath` from the associated keyring here and\n // getting the keyring instance here feels a bit overkill.\n // This will be naturally fixed once every keyring start using `KeyringAccount` and implement the keyring API.\n const derivationPath = getEvmDerivationPathForIndex(groupIndex);\n\n // Those are \"legacy options\" and they were used before `KeyringAccount` added\n // support for type options. We keep those temporarily until we update everything\n // to use the new typed options.\n const legacyOptions = {\n entropySource: keyring.metadata.id,\n derivationPath,\n groupIndex,\n };\n\n // New typed entropy options. This is required for multichain accounts.\n const entropyOptions: { entropy: KeyringAccountEntropyOptions } = {\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: keyring.metadata.id,\n derivationPath,\n groupIndex,\n },\n };\n\n options = {\n ...legacyOptions,\n ...entropyOptions,\n };\n }\n }\n\n return {\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 };\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.messenger.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 * Get an account from a Snap keyring v1.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV1(address: string): InternalAccount | undefined {\n const snapKeyring = this.#getSnapKeyring();\n\n // We need the Snap keyring to retrieve the account from its address.\n if (!snapKeyring) {\n return undefined;\n }\n\n // This might be undefined if the Snap deleted the account before\n // reaching that point.\n return snapKeyring.getAccountByAddress(address);\n }\n\n /**\n * Get an account from a Snap keyring v2.\n *\n * @param address - The address of the account to retrieve.\n * @returns The Snap account if available.\n */\n #getAccountFromSnapKeyringV2(address: string): InternalAccount | undefined {\n const keyrings = this.messenger.call(\n 'KeyringController:getKeyringsByType',\n KeyringType.Snap,\n );\n\n // Snap keyring v2 are \"per-Snaps\" (and can be accessed using their v1 adapter), so we need to\n // iterate over all of them to find the account.\n // NOTE: `:getKeyringsByType` will only return v1 instances, that's why we need to use their v1\n // adapter + `unwrap` method to get the reference to their v2 instance.\n for (const keyring of keyrings) {\n if (keyring instanceof KeyringV1Adapter) {\n // NOTE: We already filtering by `KeyringType.Snap`, so we are sure that those adapters\n // are wrapping a Snap keyring v2.\n const adapter = keyring as KeyringV1Adapter<SnapKeyringV2>;\n const keyringV2 = adapter.unwrap();\n\n // We use the synchronous method here since this method is used during `:stateChange` that are\n // use synchronous handlers.\n const account = keyringV2.lookupByAddress(address);\n if (account) {\n return {\n ...account,\n // We still have to use internal account for now, so we inject some metadata.\n metadata: {\n name: '',\n importTime: Date.now(),\n lastSelected: 0,\n keyring: {\n type: KeyringType.Snap,\n },\n snap: {\n id: keyringV2.snapId,\n },\n },\n };\n }\n }\n }\n\n return undefined;\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.messenger.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 log('Synchronizing accounts with keyrings (through :stateChange)...');\n\n // State patches.\n const patch: StatePatch = {\n previous: {},\n added: [],\n updated: [],\n removed: [],\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\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 // Money accounts are not treated as real accounts, they are owned by the `MoneyAccountController`, so\n // we need to filter them out here.\n if (isMoneyKeyringType(keyring.type)) {\n continue;\n }\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 keyring,\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 [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 // Diff that we will use to publish events afterward.\n const diff: { removed: string[]; added: InternalAccount[] } = {\n removed: [],\n added: [],\n };\n\n this.#update(\n (state) => {\n const { internalAccounts, accountIdByAddress } = state;\n\n for (const account of patch.removed) {\n delete internalAccounts.accounts[account.id];\n delete accountIdByAddress[account.address];\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.keyring,\n );\n\n if (account) {\n const accounts = Object.values(\n internalAccounts.accounts,\n ) as InternalAccount[];\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 importTime: Date.now(),\n lastSelected,\n },\n };\n\n accountIdByAddress[account.address] = account.id;\n\n diff.added.push(internalAccounts.accounts[account.id]);\n }\n }\n },\n // Will get executed after the update, but before re-selecting an account in case\n // the current one is not valid anymore.\n () => {\n // Now publish events\n for (const id of diff.removed) {\n this.messenger.publish('AccountsController:accountRemoved', id);\n }\n if (diff.removed.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsRemoved',\n diff.removed,\n );\n }\n\n for (const account of diff.added) {\n this.messenger.publish('AccountsController:accountAdded', account);\n }\n if (diff.added.length > 0) {\n this.messenger.publish(\n 'AccountsController:accountsAdded',\n diff.added,\n );\n }\n },\n );\n\n log('Accounts synchronized (through :stateChange)!');\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 * @param beforeAutoSelectAccount - Callback to be executed before auto-selecting an account\n * if the current one is no longer available.\n */\n #update(\n callback: (state: WritableDraft<AccountsControllerStrictState>) => void,\n beforeAutoSelectAccount?: () => void,\n ): 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: WritableDraft<AccountsControllerStrictState>) => {\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 // We might want to do some pre-work before selecting a new account.\n beforeAutoSelectAccount?.();\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.messenger.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n this.messenger.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\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 * Retrieves the index value for `metadata.lastSelected`.\n *\n * @returns The index value.\n */\n #getLastSelectedIndex(): number {\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 keyring - The keyring object of that new account.\n * @returns The newly generated/retrieved internal account.\n */\n #getInternalAccountFromAddressAndType(\n address: string,\n keyring: KeyringObject,\n ): InternalAccount | undefined {\n const isSnapKeyringV1 = isSnapKeyringType(keyring.type);\n const isSnapKeyringV2 = isSnapKeyringV2Type(keyring.type);\n\n if (isSnapKeyringV1 || isSnapKeyringV2) {\n let account: InternalAccount | undefined;\n\n if (isSnapKeyringV1) {\n account = this.#getAccountFromSnapKeyringV1(address);\n } else {\n account = this.#getAccountFromSnapKeyringV2(address);\n }\n\n if (account) {\n // We force the copy here, to avoid mutating the reference returned by the Snap keyring.\n account = cloneDeep(account);\n\n // MIGRATION: To avoid any existing Snap account migration, we are\n // just \"adding\" the new typed options that we need for multichain\n // accounts. Ultimately, we would need a real Snap account migrations\n // (being handled by each Snaps).\n if (isHdSnapKeyringAccount(account)) {\n const options: HdSnapKeyringAccount['options'] = {\n ...account.options,\n entropy: {\n type: KeyringAccountEntropyTypeOption.Mnemonic,\n id: account.options.entropySource,\n groupIndex: account.options.index,\n derivationPath: account.options.derivationPath,\n },\n };\n // Inject the new typed options to the internal account copy.\n account.options = options;\n }\n }\n\n return account;\n }\n\n return this.#getInternalAccountForNonSnapAccount(address, keyring);\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): void {\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 if (this.state.internalAccounts.selectedAccount === accountId) {\n return;\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 * Subscribes to message events.\n */\n #subscribeToMessageEvents(): void {\n this.messenger.subscribe('KeyringController:stateChange', (keyringState) =>\n this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountAssetListUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountAssetListUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.subscribe(\n 'SnapKeyring:accountBalancesUpdated',\n (snapAccountEvent) =>\n this.#handleOnSnapKeyringAccountEvent(\n 'AccountsController:accountBalancesUpdated',\n snapAccountEvent,\n ),\n );\n\n this.messenger.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.messenger.subscribe(\n 'MultichainNetworkController:networkDidChange',\n (id) => this.#handleOnMultichainNetworkDidChange(id),\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/accounts-controller",
3
- "version": "38.0.0",
3
+ "version": "38.1.1",
4
4
  "description": "Manages internal accounts",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -57,11 +57,12 @@
57
57
  "@metamask/base-controller": "^9.1.0",
58
58
  "@metamask/eth-snap-keyring": "^22.0.1",
59
59
  "@metamask/keyring-api": "^23.1.0",
60
- "@metamask/keyring-controller": "^25.4.0",
60
+ "@metamask/keyring-controller": "^25.5.0",
61
61
  "@metamask/keyring-internal-api": "^11.0.1",
62
- "@metamask/keyring-utils": "^3.1.0",
62
+ "@metamask/keyring-sdk": "^2.1.1",
63
+ "@metamask/keyring-utils": "^3.2.1",
63
64
  "@metamask/messenger": "^1.2.0",
64
- "@metamask/network-controller": "^30.1.0",
65
+ "@metamask/network-controller": "^32.0.0",
65
66
  "@metamask/superstruct": "^3.1.0",
66
67
  "@metamask/utils": "^11.9.0",
67
68
  "deepmerge": "^4.2.2",
@@ -72,7 +73,7 @@
72
73
  },
73
74
  "devDependencies": {
74
75
  "@metamask/auto-changelog": "^6.1.0",
75
- "@metamask/controller-utils": "^11.20.0",
76
+ "@metamask/controller-utils": "^12.1.0",
76
77
  "@metamask/providers": "^22.1.0",
77
78
  "@ts-bridge/cli": "^0.6.4",
78
79
  "@types/jest": "^29.5.14",