From 8c4d58aa4508e3d54c3f69847347e78d09c63b97 Mon Sep 17 00:00:00 2001
From: Bruno <brunobar79@gmail.com>
Date: Sun, 10 Jun 2018 03:52:32 -0400
Subject: initial trezor support

---
 app/scripts/metamask-controller.js | 63 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 62 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index a362e3826..dd5a5616f 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -48,6 +48,7 @@ const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
 const cleanErrorStack = require('./lib/cleanErrorStack')
 const DiagnosticsReporter = require('./lib/diagnostics-reporter')
 const log = require('loglevel')
+const TrezorKeyring = require("./lib/trezorKeyring");
 
 module.exports = class MetamaskController extends EventEmitter {
 
@@ -130,9 +131,11 @@ module.exports = class MetamaskController extends EventEmitter {
       provider: this.provider,
       blockTracker: this.blockTracker,
     })
-
+    
     // key mgmt
+    const additionalKeyrings = [TrezorKeyring]
     this.keyringController = new KeyringController({
+      keyringTypes: additionalKeyrings,
       initState: initState.KeyringController,
       getNetwork: this.networkController.getNetworkState.bind(this.networkController),
       encryptor: opts.encryptor || undefined,
@@ -363,6 +366,10 @@ module.exports = class MetamaskController extends EventEmitter {
       resetAccount: nodeify(this.resetAccount, this),
       importAccountWithStrategy: nodeify(this.importAccountWithStrategy, this),
 
+      // trezor
+      connectHardware: nodeify(this.connectHardware, this),
+      unlockTrezorAccount: nodeify(this.unlockTrezorAccount, this),
+
       // vault management
       submitPassword: nodeify(this.submitPassword, this),
 
@@ -523,6 +530,60 @@ module.exports = class MetamaskController extends EventEmitter {
     this.preferencesController.setSelectedAddress(address)
   }
 
+  //
+  // Hardware
+  //
+
+  /**
+   * Fetch account list from a trezor device.
+   *
+   * @returns [] accounts
+   */
+  async connectHardware (deviceName, page) {
+    const keyringController = this.keyringController
+    const keyring = await keyringController.getKeyringsByType(
+      'Trezor Hardware Keyring'
+    )[0]
+    if (!keyring) {
+      throw new Error('MetamaskController - No Trezor Hardware Keyring found')
+    }
+
+    const accounts = page === -1 ? await keyring.getPrevAccountSet() : await keyring.getNextAccountSet()
+
+    return accounts
+
+  }
+
+  /**
+   * Imports an account from a trezor device.
+   *
+   * @returns {} keyState
+   */
+  async unlockTrezorAccount (index) {
+    const keyringController = this.keyringController
+    const keyring = await keyringController.getKeyringsByType(
+      'Trezor Hardware Keyring'
+    )[0]
+    if (!keyring) {
+      throw new Error('MetamaskController - No Trezor Hardware Keyring found')
+    }
+
+    const oldAccounts = await keyringController.getAccounts()
+    const keyState = await keyringController.addNewAccount(keyring)
+    const newAccounts = await keyringController.getAccounts()
+
+    this.preferencesController.setAddresses(newAccounts)
+    newAccounts.forEach(address => {
+      if (!oldAccounts.includes(address)) {
+        this.preferencesController.setSelectedAddress(address)
+      }
+    })
+
+    const { identities } = this.preferencesController.store.getState()
+    return { ...keyState, identities }
+   }
+ 
+
   //
   // Account Management
   //
-- 
cgit 


From f5f66f59d7d215adf402a1e580c452e634480f69 Mon Sep 17 00:00:00 2001
From: Bruno <brunobar79@gmail.com>
Date: Sun, 10 Jun 2018 18:48:42 -0400
Subject: clean up

---
 app/scripts/metamask-controller.js | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index dd5a5616f..081c2e2db 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -48,7 +48,7 @@ const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
 const cleanErrorStack = require('./lib/cleanErrorStack')
 const DiagnosticsReporter = require('./lib/diagnostics-reporter')
 const log = require('loglevel')
-const TrezorKeyring = require("./lib/trezorKeyring");
+const TrezorKeyring = require('./lib/trezorKeyring')
 
 module.exports = class MetamaskController extends EventEmitter {
 
@@ -540,9 +540,10 @@ module.exports = class MetamaskController extends EventEmitter {
    * @returns [] accounts
    */
   async connectHardware (deviceName, page) {
+
     const keyringController = this.keyringController
     const keyring = await keyringController.getKeyringsByType(
-      'Trezor Hardware Keyring'
+      'Trezor Hardware'
     )[0]
     if (!keyring) {
       throw new Error('MetamaskController - No Trezor Hardware Keyring found')
@@ -562,7 +563,7 @@ module.exports = class MetamaskController extends EventEmitter {
   async unlockTrezorAccount (index) {
     const keyringController = this.keyringController
     const keyring = await keyringController.getKeyringsByType(
-      'Trezor Hardware Keyring'
+      'Trezor Hardware'
     )[0]
     if (!keyring) {
       throw new Error('MetamaskController - No Trezor Hardware Keyring found')
-- 
cgit 


From f6b27fa9eb542c1ac3fabdad9285e1a50baee7dc Mon Sep 17 00:00:00 2001
From: Bruno <brunobar79@gmail.com>
Date: Sun, 10 Jun 2018 19:02:54 -0400
Subject: add account working

---
 app/scripts/metamask-controller.js | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 081c2e2db..3cb77b35a 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -569,6 +569,8 @@ module.exports = class MetamaskController extends EventEmitter {
       throw new Error('MetamaskController - No Trezor Hardware Keyring found')
     }
 
+    keyring.setAccountToUnlock(index)
+    
     const oldAccounts = await keyringController.getAccounts()
     const keyState = await keyringController.addNewAccount(keyring)
     const newAccounts = await keyringController.getAccounts()
-- 
cgit 


From d1880073f678dbdc52e07e62ec66c39eea5062a6 Mon Sep 17 00:00:00 2001
From: Bruno <brunobar79@gmail.com>
Date: Sun, 10 Jun 2018 21:10:22 -0400
Subject: balances working

---
 app/scripts/metamask-controller.js | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 3cb77b35a..daab5baa5 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -549,10 +549,10 @@ module.exports = class MetamaskController extends EventEmitter {
       throw new Error('MetamaskController - No Trezor Hardware Keyring found')
     }
 
-    const accounts = page === -1 ? await keyring.getPrevAccountSet() : await keyring.getNextAccountSet()
+    const accounts = page === -1 ? await keyring.getPrevAccountSet(this.provider) : await keyring.getNextAccountSet(this.provider)
+    this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
 
     return accounts
-
   }
 
   /**
@@ -570,7 +570,6 @@ module.exports = class MetamaskController extends EventEmitter {
     }
 
     keyring.setAccountToUnlock(index)
-    
     const oldAccounts = await keyringController.getAccounts()
     const keyState = await keyringController.addNewAccount(keyring)
     const newAccounts = await keyringController.getAccounts()
-- 
cgit 


From 8763ea898e7838d08315063b0e2181405a2ae3d5 Mon Sep 17 00:00:00 2001
From: Bruno <brunobar79@gmail.com>
Date: Wed, 13 Jun 2018 01:32:13 -0400
Subject: move TrezorKeyring to its own package

---
 app/scripts/metamask-controller.js | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index daab5baa5..abe7ff8a2 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -48,7 +48,7 @@ const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
 const cleanErrorStack = require('./lib/cleanErrorStack')
 const DiagnosticsReporter = require('./lib/diagnostics-reporter')
 const log = require('loglevel')
-const TrezorKeyring = require('./lib/trezorKeyring')
+const TrezorKeyring = require('eth-trezor-keyring')
 
 module.exports = class MetamaskController extends EventEmitter {
 
@@ -549,7 +549,8 @@ module.exports = class MetamaskController extends EventEmitter {
       throw new Error('MetamaskController - No Trezor Hardware Keyring found')
     }
 
-    const accounts = page === -1 ? await keyring.getPrevAccountSet(this.provider) : await keyring.getNextAccountSet(this.provider)
+    const accounts = await keyring.getPage(page)
+
     this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
 
     return accounts
-- 
cgit 


From 704e2a21f8a3fc5f3d6245c5a924cd2df0cfd36e Mon Sep 17 00:00:00 2001
From: Bruno <brunobar79@gmail.com>
Date: Wed, 13 Jun 2018 02:09:25 -0400
Subject: clean up

---
 app/scripts/metamask-controller.js | 35 +++++++++++++++++++----------------
 1 file changed, 19 insertions(+), 16 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 6c380fd71..c57b643bb 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -131,7 +131,7 @@ module.exports = class MetamaskController extends EventEmitter {
       provider: this.provider,
       blockTracker: this.blockTracker,
     })
-    
+
     // key mgmt
     const additionalKeyrings = [TrezorKeyring]
     this.keyringController = new KeyringController({
@@ -423,7 +423,6 @@ module.exports = class MetamaskController extends EventEmitter {
   }
 
 
-
 //=============================================================================
 // VAULT / KEYRING RELATED METHODS
 //=============================================================================
@@ -537,19 +536,23 @@ module.exports = class MetamaskController extends EventEmitter {
    */
   async connectHardware (deviceName, page) {
 
-    const keyringController = this.keyringController
-    const keyring = await keyringController.getKeyringsByType(
-      'Trezor Hardware'
-    )[0]
-    if (!keyring) {
-      throw new Error('MetamaskController - No Trezor Hardware Keyring found')
-    }
-
-    const accounts = await keyring.getPage(page)
+    switch (deviceName) {
+      case 'trezor':
+        const keyringController = this.keyringController
+        const keyring = await keyringController.getKeyringsByType(
+          'Trezor Hardware'
+        )[0]
+        if (!keyring) {
+          throw new Error('MetamaskController - No Trezor Hardware Keyring found')
+        }
 
-    this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
+        const accounts = await keyring.getPage(page)
+        this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
+        return accounts
 
-    return accounts
+      default:
+        throw new Error('MetamaskController - Unknown device')
+    }
   }
 
   /**
@@ -581,7 +584,7 @@ module.exports = class MetamaskController extends EventEmitter {
     const { identities } = this.preferencesController.store.getState()
     return { ...keyState, identities }
    }
- 
+
 
   //
   // Account Management
@@ -1037,7 +1040,7 @@ module.exports = class MetamaskController extends EventEmitter {
    * Allows a user to begin the seed phrase recovery process.
    * @param {Function} cb - A callback function called when complete.
    */
-  markPasswordForgotten(cb) {
+  markPasswordForgotten (cb) {
     this.configManager.setPasswordForgotten(true)
     this.sendUpdate()
     cb()
@@ -1047,7 +1050,7 @@ module.exports = class MetamaskController extends EventEmitter {
    * Allows a user to end the seed phrase recovery process.
    * @param {Function} cb - A callback function called when complete.
    */
-  unMarkPasswordForgotten(cb) {
+  unMarkPasswordForgotten (cb) {
     this.configManager.setPasswordForgotten(false)
     this.sendUpdate()
     cb()
-- 
cgit 


From 87dfca07676f7a4745f68d2331a78f3ae53c558f Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Sat, 23 Jun 2018 02:52:11 -0400
Subject: fixes

---
 app/scripts/metamask-controller.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index c57b643bb..943904e4c 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -539,14 +539,14 @@ module.exports = class MetamaskController extends EventEmitter {
     switch (deviceName) {
       case 'trezor':
         const keyringController = this.keyringController
-        const keyring = await keyringController.getKeyringsByType(
+        let keyring = await keyringController.getKeyringsByType(
           'Trezor Hardware'
         )[0]
         if (!keyring) {
-          throw new Error('MetamaskController - No Trezor Hardware Keyring found')
+          keyring =  await this.keyringController.addNewKeyring('Trezor Hardware')
         }
 
-        const accounts = await keyring.getPage(page)
+        const accounts = page === 1 ? await keyring.getNextPage() : await keyring.getPreviousPage() 
         this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
         return accounts
 
-- 
cgit 


From 9d3f2435e58e2454506ea1a5f7b85452a10edffa Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Tue, 3 Jul 2018 15:46:15 -0400
Subject: lint fix

---
 app/scripts/metamask-controller.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 6e743d030..962611758 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -532,10 +532,10 @@ module.exports = class MetamaskController extends EventEmitter {
           'Trezor Hardware'
         )[0]
         if (!keyring) {
-          keyring =  await this.keyringController.addNewKeyring('Trezor Hardware')
+          keyring = await this.keyringController.addNewKeyring('Trezor Hardware')
         }
 
-        const accounts = page === 1 ? await keyring.getNextPage() : await keyring.getPreviousPage() 
+        const accounts = page === 1 ? await keyring.getNextPage() : await keyring.getPreviousPage()
         this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
         return accounts
 
-- 
cgit 


From 6b2511f94f436a30c6c683f9da2c3142d9a6461c Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Thu, 5 Jul 2018 20:59:31 -0400
Subject: UI refactor

---
 app/scripts/metamask-controller.js | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 962611758..1246629be 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -534,8 +534,10 @@ module.exports = class MetamaskController extends EventEmitter {
         if (!keyring) {
           keyring = await this.keyringController.addNewKeyring('Trezor Hardware')
         }
-
-        const accounts = page === 1 ? await keyring.getNextPage() : await keyring.getPreviousPage()
+        if (page === 0) {
+          keyring.page = 0
+        }
+        const accounts = page === -1 ? await keyring.getPreviousPage() : await keyring.getNextPage()
         this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
         return accounts
 
-- 
cgit 


From 7cca7ace2ea4cd4b9d3a242067c9a7c344406aba Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Mon, 9 Jul 2018 17:24:52 -0400
Subject: fix all the account related bugs

---
 app/scripts/metamask-controller.js | 19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index d70bac1c3..8104374bc 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -529,17 +529,28 @@ module.exports = class MetamaskController extends EventEmitter {
     switch (deviceName) {
       case 'trezor':
         const keyringController = this.keyringController
+        const oldAccounts = await keyringController.getAccounts()
         let keyring = await keyringController.getKeyringsByType(
           'Trezor Hardware'
         )[0]
         if (!keyring) {
           keyring = await this.keyringController.addNewKeyring('Trezor Hardware')
         }
-        if (page === 0) {
-          keyring.page = 0
+        let accounts = []
+
+        switch (page) {
+            case -1:
+              accounts = await keyring.getPreviousPage()
+              break
+            case 1:
+              accounts = await keyring.getNextPage()
+              break
+            default:
+              accounts = await keyring.getFirstPage()
         }
-        const accounts = page === -1 ? await keyring.getPreviousPage() : await keyring.getNextPage()
-        this.accountTracker.syncWithAddresses(accounts.map(a => a.address))
+
+        // Merge with existing accounts
+        this.accountTracker.syncWithAddresses(oldAccounts.concat(accounts.map(a => a.address)))
         return accounts
 
       default:
-- 
cgit 


From 2de3039b6b21ca05ef185c078b67815448864c72 Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Mon, 9 Jul 2018 17:55:37 -0400
Subject: fix account duplication

---
 app/scripts/metamask-controller.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 8104374bc..08b75e839 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -550,7 +550,9 @@ module.exports = class MetamaskController extends EventEmitter {
         }
 
         // Merge with existing accounts
-        this.accountTracker.syncWithAddresses(oldAccounts.concat(accounts.map(a => a.address)))
+        // and make sure addresses are not repeated
+        const accountsToTrack = [...new Set(oldAccounts.concat(accounts.map(a => a.address.toLowerCase())))]
+        this.accountTracker.syncWithAddresses(accountsToTrack)
         return accounts
 
       default:
-- 
cgit 


From d3f793a44a94274c73e0ce770f34bb2e22cdbd5b Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Mon, 9 Jul 2018 19:04:30 -0400
Subject: added label for trezor accounts

---
 app/scripts/metamask-controller.js | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 08b75e839..71a22f6ec 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -578,7 +578,8 @@ module.exports = class MetamaskController extends EventEmitter {
     const oldAccounts = await keyringController.getAccounts()
     const keyState = await keyringController.addNewAccount(keyring)
     const newAccounts = await keyringController.getAccounts()
-
+    // Assuming the trezor account is the last one
+    const trezorAccount = newAccounts[newAccounts.length -1]
     this.preferencesController.setAddresses(newAccounts)
     newAccounts.forEach(address => {
       if (!oldAccounts.includes(address)) {
@@ -586,6 +587,7 @@ module.exports = class MetamaskController extends EventEmitter {
       }
     })
 
+    this.preferencesController.setAccountLabel(trezorAccount, `TREZOR #${index + 1}`)
     const { identities } = this.preferencesController.store.getState()
     return { ...keyState, identities }
    }
-- 
cgit 


From 85a4e39b052b8e0c9d277766c79d1a2b5459d934 Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Mon, 9 Jul 2018 20:54:47 -0400
Subject: fix trezor label

---
 app/scripts/metamask-controller.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 71a22f6ec..bec02c3ed 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -579,7 +579,7 @@ module.exports = class MetamaskController extends EventEmitter {
     const keyState = await keyringController.addNewAccount(keyring)
     const newAccounts = await keyringController.getAccounts()
     // Assuming the trezor account is the last one
-    const trezorAccount = newAccounts[newAccounts.length -1]
+    const trezorAccount = newAccounts[newAccounts.length - 1]
     this.preferencesController.setAddresses(newAccounts)
     newAccounts.forEach(address => {
       if (!oldAccounts.includes(address)) {
-- 
cgit 


From 523cf9ad33d88719520ae5e7293329d133b64d4d Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Wed, 11 Jul 2018 00:20:40 -0400
Subject: account removal is working

---
 app/scripts/metamask-controller.js | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index bec02c3ed..e8f0eba90 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -354,6 +354,7 @@ module.exports = class MetamaskController extends EventEmitter {
       verifySeedPhrase: nodeify(this.verifySeedPhrase, this),
       clearSeedWordCache: this.clearSeedWordCache.bind(this),
       resetAccount: nodeify(this.resetAccount, this),
+      removeAccount: nodeify(this.removeAccount, this),
       importAccountWithStrategy: nodeify(this.importAccountWithStrategy, this),
 
       // trezor
@@ -587,7 +588,8 @@ module.exports = class MetamaskController extends EventEmitter {
       }
     })
 
-    this.preferencesController.setAccountLabel(trezorAccount, `TREZOR #${index + 1}`)
+    this.preferencesController.setAccountLabel(trezorAccount, `TREZOR #${parseInt(index, 10) + 1}`)
+    this.preferencesController.setSelectedAddress(trezorAccount)
     const { identities } = this.preferencesController.store.getState()
     return { ...keyState, identities }
    }
@@ -705,6 +707,18 @@ module.exports = class MetamaskController extends EventEmitter {
     return selectedAddress
   }
 
+  /**
+   * Removes a "Loose" account from state.
+   *
+   * @param {string[]} address A hex address
+   *
+   */
+  async removeAccount (address) {
+    this.preferencesController.removeAddress(address)
+    return address
+  }
+
+
   /**
    * Imports an account with the specified import strategy.
    * These are defined in app/scripts/account-import-strategies
-- 
cgit 


From 89cc48789af2bb6f0925384abe4d4a53179a3956 Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Wed, 11 Jul 2018 20:01:44 -0400
Subject: update to temp dependencies

---
 app/scripts/metamask-controller.js | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index e8f0eba90..cd6fdcc37 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -708,13 +708,18 @@ module.exports = class MetamaskController extends EventEmitter {
   }
 
   /**
-   * Removes a "Loose" account from state.
+   * Removes an account from state / storage.
    *
    * @param {string[]} address A hex address
    *
    */
   async removeAccount (address) {
+    // Remove account from the preferences controller
     this.preferencesController.removeAddress(address)
+    // Remove account from the account tracker controller
+    this.accountTracker.removeAccount(address)
+    // Remove account from the keyring
+    await this.keyringController.removeAccount(address)
     return address
   }
 
-- 
cgit 


From 80e875308b4447ed38d7e0f677570d73956dd9de Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Wed, 11 Jul 2018 21:21:36 -0400
Subject: forget device and autiload account features added

---
 app/scripts/metamask-controller.js | 37 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index cd6fdcc37..b8b7c38e4 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -357,8 +357,12 @@ module.exports = class MetamaskController extends EventEmitter {
       removeAccount: nodeify(this.removeAccount, this),
       importAccountWithStrategy: nodeify(this.importAccountWithStrategy, this),
 
-      // trezor
+      // hardware wallets
       connectHardware: nodeify(this.connectHardware, this),
+      forgetDevice: nodeify(this.forgetDevice, this),
+      checkHardwareStatus: nodeify(this.checkHardwareStatus, this),
+
+      // TREZOR
       unlockTrezorAccount: nodeify(this.unlockTrezorAccount, this),
 
       // vault management
@@ -561,6 +565,37 @@ module.exports = class MetamaskController extends EventEmitter {
     }
   }
 
+  async checkHardwareStatus (deviceName) {
+
+    switch (deviceName) {
+      case 'trezor':
+        const keyringController = this.keyringController
+        const keyring = await keyringController.getKeyringsByType(
+          'Trezor Hardware'
+        )[0]
+        if (!keyring) {
+          return false
+        }
+        return keyring.isUnlocked()
+    }
+  }
+
+  async forgetDevice (deviceName) {
+
+    switch (deviceName) {
+      case 'trezor':
+        const keyringController = this.keyringController
+        const keyring = await keyringController.getKeyringsByType(
+          'Trezor Hardware'
+        )[0]
+        if (!keyring) {
+          return false
+        }
+        keyring.forgetDevice()
+        return true
+    }
+  }
+
   /**
    * Imports an account from a trezor device.
    *
-- 
cgit 


From e5512c306ded1d2a521a0ba0d2c3cdd5878e53bb Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Mon, 16 Jul 2018 19:36:08 -0400
Subject: added unit tests for metamaskcontroller

---
 app/scripts/metamask-controller.js | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index b8b7c38e4..2f114e9f0 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -561,10 +561,15 @@ module.exports = class MetamaskController extends EventEmitter {
         return accounts
 
       default:
-        throw new Error('MetamaskController - Unknown device')
+        throw new Error('MetamaskController:connectHardware - Unknown device')
     }
   }
 
+  /**
+   * Check if the device is unlocked
+   *
+   * @returns {Promise<boolean>}
+   */
   async checkHardwareStatus (deviceName) {
 
     switch (deviceName) {
@@ -574,12 +579,19 @@ module.exports = class MetamaskController extends EventEmitter {
           'Trezor Hardware'
         )[0]
         if (!keyring) {
-          return false
+          throw new Error('MetamaskController:checkHardwareStatus - Trezor Hardware keyring not found')
         }
         return keyring.isUnlocked()
+      default:
+        throw new Error('MetamaskController:checkHardwareStatus - Unknown device')
     }
   }
 
+  /**
+   * Clear
+   *
+   * @returns {Promise<boolean>}
+   */
   async forgetDevice (deviceName) {
 
     switch (deviceName) {
@@ -589,10 +601,12 @@ module.exports = class MetamaskController extends EventEmitter {
           'Trezor Hardware'
         )[0]
         if (!keyring) {
-          return false
+          throw new Error('MetamaskController:forgetDevice - Trezor Hardware keyring not found')
         }
         keyring.forgetDevice()
         return true
+      default:
+        throw new Error('MetamaskController:forgetDevice - Unknown device')
     }
   }
 
-- 
cgit 


From de4265c629f8e68d882c2ded0e20417327cf4d2f Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Tue, 17 Jul 2018 01:17:18 -0400
Subject: added more unit tests

---
 app/scripts/metamask-controller.js | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 2f114e9f0..7d3f4c2a8 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -628,17 +628,16 @@ module.exports = class MetamaskController extends EventEmitter {
     const oldAccounts = await keyringController.getAccounts()
     const keyState = await keyringController.addNewAccount(keyring)
     const newAccounts = await keyringController.getAccounts()
-    // Assuming the trezor account is the last one
-    const trezorAccount = newAccounts[newAccounts.length - 1]
     this.preferencesController.setAddresses(newAccounts)
+    console.log('new vs old', newAccounts, oldAccounts)
     newAccounts.forEach(address => {
       if (!oldAccounts.includes(address)) {
+        console.log('new address found', address)
+        this.preferencesController.setAccountLabel(address, `TREZOR #${parseInt(index, 10) + 1}`)
         this.preferencesController.setSelectedAddress(address)
       }
     })
 
-    this.preferencesController.setAccountLabel(trezorAccount, `TREZOR #${parseInt(index, 10) + 1}`)
-    this.preferencesController.setSelectedAddress(trezorAccount)
     const { identities } = this.preferencesController.store.getState()
     return { ...keyState, identities }
    }
-- 
cgit 


From e89350b19fdac56968303e5c48806a4605fb4b22 Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Tue, 17 Jul 2018 01:44:28 -0400
Subject: added tests for removeAccount

---
 app/scripts/metamask-controller.js | 2 --
 1 file changed, 2 deletions(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 7d3f4c2a8..575c591fa 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -629,10 +629,8 @@ module.exports = class MetamaskController extends EventEmitter {
     const keyState = await keyringController.addNewAccount(keyring)
     const newAccounts = await keyringController.getAccounts()
     this.preferencesController.setAddresses(newAccounts)
-    console.log('new vs old', newAccounts, oldAccounts)
     newAccounts.forEach(address => {
       if (!oldAccounts.includes(address)) {
-        console.log('new address found', address)
         this.preferencesController.setAccountLabel(address, `TREZOR #${parseInt(index, 10) + 1}`)
         this.preferencesController.setSelectedAddress(address)
       }
-- 
cgit 


From aa5a987765677b4945e9eefe03cae8dcc93318cd Mon Sep 17 00:00:00 2001
From: brunobar79 <brunobar79@gmail.com>
Date: Tue, 17 Jul 2018 21:54:04 -0400
Subject: added some e2e tests

---
 app/scripts/metamask-controller.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 575c591fa..dc5c24b1b 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -579,7 +579,7 @@ module.exports = class MetamaskController extends EventEmitter {
           'Trezor Hardware'
         )[0]
         if (!keyring) {
-          throw new Error('MetamaskController:checkHardwareStatus - Trezor Hardware keyring not found')
+          return false
         }
         return keyring.isUnlocked()
       default:
-- 
cgit 


From cb045fd8feec88bd631329ab9b3285aeed0f2e97 Mon Sep 17 00:00:00 2001
From: Esteban MiƱo <efmino@uc.cl>
Date: Fri, 20 Jul 2018 12:36:24 -0400
Subject: Auto-detect tokens #3034 (#4683)

* detect tokens polling

* network store to detect token

* tests for spec

* passtest-lint

* fix lint

* improve tests

* detect tokens through infura

* detect tokens when submit password and new account selected

* keyring unlocked detect and unit tests

* add changelog
---
 app/scripts/metamask-controller.js | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

(limited to 'app/scripts/metamask-controller.js')

diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index dc5c24b1b..6f5908414 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -35,6 +35,7 @@ const TypedMessageManager = require('./lib/typed-message-manager')
 const TransactionController = require('./controllers/transactions')
 const BalancesController = require('./controllers/computed-balances')
 const TokenRatesController = require('./controllers/token-rates')
+const DetectTokensController = require('./controllers/detect-tokens')
 const ConfigManager = require('./lib/config-manager')
 const nodeify = require('./lib/nodeify')
 const accountImporter = require('./account-import-strategies')
@@ -147,6 +148,13 @@ module.exports = class MetamaskController extends EventEmitter {
       this.accountTracker.syncWithAddresses(addresses)
     })
 
+    // detect tokens controller
+    this.detectTokensController = new DetectTokensController({
+      preferences: this.preferencesController,
+      network: this.networkController,
+      keyringMemStore: this.keyringController.memStore,
+    })
+
     // address book controller
     this.addressBookController = new AddressBookController({
       initState: initState.AddressBookController,
@@ -1420,11 +1428,13 @@ module.exports = class MetamaskController extends EventEmitter {
   }
 
   /**
-   * A method for activating the retrieval of price data, which should only be fetched when the UI is visible.
+   * A method for activating the retrieval of price data and auto detect tokens, 
+   * which should only be fetched when the UI is visible.
    * @private
    * @param {boolean} active - True if price data should be getting fetched.
    */
   set isClientOpenAndUnlocked (active) {
     this.tokenRatesController.isActive = active
+    this.detectTokensController.isActive = active
   }
 }
-- 
cgit