aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkumavis <aaron@kumavis.me>2017-10-21 03:31:40 +0800
committerkumavis <aaron@kumavis.me>2017-10-21 03:31:40 +0800
commit61e1b821d426c656922cb9e6abbf4d117497693b (patch)
treee5716845d5f5dbdb35c668a5b9d86d4103a1b7db
parent8472ca406a78468199a18c173ac8c9317dee8518 (diff)
parent2a18f732c7b31d966631507ebbaca0e6cbbaceb6 (diff)
downloadtangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.tar
tangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.tar.gz
tangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.tar.bz2
tangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.tar.lz
tangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.tar.xz
tangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.tar.zst
tangerine-wallet-browser-61e1b821d426c656922cb9e6abbf4d117497693b.zip
Merge branch 'master' of github.com:MetaMask/metamask-extension into filter-fix-maybe
-rw-r--r--CHANGELOG.md1
-rw-r--r--app/scripts/controllers/balance.js10
-rw-r--r--app/scripts/controllers/computed-balances.js23
-rw-r--r--app/scripts/lib/account-tracker.js23
-rw-r--r--app/scripts/metamask-controller.js59
-rw-r--r--mascara/server/index.js2
-rw-r--r--package.json6
-rw-r--r--ui/app/reducers.js7
8 files changed, 99 insertions, 32 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 11a093621..b24cc161a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
## Current Master
- Fix bug where web3 API was sometimes injected after the page loaded.
+- Fix bug where first account was sometimes not selected correctly after creating or restoring a vault.
- Fix bug where imported accounts could not use new eth_signTypedData method.
## 3.11.0 2017-10-11
diff --git a/app/scripts/controllers/balance.js b/app/scripts/controllers/balance.js
index 4fa4c78fe..f83f294cc 100644
--- a/app/scripts/controllers/balance.js
+++ b/app/scripts/controllers/balance.js
@@ -5,7 +5,9 @@ const BN = require('ethereumjs-util').BN
class BalanceController {
constructor (opts = {}) {
+ this._validateParams(opts)
const { address, accountTracker, txController, blockTracker } = opts
+
this.address = address
this.accountTracker = accountTracker
this.txController = txController
@@ -65,6 +67,14 @@ class BalanceController {
return pending
}
+ _validateParams (opts) {
+ const { address, accountTracker, txController, blockTracker } = opts
+ if (!address || !accountTracker || !txController || !blockTracker) {
+ const error = 'Cannot construct a balance checker without address, accountTracker, txController, and blockTracker.'
+ throw new Error(error)
+ }
+ }
+
}
module.exports = BalanceController
diff --git a/app/scripts/controllers/computed-balances.js b/app/scripts/controllers/computed-balances.js
index 2479e1b3a..9855f715e 100644
--- a/app/scripts/controllers/computed-balances.js
+++ b/app/scripts/controllers/computed-balances.js
@@ -20,23 +20,34 @@ class ComputedbalancesController {
}
updateAllBalances () {
- for (let address in this.accountTracker.store.getState().accounts) {
+ Object.keys(this.balances).forEach((balance) => {
+ const address = balance.address
this.balances[address].updateBalance()
- }
+ })
}
_initBalanceUpdating () {
const store = this.accountTracker.store.getState()
- this.addAnyAccountsFromStore(store)
- this.accountTracker.store.subscribe(this.addAnyAccountsFromStore.bind(this))
+ this.syncAllAccountsFromStore(store)
+ this.accountTracker.store.subscribe(this.syncAllAccountsFromStore.bind(this))
}
- addAnyAccountsFromStore(store) {
- const balances = store.accounts
+ syncAllAccountsFromStore(store) {
+ const upstream = Object.keys(store.accounts)
+ const balances = Object.keys(this.balances)
+ .map(address => this.balances[address])
+ // Follow new addresses
for (let address in balances) {
this.trackAddressIfNotAlready(address)
}
+
+ // Unfollow old ones
+ balances.forEach(({ address }) => {
+ if (!upstream.includes(address)) {
+ delete this.balances[address]
+ }
+ })
}
trackAddressIfNotAlready (address) {
diff --git a/app/scripts/lib/account-tracker.js b/app/scripts/lib/account-tracker.js
index cdc21282d..ce6642150 100644
--- a/app/scripts/lib/account-tracker.js
+++ b/app/scripts/lib/account-tracker.js
@@ -38,6 +38,29 @@ class AccountTracker extends EventEmitter {
// public
//
+ syncWithAddresses (addresses) {
+ const accounts = this.store.getState().accounts
+ const locals = Object.keys(accounts)
+
+ const toAdd = []
+ addresses.forEach((upstream) => {
+ if (!locals.includes(upstream)) {
+ toAdd.push(upstream)
+ }
+ })
+
+ const toRemove = []
+ locals.forEach((local) => {
+ if (!addresses.includes(local)) {
+ toRemove.push(local)
+ }
+ })
+
+ toAdd.forEach(upstream => this.addAccount(upstream))
+ toRemove.forEach(local => this.removeAccount(local))
+ this._updateAccounts()
+ }
+
addAccount (address) {
const accounts = this.store.getState().accounts
accounts[address] = {}
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 727f48f1c..ad42a39fb 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -1,6 +1,5 @@
const EventEmitter = require('events')
const extend = require('xtend')
-const promiseToCallback = require('promise-to-callback')
const pump = require('pump')
const Dnode = require('dnode')
const ObservableStore = require('obs-store')
@@ -96,25 +95,20 @@ module.exports = class MetamaskController extends EventEmitter {
// key mgmt
this.keyringController = new KeyringController({
initState: initState.KeyringController,
- accountTracker: this.accountTracker,
getNetwork: this.networkController.getNetworkState.bind(this.networkController),
encryptor: opts.encryptor || undefined,
})
// If only one account exists, make sure it is selected.
- this.keyringController.store.subscribe((state) => {
- const addresses = Object.keys(state.walletNicknames || {})
+ this.keyringController.memStore.subscribe((state) => {
+ const addresses = state.keyrings.reduce((res, keyring) => {
+ return res.concat(keyring.accounts)
+ }, [])
if (addresses.length === 1) {
const address = addresses[0]
this.preferencesController.setSelectedAddress(address)
}
- })
- this.keyringController.on('newAccount', (address) => {
- this.preferencesController.setSelectedAddress(address)
- this.accountTracker.addAccount(address)
- })
- this.keyringController.on('removedAccount', (address) => {
- this.accountTracker.removeAccount(address)
+ this.accountTracker.syncWithAddresses(addresses)
})
// address book controller
@@ -329,13 +323,13 @@ module.exports = class MetamaskController extends EventEmitter {
createShapeShiftTx: this.createShapeShiftTx.bind(this),
// primary HD keyring management
- addNewAccount: this.addNewAccount.bind(this),
+ addNewAccount: nodeify(this.addNewAccount, this),
placeSeedWords: this.placeSeedWords.bind(this),
clearSeedWordCache: this.clearSeedWordCache.bind(this),
importAccountWithStrategy: this.importAccountWithStrategy.bind(this),
// vault management
- submitPassword: this.submitPassword.bind(this),
+ submitPassword: nodeify(keyringController.submitPassword, keyringController),
// network management
setProviderType: nodeify(networkController.setProviderType, networkController),
@@ -351,8 +345,8 @@ module.exports = class MetamaskController extends EventEmitter {
// KeyringController
setLocked: nodeify(keyringController.setLocked, keyringController),
- createNewVaultAndKeychain: nodeify(keyringController.createNewVaultAndKeychain, keyringController),
- createNewVaultAndRestore: nodeify(keyringController.createNewVaultAndRestore, keyringController),
+ createNewVaultAndKeychain: nodeify(this.createNewVaultAndKeychain, this),
+ createNewVaultAndRestore: nodeify(this.createNewVaultAndRestore, this),
addNewKeyring: nodeify(keyringController.addNewKeyring, keyringController),
saveAccountLabel: nodeify(keyringController.saveAccountLabel, keyringController),
exportAccount: nodeify(keyringController.exportAccount, keyringController),
@@ -473,20 +467,43 @@ module.exports = class MetamaskController extends EventEmitter {
// Vault Management
//
- submitPassword (password, cb) {
- return this.keyringController.submitPassword(password)
- .then((newState) => { cb(null, newState) })
- .catch((reason) => { cb(reason) })
+ async createNewVaultAndKeychain (password, cb) {
+ const vault = await this.keyringController.createNewVaultAndKeychain(password)
+ this.selectFirstIdentity(vault)
+ return vault
+ }
+
+ async createNewVaultAndRestore (password, seed, cb) {
+ const vault = await this.keyringController.createNewVaultAndRestore(password, seed)
+ this.selectFirstIdentity(vault)
+ return vault
+ }
+
+ selectFirstIdentity (vault) {
+ const { identities } = vault
+ const address = Object.keys(identities)[0]
+ this.preferencesController.setSelectedAddress(address)
}
//
// Opinionated Keyring Management
//
- addNewAccount (cb) {
+ async addNewAccount (cb) {
const primaryKeyring = this.keyringController.getKeyringsByType('HD Key Tree')[0]
if (!primaryKeyring) return cb(new Error('MetamaskController - No HD Key Tree found'))
- promiseToCallback(this.keyringController.addNewAccount(primaryKeyring))(cb)
+ const keyringController = this.keyringController
+ const oldAccounts = await keyringController.getAccounts()
+ const keyState = await keyringController.addNewAccount(primaryKeyring)
+ const newAccounts = await keyringController.getAccounts()
+
+ newAccounts.forEach((address) => {
+ if (!oldAccounts.includes(address)) {
+ this.preferencesController.setSelectedAddress(address)
+ }
+ })
+
+ return keyState
}
// Adds the current vault's seed words to the UI's state tree.
diff --git a/mascara/server/index.js b/mascara/server/index.js
index 12b527e5d..24739b43f 100644
--- a/mascara/server/index.js
+++ b/mascara/server/index.js
@@ -17,7 +17,7 @@ function createMetamascaraServer () {
const server = express()
// ui window
serveBundle(server, '/ui.js', uiBundle)
- server.use(express.static(__dirname + '/../ui/'))
+ server.use(express.static(__dirname + '/../ui/', { setHeaders: (res) => res.set('X-Frame-Options', 'DENY') }))
server.use(express.static(__dirname + '/../../dist/chrome'))
// metamascara
serveBundle(server, '/metamascara.js', metamascaraBundle)
diff --git a/package.json b/package.json
index 0ecd22db5..106851013 100644
--- a/package.json
+++ b/package.json
@@ -71,7 +71,7 @@
"eth-contract-metadata": "^1.1.4",
"eth-hd-keyring": "^1.2.1",
"eth-json-rpc-filters": "^1.2.4",
- "eth-keyring-controller": "^2.1.0",
+ "eth-keyring-controller": "^2.1.2",
"eth-phishing-detect": "^1.1.4",
"eth-query": "^2.1.2",
"eth-sig-util": "^1.4.0",
@@ -127,14 +127,14 @@
"react-markdown": "^2.3.0",
"react-redux": "^5.0.5",
"react-select": "^1.0.0-rc.2",
- "react-simple-file-input": "^1.0.0",
+ "react-simple-file-input": "^2.0.0",
"react-tooltip-component": "^0.3.0",
"readable-stream": "^2.3.3",
"redux": "^3.0.5",
"redux-logger": "^3.0.6",
"redux-thunk": "^2.2.0",
"request-promise": "^4.2.1",
- "sandwich-expando": "^1.0.5",
+ "sandwich-expando": "^1.1.3",
"semaphore": "^1.0.5",
"sw-stream": "^2.0.0",
"textarea-caret": "^3.0.1",
diff --git a/ui/app/reducers.js b/ui/app/reducers.js
index 6a2f44534..1cded7ca7 100644
--- a/ui/app/reducers.js
+++ b/ui/app/reducers.js
@@ -43,7 +43,12 @@ function rootReducer (state, action) {
window.logState = function () {
let state = window.METAMASK_CACHED_LOG_STATE
- const version = global.platform.getVersion()
+ let version
+ try {
+ version = global.platform.getVersion()
+ } catch (e) {
+ version = 'unable to load version.'
+ }
state.version = version
let stateString = JSON.stringify(state, removeSeedWords, 2)
return stateString