@metamask/accounts-controller 16.0.0 → 17.1.0
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 +28 -1
- package/dist/AccountsController.js +3 -3
- package/dist/AccountsController.mjs +2 -2
- package/dist/{chunk-7CWWNB3P.js → chunk-AIALCYPP.js} +80 -76
- package/dist/chunk-AIALCYPP.js.map +1 -0
- package/dist/{chunk-EIQ5DUI6.js → chunk-BYPP7G2N.js} +2 -7
- package/dist/chunk-BYPP7G2N.js.map +1 -0
- package/dist/{chunk-3R7MA6KV.mjs → chunk-ENVG3KIO.mjs} +74 -70
- package/dist/chunk-ENVG3KIO.mjs.map +1 -0
- package/dist/{chunk-YNILZSBK.mjs → chunk-Y2QVUNIA.mjs} +2 -7
- package/dist/chunk-Y2QVUNIA.mjs.map +1 -0
- package/dist/index.js +3 -7
- package/dist/index.mjs +2 -6
- package/dist/tests/mocks.js +61 -4
- package/dist/tests/mocks.js.map +1 -1
- package/dist/tests/mocks.mjs +60 -3
- package/dist/tests/mocks.mjs.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/AccountsController.d.ts +8 -3
- package/dist/types/AccountsController.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/tests/mocks.d.ts.map +1 -1
- package/dist/types/utils.d.ts +0 -12
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/utils.js +2 -4
- package/dist/utils.mjs +1 -3
- package/package.json +4 -4
- package/dist/chunk-3R7MA6KV.mjs.map +0 -1
- package/dist/chunk-7CWWNB3P.js.map +0 -1
- package/dist/chunk-EIQ5DUI6.js.map +0 -1
- package/dist/chunk-IBSI66UQ.js +0 -65
- package/dist/chunk-IBSI66UQ.js.map +0 -1
- package/dist/chunk-QAHRSXGM.mjs +0 -65
- package/dist/chunk-QAHRSXGM.mjs.map +0 -1
- package/dist/chunk-YNILZSBK.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [17.1.0]
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Add `AccountsController:listMultichainAccounts` action ([#4426](https://github.com/MetaMask/core/pull/4426))
|
|
15
|
+
|
|
16
|
+
### Fixed
|
|
17
|
+
|
|
18
|
+
- Refactored `getSelectedAccount` to handle case when there are no accounts to return. The logic was previously contained in `getAccountExpect` has been transferred to `getSelectedAccount`. ([#4322](https://github.com/MetaMask/core/pull/4322))
|
|
19
|
+
- Updated `handleAccountRemoved` to automatically select the most recent account if the removed account was the currently selected account. ([#4322](https://github.com/MetaMask/core/pull/4322))
|
|
20
|
+
- Move `@metamask/keyring-controller` to dependency ([#4425](https://github.com/MetaMask/core/pull/4425))
|
|
21
|
+
|
|
22
|
+
## [17.0.0]
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- **BREAKING:** Newly added account is no longer set as the last selected account ([#4363](https://github.com/MetaMask/core/pull/4363))
|
|
27
|
+
- Bump `@metamask/eth-snap-keyring` to `^4.3.1` ([#4405](https://github.com/MetaMask/core/pull/4405))
|
|
28
|
+
- Bump `@metamask/keyring-api` to `^8.0.0` ([#4405](https://github.com/MetaMask/core/pull/4405))
|
|
29
|
+
- Bump `@metamask/keyring-controller` to `^17.1.0` (`devDependencies`) ([#4413](https://github.com/MetaMask/core/pull/4413))
|
|
30
|
+
|
|
31
|
+
### Fixed
|
|
32
|
+
|
|
33
|
+
- Use `listMultichainAccount` in `getAccountByAddress` ([#4375](https://github.com/MetaMask/core/pull/4375))
|
|
34
|
+
|
|
10
35
|
## [16.0.0]
|
|
11
36
|
|
|
12
37
|
### Changed
|
|
@@ -202,7 +227,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
202
227
|
|
|
203
228
|
- Initial release ([#1637](https://github.com/MetaMask/core/pull/1637))
|
|
204
229
|
|
|
205
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@
|
|
230
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@17.1.0...HEAD
|
|
231
|
+
[17.1.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@17.0.0...@metamask/accounts-controller@17.1.0
|
|
232
|
+
[17.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@16.0.0...@metamask/accounts-controller@17.0.0
|
|
206
233
|
[16.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@15.0.0...@metamask/accounts-controller@16.0.0
|
|
207
234
|
[15.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@14.0.0...@metamask/accounts-controller@15.0.0
|
|
208
235
|
[14.0.0]: https://github.com/MetaMask/core/compare/@metamask/accounts-controller@13.0.0...@metamask/accounts-controller@14.0.0
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
require('./chunk-
|
|
3
|
+
var _chunkAIALCYPPjs = require('./chunk-AIALCYPP.js');
|
|
4
|
+
require('./chunk-BYPP7G2N.js');
|
|
5
5
|
require('./chunk-UJIPPGP6.js');
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
exports.AccountsController =
|
|
8
|
+
exports.AccountsController = _chunkAIALCYPPjs.AccountsController;
|
|
9
9
|
//# sourceMappingURL=AccountsController.js.map
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
var _chunkEIQ5DUI6js = require('./chunk-EIQ5DUI6.js');
|
|
5
|
+
var _chunkBYPP7G2Njs = require('./chunk-BYPP7G2N.js');
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
|
|
@@ -93,6 +92,7 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
93
92
|
/**
|
|
94
93
|
* Returns the list of accounts for a given keyring type.
|
|
95
94
|
* @param keyringType - The type of keyring.
|
|
95
|
+
* @param accounts - Accounts to filter by keyring type.
|
|
96
96
|
* @returns The list of accounts associcated with this keyring type.
|
|
97
97
|
*/
|
|
98
98
|
_chunkUJIPPGP6js.__privateAdd.call(void 0, this, _getAccountsByKeyringType);
|
|
@@ -115,12 +115,16 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
115
115
|
* Handles the addition of a new account to the controller.
|
|
116
116
|
* If the account is not a Snap Keyring account, generates an internal account for it and adds it to the controller.
|
|
117
117
|
* If the account is a Snap Keyring account, retrieves the account from the keyring and adds it to the controller.
|
|
118
|
+
* @param accountsState - AccountsController accounts state that is to be mutated.
|
|
118
119
|
* @param account - The address and keyring type object of the new account.
|
|
120
|
+
* @returns The updated AccountsController accounts state.
|
|
119
121
|
*/
|
|
120
122
|
_chunkUJIPPGP6js.__privateAdd.call(void 0, this, _handleNewAccountAdded);
|
|
121
123
|
/**
|
|
122
124
|
* Handles the removal of an account from the internal accounts list.
|
|
125
|
+
* @param accountsState - AccountsController accounts state that is to be mutated.
|
|
123
126
|
* @param accountId - The ID of the account to be removed.
|
|
127
|
+
* @returns The updated AccountsController state.
|
|
124
128
|
*/
|
|
125
129
|
_chunkUJIPPGP6js.__privateAdd.call(void 0, this, _handleAccountRemoved);
|
|
126
130
|
/**
|
|
@@ -129,6 +133,8 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
129
133
|
* @param metadataKey - The key of the metadata to retrieve.
|
|
130
134
|
* @returns The value of the specified metadata key, or undefined if the account or metadata key does not exist.
|
|
131
135
|
*/
|
|
136
|
+
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
137
|
+
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
132
138
|
_chunkUJIPPGP6js.__privateAdd.call(void 0, this, _populateExistingMetadata);
|
|
133
139
|
/**
|
|
134
140
|
* Registers message handlers for the AccountsController.
|
|
@@ -189,7 +195,19 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
189
195
|
* @throws An error if the account ID is not found.
|
|
190
196
|
*/
|
|
191
197
|
getAccountExpect(accountId) {
|
|
192
|
-
|
|
198
|
+
const account = this.getAccount(accountId);
|
|
199
|
+
if (account === void 0) {
|
|
200
|
+
throw new Error(`Account Id "${accountId}" not found`);
|
|
201
|
+
}
|
|
202
|
+
return account;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Returns the last selected EVM account.
|
|
206
|
+
*
|
|
207
|
+
* @returns The selected internal account.
|
|
208
|
+
*/
|
|
209
|
+
getSelectedAccount() {
|
|
210
|
+
if (this.state.internalAccounts.selectedAccount === "") {
|
|
193
211
|
return {
|
|
194
212
|
id: "",
|
|
195
213
|
address: "",
|
|
@@ -205,18 +223,6 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
205
223
|
}
|
|
206
224
|
};
|
|
207
225
|
}
|
|
208
|
-
const account = this.getAccount(accountId);
|
|
209
|
-
if (account === void 0) {
|
|
210
|
-
throw new Error(`Account Id "${accountId}" not found`);
|
|
211
|
-
}
|
|
212
|
-
return account;
|
|
213
|
-
}
|
|
214
|
-
/**
|
|
215
|
-
* Returns the last selected evm account.
|
|
216
|
-
*
|
|
217
|
-
* @returns The selected internal account.
|
|
218
|
-
*/
|
|
219
|
-
getSelectedAccount() {
|
|
220
226
|
const selectedAccount = this.getAccountExpect(
|
|
221
227
|
this.state.internalAccounts.selectedAccount
|
|
222
228
|
);
|
|
@@ -256,7 +262,7 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
256
262
|
* @returns The account with the specified address, or undefined if not found.
|
|
257
263
|
*/
|
|
258
264
|
getAccountByAddress(address) {
|
|
259
|
-
return this.
|
|
265
|
+
return this.listMultichainAccounts().find(
|
|
260
266
|
(account) => account.address.toLowerCase() === address.toLowerCase()
|
|
261
267
|
);
|
|
262
268
|
}
|
|
@@ -301,9 +307,7 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
301
307
|
...account,
|
|
302
308
|
metadata: { ...account.metadata, name: accountName }
|
|
303
309
|
};
|
|
304
|
-
|
|
305
|
-
newState.internalAccounts.accounts[accountId] = internalAccount;
|
|
306
|
-
return newState;
|
|
310
|
+
currentState.internalAccounts.accounts[accountId] = internalAccount;
|
|
307
311
|
});
|
|
308
312
|
}
|
|
309
313
|
/**
|
|
@@ -321,7 +325,7 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
321
325
|
...normalAccounts,
|
|
322
326
|
...snapAccounts
|
|
323
327
|
].reduce((internalAccountMap, internalAccount) => {
|
|
324
|
-
const keyringTypeName =
|
|
328
|
+
const keyringTypeName = _chunkBYPP7G2Njs.keyringTypeToName.call(void 0,
|
|
325
329
|
internalAccount.metadata.keyring.type
|
|
326
330
|
);
|
|
327
331
|
const keyringAccountIndex = keyringTypes.get(keyringTypeName) ?? 0;
|
|
@@ -343,9 +347,7 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
343
347
|
return internalAccountMap;
|
|
344
348
|
}, {});
|
|
345
349
|
this.update((currentState) => {
|
|
346
|
-
|
|
347
|
-
newState.internalAccounts.accounts = accounts;
|
|
348
|
-
return newState;
|
|
350
|
+
currentState.internalAccounts.accounts = accounts;
|
|
349
351
|
});
|
|
350
352
|
}
|
|
351
353
|
/**
|
|
@@ -356,20 +358,19 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
356
358
|
loadBackup(backup) {
|
|
357
359
|
if (backup.internalAccounts) {
|
|
358
360
|
this.update((currentState) => {
|
|
359
|
-
|
|
360
|
-
newState.internalAccounts = backup.internalAccounts;
|
|
361
|
-
return newState;
|
|
361
|
+
currentState.internalAccounts = backup.internalAccounts;
|
|
362
362
|
});
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
/**
|
|
366
366
|
* Returns the next account number for a given keyring type.
|
|
367
367
|
* @param keyringType - The type of keyring.
|
|
368
|
+
* @param accounts - Existing accounts to check for the next available account number.
|
|
368
369
|
* @returns An object containing the account prefix and index to use.
|
|
369
370
|
*/
|
|
370
|
-
getNextAvailableAccountName(keyringType = _keyringcontroller.KeyringTypes.hd) {
|
|
371
|
-
const keyringName =
|
|
372
|
-
const keyringAccounts = _chunkUJIPPGP6js.__privateMethod.call(void 0, this, _getAccountsByKeyringType, getAccountsByKeyringType_fn).call(this, keyringType);
|
|
371
|
+
getNextAvailableAccountName(keyringType = _keyringcontroller.KeyringTypes.hd, accounts) {
|
|
372
|
+
const keyringName = _chunkBYPP7G2Njs.keyringTypeToName.call(void 0, keyringType);
|
|
373
|
+
const keyringAccounts = _chunkUJIPPGP6js.__privateMethod.call(void 0, this, _getAccountsByKeyringType, getAccountsByKeyringType_fn).call(this, keyringType, accounts);
|
|
373
374
|
const lastDefaultIndexUsedForKeyringType = keyringAccounts.reduce(
|
|
374
375
|
(maxInternalAccountIndex, internalAccount) => {
|
|
375
376
|
const match = new RegExp(`${keyringName} ([0-9]+)$`, "u").exec(
|
|
@@ -393,7 +394,7 @@ var AccountsController = class extends _basecontroller.BaseController {
|
|
|
393
394
|
_generateInternalAccountForNonSnapAccount = new WeakSet();
|
|
394
395
|
generateInternalAccountForNonSnapAccount_fn = function(address, type) {
|
|
395
396
|
return {
|
|
396
|
-
id:
|
|
397
|
+
id: _chunkBYPP7G2Njs.getUUIDFromAddressOfNormalAccount.call(void 0, address),
|
|
397
398
|
address,
|
|
398
399
|
options: {},
|
|
399
400
|
methods: [
|
|
@@ -438,10 +439,10 @@ listNormalAccounts_fn = async function() {
|
|
|
438
439
|
address
|
|
439
440
|
);
|
|
440
441
|
const keyringType = keyring.type;
|
|
441
|
-
if (!
|
|
442
|
+
if (!_chunkBYPP7G2Njs.isNormalKeyringType.call(void 0, keyringType)) {
|
|
442
443
|
continue;
|
|
443
444
|
}
|
|
444
|
-
const id =
|
|
445
|
+
const id = _chunkBYPP7G2Njs.getUUIDFromAddressOfNormalAccount.call(void 0, address);
|
|
445
446
|
internalAccounts.push({
|
|
446
447
|
id,
|
|
447
448
|
address,
|
|
@@ -510,7 +511,7 @@ handleOnKeyringStateChange_fn = function(keyringState) {
|
|
|
510
511
|
const addedAccounts = [];
|
|
511
512
|
const deletedAccounts = [];
|
|
512
513
|
for (const account of updatedNormalKeyringAddresses) {
|
|
513
|
-
if (!this.state.internalAccounts.accounts[
|
|
514
|
+
if (!this.state.internalAccounts.accounts[_chunkBYPP7G2Njs.getUUIDFromAddressOfNormalAccount.call(void 0, account.address)]) {
|
|
514
515
|
addedAccounts.push(account);
|
|
515
516
|
}
|
|
516
517
|
}
|
|
@@ -535,30 +536,33 @@ handleOnKeyringStateChange_fn = function(keyringState) {
|
|
|
535
536
|
deletedAccounts.push(account);
|
|
536
537
|
}
|
|
537
538
|
}
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
if (addedAccounts.length > 0) {
|
|
544
|
-
for (const account of addedAccounts) {
|
|
545
|
-
_chunkUJIPPGP6js.__privateMethod.call(void 0, this, _handleNewAccountAdded, handleNewAccountAdded_fn).call(this, account);
|
|
539
|
+
this.update((currentState) => {
|
|
540
|
+
if (deletedAccounts.length > 0) {
|
|
541
|
+
for (const account of deletedAccounts) {
|
|
542
|
+
currentState.internalAccounts.accounts = _chunkUJIPPGP6js.__privateMethod.call(void 0, this, _handleAccountRemoved, handleAccountRemoved_fn).call(this, currentState.internalAccounts.accounts, account.id);
|
|
543
|
+
}
|
|
546
544
|
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
(accountA, accountB) => {
|
|
551
|
-
return (accountB.metadata.lastSelected ?? 0) - (accountA.metadata.lastSelected ?? 0);
|
|
545
|
+
if (addedAccounts.length > 0) {
|
|
546
|
+
for (const account of addedAccounts) {
|
|
547
|
+
currentState.internalAccounts.accounts = _chunkUJIPPGP6js.__privateMethod.call(void 0, this, _handleNewAccountAdded, handleNewAccountAdded_fn).call(this, currentState.internalAccounts.accounts, account);
|
|
552
548
|
}
|
|
549
|
+
}
|
|
550
|
+
const existingAccounts = Object.values(
|
|
551
|
+
currentState.internalAccounts.accounts
|
|
553
552
|
);
|
|
554
|
-
if (!
|
|
555
|
-
|
|
553
|
+
if (!currentState.internalAccounts.accounts[this.state.internalAccounts.selectedAccount]) {
|
|
554
|
+
if (existingAccounts.length === 0) {
|
|
556
555
|
currentState.internalAccounts.selectedAccount = "";
|
|
557
|
-
|
|
558
|
-
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
const [accountToSelect] = existingAccounts.sort(
|
|
559
|
+
(accountA, accountB) => {
|
|
560
|
+
return (accountB.metadata.lastSelected ?? 0) - (accountA.metadata.lastSelected ?? 0);
|
|
561
|
+
}
|
|
562
|
+
);
|
|
563
|
+
currentState.internalAccounts.selectedAccount = accountToSelect.id;
|
|
559
564
|
}
|
|
560
|
-
|
|
561
|
-
}
|
|
565
|
+
});
|
|
562
566
|
}
|
|
563
567
|
};
|
|
564
568
|
_handleOnSnapStateChange = new WeakSet();
|
|
@@ -581,8 +585,8 @@ handleOnSnapStateChange_fn = function(snapState) {
|
|
|
581
585
|
});
|
|
582
586
|
};
|
|
583
587
|
_getAccountsByKeyringType = new WeakSet();
|
|
584
|
-
getAccountsByKeyringType_fn = function(keyringType) {
|
|
585
|
-
return this.listAccounts().filter((internalAccount) => {
|
|
588
|
+
getAccountsByKeyringType_fn = function(keyringType, accounts) {
|
|
589
|
+
return (accounts ?? this.listAccounts()).filter((internalAccount) => {
|
|
586
590
|
if (keyringType === _keyringcontroller.KeyringTypes.hd || keyringType === _keyringcontroller.KeyringTypes.simple) {
|
|
587
591
|
return internalAccount.metadata.keyring.type === _keyringcontroller.KeyringTypes.hd || internalAccount.metadata.keyring.type === _keyringcontroller.KeyringTypes.simple;
|
|
588
592
|
}
|
|
@@ -609,7 +613,7 @@ isAccountCompatibleWithChain_fn = function(account, chainId) {
|
|
|
609
613
|
return account.type.startsWith(_utils.parseCaipChainId.call(void 0, chainId).namespace);
|
|
610
614
|
};
|
|
611
615
|
_handleNewAccountAdded = new WeakSet();
|
|
612
|
-
handleNewAccountAdded_fn = function(account) {
|
|
616
|
+
handleNewAccountAdded_fn = function(accountsState, account) {
|
|
613
617
|
let newAccount;
|
|
614
618
|
if (account.type !== _keyringcontroller.KeyringTypes.snap) {
|
|
615
619
|
newAccount = _chunkUJIPPGP6js.__privateMethod.call(void 0, this, _generateInternalAccountForNonSnapAccount, generateInternalAccountForNonSnapAccount_fn).call(this, account.address, account.type);
|
|
@@ -622,32 +626,28 @@ handleNewAccountAdded_fn = function(account) {
|
|
|
622
626
|
account.address
|
|
623
627
|
);
|
|
624
628
|
if (!newAccount) {
|
|
625
|
-
return;
|
|
629
|
+
return accountsState;
|
|
626
630
|
}
|
|
627
631
|
}
|
|
628
632
|
const accountName = this.getNextAvailableAccountName(
|
|
629
|
-
newAccount.metadata.keyring.type
|
|
633
|
+
newAccount.metadata.keyring.type,
|
|
634
|
+
Object.values(accountsState)
|
|
630
635
|
);
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
...newAccount,
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
};
|
|
642
|
-
return newState;
|
|
643
|
-
});
|
|
644
|
-
this.setSelectedAccount(newAccount.id);
|
|
636
|
+
accountsState[newAccount.id] = {
|
|
637
|
+
...newAccount,
|
|
638
|
+
metadata: {
|
|
639
|
+
...newAccount.metadata,
|
|
640
|
+
name: accountName,
|
|
641
|
+
importTime: Date.now(),
|
|
642
|
+
lastSelected: 0
|
|
643
|
+
}
|
|
644
|
+
};
|
|
645
|
+
return accountsState;
|
|
645
646
|
};
|
|
646
647
|
_handleAccountRemoved = new WeakSet();
|
|
647
|
-
handleAccountRemoved_fn = function(accountId) {
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
});
|
|
648
|
+
handleAccountRemoved_fn = function(accountsState, accountId) {
|
|
649
|
+
delete accountsState[accountId];
|
|
650
|
+
return accountsState;
|
|
651
651
|
};
|
|
652
652
|
_populateExistingMetadata = new WeakSet();
|
|
653
653
|
populateExistingMetadata_fn = function(accountId, metadataKey) {
|
|
@@ -664,6 +664,10 @@ registerMessageHandlers_fn = function() {
|
|
|
664
664
|
`${controllerName}:listAccounts`,
|
|
665
665
|
this.listAccounts.bind(this)
|
|
666
666
|
);
|
|
667
|
+
this.messagingSystem.registerActionHandler(
|
|
668
|
+
`${controllerName}:listMultichainAccounts`,
|
|
669
|
+
this.listMultichainAccounts.bind(this)
|
|
670
|
+
);
|
|
667
671
|
this.messagingSystem.registerActionHandler(
|
|
668
672
|
`${controllerName}:setAccountName`,
|
|
669
673
|
this.setAccountName.bind(this)
|
|
@@ -697,4 +701,4 @@ registerMessageHandlers_fn = function() {
|
|
|
697
701
|
|
|
698
702
|
|
|
699
703
|
exports.AccountsController = AccountsController;
|
|
700
|
-
//# sourceMappingURL=chunk-
|
|
704
|
+
//# sourceMappingURL=chunk-AIALCYPP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/AccountsController.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedControllerMessenger,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { SnapKeyring } from '@metamask/eth-snap-keyring';\nimport type { InternalAccount } from '@metamask/keyring-api';\nimport {\n EthAccountType,\n EthMethod,\n isEvmAccountType,\n} from '@metamask/keyring-api';\nimport { KeyringTypes } from '@metamask/keyring-controller';\nimport type {\n KeyringControllerState,\n KeyringControllerGetKeyringForAccountAction,\n KeyringControllerGetKeyringsByTypeAction,\n KeyringControllerGetAccountsAction,\n KeyringControllerStateChangeEvent,\n} from '@metamask/keyring-controller';\nimport type {\n SnapControllerState,\n SnapStateChange,\n} from '@metamask/snaps-controllers';\nimport type { SnapId } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport type { CaipChainId } from '@metamask/utils';\nimport {\n type Keyring,\n type Json,\n isCaipChainId,\n parseCaipChainId,\n} from '@metamask/utils';\nimport type { Draft } from 'immer';\n\nimport {\n getUUIDFromAddressOfNormalAccount,\n isNormalKeyringType,\n keyringTypeToName,\n} from './utils';\n\nconst controllerName = 'AccountsController';\n\nexport type AccountsControllerState = {\n internalAccounts: {\n accounts: Record<string, InternalAccount>;\n selectedAccount: string; // id of the selected account\n };\n};\n\nexport type AccountsControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSetSelectedAccountAction = {\n type: `${typeof controllerName}:setSelectedAccount`;\n handler: AccountsController['setSelectedAccount'];\n};\n\nexport type AccountsControllerSetAccountNameAction = {\n type: `${typeof controllerName}:setAccountName`;\n handler: AccountsController['setAccountName'];\n};\n\nexport type AccountsControllerListAccountsAction = {\n type: `${typeof controllerName}:listAccounts`;\n handler: AccountsController['listAccounts'];\n};\n\nexport type AccountsControllerListMultichainAccountsAction = {\n type: `${typeof controllerName}:listMultichainAccounts`;\n handler: AccountsController['listMultichainAccounts'];\n};\n\nexport type AccountsControllerUpdateAccountsAction = {\n type: `${typeof controllerName}:updateAccounts`;\n handler: AccountsController['updateAccounts'];\n};\n\nexport type AccountsControllerGetSelectedAccountAction = {\n type: `${typeof controllerName}:getSelectedAccount`;\n handler: AccountsController['getSelectedAccount'];\n};\n\nexport type AccountsControllerGetSelectedMultichainAccountAction = {\n type: `${typeof controllerName}:getSelectedMultichainAccount`;\n handler: AccountsController['getSelectedMultichainAccount'];\n};\n\nexport type AccountsControllerGetAccountByAddressAction = {\n type: `${typeof controllerName}:getAccountByAddress`;\n handler: AccountsController['getAccountByAddress'];\n};\n\nexport type AccountsControllerGetNextAvailableAccountNameAction = {\n type: `${typeof controllerName}:getNextAvailableAccountName`;\n handler: AccountsController['getNextAvailableAccountName'];\n};\n\nexport type AccountsControllerGetAccountAction = {\n type: `${typeof controllerName}:getAccount`;\n handler: AccountsController['getAccount'];\n};\n\nexport type AllowedActions =\n | KeyringControllerGetKeyringForAccountAction\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetAccountsAction;\n\nexport type AccountsControllerActions =\n | AccountsControllerGetStateAction\n | AccountsControllerSetSelectedAccountAction\n | AccountsControllerListAccountsAction\n | AccountsControllerListMultichainAccountsAction\n | AccountsControllerSetAccountNameAction\n | AccountsControllerUpdateAccountsAction\n | AccountsControllerGetAccountByAddressAction\n | AccountsControllerGetSelectedAccountAction\n | AccountsControllerGetNextAvailableAccountNameAction\n | AccountsControllerGetAccountAction\n | AccountsControllerGetSelectedMultichainAccountAction;\n\nexport type AccountsControllerChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n AccountsControllerState\n>;\n\nexport type AccountsControllerSelectedAccountChangeEvent = {\n type: `${typeof controllerName}:selectedAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AccountsControllerSelectedEvmAccountChangeEvent = {\n type: `${typeof controllerName}:selectedEvmAccountChange`;\n payload: [InternalAccount];\n};\n\nexport type AllowedEvents = SnapStateChange | KeyringControllerStateChangeEvent;\n\nexport type AccountsControllerEvents =\n | AccountsControllerChangeEvent\n | AccountsControllerSelectedAccountChangeEvent\n | AccountsControllerSelectedEvmAccountChangeEvent;\n\nexport type AccountsControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n AccountsControllerActions | AllowedActions,\n AccountsControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\ntype AddressAndKeyringTypeObject = {\n address: string;\n type: string;\n};\n\nconst accountsControllerMetadata = {\n internalAccounts: {\n persist: true,\n anonymous: false,\n },\n};\n\nconst defaultState: AccountsControllerState = {\n internalAccounts: {\n accounts: {},\n selectedAccount: '',\n },\n};\n\n/**\n * Controller that manages internal accounts.\n * The accounts controller is responsible for creating and managing internal accounts.\n * It also provides convenience methods for accessing and updating the internal accounts.\n * The accounts controller also listens for keyring state changes and updates the internal accounts accordingly.\n * The accounts controller also listens for snap state changes and updates the internal accounts accordingly.\n *\n */\nexport class AccountsController extends BaseController<\n typeof controllerName,\n AccountsControllerState,\n AccountsControllerMessenger\n> {\n /**\n * Constructor for AccountsController.\n *\n * @param options - The controller options.\n * @param options.messenger - The messenger object.\n * @param options.state - Initial state to set on this controller\n */\n constructor({\n messenger,\n state,\n }: {\n messenger: AccountsControllerMessenger;\n state: AccountsControllerState;\n }) {\n super({\n messenger,\n name: controllerName,\n metadata: accountsControllerMetadata,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.messagingSystem.subscribe(\n 'SnapController:stateChange',\n (snapStateState) => this.#handleOnSnapStateChange(snapStateState),\n );\n\n this.messagingSystem.subscribe(\n 'KeyringController:stateChange',\n (keyringState) => this.#handleOnKeyringStateChange(keyringState),\n );\n\n this.#registerMessageHandlers();\n }\n\n /**\n * Returns the internal account object for the given account ID, if it exists.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object, or undefined if the account does not exist.\n */\n getAccount(accountId: string): InternalAccount | undefined {\n return this.state.internalAccounts.accounts[accountId];\n }\n\n /**\n * Returns an array of all evm internal accounts.\n *\n * @returns An array of InternalAccount objects.\n */\n listAccounts(): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n return accounts.filter((account) => isEvmAccountType(account.type));\n }\n\n /**\n * Returns an array of all internal accounts.\n *\n * @param chainId - The chain ID.\n * @returns An array of InternalAccount objects.\n */\n listMultichainAccounts(chainId?: CaipChainId): InternalAccount[] {\n const accounts = Object.values(this.state.internalAccounts.accounts);\n if (!chainId) {\n return accounts;\n }\n\n if (!isCaipChainId(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${String(chainId)}`);\n }\n\n return accounts.filter((account) =>\n this.#isAccountCompatibleWithChain(account, chainId),\n );\n }\n\n /**\n * Returns the internal account object for the given account ID.\n *\n * @param accountId - The ID of the account to retrieve.\n * @returns The internal account object.\n * @throws An error if the account ID is not found.\n */\n getAccountExpect(accountId: string): InternalAccount {\n const account = this.getAccount(accountId);\n if (account === undefined) {\n throw new Error(`Account Id \"${accountId}\" not found`);\n }\n return account;\n }\n\n /**\n * Returns the last selected EVM account.\n *\n * @returns The selected internal account.\n */\n getSelectedAccount(): InternalAccount {\n // Edge case where the extension is setup but the srp is not yet created\n // certain ui elements will query the selected address before any accounts are created.\n if (this.state.internalAccounts.selectedAccount === '') {\n return {\n id: '',\n address: '',\n options: {},\n methods: [],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n keyring: {\n type: '',\n },\n importTime: 0,\n },\n };\n }\n\n const selectedAccount = this.getAccountExpect(\n this.state.internalAccounts.selectedAccount,\n );\n if (isEvmAccountType(selectedAccount.type)) {\n return selectedAccount;\n }\n\n const accounts = this.listAccounts();\n\n if (!accounts.length) {\n // ! Should never reach this.\n throw new Error('No EVM accounts');\n }\n\n // This will never be undefined because we have already checked if accounts.length is > 0\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return this.#getLastSelectedAccount(accounts)!;\n }\n\n /**\n * __WARNING The return value may be undefined if there isn't an account for that chain id.__\n *\n * Retrieves the last selected account by chain ID.\n *\n * @param chainId - The chain ID to filter the accounts.\n * @returns The last selected account compatible with the specified chain ID or undefined.\n */\n getSelectedMultichainAccount(\n chainId?: CaipChainId,\n ): InternalAccount | undefined {\n if (!chainId) {\n return this.getAccountExpect(this.state.internalAccounts.selectedAccount);\n }\n\n if (!isCaipChainId(chainId)) {\n throw new Error(`Invalid CAIP-2 chain ID: ${chainId as string}`);\n }\n\n const accounts = Object.values(this.state.internalAccounts.accounts).filter(\n (account) => this.#isAccountCompatibleWithChain(account, chainId),\n );\n\n return this.#getLastSelectedAccount(accounts);\n }\n\n /**\n * Returns the account with the specified address.\n * ! This method will only return the first account that matches the address\n * @param address - The address of the account to retrieve.\n * @returns The account with the specified address, or undefined if not found.\n */\n getAccountByAddress(address: string): InternalAccount | undefined {\n return this.listMultichainAccounts().find(\n (account) => account.address.toLowerCase() === address.toLowerCase(),\n );\n }\n\n /**\n * Sets the selected account by its ID.\n *\n * @param accountId - The ID of the account to be selected.\n */\n setSelectedAccount(accountId: string): void {\n const account = this.getAccountExpect(accountId);\n\n this.update((currentState: Draft<AccountsControllerState>) => {\n currentState.internalAccounts.accounts[account.id].metadata.lastSelected =\n Date.now();\n currentState.internalAccounts.selectedAccount = account.id;\n });\n\n if (isEvmAccountType(account.type)) {\n this.messagingSystem.publish(\n 'AccountsController:selectedEvmAccountChange',\n account,\n );\n }\n\n this.messagingSystem.publish(\n 'AccountsController:selectedAccountChange',\n account,\n );\n }\n\n /**\n * Sets the name of the account with the given ID.\n *\n * @param accountId - The ID of the account to set the name for.\n * @param accountName - The new name for the account.\n * @throws An error if an account with the same name already exists.\n */\n setAccountName(accountId: string, accountName: string): void {\n const account = this.getAccountExpect(accountId);\n\n if (\n this.listAccounts().find(\n (internalAccount) =>\n internalAccount.metadata.name === accountName &&\n internalAccount.id !== accountId,\n )\n ) {\n throw new Error('Account name already exists');\n }\n\n this.update((currentState: Draft<AccountsControllerState>) => {\n const internalAccount = {\n ...account,\n metadata: { ...account.metadata, name: accountName },\n };\n currentState.internalAccounts.accounts[accountId] = internalAccount;\n });\n }\n\n /**\n * Updates the internal accounts list by retrieving normal and snap accounts,\n * removing duplicates, and updating the metadata of each account.\n *\n * @returns A Promise that resolves when the accounts have been updated.\n */\n async updateAccounts(): Promise<void> {\n const snapAccounts = await this.#listSnapAccounts();\n const normalAccounts = await this.#listNormalAccounts();\n\n // keyring type map.\n const keyringTypes = new Map<string, number>();\n const previousAccounts = this.state.internalAccounts.accounts;\n\n const accounts: Record<string, InternalAccount> = [\n ...normalAccounts,\n ...snapAccounts,\n ].reduce((internalAccountMap, internalAccount) => {\n const keyringTypeName = keyringTypeToName(\n internalAccount.metadata.keyring.type,\n );\n const keyringAccountIndex = keyringTypes.get(keyringTypeName) ?? 0;\n if (keyringAccountIndex) {\n keyringTypes.set(keyringTypeName, keyringAccountIndex + 1);\n } else {\n keyringTypes.set(keyringTypeName, 1);\n }\n\n const existingAccount = previousAccounts[internalAccount.id];\n\n internalAccountMap[internalAccount.id] = {\n ...internalAccount,\n\n metadata: {\n ...internalAccount.metadata,\n name:\n this.#populateExistingMetadata(existingAccount?.id, 'name') ??\n `${keyringTypeName} ${keyringAccountIndex + 1}`,\n importTime:\n this.#populateExistingMetadata(existingAccount?.id, 'importTime') ??\n Date.now(),\n lastSelected:\n this.#populateExistingMetadata(\n existingAccount?.id,\n 'lastSelected',\n ) ?? 0,\n },\n };\n\n return internalAccountMap;\n }, {} as Record<string, InternalAccount>);\n\n this.update((currentState: Draft<AccountsControllerState>) => {\n currentState.internalAccounts.accounts = accounts;\n });\n }\n\n /**\n * Loads the backup state of the accounts controller.\n *\n * @param backup - The backup state to load.\n */\n loadBackup(backup: AccountsControllerState): void {\n if (backup.internalAccounts) {\n this.update((currentState: Draft<AccountsControllerState>) => {\n currentState.internalAccounts = backup.internalAccounts;\n });\n }\n }\n\n /**\n * Generates an internal account for a non-Snap account.\n * @param address - The address of the account.\n * @param type - The type of the account.\n * @returns The generated internal account.\n */\n #generateInternalAccountForNonSnapAccount(\n address: string,\n type: string,\n ): InternalAccount {\n return {\n id: getUUIDFromAddressOfNormalAccount(address),\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n type: EthAccountType.Eoa,\n metadata: {\n name: '',\n importTime: Date.now(),\n keyring: {\n type,\n },\n },\n };\n }\n\n /**\n * Returns a list of internal accounts created using the SnapKeyring.\n *\n * @returns A promise that resolves to an array of InternalAccount objects.\n */\n async #listSnapAccounts(): Promise<InternalAccount[]> {\n const [snapKeyring] = this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n // snap keyring is not available until the first account is created in the keyring controller\n if (!snapKeyring) {\n return [];\n }\n\n const snapAccounts = (snapKeyring as SnapKeyring).listAccounts();\n\n return snapAccounts;\n }\n\n /**\n * Returns a list of normal accounts.\n * Note: listNormalAccounts is a temporary method until the keyrings all implement the InternalAccount interface.\n * Once all keyrings implement the InternalAccount interface, this method can be removed and getAccounts can be used instead.\n *\n * @returns A Promise that resolves to an array of InternalAccount objects.\n */\n async #listNormalAccounts(): Promise<InternalAccount[]> {\n const addresses = await this.messagingSystem.call(\n 'KeyringController:getAccounts',\n );\n const internalAccounts: InternalAccount[] = [];\n for (const address of addresses) {\n const keyring = await this.messagingSystem.call(\n 'KeyringController:getKeyringForAccount',\n address,\n );\n\n const keyringType = (keyring as Keyring<Json>).type;\n if (!isNormalKeyringType(keyringType as KeyringTypes)) {\n // We only consider \"normal accounts\" here, so keep looping\n continue;\n }\n\n const id = getUUIDFromAddressOfNormalAccount(address);\n\n internalAccounts.push({\n id,\n address,\n options: {},\n methods: [\n EthMethod.PersonalSign,\n EthMethod.Sign,\n EthMethod.SignTransaction,\n EthMethod.SignTypedDataV1,\n EthMethod.SignTypedDataV3,\n EthMethod.SignTypedDataV4,\n ],\n type: EthAccountType.Eoa,\n metadata: {\n name: this.#populateExistingMetadata(id, 'name') ?? '',\n importTime:\n this.#populateExistingMetadata(id, 'importTime') ?? Date.now(),\n lastSelected: this.#populateExistingMetadata(id, 'lastSelected') ?? 0,\n keyring: {\n type: (keyring as Keyring<Json>).type,\n },\n },\n });\n }\n\n return internalAccounts;\n }\n\n /**\n * Handles changes in the keyring state, specifically when new accounts are added or removed.\n *\n * @param keyringState - The new state of the keyring controller.\n */\n #handleOnKeyringStateChange(keyringState: KeyringControllerState): void {\n // check if there are any new accounts added\n // TODO: change when accountAdded event is added to the keyring controller\n\n // We check for keyrings length to be greater than 0 because the extension client may try execute\n // submit password twice and clear the keyring state.\n // https://github.com/MetaMask/KeyringController/blob/2d73a4deed8d013913f6ef0c9f5c0bb7c614f7d3/src/KeyringController.ts#L910\n if (keyringState.isUnlocked && keyringState.keyrings.length > 0) {\n const updatedNormalKeyringAddresses: AddressAndKeyringTypeObject[] = [];\n const updatedSnapKeyringAddresses: AddressAndKeyringTypeObject[] = [];\n\n for (const keyring of keyringState.keyrings) {\n if (keyring.type === KeyringTypes.snap) {\n updatedSnapKeyringAddresses.push(\n ...keyring.accounts.map((address) => {\n return {\n address,\n type: keyring.type,\n };\n }),\n );\n } else {\n updatedNormalKeyringAddresses.push(\n ...keyring.accounts.map((address) => {\n return {\n address,\n type: keyring.type,\n };\n }),\n );\n }\n }\n\n const { previousNormalInternalAccounts, previousSnapInternalAccounts } =\n this.listAccounts().reduce(\n (accumulator, account) => {\n if (account.metadata.keyring.type === KeyringTypes.snap) {\n accumulator.previousSnapInternalAccounts.push(account);\n } else {\n accumulator.previousNormalInternalAccounts.push(account);\n }\n return accumulator;\n },\n {\n previousNormalInternalAccounts: [] as InternalAccount[],\n previousSnapInternalAccounts: [] as InternalAccount[],\n },\n );\n\n const addedAccounts: AddressAndKeyringTypeObject[] = [];\n const deletedAccounts: InternalAccount[] = [];\n\n // snap account ids are random uuid while normal accounts\n // are determininistic based on the address\n\n // ^NOTE: This will be removed when normal accounts also implement internal accounts\n // finding all the normal accounts that were added\n for (const account of updatedNormalKeyringAddresses) {\n if (\n !this.state.internalAccounts.accounts[\n getUUIDFromAddressOfNormalAccount(account.address)\n ]\n ) {\n addedAccounts.push(account);\n }\n }\n\n // finding all the snap accounts that were added\n for (const account of updatedSnapKeyringAddresses) {\n if (\n !previousSnapInternalAccounts.find(\n (internalAccount: InternalAccount) =>\n internalAccount.address.toLowerCase() ===\n account.address.toLowerCase(),\n )\n ) {\n addedAccounts.push(account);\n }\n }\n\n // finding all the normal accounts that were deleted\n for (const account of previousNormalInternalAccounts) {\n if (\n !updatedNormalKeyringAddresses.find(\n ({ address }) =>\n address.toLowerCase() === account.address.toLowerCase(),\n )\n ) {\n deletedAccounts.push(account);\n }\n }\n\n // finding all the snap accounts that were deleted\n for (const account of previousSnapInternalAccounts) {\n if (\n !updatedSnapKeyringAddresses.find(\n ({ address }) =>\n address.toLowerCase() === account.address.toLowerCase(),\n )\n ) {\n deletedAccounts.push(account);\n }\n }\n\n this.update((currentState: Draft<AccountsControllerState>) => {\n if (deletedAccounts.length > 0) {\n for (const account of deletedAccounts) {\n currentState.internalAccounts.accounts = this.#handleAccountRemoved(\n currentState.internalAccounts.accounts,\n account.id,\n );\n }\n }\n\n if (addedAccounts.length > 0) {\n for (const account of addedAccounts) {\n currentState.internalAccounts.accounts =\n this.#handleNewAccountAdded(\n currentState.internalAccounts.accounts,\n account,\n );\n }\n }\n\n // We don't use list accounts because it is not the updated state yet.\n const existingAccounts = Object.values(\n currentState.internalAccounts.accounts,\n );\n\n // handle if the selected account was deleted\n if (\n !currentState.internalAccounts.accounts[\n this.state.internalAccounts.selectedAccount\n ]\n ) {\n // if currently selected account is undefined and there are no accounts\n // it mean the keyring was reinitialized.\n if (existingAccounts.length === 0) {\n currentState.internalAccounts.selectedAccount = '';\n return;\n }\n\n // at this point, we know that `existingAccounts.length` is > 0, so\n // `accountToSelect` won't be `undefined`!\n const [accountToSelect] = existingAccounts.sort(\n (accountA, accountB) => {\n // sort by lastSelected descending\n return (\n (accountB.metadata.lastSelected ?? 0) -\n (accountA.metadata.lastSelected ?? 0)\n );\n },\n );\n currentState.internalAccounts.selectedAccount = accountToSelect.id;\n }\n });\n }\n }\n\n /**\n * Handles the change in SnapControllerState by updating the metadata of accounts that have a snap enabled.\n *\n * @param snapState - The new SnapControllerState.\n */\n #handleOnSnapStateChange(snapState: SnapControllerState) {\n // only check if snaps changed in status\n const { snaps } = snapState;\n const accounts = this.listAccounts().filter(\n (account) => account.metadata.snap,\n );\n\n this.update((currentState: Draft<AccountsControllerState>) => {\n accounts.forEach((account) => {\n const currentAccount =\n currentState.internalAccounts.accounts[account.id];\n if (currentAccount.metadata.snap) {\n const snapId = currentAccount.metadata.snap.id;\n const storedSnap: Snap = snaps[snapId as SnapId];\n if (storedSnap) {\n currentAccount.metadata.snap.enabled =\n storedSnap.enabled && !storedSnap.blocked;\n }\n }\n });\n });\n }\n\n /**\n * Returns the list of accounts for a given keyring type.\n * @param keyringType - The type of keyring.\n * @param accounts - Accounts to filter by keyring type.\n * @returns The list of accounts associcated with this keyring type.\n */\n #getAccountsByKeyringType(keyringType: string, accounts?: InternalAccount[]) {\n return (accounts ?? this.listAccounts()).filter((internalAccount) => {\n // We do consider `hd` and `simple` keyrings to be of same type. So we check those 2 types\n // to group those accounts together!\n if (\n keyringType === KeyringTypes.hd ||\n keyringType === KeyringTypes.simple\n ) {\n return (\n internalAccount.metadata.keyring.type === KeyringTypes.hd ||\n internalAccount.metadata.keyring.type === KeyringTypes.simple\n );\n }\n\n return internalAccount.metadata.keyring.type === keyringType;\n });\n }\n\n /**\n * Returns the last selected account from the given array of accounts.\n *\n * @param accounts - An array of InternalAccount objects.\n * @returns The InternalAccount object that was last selected, or undefined if the array is empty.\n */\n #getLastSelectedAccount(\n accounts: InternalAccount[],\n ): InternalAccount | undefined {\n return accounts.reduce((prevAccount, currentAccount) => {\n if (\n // When the account is added, lastSelected will be set\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n currentAccount.metadata.lastSelected! >\n // When the account is added, lastSelected will be set\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n prevAccount.metadata.lastSelected!\n ) {\n return currentAccount;\n }\n return prevAccount;\n }, accounts[0]);\n }\n\n /**\n * Returns the next account number for a given keyring type.\n * @param keyringType - The type of keyring.\n * @param accounts - Existing accounts to check for the next available account number.\n * @returns An object containing the account prefix and index to use.\n */\n getNextAvailableAccountName(\n keyringType: string = KeyringTypes.hd,\n accounts?: InternalAccount[],\n ): string {\n const keyringName = keyringTypeToName(keyringType);\n const keyringAccounts = this.#getAccountsByKeyringType(\n keyringType,\n accounts,\n );\n const lastDefaultIndexUsedForKeyringType = keyringAccounts.reduce(\n (maxInternalAccountIndex, internalAccount) => {\n // We **DO NOT USE** `\\d+` here to only consider valid \"human\"\n // number (rounded decimal number)\n const match = new RegExp(`${keyringName} ([0-9]+)$`, 'u').exec(\n internalAccount.metadata.name,\n );\n\n if (match) {\n // Quoting `RegExp.exec` documentation:\n // > The returned array has the matched text as the first item, and then one item for\n // > each capturing group of the matched text.\n // So use `match[1]` to get the captured value\n const internalAccountIndex = parseInt(match[1], 10);\n return Math.max(maxInternalAccountIndex, internalAccountIndex);\n }\n\n return maxInternalAccountIndex;\n },\n 0,\n );\n\n const index = Math.max(\n keyringAccounts.length + 1,\n lastDefaultIndexUsedForKeyringType + 1,\n );\n\n return `${keyringName} ${index}`;\n }\n\n /**\n * Checks if an account is compatible with a given chain namespace.\n * @private\n * @param account - The account to check compatibility for.\n * @param chainId - The CAIP2 to check compatibility with.\n * @returns Returns true if the account is compatible with the chain namespace, otherwise false.\n */\n #isAccountCompatibleWithChain(\n account: InternalAccount,\n chainId: CaipChainId,\n ): boolean {\n // TODO: Change this logic to not use account's type\n // Because we currently only use type, we can only use namespace for now.\n return account.type.startsWith(parseCaipChainId(chainId).namespace);\n }\n\n /**\n * Handles the addition of a new account to the controller.\n * If the account is not a Snap Keyring account, generates an internal account for it and adds it to the controller.\n * If the account is a Snap Keyring account, retrieves the account from the keyring and adds it to the controller.\n * @param accountsState - AccountsController accounts state that is to be mutated.\n * @param account - The address and keyring type object of the new account.\n * @returns The updated AccountsController accounts state.\n */\n #handleNewAccountAdded(\n accountsState: AccountsControllerState['internalAccounts']['accounts'],\n account: AddressAndKeyringTypeObject,\n ): AccountsControllerState['internalAccounts']['accounts'] {\n let newAccount: InternalAccount;\n if (account.type !== KeyringTypes.snap) {\n newAccount = this.#generateInternalAccountForNonSnapAccount(\n account.address,\n account.type,\n );\n } else {\n const [snapKeyring] = this.messagingSystem.call(\n 'KeyringController:getKeyringsByType',\n SnapKeyring.type,\n );\n\n newAccount = (snapKeyring as SnapKeyring).getAccountByAddress(\n account.address,\n ) as InternalAccount;\n\n // The snap deleted the account before the keyring controller could add it\n if (!newAccount) {\n return accountsState;\n }\n }\n\n // Get next account name available for this given keyring\n const accountName = this.getNextAvailableAccountName(\n newAccount.metadata.keyring.type,\n Object.values(accountsState),\n );\n\n accountsState[newAccount.id] = {\n ...newAccount,\n metadata: {\n ...newAccount.metadata,\n name: accountName,\n importTime: Date.now(),\n lastSelected: 0,\n },\n };\n\n return accountsState;\n }\n\n /**\n * Handles the removal of an account from the internal accounts list.\n * @param accountsState - AccountsController accounts state that is to be mutated.\n * @param accountId - The ID of the account to be removed.\n * @returns The updated AccountsController state.\n */\n #handleAccountRemoved(\n accountsState: AccountsControllerState['internalAccounts']['accounts'],\n accountId: string,\n ): AccountsControllerState['internalAccounts']['accounts'] {\n delete accountsState[accountId];\n return accountsState;\n }\n\n /**\n * Retrieves the value of a specific metadata key for an existing account.\n * @param accountId - The ID of the account.\n * @param metadataKey - The key of the metadata to retrieve.\n * @returns The value of the specified metadata key, or undefined if the account or metadata key does not exist.\n */\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n #populateExistingMetadata<T extends keyof InternalAccount['metadata']>(\n accountId: string,\n metadataKey: T,\n ): InternalAccount['metadata'][T] | undefined {\n const internalAccount = this.getAccount(accountId);\n return internalAccount ? internalAccount.metadata[metadataKey] : undefined;\n }\n\n /**\n * Registers message handlers for the AccountsController.\n * @private\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setSelectedAccount`,\n this.setSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listAccounts`,\n this.listAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:listMultichainAccounts`,\n this.listMultichainAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:setAccountName`,\n this.setAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:updateAccounts`,\n this.updateAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedAccount`,\n this.getSelectedAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getSelectedMultichainAccount`,\n this.getSelectedMultichainAccount.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getAccountByAddress`,\n this.getAccountByAddress.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${controllerName}:getNextAvailableAccountName`,\n this.getNextAvailableAccountName.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `AccountsController:getAccount`,\n this.getAccount.bind(this),\n );\n }\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});// src/utils.ts
|
|
2
2
|
var _util = require('@ethereumjs/util');
|
|
3
3
|
var _keyringcontroller = require('@metamask/keyring-controller');
|
|
4
|
-
var _snapsutils = require('@metamask/snaps-utils');
|
|
5
4
|
var _sha256 = require('ethereum-cryptography/sha256');
|
|
6
5
|
var _uuid = require('uuid');
|
|
7
6
|
function keyringTypeToName(keyringType) {
|
|
@@ -47,15 +46,11 @@ function getUUIDFromAddressOfNormalAccount(address) {
|
|
|
47
46
|
function isNormalKeyringType(keyringType) {
|
|
48
47
|
return keyringType !== _keyringcontroller.KeyringTypes.snap;
|
|
49
48
|
}
|
|
50
|
-
function deepCloneDraft(obj) {
|
|
51
|
-
return _snapsutils.deepClone.call(void 0, obj);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
49
|
|
|
55
50
|
|
|
56
51
|
|
|
57
52
|
|
|
58
53
|
|
|
59
54
|
|
|
60
|
-
exports.keyringTypeToName = keyringTypeToName; exports.getUUIDOptionsFromAddressOfNormalAccount = getUUIDOptionsFromAddressOfNormalAccount; exports.getUUIDFromAddressOfNormalAccount = getUUIDFromAddressOfNormalAccount; exports.isNormalKeyringType = isNormalKeyringType;
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
55
|
+
exports.keyringTypeToName = keyringTypeToName; exports.getUUIDOptionsFromAddressOfNormalAccount = getUUIDOptionsFromAddressOfNormalAccount; exports.getUUIDFromAddressOfNormalAccount = getUUIDFromAddressOfNormalAccount; exports.isNormalKeyringType = isNormalKeyringType;
|
|
56
|
+
//# sourceMappingURL=chunk-BYPP7G2N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"names":[],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB,oBAAoB;AAC/C,SAAS,cAAc;AAEvB,SAAS,MAAM,YAAY;AAQpB,SAAS,kBAAkB,aAA6B;AAG7D,MAAI,iBAAiB,WAAW,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,UAAQ,aAAa;AAAA,IACnB,KAAK,aAAa,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa,IAAI;AACpB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa,QAAQ;AACxB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa,SAAS;AACzB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa,IAAI;AACpB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa,MAAM;AACtB,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AACP,YAAM,IAAI,MAAM,mBAAmB,WAAW,EAAE;AAAA,IAClD;AAAA,EACF;AACF;AAOO,SAAS,yCACd,SACW;AACX,QAAM,YAAY;AAAA,IAChB,QAAQ,OAAO,SAAS,OAAO,CAAC,EAAE,MAAM,GAAG,EAAE;AAAA,EAC/C;AAEA,SAAO;AACT;AAOO,SAAS,kCAAkC,SAAyB;AACzE,SAAO,KAAK,yCAAyC,OAAO,CAAC;AAC/D;AAOO,SAAS,oBAAoB,aAAoC;AAGtE,SAAO,gBAAgB,aAAa;AACtC","sourcesContent":["import { toBuffer } from '@ethereumjs/util';\nimport { isCustodyKeyring, KeyringTypes } from '@metamask/keyring-controller';\nimport { sha256 } from 'ethereum-cryptography/sha256';\nimport type { V4Options } from 'uuid';\nimport { v4 as uuid } from 'uuid';\n\n/**\n * Returns the name of the keyring type.\n *\n * @param keyringType - The type of the keyring.\n * @returns The name of the keyring type.\n */\nexport function keyringTypeToName(keyringType: string): string {\n // Custody keyrings are a special case, as they are not a single type\n // they just start with the prefix `Custody`\n if (isCustodyKeyring(keyringType)) {\n return 'Custody';\n }\n\n switch (keyringType) {\n case KeyringTypes.simple: {\n return 'Account';\n }\n case KeyringTypes.hd: {\n return 'Account';\n }\n case KeyringTypes.trezor: {\n return 'Trezor';\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 Account';\n }\n default: {\n throw new Error(`Unknown keyring ${keyringType}`);\n }\n }\n}\n\n/**\n * Generates a UUID v4 options from a given Ethereum address.\n * @param address - The Ethereum address to generate the UUID from.\n * @returns The UUID v4 options.\n */\nexport function getUUIDOptionsFromAddressOfNormalAccount(\n address: string,\n): V4Options {\n const v4options = {\n random: sha256(toBuffer(address)).slice(0, 16),\n };\n\n return v4options;\n}\n\n/**\n * Generates a UUID from a given Ethereum address.\n * @param address - The Ethereum address to generate the UUID from.\n * @returns The generated UUID.\n */\nexport function getUUIDFromAddressOfNormalAccount(address: string): string {\n return uuid(getUUIDOptionsFromAddressOfNormalAccount(address));\n}\n\n/**\n * Check if a keyring type is considered a \"normal\" keyring.\n * @param keyringType - The account's keyring type.\n * @returns True if the keyring type is considered a \"normal\" keyring, false otherwise.\n */\nexport function isNormalKeyringType(keyringType: KeyringTypes): boolean {\n // Right now, we only have to \"exclude\" Snap accounts, but this might need to be\n // adapted later on if we have new kind of keyrings!\n return keyringType !== KeyringTypes.snap;\n}\n"]}
|