@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 +9 -1
- package/dist/AccountTreeController.cjs +42 -43
- package/dist/AccountTreeController.cjs.map +1 -1
- package/dist/AccountTreeController.d.cts +25 -26
- package/dist/AccountTreeController.d.cts.map +1 -1
- package/dist/AccountTreeController.d.mts +25 -26
- package/dist/AccountTreeController.d.mts.map +1 -1
- package/dist/AccountTreeController.mjs +41 -42
- package/dist/AccountTreeController.mjs.map +1 -1
- package/dist/index.cjs +2 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/names.cjs +3 -3
- package/dist/names.cjs.map +1 -1
- package/dist/names.d.cts +1 -1
- package/dist/names.d.cts.map +1 -1
- package/dist/names.d.mts +1 -1
- package/dist/names.d.mts.map +1 -1
- package/dist/names.mjs +1 -1
- package/dist/names.mjs.map +1 -1
- package/package.json +11 -12
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
|
-
[
|
|
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.
|
|
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
|
|
22
|
-
(function (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
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
|
-
|
|
42
|
-
|
|
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
|
|
50
|
+
* Convert a unique ID to a wallet ID for a given category.
|
|
52
51
|
*
|
|
53
|
-
* @param category -
|
|
54
|
-
* @param id -
|
|
55
|
-
* @returns
|
|
52
|
+
* @param category - A wallet category.
|
|
53
|
+
* @param id - A unique ID.
|
|
54
|
+
* @returns A wallet ID.
|
|
56
55
|
*/
|
|
57
|
-
function
|
|
56
|
+
function toAccountWalletId(category, id) {
|
|
58
57
|
return `${category}:${id}`;
|
|
59
58
|
}
|
|
60
|
-
exports.
|
|
59
|
+
exports.toAccountWalletId = toAccountWalletId;
|
|
61
60
|
/**
|
|
62
|
-
* Convert a
|
|
61
|
+
* Convert a wallet ID and a unique ID, to a group ID.
|
|
63
62
|
*
|
|
64
|
-
* @param
|
|
65
|
-
* @param id -
|
|
66
|
-
* @returns
|
|
63
|
+
* @param walletId - A wallet ID.
|
|
64
|
+
* @param id - A unique ID.
|
|
65
|
+
* @returns A group ID.
|
|
67
66
|
*/
|
|
68
|
-
function toAccountGroupId(
|
|
69
|
-
return `${
|
|
67
|
+
function toAccountGroupId(walletId, id) {
|
|
68
|
+
return `${walletId}:${id}`;
|
|
70
69
|
}
|
|
71
70
|
exports.toAccountGroupId = toAccountGroupId;
|
|
72
71
|
/**
|
|
73
|
-
* Convert a
|
|
72
|
+
* Convert a wallet ID to the default group ID.
|
|
74
73
|
*
|
|
75
|
-
* @param
|
|
74
|
+
* @param walletId - A wallet ID.
|
|
76
75
|
* @returns The default group ID.
|
|
77
76
|
*/
|
|
78
|
-
function toDefaultAccountGroupId(
|
|
79
|
-
return toAccountGroupId(
|
|
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
|
|
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,
|
|
124
|
+
__classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, wallets, account);
|
|
126
125
|
}
|
|
127
126
|
this.update((state) => {
|
|
128
|
-
state.
|
|
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.
|
|
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.
|
|
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:
|
|
182
|
-
id:
|
|
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:
|
|
192
|
-
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:
|
|
201
|
-
id:
|
|
202
|
-
name: (0, names_1.
|
|
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(
|
|
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 (!
|
|
233
|
-
|
|
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
|
-
|
|
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
|
|
6
|
+
export declare enum AccountWalletCategory {
|
|
7
7
|
Entropy = "entropy",
|
|
8
|
-
Snap = "snap",
|
|
9
8
|
Keyring = "keyring",
|
|
10
|
-
|
|
9
|
+
Snap = "snap"
|
|
11
10
|
}
|
|
12
|
-
export type
|
|
13
|
-
export type AccountGroupId = `${
|
|
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
|
|
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
|
|
25
|
-
id:
|
|
23
|
+
export type AccountWallet = {
|
|
24
|
+
id: AccountWalletId;
|
|
26
25
|
groups: {
|
|
27
|
-
[
|
|
26
|
+
[groupId: AccountGroupId]: AccountGroup;
|
|
28
27
|
};
|
|
29
28
|
metadata: AccountGroupMetadata;
|
|
30
29
|
};
|
|
31
30
|
export type AccountTreeControllerState = {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
[
|
|
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
|
|
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
|
|
53
|
+
* Convert a unique ID to a wallet ID for a given category.
|
|
55
54
|
*
|
|
56
|
-
* @param category -
|
|
57
|
-
* @param id -
|
|
58
|
-
* @returns
|
|
55
|
+
* @param category - A wallet category.
|
|
56
|
+
* @param id - A unique ID.
|
|
57
|
+
* @returns A wallet ID.
|
|
59
58
|
*/
|
|
60
|
-
export declare function
|
|
59
|
+
export declare function toAccountWalletId(category: AccountWalletCategory, id: string): AccountWalletId;
|
|
61
60
|
/**
|
|
62
|
-
* Convert a
|
|
61
|
+
* Convert a wallet ID and a unique ID, to a group ID.
|
|
63
62
|
*
|
|
64
|
-
* @param
|
|
65
|
-
* @param id -
|
|
66
|
-
* @returns
|
|
63
|
+
* @param walletId - A wallet ID.
|
|
64
|
+
* @param id - A unique ID.
|
|
65
|
+
* @returns A group ID.
|
|
67
66
|
*/
|
|
68
|
-
export declare function toAccountGroupId(
|
|
67
|
+
export declare function toAccountGroupId(walletId: AccountWalletId, id: string): AccountGroupId;
|
|
69
68
|
/**
|
|
70
|
-
* Convert a
|
|
69
|
+
* Convert a wallet ID to the default group ID.
|
|
71
70
|
*
|
|
72
|
-
* @param
|
|
71
|
+
* @param walletId - A wallet ID.
|
|
73
72
|
* @returns The default group ID.
|
|
74
73
|
*/
|
|
75
|
-
export declare function toDefaultAccountGroupId(
|
|
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":"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,
|
|
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
|
|
6
|
+
export declare enum AccountWalletCategory {
|
|
7
7
|
Entropy = "entropy",
|
|
8
|
-
Snap = "snap",
|
|
9
8
|
Keyring = "keyring",
|
|
10
|
-
|
|
9
|
+
Snap = "snap"
|
|
11
10
|
}
|
|
12
|
-
export type
|
|
13
|
-
export type AccountGroupId = `${
|
|
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
|
|
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
|
|
25
|
-
id:
|
|
23
|
+
export type AccountWallet = {
|
|
24
|
+
id: AccountWalletId;
|
|
26
25
|
groups: {
|
|
27
|
-
[
|
|
26
|
+
[groupId: AccountGroupId]: AccountGroup;
|
|
28
27
|
};
|
|
29
28
|
metadata: AccountGroupMetadata;
|
|
30
29
|
};
|
|
31
30
|
export type AccountTreeControllerState = {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
[
|
|
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
|
|
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
|
|
53
|
+
* Convert a unique ID to a wallet ID for a given category.
|
|
55
54
|
*
|
|
56
|
-
* @param category -
|
|
57
|
-
* @param id -
|
|
58
|
-
* @returns
|
|
55
|
+
* @param category - A wallet category.
|
|
56
|
+
* @param id - A unique ID.
|
|
57
|
+
* @returns A wallet ID.
|
|
59
58
|
*/
|
|
60
|
-
export declare function
|
|
59
|
+
export declare function toAccountWalletId(category: AccountWalletCategory, id: string): AccountWalletId;
|
|
61
60
|
/**
|
|
62
|
-
* Convert a
|
|
61
|
+
* Convert a wallet ID and a unique ID, to a group ID.
|
|
63
62
|
*
|
|
64
|
-
* @param
|
|
65
|
-
* @param id -
|
|
66
|
-
* @returns
|
|
63
|
+
* @param walletId - A wallet ID.
|
|
64
|
+
* @param id - A unique ID.
|
|
65
|
+
* @returns A group ID.
|
|
67
66
|
*/
|
|
68
|
-
export declare function toAccountGroupId(
|
|
67
|
+
export declare function toAccountGroupId(walletId: AccountWalletId, id: string): AccountGroupId;
|
|
69
68
|
/**
|
|
70
|
-
* Convert a
|
|
69
|
+
* Convert a wallet ID to the default group ID.
|
|
71
70
|
*
|
|
72
|
-
* @param
|
|
71
|
+
* @param walletId - A wallet ID.
|
|
73
72
|
* @returns The default group ID.
|
|
74
73
|
*/
|
|
75
|
-
export declare function toDefaultAccountGroupId(
|
|
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,
|
|
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 {
|
|
16
|
+
import { getAccountWalletNameFromKeyringType } from "./names.mjs";
|
|
17
17
|
const controllerName = 'AccountTreeController';
|
|
18
|
-
export var
|
|
19
|
-
(function (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
39
|
-
|
|
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
|
|
46
|
+
* Convert a unique ID to a wallet ID for a given category.
|
|
48
47
|
*
|
|
49
|
-
* @param category -
|
|
50
|
-
* @param id -
|
|
51
|
-
* @returns
|
|
48
|
+
* @param category - A wallet category.
|
|
49
|
+
* @param id - A unique ID.
|
|
50
|
+
* @returns A wallet ID.
|
|
52
51
|
*/
|
|
53
|
-
export function
|
|
52
|
+
export function toAccountWalletId(category, id) {
|
|
54
53
|
return `${category}:${id}`;
|
|
55
54
|
}
|
|
56
55
|
/**
|
|
57
|
-
* Convert a
|
|
56
|
+
* Convert a wallet ID and a unique ID, to a group ID.
|
|
58
57
|
*
|
|
59
|
-
* @param
|
|
60
|
-
* @param id -
|
|
61
|
-
* @returns
|
|
58
|
+
* @param walletId - A wallet ID.
|
|
59
|
+
* @param id - A unique ID.
|
|
60
|
+
* @returns A group ID.
|
|
62
61
|
*/
|
|
63
|
-
export function toAccountGroupId(
|
|
64
|
-
return `${
|
|
62
|
+
export function toAccountGroupId(walletId, id) {
|
|
63
|
+
return `${walletId}:${id}`;
|
|
65
64
|
}
|
|
66
65
|
/**
|
|
67
|
-
* Convert a
|
|
66
|
+
* Convert a wallet ID to the default group ID.
|
|
68
67
|
*
|
|
69
|
-
* @param
|
|
68
|
+
* @param walletId - A wallet ID.
|
|
70
69
|
* @returns The default group ID.
|
|
71
70
|
*/
|
|
72
|
-
export function toDefaultAccountGroupId(
|
|
73
|
-
return toAccountGroupId(
|
|
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
|
|
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,
|
|
117
|
+
__classPrivateFieldGet(this, _AccountTreeController_instances, "m", _AccountTreeController_insert).call(this, wallets, account);
|
|
119
118
|
}
|
|
120
119
|
this.update((state) => {
|
|
121
|
-
state.
|
|
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.
|
|
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.
|
|
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:
|
|
174
|
-
id:
|
|
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:
|
|
184
|
-
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:
|
|
193
|
-
id:
|
|
194
|
-
name:
|
|
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(
|
|
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 (!
|
|
225
|
-
|
|
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
|
-
|
|
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
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;
|
|
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 {
|
|
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
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,
|
|
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 {
|
|
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
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
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.
|
|
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
|
|
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.
|
|
42
|
+
exports.getAccountWalletNameFromKeyringType = getAccountWalletNameFromKeyringType;
|
|
43
43
|
//# sourceMappingURL=names.cjs.map
|
package/dist/names.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.cjs","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":";;;AAAA,qEAA4D;AAE5D;;;;;GAKG;AACH,SAAgB,
|
|
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
|
|
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
|
package/dist/names.d.cts.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
package/dist/names.d.mts.map
CHANGED
|
@@ -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,
|
|
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
|
|
8
|
+
export function getAccountWalletNameFromKeyringType(type) {
|
|
9
9
|
switch (type) {
|
|
10
10
|
case KeyringTypes.simple: {
|
|
11
11
|
return 'Private Keys';
|
package/dist/names.mjs.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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": "^
|
|
52
|
-
"@metamask/snaps-utils": "^9.
|
|
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": "^
|
|
56
|
+
"@metamask/accounts-controller": "^30.0.0",
|
|
57
57
|
"@metamask/auto-changelog": "^3.4.4",
|
|
58
|
-
"@metamask/keyring-api": "^
|
|
59
|
-
"@metamask/keyring-controller": "^22.0.
|
|
60
|
-
"@metamask/providers": "^
|
|
61
|
-
"@metamask/snaps-controllers": "^
|
|
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": "^
|
|
72
|
+
"@metamask/accounts-controller": "^30.0.0",
|
|
74
73
|
"@metamask/keyring-controller": "^22.0.0",
|
|
75
|
-
"@metamask/providers": "^
|
|
76
|
-
"@metamask/snaps-controllers": "^
|
|
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": {
|