From ad7d38c0dc206074379c813b307ed9350c7efeb0 Mon Sep 17 00:00:00 2001
From: Jakub Stasiak <kubafr2@gmail.com>
Date: Wed, 11 Apr 2018 18:32:27 +0200
Subject: Update: allow other extension to connect

---
 app/manifest.json         |  3 ++-
 app/scripts/background.js | 14 ++++++++++----
 2 files changed, 12 insertions(+), 5 deletions(-)

(limited to 'app')

diff --git a/app/manifest.json b/app/manifest.json
index dc46f1ca4..950bab2f1 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -67,6 +67,7 @@
   "externally_connectable": {
     "matches": [
       "https://metamask.io/*"
-    ]
+    ],
+    "ids": ["*"]
   }
 }
\ No newline at end of file
diff --git a/app/scripts/background.js b/app/scripts/background.js
index 6550e8944..6296eaa21 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -197,6 +197,7 @@ function setupController (initState, initLangCode) {
   // connect to other contexts
   //
   extension.runtime.onConnect.addListener(connectRemote)
+  extension.runtime.onConnectExternal.addListener(connectExternal)
 
   const metamaskInternalProcessHash = {
     [ENVIRONMENT_TYPE_POPUP]: true,
@@ -211,9 +212,9 @@ function setupController (initState, initLangCode) {
   function connectRemote (remotePort) {
     const processName = remotePort.name
     const isMetaMaskInternalProcess = metamaskInternalProcessHash[processName]
-    const portStream = new PortStream(remotePort)
 
     if (isMetaMaskInternalProcess) {
+      const portStream = new PortStream(remotePort)
       // communication with popup
       controller.isClientOpen = true
       controller.setupTrustedCommunication(portStream, 'MetaMask')
@@ -246,12 +247,17 @@ function setupController (initState, initLangCode) {
         })
       }
     } else {
-      // communication with page
-      const originDomain = urlUtil.parse(remotePort.sender.url).hostname
-      controller.setupUntrustedCommunication(portStream, originDomain)
+      connectExternal(remotePort)
     }
   }
 
+  // communication with page or other extension
+  function connectExternal(remotePort) {
+    const originDomain = urlUtil.parse(remotePort.sender.url).hostname
+    const portStream = new PortStream(remotePort)
+    controller.setupUntrustedCommunication(portStream, originDomain)
+  }
+
   //
   // User Interface setup
   //
-- 
cgit v1.2.3


From 7eb735651bcd1c3a4ef2b4da1be5d7444e282b44 Mon Sep 17 00:00:00 2001
From: frankiebee <frankie.diamond@gmail.com>
Date: Sun, 29 Apr 2018 16:00:13 -0700
Subject: transactions - run event emitters outside context of _setTxStatus

---
 app/scripts/controllers/transactions/tx-state-manager.js | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

(limited to 'app')

diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js
index 53428c333..17938e70f 100644
--- a/app/scripts/controllers/transactions/tx-state-manager.js
+++ b/app/scripts/controllers/transactions/tx-state-manager.js
@@ -398,13 +398,15 @@ class TransactionStateManager extends EventEmitter {
   _setTxStatus (txId, status) {
     const txMeta = this.getTx(txId)
     txMeta.status = status
-    this.emit(`${txMeta.id}:${status}`, txId)
-    this.emit(`tx:status-update`, txId, status)
-    if (['submitted', 'rejected', 'failed'].includes(status)) {
-      this.emit(`${txMeta.id}:finished`, txMeta)
-    }
-    this.updateTx(txMeta, `txStateManager: setting status to ${status}`)
-    this.emit('update:badge')
+    setTimeout(() => {
+      this.updateTx(txMeta, `txStateManager: setting status to ${status}`)
+      this.emit(`${txMeta.id}:${status}`, txId)
+      this.emit(`tx:status-update`, txId, status)
+      if (['submitted', 'rejected', 'failed'].includes(status)) {
+        this.emit(`${txMeta.id}:finished`, txMeta)
+      }
+      this.emit('update:badge')
+    })
   }
 
   /**
-- 
cgit v1.2.3


From 706647785cee23d177d646c3a06f5dc2a2586feb Mon Sep 17 00:00:00 2001
From: frankiebee <frankie.diamond@gmail.com>
Date: Sun, 29 Apr 2018 16:33:46 -0700
Subject: log emitter errors

---
 app/scripts/controllers/transactions/tx-state-manager.js | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

(limited to 'app')

diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js
index 17938e70f..28b6d6d4f 100644
--- a/app/scripts/controllers/transactions/tx-state-manager.js
+++ b/app/scripts/controllers/transactions/tx-state-manager.js
@@ -399,13 +399,17 @@ class TransactionStateManager extends EventEmitter {
     const txMeta = this.getTx(txId)
     txMeta.status = status
     setTimeout(() => {
-      this.updateTx(txMeta, `txStateManager: setting status to ${status}`)
-      this.emit(`${txMeta.id}:${status}`, txId)
-      this.emit(`tx:status-update`, txId, status)
-      if (['submitted', 'rejected', 'failed'].includes(status)) {
-        this.emit(`${txMeta.id}:finished`, txMeta)
+      try {
+        this.updateTx(txMeta, `txStateManager: setting status to ${status}`)
+        this.emit(`${txMeta.id}:${status}`, txId)
+        this.emit(`tx:status-update`, txId, status)
+        if (['submitted', 'rejected', 'failed'].includes(status)) {
+          this.emit(`${txMeta.id}:finished`, txMeta)
+        }
+        this.emit('update:badge')
+      } catch (error) {
+        log.error(error)
       }
-      this.emit('update:badge')
     })
   }
 
-- 
cgit v1.2.3


From 98ae853b6c67bce137df00c2527e5ece25f1129e Mon Sep 17 00:00:00 2001
From: frankiebee <frankie.diamond@gmail.com>
Date: Mon, 30 Apr 2018 09:57:36 -0700
Subject: require log

---
 app/scripts/controllers/transactions/tx-state-manager.js | 1 +
 1 file changed, 1 insertion(+)

(limited to 'app')

diff --git a/app/scripts/controllers/transactions/tx-state-manager.js b/app/scripts/controllers/transactions/tx-state-manager.js
index 28b6d6d4f..f05c7d095 100644
--- a/app/scripts/controllers/transactions/tx-state-manager.js
+++ b/app/scripts/controllers/transactions/tx-state-manager.js
@@ -2,6 +2,7 @@ const extend = require('xtend')
 const EventEmitter = require('events')
 const ObservableStore = require('obs-store')
 const ethUtil = require('ethereumjs-util')
+const log = require('loglevel')
 const txStateHistoryHelper = require('./lib/tx-state-history-helper')
 const createId = require('../../lib/random-id')
 const { getFinalStates } = require('./lib/util')
-- 
cgit v1.2.3


From 477063a5a0e9f218af2a49886c44a9bc153c13d3 Mon Sep 17 00:00:00 2001
From: kumavis <aaron@kumavis.me>
Date: Mon, 30 Apr 2018 13:29:22 -0700
Subject: Version 4.6.1

---
 app/manifest.json | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'app')

diff --git a/app/manifest.json b/app/manifest.json
index 3e5eed205..8a14323f0 100644
--- a/app/manifest.json
+++ b/app/manifest.json
@@ -1,7 +1,7 @@
 {
   "name": "__MSG_appName__",
   "short_name": "__MSG_appName__",
-  "version": "4.6.0",
+  "version": "4.6.1",
   "manifest_version": 2,
   "author": "https://metamask.io",
   "description": "__MSG_appDescription__",
-- 
cgit v1.2.3


From 62dc6e20eb1f7188c6452519782e8ebe54c1c540 Mon Sep 17 00:00:00 2001
From: Anton <anton@chainsecurity.com>
Date: Mon, 28 May 2018 17:57:45 +0200
Subject: Clean up user rejection error message

---
 app/scripts/controllers/transactions/index.js | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

(limited to 'app')

diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index 541f1db73..586a80baf 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -111,6 +111,15 @@ class TransactionController extends EventEmitter {
     this.txStateManager.wipeTransactions(address)
   }
 
+  /**
+  Returns error without stack trace for better UI display
+  @param {Error} err - error which stack will be cleaned
+  */
+  cleanErrorStack(err){
+    err.stack = err.name + ': ' + err.message
+    return err
+  }
+
   /**
   add a new unapproved transaction to the pipeline
 
@@ -118,6 +127,8 @@ class TransactionController extends EventEmitter {
   @param txParams {object} - txParams for the transaction
   @param opts {object} - with the key origin to put the origin on the txMeta
   */
+
+
   async newUnapprovedTransaction (txParams, opts = {}) {
     log.debug(`MetaMaskController newUnapprovedTransaction ${JSON.stringify(txParams)}`)
     const initialTxMeta = await this.addUnapprovedTransaction(txParams)
@@ -130,11 +141,11 @@ class TransactionController extends EventEmitter {
           case 'submitted':
             return resolve(finishedTxMeta.hash)
           case 'rejected':
-            return reject(new Error('MetaMask Tx Signature: User denied transaction signature.'))
+            return reject(this.cleanErrorStack(new Error('MetaMask Tx Signature: User denied transaction signature.')))
           case 'failed':
-            return reject(new Error(finishedTxMeta.err.message))
+            return reject(this.cleanErrorStack(new Error(finishedTxMeta.err.message)))
           default:
-            return reject(new Error(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finishedTxMeta.txParams)}`))
+            return reject(this.cleanErrorStack(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finishedTxMeta.txParams)}`))
         }
       })
     })
