@metamask-previews/account-tree-controller 0.0.0-preview-d9a49231 → 0.1.0-preview-ef0f18a

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,4 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
- [Unreleased]: https://github.com/MetaMask/core/
10
+ ## [0.1.0]
11
+
12
+ ### Added
13
+
14
+ - Initial release ([#5847](https://github.com/MetaMask/core/pull/5847))
15
+ - Grouping accounts into 3 main categories: Entropy source, Snap ID, keyring types.
16
+
17
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/account-tree-controller@0.1.0...HEAD
18
+ [0.1.0]: https://github.com/MetaMask/core/releases/tag/@metamask/account-tree-controller@0.1.0
@@ -12,21 +12,20 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
12
12
  };
13
13
  var _AccountTreeController_instances, _AccountTreeController_reverse, _AccountTreeController_rules, _AccountTreeController_handleAccountAdded, _AccountTreeController_handleAccountRemoved, _AccountTreeController_hasKeyringType, _AccountTreeController_matchGroupByEntropySource, _AccountTreeController_matchGroupBySnapId, _AccountTreeController_matchGroupByKeyringType, _AccountTreeController_getSnapName, _AccountTreeController_getEntropySourceName, _AccountTreeController_insert, _AccountTreeController_listAccounts;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.AccountTreeController = exports.toDefaultAccountGroupId = exports.toAccountGroupId = exports.toAccountGroupRootId = exports.DEFAULT_ACCOUNT_GROUP_NAME = exports.DEFAULT_ACCOUNT_GROUP_UNIQUE_ID = exports.getDefaultAccountTreeControllerState = exports.AccountGroupRootCategory = void 0;
15
+ exports.AccountTreeController = exports.toDefaultAccountGroupId = exports.toAccountGroupId = exports.toAccountWalletId = exports.DEFAULT_ACCOUNT_GROUP_NAME = exports.DEFAULT_ACCOUNT_GROUP_UNIQUE_ID = exports.getDefaultAccountTreeControllerState = exports.AccountWalletCategory = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
17
17
  const keyring_controller_1 = require("@metamask/keyring-controller");
18
18
  const snaps_utils_1 = require("@metamask/snaps-utils");
19
19
  const names_1 = require("./names.cjs");
20
20
  const controllerName = 'AccountTreeController';
21
- var AccountGroupRootCategory;
22
- (function (AccountGroupRootCategory) {
23
- AccountGroupRootCategory["Entropy"] = "entropy";
24
- AccountGroupRootCategory["Snap"] = "snap";
25
- AccountGroupRootCategory["Keyring"] = "keyring";
26
- AccountGroupRootCategory["Default"] = "default";
27
- })(AccountGroupRootCategory || (exports.AccountGroupRootCategory = AccountGroupRootCategory = {}));
21
+ var AccountWalletCategory;
22
+ (function (AccountWalletCategory) {
23
+ AccountWalletCategory["Entropy"] = "entropy";
24
+ AccountWalletCategory["Keyring"] = "keyring";
25
+ AccountWalletCategory["Snap"] = "snap";
26
+ })(AccountWalletCategory || (exports.AccountWalletCategory = AccountWalletCategory = {}));
28
27
  const accountTreeControllerMetadata = {
29
- accountTrees: {
28
+ accountTree: {
30
29
  persist: false,
31
30
  anonymous: false,
32
31
  },
@@ -38,8 +37,8 @@ const accountTreeControllerMetadata = {
38
37
  */
39
38
  function getDefaultAccountTreeControllerState() {
40
39
  return {
41
- accountTrees: {
42
- roots: {},
40
+ accountTree: {
41
+ wallets: {},
43
42
  },
44
43
  };
45
44
  }
@@ -48,35 +47,35 @@ exports.getDefaultAccountTreeControllerState = getDefaultAccountTreeControllerSt
48
47
  exports.DEFAULT_ACCOUNT_GROUP_UNIQUE_ID = 'default'; // This might need to be re-evaluated based on new structure
49
48
  exports.DEFAULT_ACCOUNT_GROUP_NAME = 'Default';
50
49
  /**
51
- * Convert a unique ID to a group root ID for a given category.
50
+ * Convert a unique ID to a wallet ID for a given category.
52
51
  *
53
- * @param category - The category of the account group root.
54
- * @param id - The unique ID.
55
- * @returns The group root ID.
52
+ * @param category - A wallet category.
53
+ * @param id - A unique ID.
54
+ * @returns A wallet ID.
56
55
  */
57
- function toAccountGroupRootId(category, id) {
56
+ function toAccountWalletId(category, id) {
58
57
  return `${category}:${id}`;
59
58
  }
60
- exports.toAccountGroupRootId = toAccountGroupRootId;
59
+ exports.toAccountWalletId = toAccountWalletId;
61
60
  /**
62
- * Convert a group root ID and a unique ID to a group ID.
61
+ * Convert a wallet ID and a unique ID, to a group ID.
63
62
  *
64
- * @param groupRootId - The group root ID.
65
- * @param id - The unique ID.
66
- * @returns The group ID.
63
+ * @param walletId - A wallet ID.
64
+ * @param id - A unique ID.
65
+ * @returns A group ID.
67
66
  */
68
- function toAccountGroupId(groupRootId, id) {
69
- return `${groupRootId}:${id}`;
67
+ function toAccountGroupId(walletId, id) {
68
+ return `${walletId}:${id}`;
70
69
  }
71
70
  exports.toAccountGroupId = toAccountGroupId;
72
71
  /**
73
- * Convert a group root ID to the default group ID.
72
+ * Convert a wallet ID to the default group ID.
74
73
  *
75
- * @param groupRootId - The group root ID.
74
+ * @param walletId - A wallet ID.
76
75
  * @returns The default group ID.
77
76
  */
78
- function toDefaultAccountGroupId(groupRootId) {
79
- return toAccountGroupId(groupRootId, exports.DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);
77
+ function toDefaultAccountGroupId(walletId) {
78
+ return toAccountGroupId(walletId, exports.DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);
80
79
  }
81
80
  exports.toDefaultAccountGroupId = toDefaultAccountGroupId;
82
81
  class AccountTreeController extends base_controller_1.BaseController {
@@ -119,27 +118,27 @@ class AccountTreeController extends base_controller_1.BaseController {
119
118
  });
120
119
  }
121
120
  init() {
122
- const roots = {};
121
+ const wallets = {};
123
122
  // For now, we always re-compute all wallets, we do not re-use the existing state.
124
123
  for (const account of __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_listAccounts).call(this)) {
125
- __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, roots, account);
124
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, wallets, account);
126
125
  }
127
126
  this.update((state) => {
128
- state.accountTrees.roots = roots;
127
+ state.accountTree.wallets = wallets;
129
128
  });
130
129
  }
131
130
  }
132
131
  exports.AccountTreeController = AccountTreeController;
133
132
  _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = new WeakMap(), _AccountTreeController_instances = new WeakSet(), _AccountTreeController_handleAccountAdded = function _AccountTreeController_handleAccountAdded(account) {
134
133
  this.update((state) => {
135
- __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, state.accountTrees.roots, account);
134
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, state.accountTree.wallets, account);
136
135
  });
137
136
  }, _AccountTreeController_handleAccountRemoved = function _AccountTreeController_handleAccountRemoved(accountId) {
138
137
  const found = __classPrivateFieldGet(this, _AccountTreeController_reverse, "f").get(accountId);
139
138
  if (found) {
140
139
  const { walletId, groupId } = found;
141
140
  this.update((state) => {
142
- const { accounts } = state.accountTrees.roots[walletId].groups[groupId];
141
+ const { accounts } = state.accountTree.wallets[walletId].groups[groupId];
143
142
  const index = accounts.indexOf(accountId);
144
143
  if (index !== -1) {
145
144
  accounts.splice(index, 1);
@@ -178,8 +177,8 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
178
177
  return undefined;
179
178
  }
180
179
  return {
181
- category: AccountGroupRootCategory.Entropy,
182
- id: toAccountGroupRootId(AccountGroupRootCategory.Entropy, entropySource),
180
+ category: AccountWalletCategory.Entropy,
181
+ id: toAccountWalletId(AccountWalletCategory.Entropy, entropySource),
183
182
  name: entropySourceName,
184
183
  };
185
184
  }, _AccountTreeController_matchGroupBySnapId = function _AccountTreeController_matchGroupBySnapId(account) {
@@ -188,8 +187,8 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
188
187
  account.metadata.snap.enabled) {
189
188
  const { id } = account.metadata.snap;
190
189
  return {
191
- category: AccountGroupRootCategory.Snap,
192
- id: toAccountGroupRootId(AccountGroupRootCategory.Snap, id),
190
+ category: AccountWalletCategory.Snap,
191
+ id: toAccountWalletId(AccountWalletCategory.Snap, id),
193
192
  name: __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getSnapName).call(this, id),
194
193
  };
195
194
  }
@@ -197,9 +196,9 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
197
196
  }, _AccountTreeController_matchGroupByKeyringType = function _AccountTreeController_matchGroupByKeyringType(account) {
198
197
  const { type } = account.metadata.keyring;
199
198
  return {
200
- category: AccountGroupRootCategory.Keyring,
201
- id: toAccountGroupRootId(AccountGroupRootCategory.Keyring, type),
202
- name: (0, names_1.getAccountGroupRootNameFromKeyringType)(type),
199
+ category: AccountWalletCategory.Keyring,
200
+ id: toAccountWalletId(AccountWalletCategory.Keyring, type),
201
+ name: (0, names_1.getAccountWalletNameFromKeyringType)(type),
203
202
  };
204
203
  }, _AccountTreeController_getSnapName = function _AccountTreeController_getSnapName(snapId) {
205
204
  const snap = this.messagingSystem.call('SnapController:get', snapId);
@@ -218,7 +217,7 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
218
217
  return undefined;
219
218
  }
220
219
  return `Wallet ${index + 1}`; // Use human indexing.
221
- }, _AccountTreeController_insert = function _AccountTreeController_insert(roots, account) {
220
+ }, _AccountTreeController_insert = function _AccountTreeController_insert(wallets, account) {
222
221
  for (const rule of __classPrivateFieldGet(this, _AccountTreeController_rules, "f")) {
223
222
  const match = rule(account);
224
223
  if (!match) {
@@ -229,8 +228,8 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
229
228
  const walletName = match.name;
230
229
  const groupId = toDefaultAccountGroupId(walletId); // Use a single-group for now until multichain accounts is supported.
231
230
  const groupName = exports.DEFAULT_ACCOUNT_GROUP_NAME;
232
- if (!roots[walletId]) {
233
- roots[walletId] = {
231
+ if (!wallets[walletId]) {
232
+ wallets[walletId] = {
234
233
  id: walletId,
235
234
  groups: {
236
235
  [groupId]: {
@@ -244,7 +243,7 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
244
243
  },
245
244
  };
246
245
  }
247
- roots[walletId].groups[groupId].accounts.push(account.id);
246
+ wallets[walletId].groups[groupId].accounts.push(account.id);
248
247
  // Update the reverse mapping for this account.
249
248
  __classPrivateFieldGet(this, _AccountTreeController_reverse, "f").set(account.id, {
250
249
  walletId,
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.cjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { stripSnapPrefix } from '@metamask/snaps-utils';\n\nimport { getAccountGroupRootNameFromKeyringType } from './names';\n\nconst controllerName = 'AccountTreeController';\n\nexport enum AccountGroupRootCategory {\n Entropy = 'entropy',\n Snap = 'snap',\n Keyring = 'keyring',\n Default = 'default', // TODO: Remove `default` once we have multichain accounts.\n}\n\ntype AccountTreeRuleMatch = {\n category: AccountGroupRootCategory;\n id: AccountGroupRootId;\n name: string;\n};\n\ntype AccountReverseMapping = {\n walletId: AccountGroupRootId;\n groupId: AccountGroupId;\n};\n\ntype AccountGroupRootRuleFunction = (\n account: InternalAccount,\n) => AccountTreeRuleMatch | undefined;\n\nexport type AccountGroupRootId = `${AccountGroupRootCategory}:${string}`;\nexport type AccountGroupId = `${AccountGroupRootId}:${string}`;\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountGroupRootMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroup = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountGroupRoot = {\n id: AccountGroupRootId;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [accountGroup: AccountGroupId]: AccountGroup;\n };\n metadata: AccountGroupMetadata; // Assuming Metadata is a defined type\n};\n\nexport type AccountTreeControllerState = {\n accountTrees: {\n roots: {\n // Wallets:\n [accountGroupRoot: AccountGroupRootId]: AccountGroupRoot;\n },\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\nexport type AccountTreeControllerEvents = never;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTrees: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTrees: {\n roots: {},\n },\n };\n}\n\n// TODO: For now we use this for the 2nd-level of the tree until we implements proper multichain accounts.\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default'; // This might need to be re-evaluated based on new structure\nexport const DEFAULT_ACCOUNT_GROUP_NAME: string = 'Default';\n\n/**\n * Convert a unique ID to a group root ID for a given category.\n *\n * @param category - The category of the account group root.\n * @param id - The unique ID.\n * @returns The group root ID.\n */\nexport function toAccountGroupRootId(\n category: AccountGroupRootCategory,\n id: string,\n): AccountGroupRootId {\n return `${category}:${id}`;\n}\n\n/**\n * Convert a group root ID and a unique ID to a group ID.\n *\n * @param groupRootId - The group root ID.\n * @param id - The unique ID.\n * @returns The group ID.\n */\nexport function toAccountGroupId(\n groupRootId: AccountGroupRootId,\n id: string,\n): AccountGroupId {\n return `${groupRootId}:${id}`;\n}\n\n/**\n * Convert a group root ID to the default group ID.\n *\n * @param groupRootId - The group root ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n groupRootId: AccountGroupRootId,\n): AccountGroupId {\n return toAccountGroupId(groupRootId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #reverse: Map<AccountId, AccountReverseMapping>;\n\n readonly #rules: AccountGroupRootRuleFunction[];\n\n /**\n * Constructor for AccountTreeController.\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: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n\n // Reverse map to allow fast node access from an account ID.\n this.#reverse = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#rules = [\n // 1. We group by entropy-source\n (account: InternalAccount) => this.#matchGroupByEntropySource(account),\n // 2. We group by Snap ID\n (account: InternalAccount) => this.#matchGroupBySnapId(account),\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n (account: InternalAccount) => this.#matchGroupByKeyringType(account),\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const roots = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(roots, account);\n }\n\n this.update((state) => {\n state.accountTrees.roots = roots;\n });\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTrees.roots, account);\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const found = this.#reverse.get(accountId);\n\n if (found) {\n const { walletId, groupId } = found;\n this.update((state) => {\n const { accounts } = state.accountTrees.roots[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #hasKeyringType(account: InternalAccount, type: KeyringTypes): boolean {\n return account.metadata.keyring.type === (type as string);\n }\n\n #matchGroupByEntropySource(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n let entropySource: string | undefined;\n\n if (this.#hasKeyringType(account, KeyringTypes.hd)) {\n // TODO: Maybe use superstruct to validate the structure of HD account since they are not strongly-typed for now?\n if (!account.options.entropySource) {\n console.warn(\n \"! Found an HD account with no entropy source: account won't be associated to its wallet\",\n );\n return undefined;\n }\n\n entropySource = account.options.entropySource as string;\n }\n\n // TODO: For now, we're not checking if the Snap is a preinstalled one, and we probably should...\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap?.enabled\n ) {\n // Not all Snaps have an entropy-source and options are not typed yet, so we have to check manually here.\n if (account.options.entropySource) {\n // We blindly trust the `entropySource` for now, but it could be wrong since it comes from a Snap.\n entropySource = account.options.entropySource as string;\n }\n }\n\n if (!entropySource) {\n return undefined;\n }\n\n // We check if we can get the name for that entropy source, if not this means this entropy does not match\n // any HD keyrings, thus, is invalid (this account will be grouped by another rule).\n const entropySourceName = this.#getEntropySourceName(entropySource);\n if (!entropySourceName) {\n console.warn(\n '! Tried to name a wallet using an unknown entropy, this should not be possible.',\n );\n return undefined;\n }\n\n return {\n category: AccountGroupRootCategory.Entropy,\n id: toAccountGroupRootId(AccountGroupRootCategory.Entropy, entropySource),\n name: entropySourceName,\n };\n }\n\n #matchGroupBySnapId(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap &&\n account.metadata.snap.enabled\n ) {\n const { id } = account.metadata.snap;\n\n return {\n category: AccountGroupRootCategory.Snap,\n id: toAccountGroupRootId(AccountGroupRootCategory.Snap, id),\n name: this.#getSnapName(id as SnapId),\n };\n }\n\n return undefined;\n }\n\n #matchGroupByKeyringType(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n const { type } = account.metadata.keyring;\n\n return {\n category: AccountGroupRootCategory.Keyring,\n id: toAccountGroupRootId(AccountGroupRootCategory.Keyring, type),\n name: getAccountGroupRootNameFromKeyringType(type as KeyringTypes),\n };\n }\n\n #getSnapName(snapId: SnapId): string {\n const snap = this.messagingSystem.call('SnapController:get', snapId);\n const snapName = snap\n ? // TODO: Handle localization here, but that's a \"client thing\", so we don't have a `core` controller\n // to refer too.\n snap.manifest.proposedName\n : stripSnapPrefix(snapId);\n\n return `Snap: ${snapName}`;\n }\n\n #getEntropySourceName(entropySource: string): string | undefined {\n const { keyrings } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n\n const index = keyrings\n .filter((keyring) => keyring.type === (KeyringTypes.hd as string))\n .findIndex((keyring) => keyring.metadata.id === entropySource);\n\n if (index === -1) {\n return undefined;\n }\n\n return `Wallet ${index + 1}`; // Use human indexing.\n }\n\n #insert(\n roots: { [accountGroupRootId: AccountGroupRootId]: AccountGroupRoot },\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const walletId = match.id;\n const walletName = match.name;\n const groupId = toDefaultAccountGroupId(walletId); // Use a single-group for now until multichain accounts is supported.\n const groupName = DEFAULT_ACCOUNT_GROUP_NAME;\n\n if (!roots[walletId]) {\n roots[walletId] = {\n id: walletId,\n groups: {\n [groupId]: {\n id: groupId,\n accounts: [],\n metadata: { name: groupName },\n },\n },\n metadata: {\n name: walletName,\n },\n };\n }\n roots[walletId].groups[groupId].accounts.push(account.id);\n\n // Update the reverse mapping for this account.\n this.#reverse.set(account.id, {\n walletId,\n groupId,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n ) as InternalAccount[];\n }\n}\n"]}
1
+ {"version":3,"file":"AccountTreeController.cjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { stripSnapPrefix } from '@metamask/snaps-utils';\n\nimport { getAccountWalletNameFromKeyringType } from './names';\n\nconst controllerName = 'AccountTreeController';\n\nexport enum AccountWalletCategory {\n Entropy = 'entropy',\n Keyring = 'keyring',\n Snap = 'snap',\n}\n\ntype AccountTreeRuleMatch = {\n category: AccountWalletCategory;\n id: AccountWalletId;\n name: string;\n};\n\ntype AccountTreeRuleFunction = (\n account: InternalAccount,\n) => AccountTreeRuleMatch | undefined;\n\ntype AccountReverseMapping = {\n walletId: AccountWalletId;\n groupId: AccountGroupId;\n};\n\nexport type AccountWalletId = `${AccountWalletCategory}:${string}`;\nexport type AccountGroupId = `${AccountWalletId}:${string}`;\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountWalletMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroup = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountWallet = {\n id: AccountWalletId;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [groupId: AccountGroupId]: AccountGroup;\n };\n metadata: AccountGroupMetadata; // Assuming Metadata is a defined type\n};\n\nexport type AccountTreeControllerState = {\n accountTree: {\n wallets: {\n // Wallets:\n [walletId: AccountWalletId]: AccountWallet;\n };\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\nexport type AccountTreeControllerEvents = never;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTree: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTree: {\n wallets: {},\n },\n };\n}\n\n// TODO: For now we use this for the 2nd-level of the tree until we implements proper multichain accounts.\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default'; // This might need to be re-evaluated based on new structure\nexport const DEFAULT_ACCOUNT_GROUP_NAME: string = 'Default';\n\n/**\n * Convert a unique ID to a wallet ID for a given category.\n *\n * @param category - A wallet category.\n * @param id - A unique ID.\n * @returns A wallet ID.\n */\nexport function toAccountWalletId(\n category: AccountWalletCategory,\n id: string,\n): AccountWalletId {\n return `${category}:${id}`;\n}\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId(\n walletId: AccountWalletId,\n id: string,\n): AccountGroupId {\n return `${walletId}:${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n walletId: AccountWalletId,\n): AccountGroupId {\n return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #reverse: Map<AccountId, AccountReverseMapping>;\n\n readonly #rules: AccountTreeRuleFunction[];\n\n /**\n * Constructor for AccountTreeController.\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: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n\n // Reverse map to allow fast node access from an account ID.\n this.#reverse = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#rules = [\n // 1. We group by entropy-source\n (account: InternalAccount) => this.#matchGroupByEntropySource(account),\n // 2. We group by Snap ID\n (account: InternalAccount) => this.#matchGroupBySnapId(account),\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n (account: InternalAccount) => this.#matchGroupByKeyringType(account),\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const wallets = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(wallets, account);\n }\n\n this.update((state) => {\n state.accountTree.wallets = wallets;\n });\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTree.wallets, account);\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const found = this.#reverse.get(accountId);\n\n if (found) {\n const { walletId, groupId } = found;\n this.update((state) => {\n const { accounts } =\n state.accountTree.wallets[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #hasKeyringType(account: InternalAccount, type: KeyringTypes): boolean {\n return account.metadata.keyring.type === (type as string);\n }\n\n #matchGroupByEntropySource(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n let entropySource: string | undefined;\n\n if (this.#hasKeyringType(account, KeyringTypes.hd)) {\n // TODO: Maybe use superstruct to validate the structure of HD account since they are not strongly-typed for now?\n if (!account.options.entropySource) {\n console.warn(\n \"! Found an HD account with no entropy source: account won't be associated to its wallet\",\n );\n return undefined;\n }\n\n entropySource = account.options.entropySource as string;\n }\n\n // TODO: For now, we're not checking if the Snap is a preinstalled one, and we probably should...\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap?.enabled\n ) {\n // Not all Snaps have an entropy-source and options are not typed yet, so we have to check manually here.\n if (account.options.entropySource) {\n // We blindly trust the `entropySource` for now, but it could be wrong since it comes from a Snap.\n entropySource = account.options.entropySource as string;\n }\n }\n\n if (!entropySource) {\n return undefined;\n }\n\n // We check if we can get the name for that entropy source, if not this means this entropy does not match\n // any HD keyrings, thus, is invalid (this account will be grouped by another rule).\n const entropySourceName = this.#getEntropySourceName(entropySource);\n if (!entropySourceName) {\n console.warn(\n '! Tried to name a wallet using an unknown entropy, this should not be possible.',\n );\n return undefined;\n }\n\n return {\n category: AccountWalletCategory.Entropy,\n id: toAccountWalletId(AccountWalletCategory.Entropy, entropySource),\n name: entropySourceName,\n };\n }\n\n #matchGroupBySnapId(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap &&\n account.metadata.snap.enabled\n ) {\n const { id } = account.metadata.snap;\n\n return {\n category: AccountWalletCategory.Snap,\n id: toAccountWalletId(AccountWalletCategory.Snap, id),\n name: this.#getSnapName(id as SnapId),\n };\n }\n\n return undefined;\n }\n\n #matchGroupByKeyringType(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n const { type } = account.metadata.keyring;\n\n return {\n category: AccountWalletCategory.Keyring,\n id: toAccountWalletId(AccountWalletCategory.Keyring, type),\n name: getAccountWalletNameFromKeyringType(type as KeyringTypes),\n };\n }\n\n #getSnapName(snapId: SnapId): string {\n const snap = this.messagingSystem.call('SnapController:get', snapId);\n const snapName = snap\n ? // TODO: Handle localization here, but that's a \"client thing\", so we don't have a `core` controller\n // to refer too.\n snap.manifest.proposedName\n : stripSnapPrefix(snapId);\n\n return `Snap: ${snapName}`;\n }\n\n #getEntropySourceName(entropySource: string): string | undefined {\n const { keyrings } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n\n const index = keyrings\n .filter((keyring) => keyring.type === (KeyringTypes.hd as string))\n .findIndex((keyring) => keyring.metadata.id === entropySource);\n\n if (index === -1) {\n return undefined;\n }\n\n return `Wallet ${index + 1}`; // Use human indexing.\n }\n\n #insert(\n wallets: { [walletId: AccountWalletId]: AccountWallet },\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const walletId = match.id;\n const walletName = match.name;\n const groupId = toDefaultAccountGroupId(walletId); // Use a single-group for now until multichain accounts is supported.\n const groupName = DEFAULT_ACCOUNT_GROUP_NAME;\n\n if (!wallets[walletId]) {\n wallets[walletId] = {\n id: walletId,\n groups: {\n [groupId]: {\n id: groupId,\n accounts: [],\n metadata: { name: groupName },\n },\n },\n metadata: {\n name: walletName,\n },\n };\n }\n wallets[walletId].groups[groupId].accounts.push(account.id);\n\n // Update the reverse mapping for this account.\n this.#reverse.set(account.id, {\n walletId,\n groupId,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n}\n"]}
@@ -3,42 +3,41 @@ import { type ControllerGetStateAction, type ControllerStateChangeEvent, type Re
3
3
  import type { KeyringControllerGetStateAction } from "@metamask/keyring-controller";
4
4
  import type { GetSnap as SnapControllerGetSnap } from "@metamask/snaps-controllers";
5
5
  declare const controllerName = "AccountTreeController";
6
- export declare enum AccountGroupRootCategory {
6
+ export declare enum AccountWalletCategory {
7
7
  Entropy = "entropy",
8
- Snap = "snap",
9
8
  Keyring = "keyring",
10
- Default = "default"
9
+ Snap = "snap"
11
10
  }
12
- export type AccountGroupRootId = `${AccountGroupRootCategory}:${string}`;
13
- export type AccountGroupId = `${AccountGroupRootId}:${string}`;
11
+ export type AccountWalletId = `${AccountWalletCategory}:${string}`;
12
+ export type AccountGroupId = `${AccountWalletId}:${string}`;
14
13
  type Metadata = {
15
14
  name: string;
16
15
  };
17
- export type AccountGroupRootMetadata = Metadata;
16
+ export type AccountWalletMetadata = Metadata;
18
17
  export type AccountGroupMetadata = Metadata;
19
18
  export type AccountGroup = {
20
19
  id: AccountGroupId;
21
20
  accounts: AccountId[];
22
21
  metadata: AccountGroupMetadata;
23
22
  };
24
- export type AccountGroupRoot = {
25
- id: AccountGroupRootId;
23
+ export type AccountWallet = {
24
+ id: AccountWalletId;
26
25
  groups: {
27
- [accountGroup: AccountGroupId]: AccountGroup;
26
+ [groupId: AccountGroupId]: AccountGroup;
28
27
  };
29
28
  metadata: AccountGroupMetadata;
30
29
  };
31
30
  export type AccountTreeControllerState = {
32
- accountTrees: {
33
- roots: {
34
- [accountGroupRoot: AccountGroupRootId]: AccountGroupRoot;
31
+ accountTree: {
32
+ wallets: {
33
+ [walletId: AccountWalletId]: AccountWallet;
35
34
  };
36
35
  };
37
36
  };
38
37
  export type AccountTreeControllerGetStateAction = ControllerGetStateAction<typeof controllerName, AccountTreeControllerState>;
39
38
  export type AllowedActions = AccountsControllerListMultichainAccountsAction | KeyringControllerGetStateAction | SnapControllerGetSnap;
40
39
  export type AccountTreeControllerActions = never;
41
- export type AccountTreeControllerChangeEvent = ControllerStateChangeEvent<typeof controllerName, AccountTreeControllerState>;
40
+ export type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AccountTreeControllerState>;
42
41
  export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
43
42
  export type AccountTreeControllerEvents = never;
44
43
  export type AccountTreeControllerMessenger = RestrictedMessenger<typeof controllerName, AccountTreeControllerActions | AllowedActions, AccountTreeControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
@@ -51,28 +50,28 @@ export declare function getDefaultAccountTreeControllerState(): AccountTreeContr
51
50
  export declare const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string;
52
51
  export declare const DEFAULT_ACCOUNT_GROUP_NAME: string;
53
52
  /**
54
- * Convert a unique ID to a group root ID for a given category.
53
+ * Convert a unique ID to a wallet ID for a given category.
55
54
  *
56
- * @param category - The category of the account group root.
57
- * @param id - The unique ID.
58
- * @returns The group root ID.
55
+ * @param category - A wallet category.
56
+ * @param id - A unique ID.
57
+ * @returns A wallet ID.
59
58
  */
60
- export declare function toAccountGroupRootId(category: AccountGroupRootCategory, id: string): AccountGroupRootId;
59
+ export declare function toAccountWalletId(category: AccountWalletCategory, id: string): AccountWalletId;
61
60
  /**
62
- * Convert a group root ID and a unique ID to a group ID.
61
+ * Convert a wallet ID and a unique ID, to a group ID.
63
62
  *
64
- * @param groupRootId - The group root ID.
65
- * @param id - The unique ID.
66
- * @returns The group ID.
63
+ * @param walletId - A wallet ID.
64
+ * @param id - A unique ID.
65
+ * @returns A group ID.
67
66
  */
68
- export declare function toAccountGroupId(groupRootId: AccountGroupRootId, id: string): AccountGroupId;
67
+ export declare function toAccountGroupId(walletId: AccountWalletId, id: string): AccountGroupId;
69
68
  /**
70
- * Convert a group root ID to the default group ID.
69
+ * Convert a wallet ID to the default group ID.
71
70
  *
72
- * @param groupRootId - The group root ID.
71
+ * @param walletId - A wallet ID.
73
72
  * @returns The default group ID.
74
73
  */
75
- export declare function toDefaultAccountGroupId(groupRootId: AccountGroupRootId): AccountGroupId;
74
+ export declare function toDefaultAccountGroupId(walletId: AccountWalletId): AccountGroupId;
76
75
  export declare class AccountTreeController extends BaseController<typeof controllerName, AccountTreeControllerState, AccountTreeControllerMessenger> {
77
76
  #private;
78
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.d.cts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AccountTreeController.d.cts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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"}
@@ -3,42 +3,41 @@ import { type ControllerGetStateAction, type ControllerStateChangeEvent, type Re
3
3
  import type { KeyringControllerGetStateAction } from "@metamask/keyring-controller";
4
4
  import type { GetSnap as SnapControllerGetSnap } from "@metamask/snaps-controllers";
5
5
  declare const controllerName = "AccountTreeController";
6
- export declare enum AccountGroupRootCategory {
6
+ export declare enum AccountWalletCategory {
7
7
  Entropy = "entropy",
8
- Snap = "snap",
9
8
  Keyring = "keyring",
10
- Default = "default"
9
+ Snap = "snap"
11
10
  }
12
- export type AccountGroupRootId = `${AccountGroupRootCategory}:${string}`;
13
- export type AccountGroupId = `${AccountGroupRootId}:${string}`;
11
+ export type AccountWalletId = `${AccountWalletCategory}:${string}`;
12
+ export type AccountGroupId = `${AccountWalletId}:${string}`;
14
13
  type Metadata = {
15
14
  name: string;
16
15
  };
17
- export type AccountGroupRootMetadata = Metadata;
16
+ export type AccountWalletMetadata = Metadata;
18
17
  export type AccountGroupMetadata = Metadata;
19
18
  export type AccountGroup = {
20
19
  id: AccountGroupId;
21
20
  accounts: AccountId[];
22
21
  metadata: AccountGroupMetadata;
23
22
  };
24
- export type AccountGroupRoot = {
25
- id: AccountGroupRootId;
23
+ export type AccountWallet = {
24
+ id: AccountWalletId;
26
25
  groups: {
27
- [accountGroup: AccountGroupId]: AccountGroup;
26
+ [groupId: AccountGroupId]: AccountGroup;
28
27
  };
29
28
  metadata: AccountGroupMetadata;
30
29
  };
31
30
  export type AccountTreeControllerState = {
32
- accountTrees: {
33
- roots: {
34
- [accountGroupRoot: AccountGroupRootId]: AccountGroupRoot;
31
+ accountTree: {
32
+ wallets: {
33
+ [walletId: AccountWalletId]: AccountWallet;
35
34
  };
36
35
  };
37
36
  };
38
37
  export type AccountTreeControllerGetStateAction = ControllerGetStateAction<typeof controllerName, AccountTreeControllerState>;
39
38
  export type AllowedActions = AccountsControllerListMultichainAccountsAction | KeyringControllerGetStateAction | SnapControllerGetSnap;
40
39
  export type AccountTreeControllerActions = never;
41
- export type AccountTreeControllerChangeEvent = ControllerStateChangeEvent<typeof controllerName, AccountTreeControllerState>;
40
+ export type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<typeof controllerName, AccountTreeControllerState>;
42
41
  export type AllowedEvents = AccountsControllerAccountAddedEvent | AccountsControllerAccountRemovedEvent;
43
42
  export type AccountTreeControllerEvents = never;
44
43
  export type AccountTreeControllerMessenger = RestrictedMessenger<typeof controllerName, AccountTreeControllerActions | AllowedActions, AccountTreeControllerEvents | AllowedEvents, AllowedActions['type'], AllowedEvents['type']>;
@@ -51,28 +50,28 @@ export declare function getDefaultAccountTreeControllerState(): AccountTreeContr
51
50
  export declare const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string;
52
51
  export declare const DEFAULT_ACCOUNT_GROUP_NAME: string;
53
52
  /**
54
- * Convert a unique ID to a group root ID for a given category.
53
+ * Convert a unique ID to a wallet ID for a given category.
55
54
  *
56
- * @param category - The category of the account group root.
57
- * @param id - The unique ID.
58
- * @returns The group root ID.
55
+ * @param category - A wallet category.
56
+ * @param id - A unique ID.
57
+ * @returns A wallet ID.
59
58
  */
60
- export declare function toAccountGroupRootId(category: AccountGroupRootCategory, id: string): AccountGroupRootId;
59
+ export declare function toAccountWalletId(category: AccountWalletCategory, id: string): AccountWalletId;
61
60
  /**
62
- * Convert a group root ID and a unique ID to a group ID.
61
+ * Convert a wallet ID and a unique ID, to a group ID.
63
62
  *
64
- * @param groupRootId - The group root ID.
65
- * @param id - The unique ID.
66
- * @returns The group ID.
63
+ * @param walletId - A wallet ID.
64
+ * @param id - A unique ID.
65
+ * @returns A group ID.
67
66
  */
68
- export declare function toAccountGroupId(groupRootId: AccountGroupRootId, id: string): AccountGroupId;
67
+ export declare function toAccountGroupId(walletId: AccountWalletId, id: string): AccountGroupId;
69
68
  /**
70
- * Convert a group root ID to the default group ID.
69
+ * Convert a wallet ID to the default group ID.
71
70
  *
72
- * @param groupRootId - The group root ID.
71
+ * @param walletId - A wallet ID.
73
72
  * @returns The default group ID.
74
73
  */
75
- export declare function toDefaultAccountGroupId(groupRootId: AccountGroupRootId): AccountGroupId;
74
+ export declare function toDefaultAccountGroupId(walletId: AccountWalletId): AccountGroupId;
76
75
  export declare class AccountTreeController extends BaseController<typeof controllerName, AccountTreeControllerState, AccountTreeControllerMessenger> {
77
76
  #private;
78
77
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.d.mts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,mCAAmC,EACnC,qCAAqC,EACrC,8CAA8C,EAC/C,sCAAsC;AAEvC,OAAO,EACL,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAC/B,KAAK,mBAAmB,EACxB,cAAc,EACf,kCAAkC;AACnC,OAAO,KAAK,EAAE,+BAA+B,EAAE,qCAAqC;AAGpF,OAAO,KAAK,EAAE,OAAO,IAAI,qBAAqB,EAAE,oCAAoC;AAMpF,QAAA,MAAM,cAAc,0BAA0B,CAAC;AAE/C,oBAAY,wBAAwB;IAClC,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAiBD,MAAM,MAAM,kBAAkB,GAAG,GAAG,wBAAwB,IAAI,MAAM,EAAE,CAAC;AACzE,MAAM,MAAM,cAAc,GAAG,GAAG,kBAAkB,IAAI,MAAM,EAAE,CAAC;AAG/D,KAAK,QAAQ,GAAG;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,QAAQ,CAAC;AAEhD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;AAE5C,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,cAAc,CAAC;IAEnB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,kBAAkB,CAAC;IAEvB,MAAM,EAAE;QACN,CAAC,YAAY,EAAE,cAAc,GAAG,YAAY,CAAC;KAC9C,CAAC;IACF,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE;QACZ,KAAK,EAAE;YAEL,CAAC,gBAAgB,EAAE,kBAAkB,GAAG,gBAAgB,CAAC;SAC1D,CAAC;KACH,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,wBAAwB,CACxE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,cAAc,GACtB,8CAA8C,GAC9C,+BAA+B,GAC/B,qBAAqB,CAAC;AAE1B,MAAM,MAAM,4BAA4B,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,gCAAgC,GAAG,0BAA0B,CACvE,OAAO,cAAc,EACrB,0BAA0B,CAC3B,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB,mCAAmC,GACnC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,2BAA2B,GAAG,KAAK,CAAC;AAEhD,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC9D,OAAO,cAAc,EACrB,4BAA4B,GAAG,cAAc,EAC7C,2BAA2B,GAAG,aAAa,EAC3C,cAAc,CAAC,MAAM,CAAC,EACtB,aAAa,CAAC,MAAM,CAAC,CACtB,CAAC;AAUF;;;;GAIG;AACH,wBAAgB,oCAAoC,IAAI,0BAA0B,CAMjF;AAGD,eAAO,MAAM,+BAA+B,EAAE,MAAkB,CAAC;AACjE,eAAO,MAAM,0BAA0B,EAAE,MAAkB,CAAC;AAE5D;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,wBAAwB,EAClC,EAAE,EAAE,MAAM,GACT,kBAAkB,CAEpB;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,kBAAkB,EAC/B,EAAE,EAAE,MAAM,GACT,cAAc,CAEhB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,GAC9B,cAAc,CAEhB;AAED,qBAAa,qBAAsB,SAAQ,cAAc,CACvD,OAAO,cAAc,EACrB,0BAA0B,EAC1B,8BAA8B,CAC/B;;IAKC;;;;;;OAMG;gBACS,EACV,SAAS,EACT,KAAK,GACN,EAAE;QACD,SAAS,EAAE,8BAA8B,CAAC;QAC1C,KAAK,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;KAC7C;IAuCD,IAAI;CAqML"}
1
+ {"version":3,"file":"AccountTreeController.d.mts","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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"}
@@ -13,17 +13,16 @@ var _AccountTreeController_instances, _AccountTreeController_reverse, _AccountTr
13
13
  import { BaseController } from "@metamask/base-controller";
14
14
  import { KeyringTypes } from "@metamask/keyring-controller";
15
15
  import { stripSnapPrefix } from "@metamask/snaps-utils";
16
- import { getAccountGroupRootNameFromKeyringType } from "./names.mjs";
16
+ import { getAccountWalletNameFromKeyringType } from "./names.mjs";
17
17
  const controllerName = 'AccountTreeController';
18
- export var AccountGroupRootCategory;
19
- (function (AccountGroupRootCategory) {
20
- AccountGroupRootCategory["Entropy"] = "entropy";
21
- AccountGroupRootCategory["Snap"] = "snap";
22
- AccountGroupRootCategory["Keyring"] = "keyring";
23
- AccountGroupRootCategory["Default"] = "default";
24
- })(AccountGroupRootCategory || (AccountGroupRootCategory = {}));
18
+ export var AccountWalletCategory;
19
+ (function (AccountWalletCategory) {
20
+ AccountWalletCategory["Entropy"] = "entropy";
21
+ AccountWalletCategory["Keyring"] = "keyring";
22
+ AccountWalletCategory["Snap"] = "snap";
23
+ })(AccountWalletCategory || (AccountWalletCategory = {}));
25
24
  const accountTreeControllerMetadata = {
26
- accountTrees: {
25
+ accountTree: {
27
26
  persist: false,
28
27
  anonymous: false,
29
28
  },
@@ -35,8 +34,8 @@ const accountTreeControllerMetadata = {
35
34
  */
36
35
  export function getDefaultAccountTreeControllerState() {
37
36
  return {
38
- accountTrees: {
39
- roots: {},
37
+ accountTree: {
38
+ wallets: {},
40
39
  },
41
40
  };
42
41
  }
@@ -44,33 +43,33 @@ export function getDefaultAccountTreeControllerState() {
44
43
  export const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID = 'default'; // This might need to be re-evaluated based on new structure
45
44
  export const DEFAULT_ACCOUNT_GROUP_NAME = 'Default';
46
45
  /**
47
- * Convert a unique ID to a group root ID for a given category.
46
+ * Convert a unique ID to a wallet ID for a given category.
48
47
  *
49
- * @param category - The category of the account group root.
50
- * @param id - The unique ID.
51
- * @returns The group root ID.
48
+ * @param category - A wallet category.
49
+ * @param id - A unique ID.
50
+ * @returns A wallet ID.
52
51
  */
53
- export function toAccountGroupRootId(category, id) {
52
+ export function toAccountWalletId(category, id) {
54
53
  return `${category}:${id}`;
55
54
  }
56
55
  /**
57
- * Convert a group root ID and a unique ID to a group ID.
56
+ * Convert a wallet ID and a unique ID, to a group ID.
58
57
  *
59
- * @param groupRootId - The group root ID.
60
- * @param id - The unique ID.
61
- * @returns The group ID.
58
+ * @param walletId - A wallet ID.
59
+ * @param id - A unique ID.
60
+ * @returns A group ID.
62
61
  */
63
- export function toAccountGroupId(groupRootId, id) {
64
- return `${groupRootId}:${id}`;
62
+ export function toAccountGroupId(walletId, id) {
63
+ return `${walletId}:${id}`;
65
64
  }
66
65
  /**
67
- * Convert a group root ID to the default group ID.
66
+ * Convert a wallet ID to the default group ID.
68
67
  *
69
- * @param groupRootId - The group root ID.
68
+ * @param walletId - A wallet ID.
70
69
  * @returns The default group ID.
71
70
  */
72
- export function toDefaultAccountGroupId(groupRootId) {
73
- return toAccountGroupId(groupRootId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);
71
+ export function toDefaultAccountGroupId(walletId) {
72
+ return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);
74
73
  }
75
74
  export class AccountTreeController extends BaseController {
76
75
  /**
@@ -112,26 +111,26 @@ export class AccountTreeController extends BaseController {
112
111
  });
113
112
  }
114
113
  init() {
115
- const roots = {};
114
+ const wallets = {};
116
115
  // For now, we always re-compute all wallets, we do not re-use the existing state.
117
116
  for (const account of __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_listAccounts).call(this)) {
118
- __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, roots, account);
117
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, wallets, account);
119
118
  }
120
119
  this.update((state) => {
121
- state.accountTrees.roots = roots;
120
+ state.accountTree.wallets = wallets;
122
121
  });
123
122
  }
124
123
  }
125
124
  _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = new WeakMap(), _AccountTreeController_instances = new WeakSet(), _AccountTreeController_handleAccountAdded = function _AccountTreeController_handleAccountAdded(account) {
126
125
  this.update((state) => {
127
- __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, state.accountTrees.roots, account);
126
+ __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, state.accountTree.wallets, account);
128
127
  });
129
128
  }, _AccountTreeController_handleAccountRemoved = function _AccountTreeController_handleAccountRemoved(accountId) {
130
129
  const found = __classPrivateFieldGet(this, _AccountTreeController_reverse, "f").get(accountId);
131
130
  if (found) {
132
131
  const { walletId, groupId } = found;
133
132
  this.update((state) => {
134
- const { accounts } = state.accountTrees.roots[walletId].groups[groupId];
133
+ const { accounts } = state.accountTree.wallets[walletId].groups[groupId];
135
134
  const index = accounts.indexOf(accountId);
136
135
  if (index !== -1) {
137
136
  accounts.splice(index, 1);
@@ -170,8 +169,8 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
170
169
  return undefined;
171
170
  }
172
171
  return {
173
- category: AccountGroupRootCategory.Entropy,
174
- id: toAccountGroupRootId(AccountGroupRootCategory.Entropy, entropySource),
172
+ category: AccountWalletCategory.Entropy,
173
+ id: toAccountWalletId(AccountWalletCategory.Entropy, entropySource),
175
174
  name: entropySourceName,
176
175
  };
177
176
  }, _AccountTreeController_matchGroupBySnapId = function _AccountTreeController_matchGroupBySnapId(account) {
@@ -180,8 +179,8 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
180
179
  account.metadata.snap.enabled) {
181
180
  const { id } = account.metadata.snap;
182
181
  return {
183
- category: AccountGroupRootCategory.Snap,
184
- id: toAccountGroupRootId(AccountGroupRootCategory.Snap, id),
182
+ category: AccountWalletCategory.Snap,
183
+ id: toAccountWalletId(AccountWalletCategory.Snap, id),
185
184
  name: __classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_getSnapName).call(this, id),
186
185
  };
187
186
  }
@@ -189,9 +188,9 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
189
188
  }, _AccountTreeController_matchGroupByKeyringType = function _AccountTreeController_matchGroupByKeyringType(account) {
190
189
  const { type } = account.metadata.keyring;
191
190
  return {
192
- category: AccountGroupRootCategory.Keyring,
193
- id: toAccountGroupRootId(AccountGroupRootCategory.Keyring, type),
194
- name: getAccountGroupRootNameFromKeyringType(type),
191
+ category: AccountWalletCategory.Keyring,
192
+ id: toAccountWalletId(AccountWalletCategory.Keyring, type),
193
+ name: getAccountWalletNameFromKeyringType(type),
195
194
  };
196
195
  }, _AccountTreeController_getSnapName = function _AccountTreeController_getSnapName(snapId) {
197
196
  const snap = this.messagingSystem.call('SnapController:get', snapId);
@@ -210,7 +209,7 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
210
209
  return undefined;
211
210
  }
212
211
  return `Wallet ${index + 1}`; // Use human indexing.
213
- }, _AccountTreeController_insert = function _AccountTreeController_insert(roots, account) {
212
+ }, _AccountTreeController_insert = function _AccountTreeController_insert(wallets, account) {
214
213
  for (const rule of __classPrivateFieldGet(this, _AccountTreeController_rules, "f")) {
215
214
  const match = rule(account);
216
215
  if (!match) {
@@ -221,8 +220,8 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
221
220
  const walletName = match.name;
222
221
  const groupId = toDefaultAccountGroupId(walletId); // Use a single-group for now until multichain accounts is supported.
223
222
  const groupName = DEFAULT_ACCOUNT_GROUP_NAME;
224
- if (!roots[walletId]) {
225
- roots[walletId] = {
223
+ if (!wallets[walletId]) {
224
+ wallets[walletId] = {
226
225
  id: walletId,
227
226
  groups: {
228
227
  [groupId]: {
@@ -236,7 +235,7 @@ _AccountTreeController_reverse = new WeakMap(), _AccountTreeController_rules = n
236
235
  },
237
236
  };
238
237
  }
239
- roots[walletId].groups[groupId].accounts.push(account.id);
238
+ wallets[walletId].groups[groupId].accounts.push(account.id);
240
239
  // Update the reverse mapping for this account.
241
240
  __classPrivateFieldGet(this, _AccountTreeController_reverse, "f").set(account.id, {
242
241
  walletId,
@@ -1 +1 @@
1
- {"version":3,"file":"AccountTreeController.mjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { stripSnapPrefix } from '@metamask/snaps-utils';\n\nimport { getAccountGroupRootNameFromKeyringType } from './names';\n\nconst controllerName = 'AccountTreeController';\n\nexport enum AccountGroupRootCategory {\n Entropy = 'entropy',\n Snap = 'snap',\n Keyring = 'keyring',\n Default = 'default', // TODO: Remove `default` once we have multichain accounts.\n}\n\ntype AccountTreeRuleMatch = {\n category: AccountGroupRootCategory;\n id: AccountGroupRootId;\n name: string;\n};\n\ntype AccountReverseMapping = {\n walletId: AccountGroupRootId;\n groupId: AccountGroupId;\n};\n\ntype AccountGroupRootRuleFunction = (\n account: InternalAccount,\n) => AccountTreeRuleMatch | undefined;\n\nexport type AccountGroupRootId = `${AccountGroupRootCategory}:${string}`;\nexport type AccountGroupId = `${AccountGroupRootId}:${string}`;\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountGroupRootMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroup = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountGroupRoot = {\n id: AccountGroupRootId;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [accountGroup: AccountGroupId]: AccountGroup;\n };\n metadata: AccountGroupMetadata; // Assuming Metadata is a defined type\n};\n\nexport type AccountTreeControllerState = {\n accountTrees: {\n roots: {\n // Wallets:\n [accountGroupRoot: AccountGroupRootId]: AccountGroupRoot;\n },\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\nexport type AccountTreeControllerEvents = never;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTrees: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTrees: {\n roots: {},\n },\n };\n}\n\n// TODO: For now we use this for the 2nd-level of the tree until we implements proper multichain accounts.\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default'; // This might need to be re-evaluated based on new structure\nexport const DEFAULT_ACCOUNT_GROUP_NAME: string = 'Default';\n\n/**\n * Convert a unique ID to a group root ID for a given category.\n *\n * @param category - The category of the account group root.\n * @param id - The unique ID.\n * @returns The group root ID.\n */\nexport function toAccountGroupRootId(\n category: AccountGroupRootCategory,\n id: string,\n): AccountGroupRootId {\n return `${category}:${id}`;\n}\n\n/**\n * Convert a group root ID and a unique ID to a group ID.\n *\n * @param groupRootId - The group root ID.\n * @param id - The unique ID.\n * @returns The group ID.\n */\nexport function toAccountGroupId(\n groupRootId: AccountGroupRootId,\n id: string,\n): AccountGroupId {\n return `${groupRootId}:${id}`;\n}\n\n/**\n * Convert a group root ID to the default group ID.\n *\n * @param groupRootId - The group root ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n groupRootId: AccountGroupRootId,\n): AccountGroupId {\n return toAccountGroupId(groupRootId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #reverse: Map<AccountId, AccountReverseMapping>;\n\n readonly #rules: AccountGroupRootRuleFunction[];\n\n /**\n * Constructor for AccountTreeController.\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: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n\n // Reverse map to allow fast node access from an account ID.\n this.#reverse = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#rules = [\n // 1. We group by entropy-source\n (account: InternalAccount) => this.#matchGroupByEntropySource(account),\n // 2. We group by Snap ID\n (account: InternalAccount) => this.#matchGroupBySnapId(account),\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n (account: InternalAccount) => this.#matchGroupByKeyringType(account),\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const roots = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(roots, account);\n }\n\n this.update((state) => {\n state.accountTrees.roots = roots;\n });\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTrees.roots, account);\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const found = this.#reverse.get(accountId);\n\n if (found) {\n const { walletId, groupId } = found;\n this.update((state) => {\n const { accounts } = state.accountTrees.roots[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #hasKeyringType(account: InternalAccount, type: KeyringTypes): boolean {\n return account.metadata.keyring.type === (type as string);\n }\n\n #matchGroupByEntropySource(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n let entropySource: string | undefined;\n\n if (this.#hasKeyringType(account, KeyringTypes.hd)) {\n // TODO: Maybe use superstruct to validate the structure of HD account since they are not strongly-typed for now?\n if (!account.options.entropySource) {\n console.warn(\n \"! Found an HD account with no entropy source: account won't be associated to its wallet\",\n );\n return undefined;\n }\n\n entropySource = account.options.entropySource as string;\n }\n\n // TODO: For now, we're not checking if the Snap is a preinstalled one, and we probably should...\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap?.enabled\n ) {\n // Not all Snaps have an entropy-source and options are not typed yet, so we have to check manually here.\n if (account.options.entropySource) {\n // We blindly trust the `entropySource` for now, but it could be wrong since it comes from a Snap.\n entropySource = account.options.entropySource as string;\n }\n }\n\n if (!entropySource) {\n return undefined;\n }\n\n // We check if we can get the name for that entropy source, if not this means this entropy does not match\n // any HD keyrings, thus, is invalid (this account will be grouped by another rule).\n const entropySourceName = this.#getEntropySourceName(entropySource);\n if (!entropySourceName) {\n console.warn(\n '! Tried to name a wallet using an unknown entropy, this should not be possible.',\n );\n return undefined;\n }\n\n return {\n category: AccountGroupRootCategory.Entropy,\n id: toAccountGroupRootId(AccountGroupRootCategory.Entropy, entropySource),\n name: entropySourceName,\n };\n }\n\n #matchGroupBySnapId(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap &&\n account.metadata.snap.enabled\n ) {\n const { id } = account.metadata.snap;\n\n return {\n category: AccountGroupRootCategory.Snap,\n id: toAccountGroupRootId(AccountGroupRootCategory.Snap, id),\n name: this.#getSnapName(id as SnapId),\n };\n }\n\n return undefined;\n }\n\n #matchGroupByKeyringType(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n const { type } = account.metadata.keyring;\n\n return {\n category: AccountGroupRootCategory.Keyring,\n id: toAccountGroupRootId(AccountGroupRootCategory.Keyring, type),\n name: getAccountGroupRootNameFromKeyringType(type as KeyringTypes),\n };\n }\n\n #getSnapName(snapId: SnapId): string {\n const snap = this.messagingSystem.call('SnapController:get', snapId);\n const snapName = snap\n ? // TODO: Handle localization here, but that's a \"client thing\", so we don't have a `core` controller\n // to refer too.\n snap.manifest.proposedName\n : stripSnapPrefix(snapId);\n\n return `Snap: ${snapName}`;\n }\n\n #getEntropySourceName(entropySource: string): string | undefined {\n const { keyrings } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n\n const index = keyrings\n .filter((keyring) => keyring.type === (KeyringTypes.hd as string))\n .findIndex((keyring) => keyring.metadata.id === entropySource);\n\n if (index === -1) {\n return undefined;\n }\n\n return `Wallet ${index + 1}`; // Use human indexing.\n }\n\n #insert(\n roots: { [accountGroupRootId: AccountGroupRootId]: AccountGroupRoot },\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const walletId = match.id;\n const walletName = match.name;\n const groupId = toDefaultAccountGroupId(walletId); // Use a single-group for now until multichain accounts is supported.\n const groupName = DEFAULT_ACCOUNT_GROUP_NAME;\n\n if (!roots[walletId]) {\n roots[walletId] = {\n id: walletId,\n groups: {\n [groupId]: {\n id: groupId,\n accounts: [],\n metadata: { name: groupName },\n },\n },\n metadata: {\n name: walletName,\n },\n };\n }\n roots[walletId].groups[groupId].accounts.push(account.id);\n\n // Update the reverse mapping for this account.\n this.#reverse.set(account.id, {\n walletId,\n groupId,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n ) as InternalAccount[];\n }\n}\n"]}
1
+ {"version":3,"file":"AccountTreeController.mjs","sourceRoot":"","sources":["../src/AccountTreeController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n AccountId,\n AccountsControllerAccountAddedEvent,\n AccountsControllerAccountRemovedEvent,\n AccountsControllerListMultichainAccountsAction,\n} from '@metamask/accounts-controller';\nimport type { StateMetadata } from '@metamask/base-controller';\nimport {\n type ControllerGetStateAction,\n type ControllerStateChangeEvent,\n type RestrictedMessenger,\n BaseController,\n} from '@metamask/base-controller';\nimport type { KeyringControllerGetStateAction } from '@metamask/keyring-controller';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type { InternalAccount } from '@metamask/keyring-internal-api';\nimport type { GetSnap as SnapControllerGetSnap } from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport { stripSnapPrefix } from '@metamask/snaps-utils';\n\nimport { getAccountWalletNameFromKeyringType } from './names';\n\nconst controllerName = 'AccountTreeController';\n\nexport enum AccountWalletCategory {\n Entropy = 'entropy',\n Keyring = 'keyring',\n Snap = 'snap',\n}\n\ntype AccountTreeRuleMatch = {\n category: AccountWalletCategory;\n id: AccountWalletId;\n name: string;\n};\n\ntype AccountTreeRuleFunction = (\n account: InternalAccount,\n) => AccountTreeRuleMatch | undefined;\n\ntype AccountReverseMapping = {\n walletId: AccountWalletId;\n groupId: AccountGroupId;\n};\n\nexport type AccountWalletId = `${AccountWalletCategory}:${string}`;\nexport type AccountGroupId = `${AccountWalletId}:${string}`;\n\n// Do not export this one, we just use it to have a common type interface between group and wallet metadata.\ntype Metadata = {\n name: string;\n};\n\nexport type AccountWalletMetadata = Metadata;\n\nexport type AccountGroupMetadata = Metadata;\n\nexport type AccountGroup = {\n id: AccountGroupId;\n // Blockchain Accounts:\n accounts: AccountId[];\n metadata: AccountGroupMetadata;\n};\n\nexport type AccountWallet = {\n id: AccountWalletId;\n // Account groups OR Multichain accounts (once available).\n groups: {\n [groupId: AccountGroupId]: AccountGroup;\n };\n metadata: AccountGroupMetadata; // Assuming Metadata is a defined type\n};\n\nexport type AccountTreeControllerState = {\n accountTree: {\n wallets: {\n // Wallets:\n [walletId: AccountWalletId]: AccountWallet;\n };\n };\n};\n\nexport type AccountTreeControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedActions =\n | AccountsControllerListMultichainAccountsAction\n | KeyringControllerGetStateAction\n | SnapControllerGetSnap;\n\nexport type AccountTreeControllerActions = never;\n\nexport type AccountTreeControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountTreeControllerState\n>;\n\nexport type AllowedEvents =\n | AccountsControllerAccountAddedEvent\n | AccountsControllerAccountRemovedEvent;\n\nexport type AccountTreeControllerEvents = never;\n\nexport type AccountTreeControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n AccountTreeControllerActions | AllowedActions,\n AccountTreeControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nconst accountTreeControllerMetadata: StateMetadata<AccountTreeControllerState> =\n {\n accountTree: {\n persist: false, // We do re-recompute this state everytime.\n anonymous: false,\n },\n };\n\n/**\n * Gets default state of the `AccountTreeController`.\n *\n * @returns The default state of the `AccountTreeController`.\n */\nexport function getDefaultAccountTreeControllerState(): AccountTreeControllerState {\n return {\n accountTree: {\n wallets: {},\n },\n };\n}\n\n// TODO: For now we use this for the 2nd-level of the tree until we implements proper multichain accounts.\nexport const DEFAULT_ACCOUNT_GROUP_UNIQUE_ID: string = 'default'; // This might need to be re-evaluated based on new structure\nexport const DEFAULT_ACCOUNT_GROUP_NAME: string = 'Default';\n\n/**\n * Convert a unique ID to a wallet ID for a given category.\n *\n * @param category - A wallet category.\n * @param id - A unique ID.\n * @returns A wallet ID.\n */\nexport function toAccountWalletId(\n category: AccountWalletCategory,\n id: string,\n): AccountWalletId {\n return `${category}:${id}`;\n}\n\n/**\n * Convert a wallet ID and a unique ID, to a group ID.\n *\n * @param walletId - A wallet ID.\n * @param id - A unique ID.\n * @returns A group ID.\n */\nexport function toAccountGroupId(\n walletId: AccountWalletId,\n id: string,\n): AccountGroupId {\n return `${walletId}:${id}`;\n}\n\n/**\n * Convert a wallet ID to the default group ID.\n *\n * @param walletId - A wallet ID.\n * @returns The default group ID.\n */\nexport function toDefaultAccountGroupId(\n walletId: AccountWalletId,\n): AccountGroupId {\n return toAccountGroupId(walletId, DEFAULT_ACCOUNT_GROUP_UNIQUE_ID);\n}\n\nexport class AccountTreeController extends BaseController<\n typeof controllerName,\n AccountTreeControllerState,\n AccountTreeControllerMessenger\n> {\n readonly #reverse: Map<AccountId, AccountReverseMapping>;\n\n readonly #rules: AccountTreeRuleFunction[];\n\n /**\n * Constructor for AccountTreeController.\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: AccountTreeControllerMessenger;\n state?: Partial<AccountTreeControllerState>;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountTreeControllerMetadata,\n state: {\n ...getDefaultAccountTreeControllerState(),\n ...state,\n },\n });\n\n // Reverse map to allow fast node access from an account ID.\n this.#reverse = new Map();\n\n // Rules to apply to construct the wallets tree.\n this.#rules = [\n // 1. We group by entropy-source\n (account: InternalAccount) => this.#matchGroupByEntropySource(account),\n // 2. We group by Snap ID\n (account: InternalAccount) => this.#matchGroupBySnapId(account),\n // 3. We group by wallet type (this rule cannot fail and will group all non-matching accounts)\n (account: InternalAccount) => this.#matchGroupByKeyringType(account),\n ];\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountAdded',\n (account) => {\n this.#handleAccountAdded(account);\n },\n );\n\n this.messagingSystem.subscribe(\n 'AccountsController:accountRemoved',\n (accountId) => {\n this.#handleAccountRemoved(accountId);\n },\n );\n }\n\n init() {\n const wallets = {};\n\n // For now, we always re-compute all wallets, we do not re-use the existing state.\n for (const account of this.#listAccounts()) {\n this.#insert(wallets, account);\n }\n\n this.update((state) => {\n state.accountTree.wallets = wallets;\n });\n }\n\n #handleAccountAdded(account: InternalAccount) {\n this.update((state) => {\n this.#insert(state.accountTree.wallets, account);\n });\n }\n\n #handleAccountRemoved(accountId: AccountId) {\n const found = this.#reverse.get(accountId);\n\n if (found) {\n const { walletId, groupId } = found;\n this.update((state) => {\n const { accounts } =\n state.accountTree.wallets[walletId].groups[groupId];\n\n const index = accounts.indexOf(accountId);\n if (index !== -1) {\n accounts.splice(index, 1);\n }\n });\n }\n }\n\n #hasKeyringType(account: InternalAccount, type: KeyringTypes): boolean {\n return account.metadata.keyring.type === (type as string);\n }\n\n #matchGroupByEntropySource(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n let entropySource: string | undefined;\n\n if (this.#hasKeyringType(account, KeyringTypes.hd)) {\n // TODO: Maybe use superstruct to validate the structure of HD account since they are not strongly-typed for now?\n if (!account.options.entropySource) {\n console.warn(\n \"! Found an HD account with no entropy source: account won't be associated to its wallet\",\n );\n return undefined;\n }\n\n entropySource = account.options.entropySource as string;\n }\n\n // TODO: For now, we're not checking if the Snap is a preinstalled one, and we probably should...\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap?.enabled\n ) {\n // Not all Snaps have an entropy-source and options are not typed yet, so we have to check manually here.\n if (account.options.entropySource) {\n // We blindly trust the `entropySource` for now, but it could be wrong since it comes from a Snap.\n entropySource = account.options.entropySource as string;\n }\n }\n\n if (!entropySource) {\n return undefined;\n }\n\n // We check if we can get the name for that entropy source, if not this means this entropy does not match\n // any HD keyrings, thus, is invalid (this account will be grouped by another rule).\n const entropySourceName = this.#getEntropySourceName(entropySource);\n if (!entropySourceName) {\n console.warn(\n '! Tried to name a wallet using an unknown entropy, this should not be possible.',\n );\n return undefined;\n }\n\n return {\n category: AccountWalletCategory.Entropy,\n id: toAccountWalletId(AccountWalletCategory.Entropy, entropySource),\n name: entropySourceName,\n };\n }\n\n #matchGroupBySnapId(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n if (\n this.#hasKeyringType(account, KeyringTypes.snap) &&\n account.metadata.snap &&\n account.metadata.snap.enabled\n ) {\n const { id } = account.metadata.snap;\n\n return {\n category: AccountWalletCategory.Snap,\n id: toAccountWalletId(AccountWalletCategory.Snap, id),\n name: this.#getSnapName(id as SnapId),\n };\n }\n\n return undefined;\n }\n\n #matchGroupByKeyringType(\n account: InternalAccount,\n ): AccountTreeRuleMatch | undefined {\n const { type } = account.metadata.keyring;\n\n return {\n category: AccountWalletCategory.Keyring,\n id: toAccountWalletId(AccountWalletCategory.Keyring, type),\n name: getAccountWalletNameFromKeyringType(type as KeyringTypes),\n };\n }\n\n #getSnapName(snapId: SnapId): string {\n const snap = this.messagingSystem.call('SnapController:get', snapId);\n const snapName = snap\n ? // TODO: Handle localization here, but that's a \"client thing\", so we don't have a `core` controller\n // to refer too.\n snap.manifest.proposedName\n : stripSnapPrefix(snapId);\n\n return `Snap: ${snapName}`;\n }\n\n #getEntropySourceName(entropySource: string): string | undefined {\n const { keyrings } = this.messagingSystem.call(\n 'KeyringController:getState',\n );\n\n const index = keyrings\n .filter((keyring) => keyring.type === (KeyringTypes.hd as string))\n .findIndex((keyring) => keyring.metadata.id === entropySource);\n\n if (index === -1) {\n return undefined;\n }\n\n return `Wallet ${index + 1}`; // Use human indexing.\n }\n\n #insert(\n wallets: { [walletId: AccountWalletId]: AccountWallet },\n account: InternalAccount,\n ) {\n for (const rule of this.#rules) {\n const match = rule(account);\n\n if (!match) {\n // No match for that rule, we go to the next one.\n continue;\n }\n\n const walletId = match.id;\n const walletName = match.name;\n const groupId = toDefaultAccountGroupId(walletId); // Use a single-group for now until multichain accounts is supported.\n const groupName = DEFAULT_ACCOUNT_GROUP_NAME;\n\n if (!wallets[walletId]) {\n wallets[walletId] = {\n id: walletId,\n groups: {\n [groupId]: {\n id: groupId,\n accounts: [],\n metadata: { name: groupName },\n },\n },\n metadata: {\n name: walletName,\n },\n };\n }\n wallets[walletId].groups[groupId].accounts.push(account.id);\n\n // Update the reverse mapping for this account.\n this.#reverse.set(account.id, {\n walletId,\n groupId,\n });\n\n return;\n }\n }\n\n #listAccounts(): InternalAccount[] {\n return this.messagingSystem.call(\n 'AccountsController:listMultichainAccounts',\n );\n }\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AccountTreeController = void 0;
3
+ exports.getDefaultAccountTreeControllerState = exports.AccountTreeController = void 0;
4
4
  var AccountTreeController_1 = require("./AccountTreeController.cjs");
5
5
  Object.defineProperty(exports, "AccountTreeController", { enumerable: true, get: function () { return AccountTreeController_1.AccountTreeController; } });
6
+ Object.defineProperty(exports, "getDefaultAccountTreeControllerState", { enumerable: true, get: function () { return AccountTreeController_1.getDefaultAccountTreeControllerState; } });
6
7
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAcA,qEAAgE;AAAvD,8HAAA,qBAAqB,OAAA","sourcesContent":["export type {\n AccountGroupRoot as AccountTree,\n AccountGroupRootId as AccountTreeId,\n AccountGroupRootMetadata as AccountTreeMetadata,\n AccountTreeControllerState,\n AccountTreeControllerGetStateAction,\n AccountTreeControllerActions,\n AccountTreeControllerChangeEvent,\n AccountTreeControllerEvents,\n AccountTreeControllerMessenger,\n AccountGroup,\n AccountGroupId,\n AccountGroupMetadata,\n} from './AccountTreeController';\nexport { AccountTreeController } from './AccountTreeController';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAeA,qEAGiC;AAF/B,8HAAA,qBAAqB,OAAA;AACrB,6IAAA,oCAAoC,OAAA","sourcesContent":["export type {\n AccountTreeControllerState,\n AccountTreeControllerGetStateAction,\n AccountTreeControllerActions,\n AccountTreeControllerStateChangeEvent,\n AccountTreeControllerEvents,\n AccountTreeControllerMessenger,\n AccountWallet,\n AccountWalletId,\n AccountWalletMetadata,\n AccountWalletCategory,\n AccountGroup,\n AccountGroupId,\n AccountGroupMetadata,\n} from './AccountTreeController';\nexport {\n AccountTreeController,\n getDefaultAccountTreeControllerState,\n} from './AccountTreeController';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,3 @@
1
- export type { AccountGroupRoot as AccountTree, AccountGroupRootId as AccountTreeId, AccountGroupRootMetadata as AccountTreeMetadata, AccountTreeControllerState, AccountTreeControllerGetStateAction, AccountTreeControllerActions, AccountTreeControllerChangeEvent, AccountTreeControllerEvents, AccountTreeControllerMessenger, AccountGroup, AccountGroupId, AccountGroupMetadata, } from "./AccountTreeController.cjs";
2
- export { AccountTreeController } from "./AccountTreeController.cjs";
1
+ export type { AccountTreeControllerState, AccountTreeControllerGetStateAction, AccountTreeControllerActions, AccountTreeControllerStateChangeEvent, AccountTreeControllerEvents, AccountTreeControllerMessenger, AccountWallet, AccountWalletId, AccountWalletMetadata, AccountWalletCategory, AccountGroup, AccountGroupId, AccountGroupMetadata, } from "./AccountTreeController.cjs";
2
+ export { AccountTreeController, getDefaultAccountTreeControllerState, } from "./AccountTreeController.cjs";
3
3
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,IAAI,WAAW,EAC/B,kBAAkB,IAAI,aAAa,EACnC,wBAAwB,IAAI,mBAAmB,EAC/C,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,oCAAgC;AACjC,OAAO,EAAE,qBAAqB,EAAE,oCAAgC"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,qCAAqC,EACrC,2BAA2B,EAC3B,8BAA8B,EAC9B,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,oCAAgC;AACjC,OAAO,EACL,qBAAqB,EACrB,oCAAoC,GACrC,oCAAgC"}
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- export type { AccountGroupRoot as AccountTree, AccountGroupRootId as AccountTreeId, AccountGroupRootMetadata as AccountTreeMetadata, AccountTreeControllerState, AccountTreeControllerGetStateAction, AccountTreeControllerActions, AccountTreeControllerChangeEvent, AccountTreeControllerEvents, AccountTreeControllerMessenger, AccountGroup, AccountGroupId, AccountGroupMetadata, } from "./AccountTreeController.mjs";
2
- export { AccountTreeController } from "./AccountTreeController.mjs";
1
+ export type { AccountTreeControllerState, AccountTreeControllerGetStateAction, AccountTreeControllerActions, AccountTreeControllerStateChangeEvent, AccountTreeControllerEvents, AccountTreeControllerMessenger, AccountWallet, AccountWalletId, AccountWalletMetadata, AccountWalletCategory, AccountGroup, AccountGroupId, AccountGroupMetadata, } from "./AccountTreeController.mjs";
2
+ export { AccountTreeController, getDefaultAccountTreeControllerState, } from "./AccountTreeController.mjs";
3
3
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,gBAAgB,IAAI,WAAW,EAC/B,kBAAkB,IAAI,aAAa,EACnC,wBAAwB,IAAI,mBAAmB,EAC/C,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,gCAAgC,EAChC,2BAA2B,EAC3B,8BAA8B,EAC9B,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,oCAAgC;AACjC,OAAO,EAAE,qBAAqB,EAAE,oCAAgC"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,0BAA0B,EAC1B,mCAAmC,EACnC,4BAA4B,EAC5B,qCAAqC,EACrC,2BAA2B,EAC3B,8BAA8B,EAC9B,aAAa,EACb,eAAe,EACf,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,oCAAgC;AACjC,OAAO,EACL,qBAAqB,EACrB,oCAAoC,GACrC,oCAAgC"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- export { AccountTreeController } from "./AccountTreeController.mjs";
1
+ export { AccountTreeController, getDefaultAccountTreeControllerState } from "./AccountTreeController.mjs";
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,qBAAqB,EAAE,oCAAgC","sourcesContent":["export type {\n AccountGroupRoot as AccountTree,\n AccountGroupRootId as AccountTreeId,\n AccountGroupRootMetadata as AccountTreeMetadata,\n AccountTreeControllerState,\n AccountTreeControllerGetStateAction,\n AccountTreeControllerActions,\n AccountTreeControllerChangeEvent,\n AccountTreeControllerEvents,\n AccountTreeControllerMessenger,\n AccountGroup,\n AccountGroupId,\n AccountGroupMetadata,\n} from './AccountTreeController';\nexport { AccountTreeController } from './AccountTreeController';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EACL,qBAAqB,EACrB,oCAAoC,EACrC,oCAAgC","sourcesContent":["export type {\n AccountTreeControllerState,\n AccountTreeControllerGetStateAction,\n AccountTreeControllerActions,\n AccountTreeControllerStateChangeEvent,\n AccountTreeControllerEvents,\n AccountTreeControllerMessenger,\n AccountWallet,\n AccountWalletId,\n AccountWalletMetadata,\n AccountWalletCategory,\n AccountGroup,\n AccountGroupId,\n AccountGroupMetadata,\n} from './AccountTreeController';\nexport {\n AccountTreeController,\n getDefaultAccountTreeControllerState,\n} from './AccountTreeController';\n"]}
package/dist/names.cjs CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAccountGroupRootNameFromKeyringType = void 0;
3
+ exports.getAccountWalletNameFromKeyringType = void 0;
4
4
  const keyring_controller_1 = require("@metamask/keyring-controller");
5
5
  /**
6
6
  * Get wallet name from a keyring type.
@@ -8,7 +8,7 @@ const keyring_controller_1 = require("@metamask/keyring-controller");
8
8
  * @param type - Keyring's type.
9
9
  * @returns Wallet name.
10
10
  */
11
- function getAccountGroupRootNameFromKeyringType(type) {
11
+ function getAccountWalletNameFromKeyringType(type) {
12
12
  switch (type) {
13
13
  case keyring_controller_1.KeyringTypes.simple: {
14
14
  return 'Private Keys';
@@ -39,5 +39,5 @@ function getAccountGroupRootNameFromKeyringType(type) {
39
39
  }
40
40
  }
41
41
  }
42
- exports.getAccountGroupRootNameFromKeyringType = getAccountGroupRootNameFromKeyringType;
42
+ exports.getAccountWalletNameFromKeyringType = getAccountWalletNameFromKeyringType;
43
43
  //# sourceMappingURL=names.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"names.cjs","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":";;;AAAA,qEAA4D;AAE5D;;;;;GAKG;AACH,SAAgB,sCAAsC,CAAC,IAAkB;IACvE,QAAQ,IAAI,EAAE;QACZ,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,cAAc,CAAC;SACvB;QACD,KAAK,iCAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,WAAW,CAAC;SACpB;QACD,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,iCAAY,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,SAAS,CAAC;SAClB;QACD,KAAK,iCAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;SACb;QACD,KAAK,iCAAY,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,aAAa,CAAC;SACtB;QACD,OAAO,CAAC,CAAC;YACP,OAAO,SAAS,CAAC;SAClB;KACF;AACH,CAAC;AA9BD,wFA8BC","sourcesContent":["import { KeyringTypes } from '@metamask/keyring-controller';\n\n/**\n * Get wallet name from a keyring type.\n *\n * @param type - Keyring's type.\n * @returns Wallet name.\n */\nexport function getAccountGroupRootNameFromKeyringType(type: KeyringTypes) {\n switch (type) {\n case KeyringTypes.simple: {\n return 'Private Keys';\n }\n case KeyringTypes.hd: {\n return 'HD Wallet';\n }\n case KeyringTypes.trezor: {\n return 'Trezor';\n }\n case KeyringTypes.oneKey: {\n return 'OneKey';\n }\n case KeyringTypes.ledger: {\n return 'Ledger';\n }\n case KeyringTypes.lattice: {\n return 'Lattice';\n }\n case KeyringTypes.qr: {\n return 'QR';\n }\n case KeyringTypes.snap: {\n return 'Snap Wallet';\n }\n default: {\n return 'Unknown';\n }\n }\n}\n"]}
1
+ {"version":3,"file":"names.cjs","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":";;;AAAA,qEAA4D;AAE5D;;;;;GAKG;AACH,SAAgB,mCAAmC,CAAC,IAAkB;IACpE,QAAQ,IAAI,EAAE;QACZ,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,cAAc,CAAC;SACvB;QACD,KAAK,iCAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,WAAW,CAAC;SACpB;QACD,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,iCAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,iCAAY,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,SAAS,CAAC;SAClB;QACD,KAAK,iCAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;SACb;QACD,KAAK,iCAAY,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,aAAa,CAAC;SACtB;QACD,OAAO,CAAC,CAAC;YACP,OAAO,SAAS,CAAC;SAClB;KACF;AACH,CAAC;AA9BD,kFA8BC","sourcesContent":["import { KeyringTypes } from '@metamask/keyring-controller';\n\n/**\n * Get wallet name from a keyring type.\n *\n * @param type - Keyring's type.\n * @returns Wallet name.\n */\nexport function getAccountWalletNameFromKeyringType(type: KeyringTypes) {\n switch (type) {\n case KeyringTypes.simple: {\n return 'Private Keys';\n }\n case KeyringTypes.hd: {\n return 'HD Wallet';\n }\n case KeyringTypes.trezor: {\n return 'Trezor';\n }\n case KeyringTypes.oneKey: {\n return 'OneKey';\n }\n case KeyringTypes.ledger: {\n return 'Ledger';\n }\n case KeyringTypes.lattice: {\n return 'Lattice';\n }\n case KeyringTypes.qr: {\n return 'QR';\n }\n case KeyringTypes.snap: {\n return 'Snap Wallet';\n }\n default: {\n return 'Unknown';\n }\n }\n}\n"]}
package/dist/names.d.cts CHANGED
@@ -5,5 +5,5 @@ import { KeyringTypes } from "@metamask/keyring-controller";
5
5
  * @param type - Keyring's type.
6
6
  * @returns Wallet name.
7
7
  */
8
- export declare function getAccountGroupRootNameFromKeyringType(type: KeyringTypes): "Private Keys" | "HD Wallet" | "Trezor" | "OneKey" | "Ledger" | "Lattice" | "QR" | "Snap Wallet" | "Unknown";
8
+ export declare function getAccountWalletNameFromKeyringType(type: KeyringTypes): "Private Keys" | "HD Wallet" | "Trezor" | "OneKey" | "Ledger" | "Lattice" | "QR" | "Snap Wallet" | "Unknown";
9
9
  //# sourceMappingURL=names.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"names.d.cts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAE5D;;;;;GAKG;AACH,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,YAAY,gHA8BxE"}
1
+ {"version":3,"file":"names.d.cts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAE5D;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,YAAY,gHA8BrE"}
package/dist/names.d.mts CHANGED
@@ -5,5 +5,5 @@ import { KeyringTypes } from "@metamask/keyring-controller";
5
5
  * @param type - Keyring's type.
6
6
  * @returns Wallet name.
7
7
  */
8
- export declare function getAccountGroupRootNameFromKeyringType(type: KeyringTypes): "Private Keys" | "HD Wallet" | "Trezor" | "OneKey" | "Ledger" | "Lattice" | "QR" | "Snap Wallet" | "Unknown";
8
+ export declare function getAccountWalletNameFromKeyringType(type: KeyringTypes): "Private Keys" | "HD Wallet" | "Trezor" | "OneKey" | "Ledger" | "Lattice" | "QR" | "Snap Wallet" | "Unknown";
9
9
  //# sourceMappingURL=names.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"names.d.mts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAE5D;;;;;GAKG;AACH,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,YAAY,gHA8BxE"}
1
+ {"version":3,"file":"names.d.mts","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAE5D;;;;;GAKG;AACH,wBAAgB,mCAAmC,CAAC,IAAI,EAAE,YAAY,gHA8BrE"}
package/dist/names.mjs CHANGED
@@ -5,7 +5,7 @@ import { KeyringTypes } from "@metamask/keyring-controller";
5
5
  * @param type - Keyring's type.
6
6
  * @returns Wallet name.
7
7
  */
8
- export function getAccountGroupRootNameFromKeyringType(type) {
8
+ export function getAccountWalletNameFromKeyringType(type) {
9
9
  switch (type) {
10
10
  case KeyringTypes.simple: {
11
11
  return 'Private Keys';
@@ -1 +1 @@
1
- {"version":3,"file":"names.mjs","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,sCAAsC,CAAC,IAAkB;IACvE,QAAQ,IAAI,EAAE;QACZ,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,cAAc,CAAC;SACvB;QACD,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,WAAW,CAAC;SACpB;QACD,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,SAAS,CAAC;SAClB;QACD,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;SACb;QACD,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,aAAa,CAAC;SACtB;QACD,OAAO,CAAC,CAAC;YACP,OAAO,SAAS,CAAC;SAClB;KACF;AACH,CAAC","sourcesContent":["import { KeyringTypes } from '@metamask/keyring-controller';\n\n/**\n * Get wallet name from a keyring type.\n *\n * @param type - Keyring's type.\n * @returns Wallet name.\n */\nexport function getAccountGroupRootNameFromKeyringType(type: KeyringTypes) {\n switch (type) {\n case KeyringTypes.simple: {\n return 'Private Keys';\n }\n case KeyringTypes.hd: {\n return 'HD Wallet';\n }\n case KeyringTypes.trezor: {\n return 'Trezor';\n }\n case KeyringTypes.oneKey: {\n return 'OneKey';\n }\n case KeyringTypes.ledger: {\n return 'Ledger';\n }\n case KeyringTypes.lattice: {\n return 'Lattice';\n }\n case KeyringTypes.qr: {\n return 'QR';\n }\n case KeyringTypes.snap: {\n return 'Snap Wallet';\n }\n default: {\n return 'Unknown';\n }\n }\n}\n"]}
1
+ {"version":3,"file":"names.mjs","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,qCAAqC;AAE5D;;;;;GAKG;AACH,MAAM,UAAU,mCAAmC,CAAC,IAAkB;IACpE,QAAQ,IAAI,EAAE;QACZ,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,cAAc,CAAC;SACvB;QACD,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,WAAW,CAAC;SACpB;QACD,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,YAAY,CAAC,MAAM,CAAC,CAAC;YACxB,OAAO,QAAQ,CAAC;SACjB;QACD,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,SAAS,CAAC;SAClB;QACD,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;SACb;QACD,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;YACtB,OAAO,aAAa,CAAC;SACtB;QACD,OAAO,CAAC,CAAC;YACP,OAAO,SAAS,CAAC;SAClB;KACF;AACH,CAAC","sourcesContent":["import { KeyringTypes } from '@metamask/keyring-controller';\n\n/**\n * Get wallet name from a keyring type.\n *\n * @param type - Keyring's type.\n * @returns Wallet name.\n */\nexport function getAccountWalletNameFromKeyringType(type: KeyringTypes) {\n switch (type) {\n case KeyringTypes.simple: {\n return 'Private Keys';\n }\n case KeyringTypes.hd: {\n return 'HD Wallet';\n }\n case KeyringTypes.trezor: {\n return 'Trezor';\n }\n case KeyringTypes.oneKey: {\n return 'OneKey';\n }\n case KeyringTypes.ledger: {\n return 'Ledger';\n }\n case KeyringTypes.lattice: {\n return 'Lattice';\n }\n case KeyringTypes.qr: {\n return 'QR';\n }\n case KeyringTypes.snap: {\n return 'Snap Wallet';\n }\n default: {\n return 'Unknown';\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/account-tree-controller",
3
- "version": "0.0.0-preview-d9a49231",
3
+ "version": "0.1.0-preview-ef0f18a",
4
4
  "description": "Controller to group account together based on some pre-defined rules",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -48,19 +48,18 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@metamask/base-controller": "^8.0.1",
51
- "@metamask/snaps-sdk": "^6.22.0",
52
- "@metamask/snaps-utils": "^9.2.0",
51
+ "@metamask/snaps-sdk": "^7.1.0",
52
+ "@metamask/snaps-utils": "^9.4.0",
53
53
  "lodash": "^4.17.21"
54
54
  },
55
55
  "devDependencies": {
56
- "@metamask/accounts-controller": "^29.0.0",
56
+ "@metamask/accounts-controller": "^30.0.0",
57
57
  "@metamask/auto-changelog": "^3.4.4",
58
- "@metamask/keyring-api": "^17.4.0",
59
- "@metamask/keyring-controller": "^22.0.0",
60
- "@metamask/providers": "^21.0.0",
61
- "@metamask/snaps-controllers": "^11.2.1",
58
+ "@metamask/keyring-api": "^18.0.0",
59
+ "@metamask/keyring-controller": "^22.0.2",
60
+ "@metamask/providers": "^22.1.0",
61
+ "@metamask/snaps-controllers": "^12.3.1",
62
62
  "@types/jest": "^27.4.1",
63
- "@types/lodash": "^4.14.191",
64
63
  "deepmerge": "^4.2.2",
65
64
  "jest": "^27.5.1",
66
65
  "ts-jest": "^27.1.4",
@@ -70,10 +69,10 @@
70
69
  "webextension-polyfill": "^0.12.0"
71
70
  },
72
71
  "peerDependencies": {
73
- "@metamask/accounts-controller": "^29.0.0",
72
+ "@metamask/accounts-controller": "^30.0.0",
74
73
  "@metamask/keyring-controller": "^22.0.0",
75
- "@metamask/providers": "^21.0.0",
76
- "@metamask/snaps-controllers": "^11.0.0",
74
+ "@metamask/providers": "^22.0.0",
75
+ "@metamask/snaps-controllers": "^12.0.0",
77
76
  "webextension-polyfill": "^0.10.0 || ^0.11.0 || ^0.12.0"
78
77
  },
79
78
  "engines": {