2018-03-03 00:32:57 +01:00
|
|
|
const KeyringController = require('eth-keyring-controller')
|
2018-04-12 23:06:59 +02:00
|
|
|
const log = require('loglevel')
|
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.
|
|
|
|
*
|
|
|
|
* @param {array} createdAccounts The accounts to restore
|
|
|
|
* @param {string} seedWords The seed words to verify
|
|
|
|
* @returns {Promise<void>} Promises undefined
|
|
|
|
*
|
|
|
|
*/
|
2018-03-03 00:40:40 +01:00
|
|
|
verifyAccounts (createdAccounts, seedWords) {
|
2018-03-03 00:32:57 +01:00
|
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
|
|
if (!createdAccounts || createdAccounts.length < 1) {
|
|
|
|
return reject(new Error('No created accounts defined.'))
|
|
|
|
}
|
|
|
|
|
2018-03-03 00:40:40 +01:00
|
|
|
const keyringController = new KeyringController({})
|
|
|
|
const Keyring = keyringController.getKeyringClassForType('HD Key Tree')
|
|
|
|
const opts = {
|
2018-03-03 00:32:57 +01:00
|
|
|
mnemonic: seedWords,
|
|
|
|
numberOfAccounts: createdAccounts.length,
|
|
|
|
}
|
|
|
|
|
2018-03-03 00:40:40 +01:00
|
|
|
const keyring = new Keyring(opts)
|
2018-03-03 00:32:57 +01:00
|
|
|
keyring.getAccounts()
|
|
|
|
.then((restoredAccounts) => {
|
|
|
|
|
|
|
|
log.debug('Created accounts: ' + JSON.stringify(createdAccounts))
|
|
|
|
log.debug('Restored accounts: ' + JSON.stringify(restoredAccounts))
|
|
|
|
|
2018-03-03 00:40:40 +01:00
|
|
|
if (restoredAccounts.length !== createdAccounts.length) {
|
2018-03-03 00:32:57 +01:00
|
|
|
// this should not happen...
|
2018-03-03 00:40:40 +01:00
|
|
|
return reject(new Error('Wrong number of accounts'))
|
2018-03-03 00:32:57 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
for (let i = 0; i < restoredAccounts.length; i++) {
|
2018-03-03 14:11:02 +01:00
|
|
|
if (restoredAccounts[i].toLowerCase() !== createdAccounts[i].toLowerCase()) {
|
2018-03-03 00:32:57 +01:00
|
|
|
return reject(new Error('Not identical accounts! Original: ' + createdAccounts[i] + ', Restored: ' + restoredAccounts[i]))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return resolve()
|
|
|
|
})
|
|
|
|
})
|
2018-03-03 00:40:40 +01:00
|
|
|
},
|
2018-03-03 00:32:57 +01:00
|
|
|
}
|
|
|
|
|
2018-03-03 00:40:40 +01:00
|
|
|
module.exports = seedPhraseVerifier
|