@metamask-previews/keyring-controller 7.5.0-preview.56ca173 → 8.0.0-preview.1b84247
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 +18 -2
- package/dist/KeyringController.d.ts +61 -5
- package/dist/KeyringController.d.ts.map +1 -1
- package/dist/KeyringController.js +189 -13
- package/dist/KeyringController.js.map +1 -1
- package/dist/types/SerializedKeyringTypes.d.ts +9 -0
- package/dist/types/SerializedKeyringTypes.d.ts.map +1 -0
- package/dist/types/SerializedKeyringTypes.js +3 -0
- package/dist/types/SerializedKeyringTypes.js.map +1 -0
- package/package.json +9 -7
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [8.0.0]
|
|
10
|
+
### Added
|
|
11
|
+
- Add `getQRKeyring(): QRKeyring | undefined` method
|
|
12
|
+
- Add `KeyringController:qrKeyringStateChange` messenger event
|
|
13
|
+
- The event emits updates from the internal `QRKeyring` instance, if there's one
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
- **BREAKING:** addNewKeyring(type) return type changed from Promise<Keyring<Json>> to Promise<unknown>
|
|
17
|
+
- When calling with QRKeyring type the keyring instance is retrieved or created (no multiple QRKeyring instances possible)
|
|
18
|
+
- Bump dependency on `@metamask/message-manager` to ^7.3.3
|
|
19
|
+
- Bump dependency on `@metamask/preferences-controller` to ^4.4.1
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
- Fix `addNewAccountForKeyring` for `CustodyKeyring` ([#1694](https://github.com/MetaMask/core/pull/1694))
|
|
23
|
+
|
|
9
24
|
## [7.5.0]
|
|
10
25
|
### Added
|
|
11
26
|
- Add `KeyringController` messenger actions ([#1691](https://github.com/MetaMask/core/pull/1691))
|
|
@@ -20,7 +35,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
20
35
|
### Added
|
|
21
36
|
- Add `KeyringController` messenger actions ([#1654](https://github.com/MetaMask/core/pull/1654))
|
|
22
37
|
- `KeyringController:signMessage`
|
|
23
|
-
- `KeyringController:signPersonalMessage`
|
|
38
|
+
- `KeyringController:signPersonalMessage`
|
|
24
39
|
- `KeyringController:signTypedMessage`
|
|
25
40
|
- `KeyringController:decryptMessage`
|
|
26
41
|
- `KeyringController:getEncryptionPublicKey`
|
|
@@ -181,7 +196,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
181
196
|
|
|
182
197
|
All changes listed after this point were applied to this package following the monorepo conversion.
|
|
183
198
|
|
|
184
|
-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/keyring-controller@
|
|
199
|
+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/keyring-controller@8.0.0...HEAD
|
|
200
|
+
[8.0.0]: https://github.com/MetaMask/core/compare/@metamask/keyring-controller@7.5.0...@metamask/keyring-controller@8.0.0
|
|
185
201
|
[7.5.0]: https://github.com/MetaMask/core/compare/@metamask/keyring-controller@7.4.0...@metamask/keyring-controller@7.5.0
|
|
186
202
|
[7.4.0]: https://github.com/MetaMask/core/compare/@metamask/keyring-controller@7.3.0...@metamask/keyring-controller@7.4.0
|
|
187
203
|
[7.3.0]: https://github.com/MetaMask/core/compare/@metamask/keyring-controller@7.2.0...@metamask/keyring-controller@7.3.0
|
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
import type { TxData, TypedTransaction } from '@ethereumjs/tx';
|
|
2
|
-
import {
|
|
2
|
+
import { MetaMaskKeyring as QRKeyring, type IKeyringState as IQRKeyringState } from '@keystonehq/metamask-airgapped-keyring';
|
|
3
|
+
import type Transport from '@ledgerhq/hw-transport';
|
|
4
|
+
import LedgerKeyring from '@ledgerhq/metamask-keyring';
|
|
3
5
|
import type { RestrictedControllerMessenger } from '@metamask/base-controller';
|
|
4
6
|
import { BaseControllerV2 } from '@metamask/base-controller';
|
|
5
7
|
import type { PersonalMessageParams, TypedMessageParams } from '@metamask/message-manager';
|
|
6
8
|
import type { PreferencesController } from '@metamask/preferences-controller';
|
|
7
9
|
import type { Eip1024EncryptedData, Hex, Keyring, Json } from '@metamask/utils';
|
|
8
10
|
import type { Patch } from 'immer';
|
|
11
|
+
import type { SerializedLedgerKeyring } from './types/SerializedKeyringTypes';
|
|
9
12
|
declare const name = "KeyringController";
|
|
10
13
|
/**
|
|
11
14
|
* Available keyring types
|
|
@@ -13,7 +16,8 @@ declare const name = "KeyringController";
|
|
|
13
16
|
export declare enum KeyringTypes {
|
|
14
17
|
simple = "Simple Key Pair",
|
|
15
18
|
hd = "HD Key Tree",
|
|
16
|
-
qr = "QR Hardware Wallet Device"
|
|
19
|
+
qr = "QR Hardware Wallet Device",
|
|
20
|
+
ledger = "Ledger"
|
|
17
21
|
}
|
|
18
22
|
/**
|
|
19
23
|
* @type KeyringControllerState
|
|
@@ -86,8 +90,12 @@ export declare type KeyringControllerUnlockEvent = {
|
|
|
86
90
|
type: `${typeof name}:unlock`;
|
|
87
91
|
payload: [];
|
|
88
92
|
};
|
|
93
|
+
export declare type KeyringControllerQRKeyringStateChangeEvent = {
|
|
94
|
+
type: `${typeof name}:qrKeyringStateChange`;
|
|
95
|
+
payload: [ReturnType<IQRKeyringState['getState']>];
|
|
96
|
+
};
|
|
89
97
|
export declare type KeyringControllerActions = KeyringControllerGetStateAction | KeyringControllerSignMessageAction | KeyringControllerSignPersonalMessageAction | KeyringControllerSignTypedMessageAction | KeyringControllerDecryptMessageAction | KeyringControllerGetEncryptionPublicKeyAction | KeyringControllerGetAccountsAction | KeyringControllerGetKeyringsByTypeAction | KeyringControllerGetKeyringForAccountAction;
|
|
90
|
-
export declare type KeyringControllerEvents = KeyringControllerStateChangeEvent | KeyringControllerLockEvent | KeyringControllerUnlockEvent | KeyringControllerAccountRemovedEvent;
|
|
98
|
+
export declare type KeyringControllerEvents = KeyringControllerStateChangeEvent | KeyringControllerLockEvent | KeyringControllerUnlockEvent | KeyringControllerAccountRemovedEvent | KeyringControllerQRKeyringStateChangeEvent;
|
|
91
99
|
export declare type KeyringControllerMessenger = RestrictedControllerMessenger<typeof name, KeyringControllerActions, KeyringControllerEvents, string, string>;
|
|
92
100
|
export declare type KeyringControllerOptions = {
|
|
93
101
|
removeIdentity: PreferencesController['removeIdentity'];
|
|
@@ -218,7 +226,7 @@ export declare class KeyringController extends BaseControllerV2<typeof name, Key
|
|
|
218
226
|
* @throws If a builder for the given `type` does not exist.
|
|
219
227
|
* @returns Promise resolving to the added keyring.
|
|
220
228
|
*/
|
|
221
|
-
addNewKeyring(type: KeyringTypes | string, opts?: unknown): Promise<
|
|
229
|
+
addNewKeyring(type: KeyringTypes | string, opts?: unknown): Promise<unknown>;
|
|
222
230
|
/**
|
|
223
231
|
* Method to verify a given password validity. Throws an
|
|
224
232
|
* error if the password is invalid.
|
|
@@ -384,7 +392,13 @@ export declare class KeyringController extends BaseControllerV2<typeof name, Key
|
|
|
384
392
|
*/
|
|
385
393
|
verifySeedPhrase(): Promise<Uint8Array>;
|
|
386
394
|
/**
|
|
387
|
-
* Get
|
|
395
|
+
* Get QR Hardware keyring.
|
|
396
|
+
*
|
|
397
|
+
* @returns The QR Keyring if defined, otherwise undefined
|
|
398
|
+
*/
|
|
399
|
+
getQRKeyring(): QRKeyring | undefined;
|
|
400
|
+
/**
|
|
401
|
+
* Get QR hardware keyring. If it doesn't exist, add it.
|
|
388
402
|
*
|
|
389
403
|
* @returns The added keyring
|
|
390
404
|
*/
|
|
@@ -408,6 +422,48 @@ export declare class KeyringController extends BaseControllerV2<typeof name, Key
|
|
|
408
422
|
unlockQRHardwareWalletAccount(index: number): Promise<void>;
|
|
409
423
|
getAccountKeyringType(account: string): Promise<string>;
|
|
410
424
|
forgetQRDevice(): Promise<void>;
|
|
425
|
+
private addLedgerKeyring;
|
|
426
|
+
/**
|
|
427
|
+
* Retrieve the existing LedgerKeyring or create a new one.
|
|
428
|
+
*
|
|
429
|
+
* @returns The stored Ledger Keyring
|
|
430
|
+
*/
|
|
431
|
+
getLedgerKeyring(): Promise<LedgerKeyring>;
|
|
432
|
+
/**
|
|
433
|
+
* Restores the Ledger Keyring. This is only used at the time the user resets the account's password at the moment.
|
|
434
|
+
*
|
|
435
|
+
* @param keyringSerialized - The serialized keyring;
|
|
436
|
+
*/
|
|
437
|
+
restoreLedgerKeyring(keyringSerialized: SerializedLedgerKeyring): Promise<void>;
|
|
438
|
+
/**
|
|
439
|
+
* Connects to the ledger device by requesting some metadata from it.
|
|
440
|
+
*
|
|
441
|
+
* @param transport - The transport to use to connect to the device
|
|
442
|
+
* @param deviceId - The device ID to connect to
|
|
443
|
+
* @returns The name of the currently open application on the device
|
|
444
|
+
*/
|
|
445
|
+
connectLedgerHardware(transport: Transport, deviceId: string): Promise<string>;
|
|
446
|
+
/**
|
|
447
|
+
* Retrieve the first account from the Ledger device.
|
|
448
|
+
*
|
|
449
|
+
* @returns The default (first) account on the device
|
|
450
|
+
*/
|
|
451
|
+
unlockLedgerDefaultAccount(): Promise<{
|
|
452
|
+
address: string;
|
|
453
|
+
balance: string;
|
|
454
|
+
}>;
|
|
455
|
+
/**
|
|
456
|
+
* Automatically opens the Ethereum app on the Ledger device.
|
|
457
|
+
*/
|
|
458
|
+
openEthereumAppOnLedger(): Promise<void>;
|
|
459
|
+
/**
|
|
460
|
+
* Automatically closes the current app on the Ledger device.
|
|
461
|
+
*/
|
|
462
|
+
closeRunningAppOnLedger(): Promise<void>;
|
|
463
|
+
/**
|
|
464
|
+
* Forgets the ledger keyring's previous device specific state.
|
|
465
|
+
*/
|
|
466
|
+
forgetLedger(): Promise<void>;
|
|
411
467
|
}
|
|
412
468
|
export default KeyringController;
|
|
413
469
|
//# sourceMappingURL=KeyringController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyringController.d.ts","sourceRoot":"","sources":["../src/KeyringController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"KeyringController.d.ts","sourceRoot":"","sources":["../src/KeyringController.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,11 +42,17 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
42
42
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
43
43
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
44
44
|
};
|
|
45
|
-
var
|
|
45
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
46
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
47
|
+
};
|
|
48
|
+
var _KeyringController_instances, _KeyringController_keyring, _KeyringController_qrKeyringStateListener, _KeyringController_registerMessageHandlers, _KeyringController_addQRKeyring, _KeyringController_subscribeToQRKeyringEvents, _KeyringController_unsubscribeFromQRKeyringsEvents, _KeyringController_fullUpdate, _KeyringController_handleLock, _KeyringController_handleUnlock, _KeyringController_getMemState;
|
|
46
49
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
50
|
exports.KeyringController = exports.SignTypedDataVersion = exports.AccountImportStrategy = exports.KeyringTypes = void 0;
|
|
51
|
+
const metamask_airgapped_keyring_1 = require("@keystonehq/metamask-airgapped-keyring");
|
|
52
|
+
const metamask_keyring_1 = __importDefault(require("@ledgerhq/metamask-keyring"));
|
|
48
53
|
const base_controller_1 = require("@metamask/base-controller");
|
|
49
54
|
const eth_keyring_controller_1 = require("@metamask/eth-keyring-controller");
|
|
55
|
+
const eth_sig_util_1 = require("@metamask/eth-sig-util");
|
|
50
56
|
const utils_1 = require("@metamask/utils");
|
|
51
57
|
const async_mutex_1 = require("async-mutex");
|
|
52
58
|
const ethereumjs_util_1 = require("ethereumjs-util");
|
|
@@ -60,6 +66,7 @@ var KeyringTypes;
|
|
|
60
66
|
KeyringTypes["simple"] = "Simple Key Pair";
|
|
61
67
|
KeyringTypes["hd"] = "HD Key Tree";
|
|
62
68
|
KeyringTypes["qr"] = "QR Hardware Wallet Device";
|
|
69
|
+
KeyringTypes["ledger"] = "Ledger";
|
|
63
70
|
})(KeyringTypes = exports.KeyringTypes || (exports.KeyringTypes = {}));
|
|
64
71
|
/**
|
|
65
72
|
* A strategy for importing an account
|
|
@@ -137,12 +144,21 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
137
144
|
_KeyringController_instances.add(this);
|
|
138
145
|
this.mutex = new async_mutex_1.Mutex();
|
|
139
146
|
_KeyringController_keyring.set(this, void 0);
|
|
140
|
-
|
|
141
|
-
|
|
147
|
+
_KeyringController_qrKeyringStateListener.set(this, void 0);
|
|
148
|
+
const additionalKeyringBuilders = [
|
|
149
|
+
(0, eth_keyring_controller_1.keyringBuilderFactory)(metamask_airgapped_keyring_1.MetaMaskKeyring),
|
|
150
|
+
(0, eth_keyring_controller_1.keyringBuilderFactory)(metamask_keyring_1.default),
|
|
151
|
+
];
|
|
152
|
+
__classPrivateFieldSet(this, _KeyringController_keyring, new eth_keyring_controller_1.KeyringController(Object.assign({ initState: state }, {
|
|
142
153
|
encryptor,
|
|
143
|
-
keyringBuilders,
|
|
144
154
|
cacheEncryptionKey,
|
|
145
|
-
|
|
155
|
+
keyringBuilders: [
|
|
156
|
+
...(keyringBuilders && Array.isArray(keyringBuilders)
|
|
157
|
+
? keyringBuilders
|
|
158
|
+
: []),
|
|
159
|
+
...additionalKeyringBuilders,
|
|
160
|
+
],
|
|
161
|
+
})), "f");
|
|
146
162
|
__classPrivateFieldGet(this, _KeyringController_keyring, "f").memStore.subscribe(__classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_fullUpdate).bind(this));
|
|
147
163
|
__classPrivateFieldGet(this, _KeyringController_keyring, "f").store.subscribe(__classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_fullUpdate).bind(this));
|
|
148
164
|
__classPrivateFieldGet(this, _KeyringController_keyring, "f").on('lock', __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_handleLock).bind(this));
|
|
@@ -202,15 +218,17 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
202
218
|
*/
|
|
203
219
|
addNewAccountForKeyring(keyring, accountCount) {
|
|
204
220
|
return __awaiter(this, void 0, void 0, function* () {
|
|
205
|
-
const oldAccounts = yield
|
|
221
|
+
const oldAccounts = yield this.getAccounts();
|
|
206
222
|
if (accountCount && oldAccounts.length !== accountCount) {
|
|
207
223
|
if (accountCount > oldAccounts.length) {
|
|
208
224
|
throw new Error('Account out of sequence');
|
|
209
225
|
}
|
|
210
|
-
|
|
226
|
+
const existingAccount = oldAccounts[accountCount];
|
|
227
|
+
(0, utils_1.assertIsStrictHexString)(existingAccount);
|
|
228
|
+
return existingAccount;
|
|
211
229
|
}
|
|
212
230
|
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").addNewAccount(keyring);
|
|
213
|
-
const addedAccountAddress = (yield
|
|
231
|
+
const addedAccountAddress = (yield this.getAccounts()).find((selectedAddress) => !oldAccounts.includes(selectedAddress));
|
|
214
232
|
(0, utils_1.assertIsStrictHexString)(addedAccountAddress);
|
|
215
233
|
this.updateIdentities(yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").getAccounts());
|
|
216
234
|
return addedAccountAddress;
|
|
@@ -291,6 +309,9 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
291
309
|
*/
|
|
292
310
|
addNewKeyring(type, opts) {
|
|
293
311
|
return __awaiter(this, void 0, void 0, function* () {
|
|
312
|
+
if (type === KeyringTypes.qr) {
|
|
313
|
+
return this.getOrAddQRKeyring();
|
|
314
|
+
}
|
|
294
315
|
return __classPrivateFieldGet(this, _KeyringController_keyring, "f").addNewKeyring(type, opts);
|
|
295
316
|
});
|
|
296
317
|
}
|
|
@@ -493,6 +514,7 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
493
514
|
*/
|
|
494
515
|
setLocked() {
|
|
495
516
|
return __awaiter(this, void 0, void 0, function* () {
|
|
517
|
+
__classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_unsubscribeFromQRKeyringsEvents).call(this);
|
|
496
518
|
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").setLocked();
|
|
497
519
|
return __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_getMemState).call(this);
|
|
498
520
|
});
|
|
@@ -536,6 +558,14 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
536
558
|
].includes(version)) {
|
|
537
559
|
throw new Error(`Unexpected signTypedMessage version: '${version}'`);
|
|
538
560
|
}
|
|
561
|
+
const ledgerKeyring = yield this.getLedgerKeyring();
|
|
562
|
+
const isLedgerAccount = yield ledgerKeyring.managesAccount((0, eth_sig_util_1.normalize)(messageParams.from || '') || '');
|
|
563
|
+
if (isLedgerAccount) {
|
|
564
|
+
return yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").signTypedMessage({
|
|
565
|
+
from: messageParams.from,
|
|
566
|
+
data: messageParams.data,
|
|
567
|
+
}, { version });
|
|
568
|
+
}
|
|
539
569
|
return yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").signTypedMessage({
|
|
540
570
|
from: messageParams.from,
|
|
541
571
|
data: version !== SignTypedDataVersion.V1 &&
|
|
@@ -570,6 +600,12 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
570
600
|
submitEncryptionKey(encryptionKey, encryptionSalt) {
|
|
571
601
|
return __awaiter(this, void 0, void 0, function* () {
|
|
572
602
|
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").submitEncryptionKey(encryptionKey, encryptionSalt);
|
|
603
|
+
const qrKeyring = this.getQRKeyring();
|
|
604
|
+
if (qrKeyring) {
|
|
605
|
+
// if there is a QR keyring, we need to subscribe
|
|
606
|
+
// to its events after unlocking the vault
|
|
607
|
+
__classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_subscribeToQRKeyringEvents).call(this, qrKeyring);
|
|
608
|
+
}
|
|
573
609
|
return __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_getMemState).call(this);
|
|
574
610
|
});
|
|
575
611
|
}
|
|
@@ -584,6 +620,12 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
584
620
|
return __awaiter(this, void 0, void 0, function* () {
|
|
585
621
|
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").submitPassword(password);
|
|
586
622
|
const accounts = yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").getAccounts();
|
|
623
|
+
const qrKeyring = this.getQRKeyring();
|
|
624
|
+
if (qrKeyring) {
|
|
625
|
+
// if there is a QR keyring, we need to subscribe
|
|
626
|
+
// to its events after unlocking the vault
|
|
627
|
+
__classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_subscribeToQRKeyringEvents).call(this, qrKeyring);
|
|
628
|
+
}
|
|
587
629
|
yield this.syncIdentities(accounts);
|
|
588
630
|
return __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_getMemState).call(this);
|
|
589
631
|
});
|
|
@@ -633,14 +675,22 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
633
675
|
}
|
|
634
676
|
// QR Hardware related methods
|
|
635
677
|
/**
|
|
636
|
-
* Get
|
|
678
|
+
* Get QR Hardware keyring.
|
|
679
|
+
*
|
|
680
|
+
* @returns The QR Keyring if defined, otherwise undefined
|
|
681
|
+
*/
|
|
682
|
+
getQRKeyring() {
|
|
683
|
+
// QRKeyring is not yet compatible with Keyring type from @metamask/utils
|
|
684
|
+
return __classPrivateFieldGet(this, _KeyringController_keyring, "f").getKeyringsByType(KeyringTypes.qr)[0];
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Get QR hardware keyring. If it doesn't exist, add it.
|
|
637
688
|
*
|
|
638
689
|
* @returns The added keyring
|
|
639
690
|
*/
|
|
640
691
|
getOrAddQRKeyring() {
|
|
641
692
|
return __awaiter(this, void 0, void 0, function* () {
|
|
642
|
-
|
|
643
|
-
return keyring;
|
|
693
|
+
return this.getQRKeyring() || (yield __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_addQRKeyring).call(this));
|
|
644
694
|
});
|
|
645
695
|
}
|
|
646
696
|
restoreQRKeyring(serialized) {
|
|
@@ -754,9 +804,121 @@ class KeyringController extends base_controller_1.BaseControllerV2 {
|
|
|
754
804
|
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").persistAllKeyrings();
|
|
755
805
|
});
|
|
756
806
|
}
|
|
807
|
+
// Ledger Related methods
|
|
808
|
+
addLedgerKeyring() {
|
|
809
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
810
|
+
return (yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").addNewKeyring(KeyringTypes.ledger));
|
|
811
|
+
});
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* Retrieve the existing LedgerKeyring or create a new one.
|
|
815
|
+
*
|
|
816
|
+
* @returns The stored Ledger Keyring
|
|
817
|
+
*/
|
|
818
|
+
getLedgerKeyring() {
|
|
819
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
820
|
+
const keyring = __classPrivateFieldGet(this, _KeyringController_keyring, "f").getKeyringsByType(KeyringTypes.ledger)[0];
|
|
821
|
+
if (keyring) {
|
|
822
|
+
return keyring;
|
|
823
|
+
}
|
|
824
|
+
return yield this.addLedgerKeyring();
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Restores the Ledger Keyring. This is only used at the time the user resets the account's password at the moment.
|
|
829
|
+
*
|
|
830
|
+
* @param keyringSerialized - The serialized keyring;
|
|
831
|
+
*/
|
|
832
|
+
restoreLedgerKeyring(keyringSerialized) {
|
|
833
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
834
|
+
(yield this.getLedgerKeyring()).deserialize(keyringSerialized);
|
|
835
|
+
this.updateIdentities(yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").getAccounts());
|
|
836
|
+
yield __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_fullUpdate).call(this);
|
|
837
|
+
});
|
|
838
|
+
}
|
|
839
|
+
/**
|
|
840
|
+
* Connects to the ledger device by requesting some metadata from it.
|
|
841
|
+
*
|
|
842
|
+
* @param transport - The transport to use to connect to the device
|
|
843
|
+
* @param deviceId - The device ID to connect to
|
|
844
|
+
* @returns The name of the currently open application on the device
|
|
845
|
+
*/
|
|
846
|
+
connectLedgerHardware(transport, deviceId) {
|
|
847
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
848
|
+
const keyring = yield this.getLedgerKeyring();
|
|
849
|
+
keyring.setTransport(transport, deviceId);
|
|
850
|
+
const { appName } = yield keyring.getAppAndVersion();
|
|
851
|
+
return appName;
|
|
852
|
+
});
|
|
853
|
+
}
|
|
854
|
+
/**
|
|
855
|
+
* Retrieve the first account from the Ledger device.
|
|
856
|
+
*
|
|
857
|
+
* @returns The default (first) account on the device
|
|
858
|
+
*/
|
|
859
|
+
unlockLedgerDefaultAccount() {
|
|
860
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
861
|
+
const keyring = yield this.getLedgerKeyring();
|
|
862
|
+
const oldAccounts = yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").getAccounts();
|
|
863
|
+
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").addNewAccount(keyring);
|
|
864
|
+
const newAccounts = yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").getAccounts();
|
|
865
|
+
this.updateIdentities(newAccounts);
|
|
866
|
+
newAccounts.forEach((address) => {
|
|
867
|
+
if (!oldAccounts.includes(address)) {
|
|
868
|
+
if (this.setAccountLabel) {
|
|
869
|
+
// The first ledger account is always returned.
|
|
870
|
+
this.setAccountLabel(address, `${keyring.getName()} 1`);
|
|
871
|
+
}
|
|
872
|
+
this.setSelectedAddress(address);
|
|
873
|
+
}
|
|
874
|
+
});
|
|
875
|
+
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").persistAllKeyrings();
|
|
876
|
+
yield __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_fullUpdate).call(this);
|
|
877
|
+
const address = yield keyring.getDefaultAccount();
|
|
878
|
+
return {
|
|
879
|
+
address,
|
|
880
|
+
balance: `0x0`,
|
|
881
|
+
};
|
|
882
|
+
});
|
|
883
|
+
}
|
|
884
|
+
/**
|
|
885
|
+
* Automatically opens the Ethereum app on the Ledger device.
|
|
886
|
+
*/
|
|
887
|
+
openEthereumAppOnLedger() {
|
|
888
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
889
|
+
const keyring = yield this.getLedgerKeyring();
|
|
890
|
+
yield keyring.openEthApp();
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
/**
|
|
894
|
+
* Automatically closes the current app on the Ledger device.
|
|
895
|
+
*/
|
|
896
|
+
closeRunningAppOnLedger() {
|
|
897
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
898
|
+
const keyring = yield this.getLedgerKeyring();
|
|
899
|
+
const { appName } = yield keyring.getAppAndVersion();
|
|
900
|
+
// BOLOS means we are on the dashboard we don't need to close anything
|
|
901
|
+
if (appName !== 'BOLOS') {
|
|
902
|
+
yield keyring.quitApp();
|
|
903
|
+
}
|
|
904
|
+
});
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Forgets the ledger keyring's previous device specific state.
|
|
908
|
+
*/
|
|
909
|
+
forgetLedger() {
|
|
910
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
911
|
+
const keyring = yield this.getLedgerKeyring();
|
|
912
|
+
keyring.forgetDevice();
|
|
913
|
+
const accounts = yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").getAccounts();
|
|
914
|
+
this.setSelectedAddress(accounts[0]);
|
|
915
|
+
yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").persistAllKeyrings();
|
|
916
|
+
yield __classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_fullUpdate).call(this);
|
|
917
|
+
});
|
|
918
|
+
}
|
|
757
919
|
}
|
|
758
920
|
exports.KeyringController = KeyringController;
|
|
759
|
-
_KeyringController_keyring = new WeakMap(), _KeyringController_instances = new WeakSet(), _KeyringController_registerMessageHandlers = function _KeyringController_registerMessageHandlers() {
|
|
921
|
+
_KeyringController_keyring = new WeakMap(), _KeyringController_qrKeyringStateListener = new WeakMap(), _KeyringController_instances = new WeakSet(), _KeyringController_registerMessageHandlers = function _KeyringController_registerMessageHandlers() {
|
|
760
922
|
this.messagingSystem.registerActionHandler(`${name}:signMessage`, this.signMessage.bind(this));
|
|
761
923
|
this.messagingSystem.registerActionHandler(`${name}:signPersonalMessage`, this.signPersonalMessage.bind(this));
|
|
762
924
|
this.messagingSystem.registerActionHandler(`${name}:signTypedMessage`, this.signTypedMessage.bind(this));
|
|
@@ -768,7 +930,21 @@ _KeyringController_keyring = new WeakMap(), _KeyringController_instances = new W
|
|
|
768
930
|
}, _KeyringController_addQRKeyring = function _KeyringController_addQRKeyring() {
|
|
769
931
|
return __awaiter(this, void 0, void 0, function* () {
|
|
770
932
|
// QRKeyring is not yet compatible with Keyring type from @metamask/utils
|
|
771
|
-
|
|
933
|
+
const qrKeyring = (yield __classPrivateFieldGet(this, _KeyringController_keyring, "f").addNewKeyring(KeyringTypes.qr));
|
|
934
|
+
__classPrivateFieldGet(this, _KeyringController_instances, "m", _KeyringController_subscribeToQRKeyringEvents).call(this, qrKeyring);
|
|
935
|
+
return qrKeyring;
|
|
936
|
+
});
|
|
937
|
+
}, _KeyringController_subscribeToQRKeyringEvents = function _KeyringController_subscribeToQRKeyringEvents(qrKeyring) {
|
|
938
|
+
__classPrivateFieldSet(this, _KeyringController_qrKeyringStateListener, (state) => {
|
|
939
|
+
this.messagingSystem.publish(`${name}:qrKeyringStateChange`, state);
|
|
940
|
+
}, "f");
|
|
941
|
+
qrKeyring.getMemStore().subscribe(__classPrivateFieldGet(this, _KeyringController_qrKeyringStateListener, "f"));
|
|
942
|
+
}, _KeyringController_unsubscribeFromQRKeyringsEvents = function _KeyringController_unsubscribeFromQRKeyringsEvents() {
|
|
943
|
+
const qrKeyrings = __classPrivateFieldGet(this, _KeyringController_keyring, "f").getKeyringsByType(KeyringTypes.qr);
|
|
944
|
+
qrKeyrings.forEach((qrKeyring) => {
|
|
945
|
+
if (__classPrivateFieldGet(this, _KeyringController_qrKeyringStateListener, "f")) {
|
|
946
|
+
qrKeyring.getMemStore().unsubscribe(__classPrivateFieldGet(this, _KeyringController_qrKeyringStateListener, "f"));
|
|
947
|
+
}
|
|
772
948
|
});
|
|
773
949
|
}, _KeyringController_fullUpdate = function _KeyringController_fullUpdate() {
|
|
774
950
|
this.update(() => (Object.assign(Object.assign({}, __classPrivateFieldGet(this, _KeyringController_keyring, "f").store.getState()), __classPrivateFieldGet(this, _KeyringController_keyring, "f").memStore.getState())));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KeyringController.js","sourceRoot":"","sources":["../src/KeyringController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TxData, TypedTransaction } from '@ethereumjs/tx';\nimport {\n type MetaMaskKeyring as QRKeyring,\n type IKeyringState as IQRKeyringState,\n} from '@keystonehq/metamask-airgapped-keyring';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport { KeyringController as EthKeyringController } from '@metamask/eth-keyring-controller';\nimport type {\n PersonalMessageParams,\n TypedMessageParams,\n} from '@metamask/message-manager';\nimport type { PreferencesController } from '@metamask/preferences-controller';\nimport type { Eip1024EncryptedData, Hex, Keyring, Json } from '@metamask/utils';\nimport { assertIsStrictHexString, hasProperty } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport {\n addHexPrefix,\n bufferToHex,\n isValidPrivate,\n toBuffer,\n stripHexPrefix,\n getBinarySize,\n} from 'ethereumjs-util';\nimport Wallet, { thirdparty as importers } from 'ethereumjs-wallet';\nimport type { Patch } from 'immer';\n\nconst name = 'KeyringController';\n\n/**\n * Available keyring types\n */\nexport enum KeyringTypes {\n simple = 'Simple Key Pair',\n hd = 'HD Key Tree',\n qr = 'QR Hardware Wallet Device',\n}\n\n/**\n * @type KeyringControllerState\n *\n * Keyring controller state\n * @property vault - Encrypted string representing keyring data\n * @property isUnlocked - Whether vault is unlocked\n * @property keyringTypes - Account types\n * @property keyrings - Group of accounts\n * @property encryptionKey - Keyring encryption key\n * @property encryptionSalt - Keyring encryption salt\n */\nexport type KeyringControllerState = {\n vault?: string;\n isUnlocked: boolean;\n keyrings: KeyringObject[];\n encryptionKey?: string;\n encryptionSalt?: string;\n};\n\nexport type KeyringControllerMemState = Omit<\n KeyringControllerState,\n 'vault' | 'encryptionKey' | 'encryptionSalt'\n>;\n\nexport type KeyringControllerGetStateAction = {\n type: `${typeof name}:getState`;\n handler: () => KeyringControllerState;\n};\n\nexport type KeyringControllerSignMessageAction = {\n type: `${typeof name}:signMessage`;\n handler: KeyringController['signMessage'];\n};\n\nexport type KeyringControllerSignPersonalMessageAction = {\n type: `${typeof name}:signPersonalMessage`;\n handler: KeyringController['signPersonalMessage'];\n};\n\nexport type KeyringControllerSignTypedMessageAction = {\n type: `${typeof name}:signTypedMessage`;\n handler: KeyringController['signTypedMessage'];\n};\n\nexport type KeyringControllerDecryptMessageAction = {\n type: `${typeof name}:decryptMessage`;\n handler: KeyringController['decryptMessage'];\n};\n\nexport type KeyringControllerGetEncryptionPublicKeyAction = {\n type: `${typeof name}:getEncryptionPublicKey`;\n handler: KeyringController['getEncryptionPublicKey'];\n};\n\nexport type KeyringControllerGetKeyringsByTypeAction = {\n type: `${typeof name}:getKeyringsByType`;\n handler: KeyringController['getKeyringsByType'];\n};\n\nexport type KeyringControllerGetKeyringForAccountAction = {\n type: `${typeof name}:getKeyringForAccount`;\n handler: KeyringController['getKeyringForAccount'];\n};\n\nexport type KeyringControllerGetAccountsAction = {\n type: `${typeof name}:getAccounts`;\n handler: KeyringController['getAccounts'];\n};\n\nexport type KeyringControllerStateChangeEvent = {\n type: `${typeof name}:stateChange`;\n payload: [KeyringControllerState, Patch[]];\n};\n\nexport type KeyringControllerAccountRemovedEvent = {\n type: `${typeof name}:accountRemoved`;\n payload: [string];\n};\n\nexport type KeyringControllerLockEvent = {\n type: `${typeof name}:lock`;\n payload: [];\n};\n\nexport type KeyringControllerUnlockEvent = {\n type: `${typeof name}:unlock`;\n payload: [];\n};\n\nexport type KeyringControllerActions =\n | KeyringControllerGetStateAction\n | KeyringControllerSignMessageAction\n | KeyringControllerSignPersonalMessageAction\n | KeyringControllerSignTypedMessageAction\n | KeyringControllerDecryptMessageAction\n | KeyringControllerGetEncryptionPublicKeyAction\n | KeyringControllerGetAccountsAction\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetKeyringForAccountAction;\n\nexport type KeyringControllerEvents =\n | KeyringControllerStateChangeEvent\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | KeyringControllerAccountRemovedEvent;\n\nexport type KeyringControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n KeyringControllerActions,\n KeyringControllerEvents,\n string,\n string\n>;\n\nexport type KeyringControllerOptions = {\n removeIdentity: PreferencesController['removeIdentity'];\n syncIdentities: PreferencesController['syncIdentities'];\n updateIdentities: PreferencesController['updateIdentities'];\n setSelectedAddress: PreferencesController['setSelectedAddress'];\n setAccountLabel?: PreferencesController['setAccountLabel'];\n encryptor?: any;\n keyringBuilders?: { (): Keyring<Json>; type: string }[];\n cacheEncryptionKey?: boolean;\n messenger: KeyringControllerMessenger;\n state?: { vault?: string };\n};\n\n/**\n * @type KeyringObject\n *\n * Keyring object to return in fullUpdate\n * @property type - Keyring type\n * @property accounts - Associated accounts\n */\nexport type KeyringObject = {\n accounts: string[];\n type: string;\n};\n\n/**\n * A strategy for importing an account\n */\nexport enum AccountImportStrategy {\n privateKey = 'privateKey',\n json = 'json',\n}\n\n/**\n * The `signTypedMessage` version\n *\n * @see https://docs.metamask.io/guide/signing-data.html\n */\nexport enum SignTypedDataVersion {\n V1 = 'V1',\n V3 = 'V3',\n V4 = 'V4',\n}\n\nconst defaultState: KeyringControllerState = {\n isUnlocked: false,\n keyrings: [],\n};\n\n/**\n * Assert that the given keyring has an exportable\n * mnemonic.\n *\n * @param keyring - The keyring to check\n * @throws When the keyring does not have a mnemonic\n */\nfunction assertHasUint8ArrayMnemonic(\n keyring: Keyring<Json>,\n): asserts keyring is Keyring<Json> & { mnemonic: Uint8Array } {\n if (\n !(\n hasProperty(keyring, 'mnemonic') && keyring.mnemonic instanceof Uint8Array\n )\n ) {\n throw new Error(\"Can't get mnemonic bytes from keyring\");\n }\n}\n\n/**\n * Controller responsible for establishing and managing user identity.\n *\n * This class is a wrapper around the `eth-keyring-controller` package. The\n * `eth-keyring-controller` manages the \"vault\", which is an encrypted store of private keys, and\n * it manages the wallet \"lock\" state. This wrapper class has convenience methods for interacting\n * with the internal keyring controller and handling certain complex operations that involve the\n * keyrings.\n */\nexport class KeyringController extends BaseControllerV2<\n typeof name,\n KeyringControllerState,\n KeyringControllerMessenger\n> {\n private readonly mutex = new Mutex();\n\n private readonly removeIdentity: PreferencesController['removeIdentity'];\n\n private readonly syncIdentities: PreferencesController['syncIdentities'];\n\n private readonly updateIdentities: PreferencesController['updateIdentities'];\n\n private readonly setSelectedAddress: PreferencesController['setSelectedAddress'];\n\n private readonly setAccountLabel?: PreferencesController['setAccountLabel'];\n\n #keyring: EthKeyringController;\n\n /**\n * Creates a KeyringController instance.\n *\n * @param opts - Initial options used to configure this controller\n * @param opts.removeIdentity - Remove the identity with the given address.\n * @param opts.syncIdentities - Sync identities with the given list of addresses.\n * @param opts.updateIdentities - Generate an identity for each address given that doesn't already have an identity.\n * @param opts.setSelectedAddress - Set the selected address.\n * @param opts.setAccountLabel - Set a new name for account.\n * @param opts.encryptor - An optional object for defining encryption schemes.\n * @param opts.keyringBuilders - Set a new name for account.\n * @param opts.cacheEncryptionKey - Whether to cache or not encryption key.\n * @param opts.messenger - A restricted controller messenger.\n * @param opts.state - Initial state to set on this controller.\n */\n constructor({\n removeIdentity,\n syncIdentities,\n updateIdentities,\n setSelectedAddress,\n setAccountLabel,\n encryptor,\n keyringBuilders,\n cacheEncryptionKey = false,\n messenger,\n state,\n }: KeyringControllerOptions) {\n super({\n name,\n metadata: {\n vault: { persist: true, anonymous: false },\n isUnlocked: { persist: false, anonymous: true },\n keyrings: { persist: false, anonymous: false },\n encryptionKey: { persist: false, anonymous: false },\n encryptionSalt: { persist: false, anonymous: false },\n },\n messenger,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n this.#keyring = new EthKeyringController({\n initState: state,\n encryptor,\n keyringBuilders,\n cacheEncryptionKey,\n });\n this.#keyring.memStore.subscribe(this.#fullUpdate.bind(this));\n this.#keyring.store.subscribe(this.#fullUpdate.bind(this));\n this.#keyring.on('lock', this.#handleLock.bind(this));\n this.#keyring.on('unlock', this.#handleUnlock.bind(this));\n\n this.removeIdentity = removeIdentity;\n this.syncIdentities = syncIdentities;\n this.updateIdentities = updateIdentities;\n this.setSelectedAddress = setSelectedAddress;\n this.setAccountLabel = setAccountLabel;\n\n this.#registerMessageHandlers();\n }\n\n /**\n * Adds a new account to the default (first) HD seed phrase keyring.\n *\n * @param accountCount - Number of accounts before adding a new one, used to\n * make the method idempotent.\n * @returns Promise resolving to keyring current state and added account\n * address.\n */\n async addNewAccount(accountCount?: number): Promise<{\n keyringState: KeyringControllerMemState;\n addedAccountAddress: string;\n }> {\n const primaryKeyring = this.#keyring.getKeyringsByType('HD Key Tree')[0];\n /* istanbul ignore if */\n if (!primaryKeyring) {\n throw new Error('No HD keyring found');\n }\n const oldAccounts = await this.#keyring.getAccounts();\n\n if (accountCount && oldAccounts.length !== accountCount) {\n if (accountCount > oldAccounts.length) {\n throw new Error('Account out of sequence');\n }\n // we return the account already existing at index `accountCount`\n const primaryKeyringAccounts = await primaryKeyring.getAccounts();\n return {\n keyringState: this.#getMemState(),\n addedAccountAddress: primaryKeyringAccounts[accountCount],\n };\n }\n\n await this.#keyring.addNewAccount(primaryKeyring);\n const newAccounts = await this.#keyring.getAccounts();\n\n await this.verifySeedPhrase();\n\n this.updateIdentities(newAccounts);\n const addedAccountAddress = newAccounts.find(\n (selectedAddress: string) => !oldAccounts.includes(selectedAddress),\n );\n\n assertIsStrictHexString(addedAccountAddress);\n return {\n keyringState: this.#getMemState(),\n addedAccountAddress,\n };\n }\n\n /**\n * Adds a new account to the specified keyring.\n *\n * @param keyring - Keyring to add the account to.\n * @param accountCount - Number of accounts before adding a new one, used to make the method idempotent.\n * @returns Promise resolving to keyring current state and added account\n */\n async addNewAccountForKeyring(\n keyring: Keyring<Json>,\n accountCount?: number,\n ): Promise<Hex> {\n const oldAccounts = await keyring.getAccounts();\n\n if (accountCount && oldAccounts.length !== accountCount) {\n if (accountCount > oldAccounts.length) {\n throw new Error('Account out of sequence');\n }\n return oldAccounts[accountCount];\n }\n\n await this.#keyring.addNewAccount(keyring);\n const addedAccountAddress = (await keyring.getAccounts()).find(\n (selectedAddress) => !oldAccounts.includes(selectedAddress),\n );\n assertIsStrictHexString(addedAccountAddress);\n\n this.updateIdentities(await this.#keyring.getAccounts());\n\n return addedAccountAddress;\n }\n\n /**\n * Adds a new account to the default (first) HD seed phrase keyring without updating identities in preferences.\n *\n * @returns Promise resolving to current state when the account is added.\n */\n async addNewAccountWithoutUpdate(): Promise<KeyringControllerMemState> {\n const primaryKeyring = this.#keyring.getKeyringsByType('HD Key Tree')[0];\n /* istanbul ignore if */\n if (!primaryKeyring) {\n throw new Error('No HD keyring found');\n }\n await this.#keyring.addNewAccount(primaryKeyring);\n await this.verifySeedPhrase();\n return this.#getMemState();\n }\n\n /**\n * Effectively the same as creating a new keychain then populating it\n * using the given seed phrase.\n *\n * @param password - Password to unlock keychain.\n * @param seed - A BIP39-compliant seed phrase as Uint8Array,\n * either as a string or an array of UTF-8 bytes that represent the string.\n * @returns Promise resolving to the restored keychain object.\n */\n async createNewVaultAndRestore(\n password: string,\n seed: Uint8Array,\n ): Promise<KeyringControllerMemState> {\n const releaseLock = await this.mutex.acquire();\n if (!password || !password.length) {\n throw new Error('Invalid password');\n }\n\n try {\n this.updateIdentities([]);\n await this.#keyring.createNewVaultAndRestore(password, seed);\n this.updateIdentities(await this.#keyring.getAccounts());\n return this.#getMemState();\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Create a new primary keychain and wipe any previous keychains.\n *\n * @param password - Password to unlock the new vault.\n * @returns Newly-created keychain object.\n */\n async createNewVaultAndKeychain(password: string) {\n const releaseLock = await this.mutex.acquire();\n try {\n const accounts = await this.getAccounts();\n if (!accounts.length) {\n await this.#keyring.createNewVaultAndKeychain(password);\n this.updateIdentities(await this.getAccounts());\n }\n return this.#getMemState();\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Adds a new keyring of the given `type`.\n *\n * @param type - Keyring type name.\n * @param opts - Keyring options.\n * @throws If a builder for the given `type` does not exist.\n * @returns Promise resolving to the added keyring.\n */\n async addNewKeyring(\n type: KeyringTypes | string,\n opts?: unknown,\n ): Promise<Keyring<Json>> {\n return this.#keyring.addNewKeyring(type, opts);\n }\n\n /**\n * Method to verify a given password validity. Throws an\n * error if the password is invalid.\n *\n * @param password - Password of the keyring.\n */\n async verifyPassword(password: string) {\n await this.#keyring.verifyPassword(password);\n }\n\n /**\n * Returns the status of the vault.\n *\n * @returns Boolean returning true if the vault is unlocked.\n */\n isUnlocked(): boolean {\n return this.state.isUnlocked;\n }\n\n /**\n * Gets the seed phrase of the HD keyring.\n *\n * @param password - Password of the keyring.\n * @returns Promise resolving to the seed phrase.\n */\n async exportSeedPhrase(password: string): Promise<Uint8Array> {\n await this.verifyPassword(password);\n assertHasUint8ArrayMnemonic(this.#keyring.keyrings[0]);\n return this.#keyring.keyrings[0].mnemonic;\n }\n\n /**\n * Gets the private key from the keyring controlling an address.\n *\n * @param password - Password of the keyring.\n * @param address - Address to export.\n * @returns Promise resolving to the private key for an address.\n */\n async exportAccount(password: string, address: string): Promise<string> {\n await this.verifyPassword(password);\n return this.#keyring.exportAccount(address);\n }\n\n /**\n * Returns the public addresses of all accounts for the current keyring.\n *\n * @returns A promise resolving to an array of addresses.\n */\n getAccounts(): Promise<string[]> {\n return this.#keyring.getAccounts();\n }\n\n /**\n * Get encryption public key.\n *\n * @param account - An account address.\n * @param opts - Additional encryption options.\n * @throws If the `account` does not exist or does not support the `getEncryptionPublicKey` method\n * @returns Promise resolving to encyption public key of the `account` if one exists.\n */\n async getEncryptionPublicKey(\n account: string,\n opts?: Record<string, unknown>,\n ): Promise<string> {\n return this.#keyring.getEncryptionPublicKey(account, opts);\n }\n\n /**\n * Attempts to decrypt the provided message parameters.\n *\n * @param messageParams - The decryption message parameters.\n * @param messageParams.from - The address of the account you want to use to decrypt the message.\n * @param messageParams.data - The encrypted data that you want to decrypt.\n * @returns The raw decryption result.\n */\n async decryptMessage(messageParams: {\n from: string;\n data: Eip1024EncryptedData;\n }): Promise<string> {\n return this.#keyring.decryptMessage(messageParams);\n }\n\n /**\n * Returns the currently initialized keyring that manages\n * the specified `address` if one exists.\n *\n * @deprecated Use of this method is discouraged as actions executed directly on\n * keyrings are not being reflected in the KeyringController state and not\n * persisted in the vault.\n * @param account - An account address.\n * @returns Promise resolving to keyring of the `account` if one exists.\n */\n async getKeyringForAccount(account: string): Promise<unknown> {\n return this.#keyring.getKeyringForAccount(account);\n }\n\n /**\n * Returns all keyrings of the given type.\n *\n * @deprecated Use of this method is discouraged as actions executed directly on\n * keyrings are not being reflected in the KeyringController state and not\n * persisted in the vault.\n * @param type - Keyring type name.\n * @returns An array of keyrings of the given type.\n */\n getKeyringsByType(type: KeyringTypes | string): unknown[] {\n return this.#keyring.getKeyringsByType(type);\n }\n\n /**\n * Persist all serialized keyrings in the vault.\n *\n * @returns Promise resolving with `true` value when the\n * operation completes.\n */\n async persistAllKeyrings(): Promise<boolean> {\n return this.#keyring.persistAllKeyrings();\n }\n\n /**\n * Imports an account with the specified import strategy.\n *\n * @param strategy - Import strategy name.\n * @param args - Array of arguments to pass to the underlying stategy.\n * @throws Will throw when passed an unrecognized strategy.\n * @returns Promise resolving to keyring current state and imported account\n * address.\n */\n async importAccountWithStrategy(\n strategy: AccountImportStrategy,\n args: any[],\n ): Promise<{\n keyringState: KeyringControllerMemState;\n importedAccountAddress: string;\n }> {\n let privateKey;\n switch (strategy) {\n case 'privateKey':\n const [importedKey] = args;\n if (!importedKey) {\n throw new Error('Cannot import an empty key.');\n }\n const prefixed = addHexPrefix(importedKey);\n\n let bufferedPrivateKey;\n try {\n bufferedPrivateKey = toBuffer(prefixed);\n } catch {\n throw new Error('Cannot import invalid private key.');\n }\n\n /* istanbul ignore if */\n if (\n !isValidPrivate(bufferedPrivateKey) ||\n // ensures that the key is 64 bytes long\n getBinarySize(prefixed) !== 64 + '0x'.length\n ) {\n throw new Error('Cannot import invalid private key.');\n }\n\n privateKey = stripHexPrefix(prefixed);\n break;\n case 'json':\n let wallet;\n const [input, password] = args;\n try {\n wallet = importers.fromEtherWallet(input, password);\n } catch (e) {\n wallet = wallet || (await Wallet.fromV3(input, password, true));\n }\n privateKey = bufferToHex(wallet.getPrivateKey());\n break;\n default:\n throw new Error(`Unexpected import strategy: '${strategy}'`);\n }\n const newKeyring = await this.#keyring.addNewKeyring(KeyringTypes.simple, [\n privateKey,\n ]);\n const accounts = await newKeyring.getAccounts();\n const allAccounts = await this.#keyring.getAccounts();\n this.updateIdentities(allAccounts);\n return {\n keyringState: this.#getMemState(),\n importedAccountAddress: accounts[0],\n };\n }\n\n /**\n * Removes an account from keyring state.\n *\n * @param address - Address of the account to remove.\n * @fires KeyringController:accountRemoved\n * @returns Promise resolving current state when this account removal completes.\n */\n async removeAccount(address: Hex): Promise<KeyringControllerMemState> {\n this.removeIdentity(address);\n await this.#keyring.removeAccount(address);\n this.messagingSystem.publish(`${name}:accountRemoved`, address);\n return this.#getMemState();\n }\n\n /**\n * Deallocates all secrets and locks the wallet.\n *\n * @returns Promise resolving to current state.\n */\n async setLocked(): Promise<KeyringControllerMemState> {\n await this.#keyring.setLocked();\n return this.#getMemState();\n }\n\n /**\n * Signs message by calling down into a specific keyring.\n *\n * @param messageParams - PersonalMessageParams object to sign.\n * @returns Promise resolving to a signed message string.\n */\n signMessage(messageParams: PersonalMessageParams) {\n if (!messageParams.data) {\n throw new Error(\"Can't sign an empty message\");\n }\n return this.#keyring.signMessage(messageParams);\n }\n\n /**\n * Signs personal message by calling down into a specific keyring.\n *\n * @param messageParams - PersonalMessageParams object to sign.\n * @returns Promise resolving to a signed message string.\n */\n signPersonalMessage(messageParams: PersonalMessageParams) {\n return this.#keyring.signPersonalMessage(messageParams);\n }\n\n /**\n * Signs typed message by calling down into a specific keyring.\n *\n * @param messageParams - TypedMessageParams object to sign.\n * @param version - Compatibility version EIP712.\n * @throws Will throw when passed an unrecognized version.\n * @returns Promise resolving to a signed message string or an error if any.\n */\n async signTypedMessage(\n messageParams: TypedMessageParams,\n version: SignTypedDataVersion,\n ): Promise<string> {\n try {\n if (\n ![\n SignTypedDataVersion.V1,\n SignTypedDataVersion.V3,\n SignTypedDataVersion.V4,\n ].includes(version)\n ) {\n throw new Error(`Unexpected signTypedMessage version: '${version}'`);\n }\n\n return await this.#keyring.signTypedMessage(\n {\n from: messageParams.from,\n data:\n version !== SignTypedDataVersion.V1 &&\n typeof messageParams.data === 'string'\n ? JSON.parse(messageParams.data)\n : messageParams.data,\n },\n { version },\n );\n } catch (error) {\n throw new Error(`Keyring Controller signTypedMessage: ${error}`);\n }\n }\n\n /**\n * Signs a transaction by calling down into a specific keyring.\n *\n * @param transaction - Transaction object to sign. Must be a `ethereumjs-tx` transaction instance.\n * @param from - Address to sign from, should be in keychain.\n * @returns Promise resolving to a signed transaction string.\n */\n signTransaction(\n transaction: TypedTransaction,\n from: string,\n ): Promise<TxData> {\n return this.#keyring.signTransaction(transaction, from);\n }\n\n /**\n * Attempts to decrypt the current vault and load its keyrings,\n * using the given encryption key and salt.\n *\n * @param encryptionKey - Key to unlock the keychain.\n * @param encryptionSalt - Salt to unlock the keychain.\n * @returns Promise resolving to the current state.\n */\n async submitEncryptionKey(\n encryptionKey: string,\n encryptionSalt: string,\n ): Promise<KeyringControllerMemState> {\n await this.#keyring.submitEncryptionKey(encryptionKey, encryptionSalt);\n return this.#getMemState();\n }\n\n /**\n * Attempts to decrypt the current vault and load its keyrings,\n * using the given password.\n *\n * @param password - Password to unlock the keychain.\n * @returns Promise resolving to the current state.\n */\n async submitPassword(password: string): Promise<KeyringControllerMemState> {\n await this.#keyring.submitPassword(password);\n const accounts = await this.#keyring.getAccounts();\n await this.syncIdentities(accounts);\n return this.#getMemState();\n }\n\n /**\n * Verifies the that the seed phrase restores the current keychain's accounts.\n *\n * @returns Promise resolving to the seed phrase as Uint8Array.\n */\n async verifySeedPhrase(): Promise<Uint8Array> {\n const primaryKeyring = this.#keyring.getKeyringsByType(KeyringTypes.hd)[0];\n /* istanbul ignore if */\n if (!primaryKeyring) {\n throw new Error('No HD keyring found.');\n }\n\n assertHasUint8ArrayMnemonic(primaryKeyring);\n\n const seedWords = primaryKeyring.mnemonic;\n const accounts = await primaryKeyring.getAccounts();\n /* istanbul ignore if */\n if (accounts.length === 0) {\n throw new Error('Cannot verify an empty keyring.');\n }\n\n // The HD Keyring Builder is a default keyring builder\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const hdKeyringBuilder = this.#keyring.getKeyringBuilderForType(\n KeyringTypes.hd,\n )!;\n\n const hdKeyring = hdKeyringBuilder();\n // @ts-expect-error @metamask/eth-hd-keyring correctly handles\n // Uint8Array seed phrases in the `deserialize` method.\n hdKeyring.deserialize({\n mnemonic: seedWords,\n numberOfAccounts: accounts.length,\n });\n const testAccounts = await hdKeyring.getAccounts();\n /* istanbul ignore if */\n if (testAccounts.length !== accounts.length) {\n throw new Error('Seed phrase imported incorrect number of accounts.');\n }\n\n testAccounts.forEach((account: string, i: number) => {\n /* istanbul ignore if */\n if (account.toLowerCase() !== accounts[i].toLowerCase()) {\n throw new Error('Seed phrase imported different accounts.');\n }\n });\n\n return seedWords;\n }\n\n // QR Hardware related methods\n\n /**\n * Get qr hardware keyring.\n *\n * @returns The added keyring\n */\n async getOrAddQRKeyring(): Promise<QRKeyring> {\n const keyring =\n (this.#keyring.getKeyringsByType(\n KeyringTypes.qr,\n )[0] as unknown as QRKeyring) || (await this.#addQRKeyring());\n return keyring;\n }\n\n async restoreQRKeyring(serialized: any): Promise<void> {\n (await this.getOrAddQRKeyring()).deserialize(serialized);\n await this.#keyring.persistAllKeyrings();\n this.updateIdentities(await this.#keyring.getAccounts());\n }\n\n async resetQRKeyringState(): Promise<void> {\n (await this.getOrAddQRKeyring()).resetStore();\n }\n\n async getQRKeyringState(): Promise<IQRKeyringState> {\n return (await this.getOrAddQRKeyring()).getMemStore();\n }\n\n async submitQRCryptoHDKey(cryptoHDKey: string): Promise<void> {\n (await this.getOrAddQRKeyring()).submitCryptoHDKey(cryptoHDKey);\n }\n\n async submitQRCryptoAccount(cryptoAccount: string): Promise<void> {\n (await this.getOrAddQRKeyring()).submitCryptoAccount(cryptoAccount);\n }\n\n async submitQRSignature(\n requestId: string,\n ethSignature: string,\n ): Promise<void> {\n (await this.getOrAddQRKeyring()).submitSignature(requestId, ethSignature);\n }\n\n async cancelQRSignRequest(): Promise<void> {\n (await this.getOrAddQRKeyring()).cancelSignRequest();\n }\n\n /**\n * Cancels qr keyring sync.\n */\n async cancelQRSynchronization(): Promise<void> {\n // eslint-disable-next-line n/no-sync\n (await this.getOrAddQRKeyring()).cancelSync();\n }\n\n async connectQRHardware(\n page: number,\n ): Promise<{ balance: string; address: string; index: number }[]> {\n try {\n const keyring = await this.getOrAddQRKeyring();\n let accounts;\n switch (page) {\n case -1:\n accounts = await keyring.getPreviousPage();\n break;\n case 1:\n accounts = await keyring.getNextPage();\n break;\n default:\n accounts = await keyring.getFirstPage();\n }\n return accounts.map((account: any) => {\n return {\n ...account,\n balance: '0x0',\n };\n });\n } catch (e) {\n // TODO: Add test case for when keyring throws\n /* istanbul ignore next */\n throw new Error(`Unspecified error when connect QR Hardware, ${e}`);\n }\n }\n\n async unlockQRHardwareWalletAccount(index: number): Promise<void> {\n const keyring = await this.getOrAddQRKeyring();\n\n keyring.setAccountToUnlock(index);\n const oldAccounts = await this.#keyring.getAccounts();\n // QRKeyring is not yet compatible with Keyring from\n // @metamask/utils, but we can use the `addNewAccount` method\n // as it internally calls `addAccounts` from on the keyring instance,\n // which is supported by QRKeyring API.\n await this.#keyring.addNewAccount(keyring as unknown as Keyring<Json>);\n const newAccounts = await this.#keyring.getAccounts();\n this.updateIdentities(newAccounts);\n newAccounts.forEach((address: string) => {\n if (!oldAccounts.includes(address)) {\n if (this.setAccountLabel) {\n this.setAccountLabel(address, `${keyring.getName()} ${index}`);\n }\n this.setSelectedAddress(address);\n }\n });\n await this.#keyring.persistAllKeyrings();\n }\n\n async getAccountKeyringType(account: string): Promise<string> {\n return (await this.#keyring.getKeyringForAccount(account)).type;\n }\n\n async forgetQRDevice(): Promise<void> {\n const keyring = await this.getOrAddQRKeyring();\n keyring.forgetDevice();\n const accounts = (await this.#keyring.getAccounts()) as string[];\n accounts.forEach((account) => {\n this.setSelectedAddress(account);\n });\n await this.#keyring.persistAllKeyrings();\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${name}:signMessage`,\n this.signMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:signPersonalMessage`,\n this.signPersonalMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:signTypedMessage`,\n this.signTypedMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:decryptMessage`,\n this.decryptMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getEncryptionPublicKey`,\n this.getEncryptionPublicKey.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getAccounts`,\n this.getAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getKeyringsByType`,\n this.getKeyringsByType.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getKeyringForAccount`,\n this.getKeyringForAccount.bind(this),\n );\n }\n\n /**\n * Add qr hardware keyring.\n *\n * @returns The added keyring\n * @throws If a QRKeyring builder is not provided\n * when initializing the controller\n */\n async #addQRKeyring(): Promise<QRKeyring> {\n // QRKeyring is not yet compatible with Keyring type from @metamask/utils\n return this.#keyring.addNewKeyring(KeyringTypes.qr) as unknown as QRKeyring;\n }\n\n /**\n * Sync controller state with current keyring store\n * and memStore states.\n *\n * @fires KeyringController:stateChange\n */\n #fullUpdate() {\n this.update(() => ({\n ...this.#keyring.store.getState(),\n ...this.#keyring.memStore.getState(),\n }));\n }\n\n /**\n * Handle keyring lock event.\n *\n * @fires KeyringController:lock\n */\n #handleLock() {\n this.messagingSystem.publish(`${name}:lock`);\n }\n\n /**\n * Handle keyring unlock event.\n *\n * @fires KeyringController:unlock\n */\n #handleUnlock() {\n this.messagingSystem.publish(`${name}:unlock`);\n }\n\n #getMemState(): KeyringControllerMemState {\n return {\n isUnlocked: this.state.isUnlocked,\n keyrings: this.state.keyrings,\n };\n }\n}\n\nexport default KeyringController;\n"]}
|
|
1
|
+
{"version":3,"file":"KeyringController.js","sourceRoot":"","sources":["../src/KeyringController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TxData, TypedTransaction } from '@ethereumjs/tx';\nimport {\n MetaMaskKeyring as QRKeyring,\n type IKeyringState as IQRKeyringState,\n} from '@keystonehq/metamask-airgapped-keyring';\nimport type Transport from '@ledgerhq/hw-transport';\nimport LedgerKeyring from '@ledgerhq/metamask-keyring';\nimport type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseControllerV2 } from '@metamask/base-controller';\nimport {\n KeyringController as EthKeyringController,\n keyringBuilderFactory,\n} from '@metamask/eth-keyring-controller';\nimport { normalize as normalizeAddress } from '@metamask/eth-sig-util';\nimport type {\n PersonalMessageParams,\n TypedMessageParams,\n} from '@metamask/message-manager';\nimport type { PreferencesController } from '@metamask/preferences-controller';\nimport type {\n Eip1024EncryptedData,\n Hex,\n Keyring,\n Json,\n KeyringClass,\n} from '@metamask/utils';\nimport { assertIsStrictHexString, hasProperty } from '@metamask/utils';\nimport { Mutex } from 'async-mutex';\nimport {\n addHexPrefix,\n bufferToHex,\n isValidPrivate,\n toBuffer,\n stripHexPrefix,\n getBinarySize,\n} from 'ethereumjs-util';\nimport Wallet, { thirdparty as importers } from 'ethereumjs-wallet';\nimport type { Patch } from 'immer';\n\nimport type { SerializedLedgerKeyring } from './types/SerializedKeyringTypes';\n\nconst name = 'KeyringController';\n\n/**\n * Available keyring types\n */\nexport enum KeyringTypes {\n simple = 'Simple Key Pair',\n hd = 'HD Key Tree',\n qr = 'QR Hardware Wallet Device',\n ledger = 'Ledger',\n}\n\n/**\n * @type KeyringControllerState\n *\n * Keyring controller state\n * @property vault - Encrypted string representing keyring data\n * @property isUnlocked - Whether vault is unlocked\n * @property keyringTypes - Account types\n * @property keyrings - Group of accounts\n * @property encryptionKey - Keyring encryption key\n * @property encryptionSalt - Keyring encryption salt\n */\nexport type KeyringControllerState = {\n vault?: string;\n isUnlocked: boolean;\n keyrings: KeyringObject[];\n encryptionKey?: string;\n encryptionSalt?: string;\n};\n\nexport type KeyringControllerMemState = Omit<\n KeyringControllerState,\n 'vault' | 'encryptionKey' | 'encryptionSalt'\n>;\n\nexport type KeyringControllerGetStateAction = {\n type: `${typeof name}:getState`;\n handler: () => KeyringControllerState;\n};\n\nexport type KeyringControllerSignMessageAction = {\n type: `${typeof name}:signMessage`;\n handler: KeyringController['signMessage'];\n};\n\nexport type KeyringControllerSignPersonalMessageAction = {\n type: `${typeof name}:signPersonalMessage`;\n handler: KeyringController['signPersonalMessage'];\n};\n\nexport type KeyringControllerSignTypedMessageAction = {\n type: `${typeof name}:signTypedMessage`;\n handler: KeyringController['signTypedMessage'];\n};\n\nexport type KeyringControllerDecryptMessageAction = {\n type: `${typeof name}:decryptMessage`;\n handler: KeyringController['decryptMessage'];\n};\n\nexport type KeyringControllerGetEncryptionPublicKeyAction = {\n type: `${typeof name}:getEncryptionPublicKey`;\n handler: KeyringController['getEncryptionPublicKey'];\n};\n\nexport type KeyringControllerGetKeyringsByTypeAction = {\n type: `${typeof name}:getKeyringsByType`;\n handler: KeyringController['getKeyringsByType'];\n};\n\nexport type KeyringControllerGetKeyringForAccountAction = {\n type: `${typeof name}:getKeyringForAccount`;\n handler: KeyringController['getKeyringForAccount'];\n};\n\nexport type KeyringControllerGetAccountsAction = {\n type: `${typeof name}:getAccounts`;\n handler: KeyringController['getAccounts'];\n};\n\nexport type KeyringControllerStateChangeEvent = {\n type: `${typeof name}:stateChange`;\n payload: [KeyringControllerState, Patch[]];\n};\n\nexport type KeyringControllerAccountRemovedEvent = {\n type: `${typeof name}:accountRemoved`;\n payload: [string];\n};\n\nexport type KeyringControllerLockEvent = {\n type: `${typeof name}:lock`;\n payload: [];\n};\n\nexport type KeyringControllerUnlockEvent = {\n type: `${typeof name}:unlock`;\n payload: [];\n};\n\nexport type KeyringControllerQRKeyringStateChangeEvent = {\n type: `${typeof name}:qrKeyringStateChange`;\n payload: [ReturnType<IQRKeyringState['getState']>];\n};\n\nexport type KeyringControllerActions =\n | KeyringControllerGetStateAction\n | KeyringControllerSignMessageAction\n | KeyringControllerSignPersonalMessageAction\n | KeyringControllerSignTypedMessageAction\n | KeyringControllerDecryptMessageAction\n | KeyringControllerGetEncryptionPublicKeyAction\n | KeyringControllerGetAccountsAction\n | KeyringControllerGetKeyringsByTypeAction\n | KeyringControllerGetKeyringForAccountAction;\n\nexport type KeyringControllerEvents =\n | KeyringControllerStateChangeEvent\n | KeyringControllerLockEvent\n | KeyringControllerUnlockEvent\n | KeyringControllerAccountRemovedEvent\n | KeyringControllerQRKeyringStateChangeEvent;\n\nexport type KeyringControllerMessenger = RestrictedControllerMessenger<\n typeof name,\n KeyringControllerActions,\n KeyringControllerEvents,\n string,\n string\n>;\n\nexport type KeyringControllerOptions = {\n removeIdentity: PreferencesController['removeIdentity'];\n syncIdentities: PreferencesController['syncIdentities'];\n updateIdentities: PreferencesController['updateIdentities'];\n setSelectedAddress: PreferencesController['setSelectedAddress'];\n setAccountLabel?: PreferencesController['setAccountLabel'];\n encryptor?: any;\n keyringBuilders?: { (): Keyring<Json>; type: string }[];\n cacheEncryptionKey?: boolean;\n messenger: KeyringControllerMessenger;\n state?: { vault?: string };\n};\n\n/**\n * @type KeyringObject\n *\n * Keyring object to return in fullUpdate\n * @property type - Keyring type\n * @property accounts - Associated accounts\n */\nexport type KeyringObject = {\n accounts: string[];\n type: string;\n};\n\n/**\n * A strategy for importing an account\n */\nexport enum AccountImportStrategy {\n privateKey = 'privateKey',\n json = 'json',\n}\n\n/**\n * The `signTypedMessage` version\n *\n * @see https://docs.metamask.io/guide/signing-data.html\n */\nexport enum SignTypedDataVersion {\n V1 = 'V1',\n V3 = 'V3',\n V4 = 'V4',\n}\n\nconst defaultState: KeyringControllerState = {\n isUnlocked: false,\n keyrings: [],\n};\n\n/**\n * Assert that the given keyring has an exportable\n * mnemonic.\n *\n * @param keyring - The keyring to check\n * @throws When the keyring does not have a mnemonic\n */\nfunction assertHasUint8ArrayMnemonic(\n keyring: Keyring<Json>,\n): asserts keyring is Keyring<Json> & { mnemonic: Uint8Array } {\n if (\n !(\n hasProperty(keyring, 'mnemonic') && keyring.mnemonic instanceof Uint8Array\n )\n ) {\n throw new Error(\"Can't get mnemonic bytes from keyring\");\n }\n}\n\n/**\n * Controller responsible for establishing and managing user identity.\n *\n * This class is a wrapper around the `eth-keyring-controller` package. The\n * `eth-keyring-controller` manages the \"vault\", which is an encrypted store of private keys, and\n * it manages the wallet \"lock\" state. This wrapper class has convenience methods for interacting\n * with the internal keyring controller and handling certain complex operations that involve the\n * keyrings.\n */\nexport class KeyringController extends BaseControllerV2<\n typeof name,\n KeyringControllerState,\n KeyringControllerMessenger\n> {\n private readonly mutex = new Mutex();\n\n private readonly removeIdentity: PreferencesController['removeIdentity'];\n\n private readonly syncIdentities: PreferencesController['syncIdentities'];\n\n private readonly updateIdentities: PreferencesController['updateIdentities'];\n\n private readonly setSelectedAddress: PreferencesController['setSelectedAddress'];\n\n private readonly setAccountLabel?: PreferencesController['setAccountLabel'];\n\n #keyring: EthKeyringController;\n\n #qrKeyringStateListener?: (\n state: ReturnType<IQRKeyringState['getState']>,\n ) => void;\n\n /**\n * Creates a KeyringController instance.\n *\n * @param opts - Initial options used to configure this controller\n * @param opts.removeIdentity - Remove the identity with the given address.\n * @param opts.syncIdentities - Sync identities with the given list of addresses.\n * @param opts.updateIdentities - Generate an identity for each address given that doesn't already have an identity.\n * @param opts.setSelectedAddress - Set the selected address.\n * @param opts.setAccountLabel - Set a new name for account.\n * @param opts.encryptor - An optional object for defining encryption schemes.\n * @param opts.keyringBuilders - Set a new name for account.\n * @param opts.cacheEncryptionKey - Whether to cache or not encryption key.\n * @param opts.messenger - A restricted controller messenger.\n * @param opts.state - Initial state to set on this controller.\n */\n constructor({\n removeIdentity,\n syncIdentities,\n updateIdentities,\n setSelectedAddress,\n setAccountLabel,\n encryptor,\n keyringBuilders,\n cacheEncryptionKey = false,\n messenger,\n state,\n }: KeyringControllerOptions) {\n super({\n name,\n metadata: {\n vault: { persist: true, anonymous: false },\n isUnlocked: { persist: false, anonymous: true },\n keyrings: { persist: false, anonymous: false },\n encryptionKey: { persist: false, anonymous: false },\n encryptionSalt: { persist: false, anonymous: false },\n },\n messenger,\n state: {\n ...defaultState,\n ...state,\n },\n });\n\n const additionalKeyringBuilders = [\n keyringBuilderFactory(QRKeyring as unknown as KeyringClass<Json>),\n keyringBuilderFactory(LedgerKeyring as unknown as KeyringClass<Json>),\n ];\n\n this.#keyring = new EthKeyringController(\n Object.assign(\n { initState: state },\n {\n encryptor,\n cacheEncryptionKey,\n keyringBuilders: [\n ...(keyringBuilders && Array.isArray(keyringBuilders)\n ? keyringBuilders\n : []),\n ...additionalKeyringBuilders,\n ],\n },\n ),\n );\n this.#keyring.memStore.subscribe(this.#fullUpdate.bind(this));\n this.#keyring.store.subscribe(this.#fullUpdate.bind(this));\n this.#keyring.on('lock', this.#handleLock.bind(this));\n this.#keyring.on('unlock', this.#handleUnlock.bind(this));\n\n this.removeIdentity = removeIdentity;\n this.syncIdentities = syncIdentities;\n this.updateIdentities = updateIdentities;\n this.setSelectedAddress = setSelectedAddress;\n this.setAccountLabel = setAccountLabel;\n\n this.#registerMessageHandlers();\n }\n\n /**\n * Adds a new account to the default (first) HD seed phrase keyring.\n *\n * @param accountCount - Number of accounts before adding a new one, used to\n * make the method idempotent.\n * @returns Promise resolving to keyring current state and added account\n * address.\n */\n async addNewAccount(accountCount?: number): Promise<{\n keyringState: KeyringControllerMemState;\n addedAccountAddress: string;\n }> {\n const primaryKeyring = this.#keyring.getKeyringsByType('HD Key Tree')[0];\n /* istanbul ignore if */\n if (!primaryKeyring) {\n throw new Error('No HD keyring found');\n }\n const oldAccounts = await this.#keyring.getAccounts();\n\n if (accountCount && oldAccounts.length !== accountCount) {\n if (accountCount > oldAccounts.length) {\n throw new Error('Account out of sequence');\n }\n // we return the account already existing at index `accountCount`\n const primaryKeyringAccounts = await primaryKeyring.getAccounts();\n return {\n keyringState: this.#getMemState(),\n addedAccountAddress: primaryKeyringAccounts[accountCount],\n };\n }\n\n await this.#keyring.addNewAccount(primaryKeyring);\n const newAccounts = await this.#keyring.getAccounts();\n\n await this.verifySeedPhrase();\n\n this.updateIdentities(newAccounts);\n const addedAccountAddress = newAccounts.find(\n (selectedAddress: string) => !oldAccounts.includes(selectedAddress),\n );\n\n assertIsStrictHexString(addedAccountAddress);\n return {\n keyringState: this.#getMemState(),\n addedAccountAddress,\n };\n }\n\n /**\n * Adds a new account to the specified keyring.\n *\n * @param keyring - Keyring to add the account to.\n * @param accountCount - Number of accounts before adding a new one, used to make the method idempotent.\n * @returns Promise resolving to keyring current state and added account\n */\n async addNewAccountForKeyring(\n keyring: Keyring<Json>,\n accountCount?: number,\n ): Promise<Hex> {\n const oldAccounts = await this.getAccounts();\n\n if (accountCount && oldAccounts.length !== accountCount) {\n if (accountCount > oldAccounts.length) {\n throw new Error('Account out of sequence');\n }\n\n const existingAccount = oldAccounts[accountCount];\n assertIsStrictHexString(existingAccount);\n\n return existingAccount;\n }\n\n await this.#keyring.addNewAccount(keyring);\n const addedAccountAddress = (await this.getAccounts()).find(\n (selectedAddress) => !oldAccounts.includes(selectedAddress),\n );\n assertIsStrictHexString(addedAccountAddress);\n\n this.updateIdentities(await this.#keyring.getAccounts());\n\n return addedAccountAddress;\n }\n\n /**\n * Adds a new account to the default (first) HD seed phrase keyring without updating identities in preferences.\n *\n * @returns Promise resolving to current state when the account is added.\n */\n async addNewAccountWithoutUpdate(): Promise<KeyringControllerMemState> {\n const primaryKeyring = this.#keyring.getKeyringsByType('HD Key Tree')[0];\n /* istanbul ignore if */\n if (!primaryKeyring) {\n throw new Error('No HD keyring found');\n }\n await this.#keyring.addNewAccount(primaryKeyring);\n await this.verifySeedPhrase();\n return this.#getMemState();\n }\n\n /**\n * Effectively the same as creating a new keychain then populating it\n * using the given seed phrase.\n *\n * @param password - Password to unlock keychain.\n * @param seed - A BIP39-compliant seed phrase as Uint8Array,\n * either as a string or an array of UTF-8 bytes that represent the string.\n * @returns Promise resolving to the restored keychain object.\n */\n async createNewVaultAndRestore(\n password: string,\n seed: Uint8Array,\n ): Promise<KeyringControllerMemState> {\n const releaseLock = await this.mutex.acquire();\n if (!password || !password.length) {\n throw new Error('Invalid password');\n }\n\n try {\n this.updateIdentities([]);\n await this.#keyring.createNewVaultAndRestore(password, seed);\n this.updateIdentities(await this.#keyring.getAccounts());\n return this.#getMemState();\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Create a new primary keychain and wipe any previous keychains.\n *\n * @param password - Password to unlock the new vault.\n * @returns Newly-created keychain object.\n */\n async createNewVaultAndKeychain(password: string) {\n const releaseLock = await this.mutex.acquire();\n try {\n const accounts = await this.getAccounts();\n if (!accounts.length) {\n await this.#keyring.createNewVaultAndKeychain(password);\n this.updateIdentities(await this.getAccounts());\n }\n return this.#getMemState();\n } finally {\n releaseLock();\n }\n }\n\n /**\n * Adds a new keyring of the given `type`.\n *\n * @param type - Keyring type name.\n * @param opts - Keyring options.\n * @throws If a builder for the given `type` does not exist.\n * @returns Promise resolving to the added keyring.\n */\n async addNewKeyring(\n type: KeyringTypes | string,\n opts?: unknown,\n ): Promise<unknown> {\n if (type === KeyringTypes.qr) {\n return this.getOrAddQRKeyring();\n }\n\n return this.#keyring.addNewKeyring(type, opts);\n }\n\n /**\n * Method to verify a given password validity. Throws an\n * error if the password is invalid.\n *\n * @param password - Password of the keyring.\n */\n async verifyPassword(password: string) {\n await this.#keyring.verifyPassword(password);\n }\n\n /**\n * Returns the status of the vault.\n *\n * @returns Boolean returning true if the vault is unlocked.\n */\n isUnlocked(): boolean {\n return this.state.isUnlocked;\n }\n\n /**\n * Gets the seed phrase of the HD keyring.\n *\n * @param password - Password of the keyring.\n * @returns Promise resolving to the seed phrase.\n */\n async exportSeedPhrase(password: string): Promise<Uint8Array> {\n await this.verifyPassword(password);\n assertHasUint8ArrayMnemonic(this.#keyring.keyrings[0]);\n return this.#keyring.keyrings[0].mnemonic;\n }\n\n /**\n * Gets the private key from the keyring controlling an address.\n *\n * @param password - Password of the keyring.\n * @param address - Address to export.\n * @returns Promise resolving to the private key for an address.\n */\n async exportAccount(password: string, address: string): Promise<string> {\n await this.verifyPassword(password);\n return this.#keyring.exportAccount(address);\n }\n\n /**\n * Returns the public addresses of all accounts for the current keyring.\n *\n * @returns A promise resolving to an array of addresses.\n */\n getAccounts(): Promise<string[]> {\n return this.#keyring.getAccounts();\n }\n\n /**\n * Get encryption public key.\n *\n * @param account - An account address.\n * @param opts - Additional encryption options.\n * @throws If the `account` does not exist or does not support the `getEncryptionPublicKey` method\n * @returns Promise resolving to encyption public key of the `account` if one exists.\n */\n async getEncryptionPublicKey(\n account: string,\n opts?: Record<string, unknown>,\n ): Promise<string> {\n return this.#keyring.getEncryptionPublicKey(account, opts);\n }\n\n /**\n * Attempts to decrypt the provided message parameters.\n *\n * @param messageParams - The decryption message parameters.\n * @param messageParams.from - The address of the account you want to use to decrypt the message.\n * @param messageParams.data - The encrypted data that you want to decrypt.\n * @returns The raw decryption result.\n */\n async decryptMessage(messageParams: {\n from: string;\n data: Eip1024EncryptedData;\n }): Promise<string> {\n return this.#keyring.decryptMessage(messageParams);\n }\n\n /**\n * Returns the currently initialized keyring that manages\n * the specified `address` if one exists.\n *\n * @deprecated Use of this method is discouraged as actions executed directly on\n * keyrings are not being reflected in the KeyringController state and not\n * persisted in the vault.\n * @param account - An account address.\n * @returns Promise resolving to keyring of the `account` if one exists.\n */\n async getKeyringForAccount(account: string): Promise<unknown> {\n return this.#keyring.getKeyringForAccount(account);\n }\n\n /**\n * Returns all keyrings of the given type.\n *\n * @deprecated Use of this method is discouraged as actions executed directly on\n * keyrings are not being reflected in the KeyringController state and not\n * persisted in the vault.\n * @param type - Keyring type name.\n * @returns An array of keyrings of the given type.\n */\n getKeyringsByType(type: KeyringTypes | string): unknown[] {\n return this.#keyring.getKeyringsByType(type);\n }\n\n /**\n * Persist all serialized keyrings in the vault.\n *\n * @returns Promise resolving with `true` value when the\n * operation completes.\n */\n async persistAllKeyrings(): Promise<boolean> {\n return this.#keyring.persistAllKeyrings();\n }\n\n /**\n * Imports an account with the specified import strategy.\n *\n * @param strategy - Import strategy name.\n * @param args - Array of arguments to pass to the underlying stategy.\n * @throws Will throw when passed an unrecognized strategy.\n * @returns Promise resolving to keyring current state and imported account\n * address.\n */\n async importAccountWithStrategy(\n strategy: AccountImportStrategy,\n args: any[],\n ): Promise<{\n keyringState: KeyringControllerMemState;\n importedAccountAddress: string;\n }> {\n let privateKey;\n switch (strategy) {\n case 'privateKey':\n const [importedKey] = args;\n if (!importedKey) {\n throw new Error('Cannot import an empty key.');\n }\n const prefixed = addHexPrefix(importedKey);\n\n let bufferedPrivateKey;\n try {\n bufferedPrivateKey = toBuffer(prefixed);\n } catch {\n throw new Error('Cannot import invalid private key.');\n }\n\n /* istanbul ignore if */\n if (\n !isValidPrivate(bufferedPrivateKey) ||\n // ensures that the key is 64 bytes long\n getBinarySize(prefixed) !== 64 + '0x'.length\n ) {\n throw new Error('Cannot import invalid private key.');\n }\n\n privateKey = stripHexPrefix(prefixed);\n break;\n case 'json':\n let wallet;\n const [input, password] = args;\n try {\n wallet = importers.fromEtherWallet(input, password);\n } catch (e) {\n wallet = wallet || (await Wallet.fromV3(input, password, true));\n }\n privateKey = bufferToHex(wallet.getPrivateKey());\n break;\n default:\n throw new Error(`Unexpected import strategy: '${strategy}'`);\n }\n const newKeyring = await this.#keyring.addNewKeyring(KeyringTypes.simple, [\n privateKey,\n ]);\n const accounts = await newKeyring.getAccounts();\n const allAccounts = await this.#keyring.getAccounts();\n this.updateIdentities(allAccounts);\n return {\n keyringState: this.#getMemState(),\n importedAccountAddress: accounts[0],\n };\n }\n\n /**\n * Removes an account from keyring state.\n *\n * @param address - Address of the account to remove.\n * @fires KeyringController:accountRemoved\n * @returns Promise resolving current state when this account removal completes.\n */\n async removeAccount(address: Hex): Promise<KeyringControllerMemState> {\n this.removeIdentity(address);\n await this.#keyring.removeAccount(address);\n this.messagingSystem.publish(`${name}:accountRemoved`, address);\n return this.#getMemState();\n }\n\n /**\n * Deallocates all secrets and locks the wallet.\n *\n * @returns Promise resolving to current state.\n */\n async setLocked(): Promise<KeyringControllerMemState> {\n this.#unsubscribeFromQRKeyringsEvents();\n await this.#keyring.setLocked();\n return this.#getMemState();\n }\n\n /**\n * Signs message by calling down into a specific keyring.\n *\n * @param messageParams - PersonalMessageParams object to sign.\n * @returns Promise resolving to a signed message string.\n */\n signMessage(messageParams: PersonalMessageParams) {\n if (!messageParams.data) {\n throw new Error(\"Can't sign an empty message\");\n }\n return this.#keyring.signMessage(messageParams);\n }\n\n /**\n * Signs personal message by calling down into a specific keyring.\n *\n * @param messageParams - PersonalMessageParams object to sign.\n * @returns Promise resolving to a signed message string.\n */\n signPersonalMessage(messageParams: PersonalMessageParams) {\n return this.#keyring.signPersonalMessage(messageParams);\n }\n\n /**\n * Signs typed message by calling down into a specific keyring.\n *\n * @param messageParams - TypedMessageParams object to sign.\n * @param version - Compatibility version EIP712.\n * @throws Will throw when passed an unrecognized version.\n * @returns Promise resolving to a signed message string or an error if any.\n */\n async signTypedMessage(\n messageParams: TypedMessageParams,\n version: SignTypedDataVersion,\n ): Promise<string> {\n try {\n if (\n ![\n SignTypedDataVersion.V1,\n SignTypedDataVersion.V3,\n SignTypedDataVersion.V4,\n ].includes(version)\n ) {\n throw new Error(`Unexpected signTypedMessage version: '${version}'`);\n }\n\n const ledgerKeyring = await this.getLedgerKeyring();\n const isLedgerAccount = await ledgerKeyring.managesAccount(\n normalizeAddress(messageParams.from || '') || '',\n );\n\n if (isLedgerAccount) {\n return await this.#keyring.signTypedMessage(\n {\n from: messageParams.from,\n data: messageParams.data as\n | Record<string, unknown>\n | Record<string, unknown>[],\n },\n { version },\n );\n }\n\n return await this.#keyring.signTypedMessage(\n {\n from: messageParams.from,\n data:\n version !== SignTypedDataVersion.V1 &&\n typeof messageParams.data === 'string'\n ? JSON.parse(messageParams.data)\n : messageParams.data,\n },\n { version },\n );\n } catch (error) {\n throw new Error(`Keyring Controller signTypedMessage: ${error}`);\n }\n }\n\n /**\n * Signs a transaction by calling down into a specific keyring.\n *\n * @param transaction - Transaction object to sign. Must be a `ethereumjs-tx` transaction instance.\n * @param from - Address to sign from, should be in keychain.\n * @returns Promise resolving to a signed transaction string.\n */\n signTransaction(\n transaction: TypedTransaction,\n from: string,\n ): Promise<TxData> {\n return this.#keyring.signTransaction(transaction, from);\n }\n\n /**\n * Attempts to decrypt the current vault and load its keyrings,\n * using the given encryption key and salt.\n *\n * @param encryptionKey - Key to unlock the keychain.\n * @param encryptionSalt - Salt to unlock the keychain.\n * @returns Promise resolving to the current state.\n */\n async submitEncryptionKey(\n encryptionKey: string,\n encryptionSalt: string,\n ): Promise<KeyringControllerMemState> {\n await this.#keyring.submitEncryptionKey(encryptionKey, encryptionSalt);\n\n const qrKeyring = this.getQRKeyring();\n if (qrKeyring) {\n // if there is a QR keyring, we need to subscribe\n // to its events after unlocking the vault\n this.#subscribeToQRKeyringEvents(qrKeyring);\n }\n\n return this.#getMemState();\n }\n\n /**\n * Attempts to decrypt the current vault and load its keyrings,\n * using the given password.\n *\n * @param password - Password to unlock the keychain.\n * @returns Promise resolving to the current state.\n */\n async submitPassword(password: string): Promise<KeyringControllerMemState> {\n await this.#keyring.submitPassword(password);\n const accounts = await this.#keyring.getAccounts();\n\n const qrKeyring = this.getQRKeyring();\n if (qrKeyring) {\n // if there is a QR keyring, we need to subscribe\n // to its events after unlocking the vault\n this.#subscribeToQRKeyringEvents(qrKeyring);\n }\n\n await this.syncIdentities(accounts);\n return this.#getMemState();\n }\n\n /**\n * Verifies the that the seed phrase restores the current keychain's accounts.\n *\n * @returns Promise resolving to the seed phrase as Uint8Array.\n */\n async verifySeedPhrase(): Promise<Uint8Array> {\n const primaryKeyring = this.#keyring.getKeyringsByType(KeyringTypes.hd)[0];\n /* istanbul ignore if */\n if (!primaryKeyring) {\n throw new Error('No HD keyring found.');\n }\n\n assertHasUint8ArrayMnemonic(primaryKeyring);\n\n const seedWords = primaryKeyring.mnemonic;\n const accounts = await primaryKeyring.getAccounts();\n /* istanbul ignore if */\n if (accounts.length === 0) {\n throw new Error('Cannot verify an empty keyring.');\n }\n\n // The HD Keyring Builder is a default keyring builder\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const hdKeyringBuilder = this.#keyring.getKeyringBuilderForType(\n KeyringTypes.hd,\n )!;\n\n const hdKeyring = hdKeyringBuilder();\n // @ts-expect-error @metamask/eth-hd-keyring correctly handles\n // Uint8Array seed phrases in the `deserialize` method.\n hdKeyring.deserialize({\n mnemonic: seedWords,\n numberOfAccounts: accounts.length,\n });\n const testAccounts = await hdKeyring.getAccounts();\n /* istanbul ignore if */\n if (testAccounts.length !== accounts.length) {\n throw new Error('Seed phrase imported incorrect number of accounts.');\n }\n\n testAccounts.forEach((account: string, i: number) => {\n /* istanbul ignore if */\n if (account.toLowerCase() !== accounts[i].toLowerCase()) {\n throw new Error('Seed phrase imported different accounts.');\n }\n });\n\n return seedWords;\n }\n\n // QR Hardware related methods\n\n /**\n * Get QR Hardware keyring.\n *\n * @returns The QR Keyring if defined, otherwise undefined\n */\n getQRKeyring(): QRKeyring | undefined {\n // QRKeyring is not yet compatible with Keyring type from @metamask/utils\n return this.#keyring.getKeyringsByType(\n KeyringTypes.qr,\n )[0] as unknown as QRKeyring;\n }\n\n /**\n * Get QR hardware keyring. If it doesn't exist, add it.\n *\n * @returns The added keyring\n */\n async getOrAddQRKeyring(): Promise<QRKeyring> {\n return this.getQRKeyring() || (await this.#addQRKeyring());\n }\n\n async restoreQRKeyring(serialized: any): Promise<void> {\n (await this.getOrAddQRKeyring()).deserialize(serialized);\n await this.#keyring.persistAllKeyrings();\n this.updateIdentities(await this.#keyring.getAccounts());\n }\n\n async resetQRKeyringState(): Promise<void> {\n (await this.getOrAddQRKeyring()).resetStore();\n }\n\n async getQRKeyringState(): Promise<IQRKeyringState> {\n return (await this.getOrAddQRKeyring()).getMemStore();\n }\n\n async submitQRCryptoHDKey(cryptoHDKey: string): Promise<void> {\n (await this.getOrAddQRKeyring()).submitCryptoHDKey(cryptoHDKey);\n }\n\n async submitQRCryptoAccount(cryptoAccount: string): Promise<void> {\n (await this.getOrAddQRKeyring()).submitCryptoAccount(cryptoAccount);\n }\n\n async submitQRSignature(\n requestId: string,\n ethSignature: string,\n ): Promise<void> {\n (await this.getOrAddQRKeyring()).submitSignature(requestId, ethSignature);\n }\n\n async cancelQRSignRequest(): Promise<void> {\n (await this.getOrAddQRKeyring()).cancelSignRequest();\n }\n\n /**\n * Cancels qr keyring sync.\n */\n async cancelQRSynchronization(): Promise<void> {\n // eslint-disable-next-line n/no-sync\n (await this.getOrAddQRKeyring()).cancelSync();\n }\n\n async connectQRHardware(\n page: number,\n ): Promise<{ balance: string; address: string; index: number }[]> {\n try {\n const keyring = await this.getOrAddQRKeyring();\n let accounts;\n switch (page) {\n case -1:\n accounts = await keyring.getPreviousPage();\n break;\n case 1:\n accounts = await keyring.getNextPage();\n break;\n default:\n accounts = await keyring.getFirstPage();\n }\n return accounts.map((account: any) => {\n return {\n ...account,\n balance: '0x0',\n };\n });\n } catch (e) {\n // TODO: Add test case for when keyring throws\n /* istanbul ignore next */\n throw new Error(`Unspecified error when connect QR Hardware, ${e}`);\n }\n }\n\n async unlockQRHardwareWalletAccount(index: number): Promise<void> {\n const keyring = await this.getOrAddQRKeyring();\n\n keyring.setAccountToUnlock(index);\n const oldAccounts = await this.#keyring.getAccounts();\n // QRKeyring is not yet compatible with Keyring from\n // @metamask/utils, but we can use the `addNewAccount` method\n // as it internally calls `addAccounts` from on the keyring instance,\n // which is supported by QRKeyring API.\n await this.#keyring.addNewAccount(keyring as unknown as Keyring<Json>);\n const newAccounts = await this.#keyring.getAccounts();\n this.updateIdentities(newAccounts);\n newAccounts.forEach((address: string) => {\n if (!oldAccounts.includes(address)) {\n if (this.setAccountLabel) {\n this.setAccountLabel(address, `${keyring.getName()} ${index}`);\n }\n this.setSelectedAddress(address);\n }\n });\n await this.#keyring.persistAllKeyrings();\n }\n\n async getAccountKeyringType(account: string): Promise<string> {\n return (await this.#keyring.getKeyringForAccount(account)).type;\n }\n\n async forgetQRDevice(): Promise<void> {\n const keyring = await this.getOrAddQRKeyring();\n keyring.forgetDevice();\n const accounts = (await this.#keyring.getAccounts()) as string[];\n accounts.forEach((account) => {\n this.setSelectedAddress(account);\n });\n await this.#keyring.persistAllKeyrings();\n }\n\n /**\n * Constructor helper for registering this controller's messaging system\n * actions.\n */\n #registerMessageHandlers() {\n this.messagingSystem.registerActionHandler(\n `${name}:signMessage`,\n this.signMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:signPersonalMessage`,\n this.signPersonalMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:signTypedMessage`,\n this.signTypedMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:decryptMessage`,\n this.decryptMessage.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getEncryptionPublicKey`,\n this.getEncryptionPublicKey.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getAccounts`,\n this.getAccounts.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getKeyringsByType`,\n this.getKeyringsByType.bind(this),\n );\n\n this.messagingSystem.registerActionHandler(\n `${name}:getKeyringForAccount`,\n this.getKeyringForAccount.bind(this),\n );\n }\n\n /**\n * Add qr hardware keyring.\n *\n * @returns The added keyring\n * @throws If a QRKeyring builder is not provided\n * when initializing the controller\n */\n async #addQRKeyring(): Promise<QRKeyring> {\n // QRKeyring is not yet compatible with Keyring type from @metamask/utils\n const qrKeyring = (await this.#keyring.addNewKeyring(\n KeyringTypes.qr,\n )) as unknown as QRKeyring;\n\n this.#subscribeToQRKeyringEvents(qrKeyring);\n\n return qrKeyring;\n }\n\n /**\n * Subscribe to a QRKeyring state change events and\n * forward them through the messaging system.\n *\n * @param qrKeyring - The QRKeyring instance to subscribe to\n */\n #subscribeToQRKeyringEvents(qrKeyring: QRKeyring) {\n this.#qrKeyringStateListener = (state) => {\n this.messagingSystem.publish(`${name}:qrKeyringStateChange`, state);\n };\n\n qrKeyring.getMemStore().subscribe(this.#qrKeyringStateListener);\n }\n\n #unsubscribeFromQRKeyringsEvents() {\n const qrKeyrings = this.#keyring.getKeyringsByType(\n KeyringTypes.qr,\n ) as unknown as QRKeyring[];\n\n qrKeyrings.forEach((qrKeyring) => {\n if (this.#qrKeyringStateListener) {\n qrKeyring.getMemStore().unsubscribe(this.#qrKeyringStateListener);\n }\n });\n }\n\n /**\n * Sync controller state with current keyring store\n * and memStore states.\n *\n * @fires KeyringController:stateChange\n */\n #fullUpdate() {\n this.update(() => ({\n ...this.#keyring.store.getState(),\n ...this.#keyring.memStore.getState(),\n }));\n }\n\n /**\n * Handle keyring lock event.\n *\n * @fires KeyringController:lock\n */\n #handleLock() {\n this.messagingSystem.publish(`${name}:lock`);\n }\n\n /**\n * Handle keyring unlock event.\n *\n * @fires KeyringController:unlock\n */\n #handleUnlock() {\n this.messagingSystem.publish(`${name}:unlock`);\n }\n\n #getMemState(): KeyringControllerMemState {\n return {\n isUnlocked: this.state.isUnlocked,\n keyrings: this.state.keyrings,\n };\n }\n\n // Ledger Related methods\n\n private async addLedgerKeyring(): Promise<LedgerKeyring> {\n return (await this.#keyring.addNewKeyring(\n KeyringTypes.ledger,\n )) as unknown as LedgerKeyring;\n }\n\n /**\n * Retrieve the existing LedgerKeyring or create a new one.\n *\n * @returns The stored Ledger Keyring\n */\n async getLedgerKeyring(): Promise<LedgerKeyring> {\n const keyring = this.#keyring.getKeyringsByType(\n KeyringTypes.ledger,\n )[0] as unknown as LedgerKeyring;\n\n if (keyring) {\n return keyring;\n }\n\n return await this.addLedgerKeyring();\n }\n\n /**\n * Restores the Ledger Keyring. This is only used at the time the user resets the account's password at the moment.\n *\n * @param keyringSerialized - The serialized keyring;\n */\n async restoreLedgerKeyring(\n keyringSerialized: SerializedLedgerKeyring,\n ): Promise<void> {\n (await this.getLedgerKeyring()).deserialize(keyringSerialized);\n this.updateIdentities(await this.#keyring.getAccounts());\n await this.#fullUpdate();\n }\n\n /**\n * Connects to the ledger device by requesting some metadata from it.\n *\n * @param transport - The transport to use to connect to the device\n * @param deviceId - The device ID to connect to\n * @returns The name of the currently open application on the device\n */\n async connectLedgerHardware(\n transport: Transport,\n deviceId: string,\n ): Promise<string> {\n const keyring = await this.getLedgerKeyring();\n keyring.setTransport(transport, deviceId);\n\n const { appName } = await keyring.getAppAndVersion();\n\n return appName;\n }\n\n /**\n * Retrieve the first account from the Ledger device.\n *\n * @returns The default (first) account on the device\n */\n async unlockLedgerDefaultAccount(): Promise<{\n address: string;\n balance: string;\n }> {\n const keyring = await this.getLedgerKeyring();\n const oldAccounts = await this.#keyring.getAccounts();\n await this.#keyring.addNewAccount(keyring as unknown as Keyring<Json>);\n const newAccounts = await this.#keyring.getAccounts();\n\n this.updateIdentities(newAccounts);\n newAccounts.forEach((address: string) => {\n if (!oldAccounts.includes(address)) {\n if (this.setAccountLabel) {\n // The first ledger account is always returned.\n this.setAccountLabel(address, `${keyring.getName()} 1`);\n }\n this.setSelectedAddress(address);\n }\n });\n await this.#keyring.persistAllKeyrings();\n await this.#fullUpdate();\n\n const address = await keyring.getDefaultAccount();\n return {\n address,\n balance: `0x0`,\n };\n }\n\n /**\n * Automatically opens the Ethereum app on the Ledger device.\n */\n async openEthereumAppOnLedger(): Promise<void> {\n const keyring = await this.getLedgerKeyring();\n await keyring.openEthApp();\n }\n\n /**\n * Automatically closes the current app on the Ledger device.\n */\n async closeRunningAppOnLedger(): Promise<void> {\n const keyring = await this.getLedgerKeyring();\n const { appName } = await keyring.getAppAndVersion();\n\n // BOLOS means we are on the dashboard we don't need to close anything\n if (appName !== 'BOLOS') {\n await keyring.quitApp();\n }\n }\n\n /**\n * Forgets the ledger keyring's previous device specific state.\n */\n async forgetLedger(): Promise<void> {\n const keyring = await this.getLedgerKeyring();\n keyring.forgetDevice();\n\n const accounts: string[] = await this.#keyring.getAccounts();\n this.setSelectedAddress(accounts[0]);\n\n await this.#keyring.persistAllKeyrings();\n await this.#fullUpdate();\n }\n}\n\nexport default KeyringController;\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerializedKeyringTypes.d.ts","sourceRoot":"","sources":["../../src/types/SerializedKeyringTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SerializedKeyringTypes.js","sourceRoot":"","sources":["../../src/types/SerializedKeyringTypes.ts"],"names":[],"mappings":"","sourcesContent":["export interface SerializedLedgerKeyring {\n accounts: { address: string; hdPath: string }[];\n deviceId: string;\n hdPath: string;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@metamask-previews/keyring-controller",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.0-preview.1b84247",
|
|
4
4
|
"description": "Stores identities seen in the wallet and manages interactions such as signing",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"MetaMask",
|
|
@@ -29,10 +29,13 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"@keystonehq/metamask-airgapped-keyring": "^0.13.1",
|
|
32
|
+
"@ledgerhq/hw-transport": "6.24.1",
|
|
33
|
+
"@ledgerhq/metamask-keyring": "0.3.3",
|
|
32
34
|
"@metamask/base-controller": "^3.2.1",
|
|
33
35
|
"@metamask/eth-keyring-controller": "^13.0.1",
|
|
34
|
-
"@metamask/
|
|
35
|
-
"@metamask/
|
|
36
|
+
"@metamask/eth-sig-util": "^7.0.0",
|
|
37
|
+
"@metamask/message-manager": "^7.3.3",
|
|
38
|
+
"@metamask/preferences-controller": "^4.4.1",
|
|
36
39
|
"@metamask/utils": "^6.2.0",
|
|
37
40
|
"async-mutex": "^0.2.6",
|
|
38
41
|
"ethereumjs-util": "^7.0.10",
|
|
@@ -44,20 +47,19 @@
|
|
|
44
47
|
"@ethereumjs/tx": "^4.2.0",
|
|
45
48
|
"@keystonehq/bc-ur-registry-eth": "^0.9.0",
|
|
46
49
|
"@metamask/auto-changelog": "^3.1.0",
|
|
47
|
-
"@metamask/eth-sig-util": "^7.0.0",
|
|
48
50
|
"@metamask/scure-bip39": "^2.1.0",
|
|
49
51
|
"@types/jest": "^27.4.1",
|
|
50
52
|
"deepmerge": "^4.2.2",
|
|
51
53
|
"jest": "^27.5.1",
|
|
52
54
|
"sinon": "^9.2.4",
|
|
53
55
|
"ts-jest": "^27.1.4",
|
|
54
|
-
"typedoc": "^0.
|
|
55
|
-
"typedoc-plugin-missing-exports": "^0.
|
|
56
|
+
"typedoc": "^0.23.15",
|
|
57
|
+
"typedoc-plugin-missing-exports": "^0.23.0",
|
|
56
58
|
"typescript": "~4.6.3",
|
|
57
59
|
"uuid": "^8.3.2"
|
|
58
60
|
},
|
|
59
61
|
"peerDependencies": {
|
|
60
|
-
"@metamask/preferences-controller": "^4.4.
|
|
62
|
+
"@metamask/preferences-controller": "^4.4.1"
|
|
61
63
|
},
|
|
62
64
|
"engines": {
|
|
63
65
|
"node": ">=16.0.0"
|