From 2efab79f5bea899764c08dfb317ce70b5bebbb55 Mon Sep 17 00:00:00 2001 From: Dan Finlay Date: Tue, 22 Nov 2016 23:16:36 -0800 Subject: [PATCH] Asynced keyrings and started on controller --- app/scripts/keyring-controller.js | 44 ++++++++++++++++++++----------- app/scripts/keyrings/hd.js | 17 +++++++----- app/scripts/keyrings/simple.js | 18 ++++++------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/app/scripts/keyring-controller.js b/app/scripts/keyring-controller.js index 68cf62f7a..1f58f3780 100644 --- a/app/scripts/keyring-controller.js +++ b/app/scripts/keyring-controller.js @@ -121,10 +121,13 @@ module.exports = class KeyringController extends EventEmitter { this.password = password const keyring = this.restoreKeyring(serialized) this.keyrings.push(keyring) - this.configManager.setSelectedAccount(keyring.getAccounts()[0]) - return this.persistAllKeyrings() + keyring.getAccounts() + .then((accounts) => { + this.configManager.setSelectedAccount(accounts[0]) + return this.persistAllKeyrings() + }) } - return + return Promise.resolve() }) } @@ -165,13 +168,18 @@ module.exports = class KeyringController extends EventEmitter { placeSeedWords (cb) { const firstKeyring = this.keyrings[0] - const seedWords = firstKeyring.serialize().mnemonic - this.configManager.setSeedWords(seedWords) + firstKeyring.serialize() + .then((serialized) => { - if (cb) { - cb() - } - this.emit('update') + const seedWords = serialized.mnemonic + this.configManager.setSeedWords(seedWords) + + if (cb) { + cb() + } + + this.emit('update') + }) } submitPassword (password, cb) { @@ -259,13 +267,19 @@ module.exports = class KeyringController extends EventEmitter { } persistAllKeyrings () { - const serialized = this.keyrings.map((keyring) => { - return { - type: keyring.type, - data: keyring.serialize(), - } + Promise.all(this.keyrings.map((keyring) => { + return Promise.all([keyring.type, keyring.serialize()]) + .then((serializedKeyringArray) => { + // Label the output values on each serialized Keyring: + return { + type: serializedKeyringArray[0], + data: serializedKeyringArray[1], + } + }) + })) + .then((serializedKeyrings) => { + return this.encryptor.encrypt(this.password, serializedKeyrings) }) - return this.encryptor.encrypt(this.password, serialized) .then((encryptedString) => { this.configManager.setVault(encryptedString) return true diff --git a/app/scripts/keyrings/hd.js b/app/scripts/keyrings/hd.js index a28ef6736..cfec56561 100644 --- a/app/scripts/keyrings/hd.js +++ b/app/scripts/keyrings/hd.js @@ -21,10 +21,10 @@ class HdKeyring extends EventEmitter { } serialize () { - return { + return Promise.resolve({ mnemonic: this.mnemonic, numberOfAccounts: this.wallets.length, - } + }) } deserialize (opts = {}) { @@ -40,6 +40,8 @@ class HdKeyring extends EventEmitter { if ('numberOfAccounts' in opts) { this.addAccounts(opts.numberOfAccounts) } + + return Promise.resolve() } addAccounts (numberOfAccounts = 1) { @@ -55,11 +57,12 @@ class HdKeyring extends EventEmitter { newWallets.push(wallet) this.wallets.push(wallet) } - return newWallets.map(w => w.getAddress().toString('hex')) + const hexWallets = newWallets.map(w => w.getAddress().toString('hex')) + return Promise.resolve(hexWallets) } getAccounts () { - return this.wallets.map(w => w.getAddress().toString('hex')) + return Promise.resolve(this.wallets.map(w => w.getAddress().toString('hex'))) } // tx is an instance of the ethereumjs-transaction class. @@ -67,7 +70,7 @@ class HdKeyring extends EventEmitter { const wallet = this._getWalletForAccount(address) var privKey = wallet.getPrivateKey() tx.sign(privKey) - return tx + return Promise.resolve(tx) } // For eth_sign, we need to sign transactions: @@ -77,12 +80,12 @@ class HdKeyring extends EventEmitter { var privKey = wallet.getPrivateKey() var msgSig = ethUtil.ecsign(new Buffer(message, 'hex'), privKey) var rawMsgSig = ethUtil.bufferToHex(sigUtil.concatSig(msgSig.v, msgSig.r, msgSig.s)) - return rawMsgSig + return Promise.resolve(rawMsgSig) } exportAccount (address) { const wallet = this._getWalletForAccount(address) - return wallet.getPrivateKey().toString('hex') + return Promise.resolve(wallet.getPrivateKey().toString('hex')) } diff --git a/app/scripts/keyrings/simple.js b/app/scripts/keyrings/simple.js index 4fdccc4f7..8f339cf80 100644 --- a/app/scripts/keyrings/simple.js +++ b/app/scripts/keyrings/simple.js @@ -8,10 +8,6 @@ class SimpleKeyring extends EventEmitter { /* PUBLIC METHODS */ - static type () { - return type - } - constructor (opts) { super() this.type = type @@ -20,7 +16,7 @@ class SimpleKeyring extends EventEmitter { } serialize () { - return this.wallets.map(w => w.getPrivateKey().toString('hex')) + return Promise.resolve(this.wallets.map(w => w.getPrivateKey().toString('hex'))) } deserialize (wallets = []) { @@ -29,6 +25,7 @@ class SimpleKeyring extends EventEmitter { const wallet = Wallet.fromPrivateKey(b) return wallet }) + return Promise.resolve() } addAccounts (n = 1) { @@ -37,11 +34,12 @@ class SimpleKeyring extends EventEmitter { newWallets.push(Wallet.generate()) } this.wallets = this.wallets.concat(newWallets) - return newWallets.map(w => w.getAddress().toString('hex')) + const hexWallets = newWallets.map(w => w.getAddress().toString('hex')) + return Promise.resolve(hexWallets) } getAccounts () { - return this.wallets.map(w => w.getAddress().toString('hex')) + return Promise.resolve(this.wallets.map(w => w.getAddress().toString('hex'))) } // tx is an instance of the ethereumjs-transaction class. @@ -49,7 +47,7 @@ class SimpleKeyring extends EventEmitter { const wallet = this._getWalletForAccount(address) var privKey = wallet.getPrivateKey() tx.sign(privKey) - return tx + return Promise.resolve(tx) } // For eth_sign, we need to sign transactions: @@ -59,12 +57,12 @@ class SimpleKeyring extends EventEmitter { var privKey = wallet.getPrivateKey() var msgSig = ethUtil.ecsign(new Buffer(message, 'hex'), privKey) var rawMsgSig = ethUtil.bufferToHex(sigUtil.concatSig(msgSig.v, msgSig.r, msgSig.s)) - return rawMsgSig + return Promise.resolve(rawMsgSig) } exportAccount (address) { const wallet = this._getWalletForAccount(address) - return wallet.getPrivateKey().toString('hex') + return Promise.resolve(wallet.getPrivateKey().toString('hex')) }