2023-01-21 00:03:11 +01:00
|
|
|
import { KeyringController } from '@metamask/eth-keyring-controller';
|
2021-02-04 19:15:23 +01:00
|
|
|
import log from 'loglevel';
|
2018-03-03 00:32:57 +01:00
|
|
|
|
2023-01-20 16:14:40 +01:00
|
|
|
import { HardwareKeyringTypes } from '../../../shared/constants/hardware-wallets';
|
2022-11-21 15:23:35 +01:00
|
|
|
|
2018-03-03 00:32:57 +01:00
|
|
|
const seedPhraseVerifier = {
|
2018-04-19 17:38:56 +02:00
|
|
|
/**
|
|
|
|
* Verifies if the seed words can restore the accounts.
|
|
|
|
*
|
|
|
|
* Key notes:
|
|
|
|
* - The seed words can recreate the primary keyring and the accounts belonging to it.
|
|
|
|
* - The created accounts in the primary keyring are always the same.
|
|
|
|
* - The keyring always creates the accounts in the same sequence.
|
|
|
|
*
|
2020-11-10 18:30:41 +01:00
|
|
|
* @param {Array} createdAccounts - The accounts to restore
|
2021-07-30 23:37:40 +02:00
|
|
|
* @param {Buffer} seedPhrase - The seed words to verify, encoded as a Buffer
|
|
|
|
* @returns {Promise<void>}
|
2020-11-03 00:41:28 +01:00
|
|
|
*/
|
2021-07-30 23:37:40 +02:00
|
|
|
async verifyAccounts(createdAccounts, seedPhrase) {
|
2020-07-30 00:20:38 +02:00
|
|
|
if (!createdAccounts || createdAccounts.length < 1) {
|
2021-02-04 19:15:23 +01:00
|
|
|
throw new Error('No created accounts defined.');
|
2020-07-30 00:20:38 +02:00
|
|
|
}
|
|
|
|
|
2021-02-04 19:15:23 +01:00
|
|
|
const keyringController = new KeyringController({});
|
2023-01-21 00:03:11 +01:00
|
|
|
const keyringBuilder = keyringController.getKeyringBuilderForType(
|
2023-01-20 16:14:40 +01:00
|
|
|
HardwareKeyringTypes.hdKeyTree,
|
2022-11-21 15:23:35 +01:00
|
|
|
);
|
2023-01-21 00:03:11 +01:00
|
|
|
const keyring = keyringBuilder();
|
2020-07-30 00:20:38 +02:00
|
|
|
const opts = {
|
2021-07-30 23:37:40 +02:00
|
|
|
mnemonic: seedPhrase,
|
2020-07-30 00:20:38 +02:00
|
|
|
numberOfAccounts: createdAccounts.length,
|
2021-02-04 19:15:23 +01:00
|
|
|
};
|
2020-07-30 00:20:38 +02:00
|
|
|
|
2023-01-21 00:03:11 +01:00
|
|
|
await keyring.deserialize(opts);
|
2021-02-04 19:15:23 +01:00
|
|
|
const restoredAccounts = await keyring.getAccounts();
|
|
|
|
log.debug(`Created accounts: ${JSON.stringify(createdAccounts)}`);
|
|
|
|
log.debug(`Restored accounts: ${JSON.stringify(restoredAccounts)}`);
|
2020-07-30 00:20:38 +02:00
|
|
|
|
|
|
|
if (restoredAccounts.length !== createdAccounts.length) {
|
|
|
|
// this should not happen...
|
2021-02-04 19:15:23 +01:00
|
|
|
throw new Error('Wrong number of accounts');
|
2020-07-30 00:20:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for (let i = 0; i < restoredAccounts.length; i++) {
|
2020-11-03 00:41:28 +01:00
|
|
|
if (
|
|
|
|
restoredAccounts[i].toLowerCase() !== createdAccounts[i].toLowerCase()
|
|
|
|
) {
|
|
|
|
throw new Error(
|
|
|
|
`Not identical accounts! Original: ${createdAccounts[i]}, Restored: ${restoredAccounts[i]}`,
|
2021-02-04 19:15:23 +01:00
|
|
|
);
|
2018-03-03 00:32:57 +01:00
|
|
|
}
|
2020-07-30 00:20:38 +02:00
|
|
|
}
|
2018-03-03 00:40:40 +01:00
|
|
|
},
|
2021-02-04 19:15:23 +01:00
|
|
|
};
|
2018-03-03 00:32:57 +01:00
|
|
|
|
2021-02-04 19:15:23 +01:00
|
|
|
export default seedPhraseVerifier;
|