-- 
cgit v1.2.3


From 1d23a5c81b03b8b52225e942603c84b237d4e63c Mon Sep 17 00:00:00 2001
From: Anton <anton@chainsecurity.com>
Date: Mon, 28 May 2018 18:08:33 +0200
Subject: error message fix

---
 app/scripts/controllers/transactions/index.js | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

(limited to 'app')

diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index 586a80baf..6609b80b0 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -128,7 +128,6 @@ class TransactionController extends EventEmitter {
   @param opts {object} - with the key origin to put the origin on the txMeta
   */
 
-
   async newUnapprovedTransaction (txParams, opts = {}) {
     log.debug(`MetaMaskController newUnapprovedTransaction ${JSON.stringify(txParams)}`)
     const initialTxMeta = await this.addUnapprovedTransaction(txParams)
@@ -145,7 +144,7 @@ class TransactionController extends EventEmitter {
           case 'failed':
             return reject(this.cleanErrorStack(new Error(finishedTxMeta.err.message)))
           default:
-            return reject(this.cleanErrorStack(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finishedTxMeta.txParams)}`))
+            return reject(this.cleanErrorStack(new Error(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finishedTxMeta.txParams)}`)))
         }
       })
     })
-- 
cgit v1.2.3


From 71a6e97327a4c759942784ee81505e3bc5ed545e Mon Sep 17 00:00:00 2001
From: Anton <anton@chainsecurity.com>
Date: Mon, 28 May 2018 22:57:08 +0200
Subject: cleanErrorStack moved to separate library module more errors traces
 cleaned up

