diff options
-rw-r--r-- | app/scripts/keyring-controller.js | 74 | ||||
-rw-r--r-- | app/scripts/metamask-controller.js | 48 | ||||
-rw-r--r-- | mock-dev.js | 16 | ||||
-rw-r--r-- | test/unit/idStore-migration-test.js | 14 | ||||
-rw-r--r-- | test/unit/keyring-controller-test.js | 6 |
5 files changed, 74 insertions, 84 deletions
diff --git a/app/scripts/keyring-controller.js b/app/scripts/keyring-controller.js index f7a4e4010..be54ab00b 100644 --- a/app/scripts/keyring-controller.js +++ b/app/scripts/keyring-controller.js @@ -31,13 +31,17 @@ class KeyringController extends EventEmitter { constructor (opts) { super() const initState = opts.initState || {} + this.keyringTypes = keyringTypes this.store = new ObservableStore(initState) + this.memStore = new ObservableStore({ + keyringTypes: this.keyringTypes.map(krt => krt.type), + keyrings: [], + identities: {}, + }) this.configManager = opts.configManager this.ethStore = opts.ethStore this.encryptor = encryptor - this.keyringTypes = keyringTypes this.keyrings = [] - this.identities = {} // Essentially a name hash this._unconfMsgCbs = {} @@ -74,31 +78,23 @@ class KeyringController extends EventEmitter { // in this class, but will need to be Promisified when we move our // persistence to an async model. getState () { - return Promise.all(this.keyrings.map(this.displayForKeyring)) - .then((displayKeyrings) => { - const state = this.store.getState() - // old wallet - const wallet = this.configManager.getWallet() - return { - // computed - isInitialized: (!!wallet || !!state.vault), - isUnlocked: (!!this.password), - keyrings: displayKeyrings, - // hard coded - keyringTypes: this.keyringTypes.map(krt => krt.type), - // memStore - identities: this.identities, - // configManager - seedWords: this.configManager.getSeedWords(), - isDisclaimerConfirmed: this.configManager.getConfirmedDisclaimer(), - currentFiat: this.configManager.getCurrentFiat(), - conversionRate: this.configManager.getConversionRate(), - conversionDate: this.configManager.getConversionDate(), - // messageManager - unconfMsgs: messageManager.unconfirmedMsgs(), - messages: messageManager.getMsgList(), - } - }) + // old wallet + const memState = this.memStore.getState() + const result = { + // computed + isUnlocked: (!!this.password), + // memStore + keyringTypes: memState.keyringTypes, + identities: memState.identities, + keyrings: memState.keyrings, + // messageManager + unconfMsgs: messageManager.unconfirmedMsgs(), + messages: messageManager.getMsgList(), + // configManager + seedWords: this.configManager.getSeedWords(), + isDisclaimerConfirmed: this.configManager.getConfirmedDisclaimer(), + } + return result } // Create New Vault And Keychain @@ -164,6 +160,7 @@ class KeyringController extends EventEmitter { setLocked () { this.password = null this.keyrings = [] + this._updateMemStoreKeyrings() return this.fullUpdate() } @@ -245,7 +242,9 @@ class KeyringController extends EventEmitter { walletNicknames[hexAddress] = label this.store.updateState({ walletNicknames }) // update state on memStore - this.identities[hexAddress].name = label + const identities = this.memStore.getState().identities + identities[hexAddress].name = label + this.memStore.updateState({ identities }) return Promise.resolve(label) } catch (err) { return Promise.reject(err) @@ -439,14 +438,16 @@ class KeyringController extends EventEmitter { // Takes an address, and assigns it an incremented nickname, persisting it. createNickname (address) { const hexAddress = normalizeAddress(address) - const currentIdentityCount = Object.keys(this.identities).length + 1 + const identities = this.memStore.getState().identities + const currentIdentityCount = Object.keys(identities).length + 1 const nicknames = this.store.getState().walletNicknames || {} const existingNickname = nicknames[hexAddress] const name = existingNickname || `Account ${currentIdentityCount}` - this.identities[hexAddress] = { + identities[hexAddress] = { address: hexAddress, name, } + this.memStore.updateState({ identities }) return this.saveAccountLabel(hexAddress, name) } @@ -635,8 +636,19 @@ class KeyringController extends EventEmitter { this.ethStore.removeAccount(address) }) + // clear keyrings from memory this.keyrings = [] - this.identities = {} + this.memStore.updateState({ + keyrings: [], + identities: {}, + }) + } + + _updateMemStoreKeyrings() { + Promise.all(this.keyrings.map(this.displayForKeyring)) + .then((keyrings) => { + this.memStore.updateState({ keyrings }) + }) } } diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 2c379f8d9..222a1d618 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -169,22 +169,29 @@ module.exports = class MetamaskController extends EventEmitter { // getState () { - return this.keyringController.getState() - .then((keyringControllerState) => { - return extend( - this.state, - this.ethStore.getState(), - this.configManager.getConfig(), - this.txManager.getState(), - keyringControllerState, - this.preferencesController.store.getState(), - this.noticeController.getState(), - { - shapeShiftTxList: this.configManager.getShapeShiftTxList(), - lostAccounts: this.configManager.getLostAccounts(), - } - ) - }) + const wallet = this.configManager.getWallet() + const vault = this.keyringController.store.getState().vault + const isInitialized = (!!wallet || !!vault) + return extend( + { + isInitialized, + }, + this.state, + this.ethStore.getState(), + this.txManager.getState(), + this.keyringController.getState(), + this.preferencesController.store.getState(), + this.noticeController.getState(), + // config manager + this.configManager.getConfig(), + { + shapeShiftTxList: this.configManager.getShapeShiftTxList(), + lostAccounts: this.configManager.getLostAccounts(), + currentFiat: this.configManager.getCurrentFiat(), + conversionRate: this.configManager.getConversionRate(), + conversionDate: this.configManager.getConversionDate(), + } + ) } // @@ -199,7 +206,7 @@ module.exports = class MetamaskController extends EventEmitter { return { // etc - getState: nodeify(this.getState.bind(this)), + getState: (cb) => cb(null, this.getState()), setRpcTarget: this.setRpcTarget.bind(this), setProviderType: this.setProviderType.bind(this), useEtherscanProvider: this.useEtherscanProvider.bind(this), @@ -295,11 +302,8 @@ module.exports = class MetamaskController extends EventEmitter { ) } - sendUpdate () { - this.getState() - .then((state) => { - this.emit('update', state) - }) + sendUpdate () { + this.emit('update', this.getState()) } // diff --git a/mock-dev.js b/mock-dev.js index bd3a1ad77..b20c3be3a 100644 --- a/mock-dev.js +++ b/mock-dev.js @@ -16,7 +16,6 @@ const extend = require('xtend') const render = require('react-dom').render const h = require('react-hyperscript') const pipe = require('mississippi').pipe -const LocalStorageStore = require('obs-store/lib/localStorage') const Root = require('./ui/app/root') const configureStore = require('./ui/app/store') const actions = require('./ui/app/actions') @@ -27,7 +26,6 @@ const firstTimeState = require('./app/scripts/first-time-state') const extension = require('./development/mockExtension') const noop = function () {} -const STORAGE_KEY = 'metamask-config' // // Query String @@ -56,27 +54,15 @@ const injectCss = require('inject-css') // MetaMask Controller // -let dataStore = new LocalStorageStore({ storageKey: STORAGE_KEY }) -// initial state for first time users -if (!dataStore.getState()) { - dataStore.putState(firstTimeState) -} - const controller = new MetamaskController({ // User confirmation callbacks: showUnconfirmedMessage: noop, unlockAccountMessage: noop, showUnapprovedTx: noop, // initial state - initState: dataStore.getState(), + initState: firstTimeState, }) -// setup state persistence -pipe( - controller.store, - dataStore -) - // // User Interface // diff --git a/test/unit/idStore-migration-test.js b/test/unit/idStore-migration-test.js index 3aaf4bb94..81a99ef63 100644 --- a/test/unit/idStore-migration-test.js +++ b/test/unit/idStore-migration-test.js @@ -80,18 +80,4 @@ describe('IdentityStore to KeyringController migration', function() { }) }) - describe('entering a password', function() { - it('should identify an old wallet as an initialized keyring', function(done) { - keyringController.configManager.setWallet('something') - keyringController.getState() - .then((state) => { - assert(state.isInitialized, 'old vault counted as initialized.') - assert(!state.lostAccounts, 'no lost accounts') - done() - }) - .catch((err) => { - done(err) - }) - }) - }) }) diff --git a/test/unit/keyring-controller-test.js b/test/unit/keyring-controller-test.js index 347aa2bdf..aae4cdfd6 100644 --- a/test/unit/keyring-controller-test.js +++ b/test/unit/keyring-controller-test.js @@ -104,7 +104,7 @@ describe('KeyringController', function() { it('should add the address to the identities hash', function() { const fakeAddress = '0x12345678' keyringController.createNickname(fakeAddress) - const identities = keyringController.identities + const identities = keyringController.memStore.getState().identities const identity = identities[fakeAddress] assert.equal(identity.address, fakeAddress) }) @@ -114,7 +114,9 @@ describe('KeyringController', function() { it ('sets the nickname', function(done) { const account = addresses[0] var nick = 'Test nickname' - keyringController.identities[ethUtil.addHexPrefix(account)] = {} + const identities = keyringController.memStore.getState().identities + identities[ethUtil.addHexPrefix(account)] = {} + keyringController.memStore.updateState({ identities }) keyringController.saveAccountLabel(account, nick) .then((label) => { try { |