---
 app/scripts/controllers/transactions/index.js | 16 ++++------------
 app/scripts/lib/cleanErrorStack.js            | 24 ++++++++++++++++++++++++
 app/scripts/metamask-controller.js            | 15 ++++++++-------
 3 files changed, 36 insertions(+), 19 deletions(-)
 create mode 100644 app/scripts/lib/cleanErrorStack.js

(limited to 'app')

diff --git a/app/scripts/controllers/transactions/index.js b/app/scripts/controllers/transactions/index.js
index 6609b80b0..aff5db984 100644
--- a/app/scripts/controllers/transactions/index.js
+++ b/app/scripts/controllers/transactions/index.js
@@ -8,6 +8,7 @@ const TxGasUtil = require('./tx-gas-utils')
 const PendingTransactionTracker = require('./pending-tx-tracker')
 const NonceTracker = require('./nonce-tracker')
 const txUtils = require('./lib/util')
+const cleanErrorStack = require('../../lib/cleanErrorStack')
 const log = require('loglevel')
 
 /**
@@ -111,15 +112,6 @@ class TransactionController extends EventEmitter {
     this.txStateManager.wipeTransactions(address)
   }
 
-  /**
-  Returns error without stack trace for better UI display
-  @param {Error} err - error which stack will be cleaned
-  */
-  cleanErrorStack(err){
-    err.stack = err.name + ': ' + err.message
-    return err
-  }
-
   /**
   add a new unapproved transaction to the pipeline
 
@@ -140,11 +132,11 @@ class TransactionController extends EventEmitter {
           case 'submitted':
             return resolve(finishedTxMeta.hash)
           case 'rejected':
-            return reject(this.cleanErrorStack(new Error('MetaMask Tx Signature: User denied transaction signature.')))
+            return reject(cleanErrorStack(new Error('MetaMask Tx Signature: User denied transaction signature.')))
           case 'failed':
-            return reject(this.cleanErrorStack(new Error(finishedTxMeta.err.message)))
+            return reject(cleanErrorStack(new Error(finishedTxMeta.err.message)))
           default:
-            return reject(this.cleanErrorStack(new Error(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finishedTxMeta.txParams)}`)))
+            return reject(cleanErrorStack(new Error(`MetaMask Tx Signature: Unknown problem: ${JSON.stringify(finishedTxMeta.txParams)}`)))
         }
       })
     })
diff --git a/app/scripts/lib/cleanErrorStack.js b/app/scripts/lib/cleanErrorStack.js
new file mode 100644
index 000000000..fe1bfb0ce
--- /dev/null
+++ b/app/scripts/lib/cleanErrorStack.js
@@ -0,0 +1,24 @@
+/**
+ * Returns error without stack trace for better UI display
+ * @param {Error} err - error
+ * @returns {Error} Error with clean stack trace.
+ */
+function cleanErrorStack(err){
+  var name = err.name
+  name = (name === undefined) ? 'Error' : String(name)
+
+  var msg = err.message
+  msg = (msg === undefined) ? '' : String(msg)
+
+  if (name === '') {
+    err.stack = err.message
+  } else if (msg === '') {
+    err.stack = err.name
+  } else {
+    err.stack = err.name + ': ' + err.message
+  }
+
+  return err
+}
+
+module.exports = cleanErrorStack
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index c4a73d8ea..b0666d9f9 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -45,6 +45,7 @@ const BN = require('ethereumjs-util').BN
 const GWEI_BN = new BN('1000000000')
 const percentile = require('percentile')
 const seedPhraseVerifier = require('./lib/seed-phrase-verifier')
+const cleanErrorStack = require('./lib/cleanErrorStack')
 const log = require('loglevel')
 
 module.exports = class MetamaskController extends EventEmitter {
@@ -637,9 +638,9 @@ module.exports = class MetamaskController extends EventEmitter {
         case 'signed':
           return cb(null, data.rawSig)
         case 'rejected':
-          return cb(new Error('MetaMask Message Signature: User denied message signature.'))
+          return cb(cleanErrorStack(new Error('MetaMask Message Signature: User denied message signature.')))
         default:
-          return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`))
+          return cb(cleanErrorStack(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)))
       }
     })
   }
@@ -697,7 +698,7 @@ module.exports = class MetamaskController extends EventEmitter {
    */
   newUnsignedPersonalMessage (msgParams, cb) {
     if (!msgParams.from) {
-      return cb(new Error('MetaMask Message Signature: from field is required.'))
+      return cb(cleanErrorStack(new Error('MetaMask Message Signature: from field is required.')))
     }
 
     const msgId = this.personalMessageManager.addUnapprovedMessage(msgParams)
@@ -708,9 +709,9 @@ module.exports = class MetamaskController extends EventEmitter {
         case 'signed':
           return cb(null, data.rawSig)
         case 'rejected':
-          return cb(new Error('MetaMask Message Signature: User denied message signature.'))
+          return cb(cleanErrorStack(new Error('MetaMask Message Signature: User denied message signature.')))
         default:
-          return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`))
+          return cb(cleanErrorStack(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)))
       }
     })
   }
@@ -776,9 +777,9 @@ module.exports = class MetamaskController extends EventEmitter {
         case 'signed':
           return cb(null, data.rawSig)
         case 'rejected':
-          return cb(new Error('MetaMask Message Signature: User denied message signature.'))
+          return cb(cleanErrorStack(new Error('MetaMask Message Signature: User denied message signature.')))
         default:
-          return cb(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`))
+          return cb(cleanErrorStack(new Error(`MetaMask Message Signature: Unknown problem: ${JSON.stringify(msgParams)}`)))
       }
     })
   }
-- 
cgit v1.2.3


From a19b911febbd2f29ef838a0f6059319c6d1c054e Mon Sep 17 00:00:00 2001
From: Alexander Tseung <alextsg@users.noreply.github.com>
Date: Tue, 29 May 2018 18:31:32 -0700
Subject: Add rpc key to i18n messages (#4375)

---
 app/_locales/en/messages.json | 3 +++
 1 file changed, 3 insertions(+)

(limited to 'app')

diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json
index 34b7477a6..4851508a3 100644
--- a/app/_locales/en/messages.json
+++ b/app/_locales/en/messages.json
@@ -679,6 +679,9 @@
   "ropsten": {
     "message": "Ropsten Test Network"
   },
+  "rpc": {
+    "message": "Custom RPC"
+  },
   "currentRpc": {
     "message": "Current RPC"
   },
-- 
cgit v1.2.3