aboutsummaryrefslogtreecommitdiffstats
path: root/app/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'app/scripts')
-rw-r--r--app/scripts/background.js1
-rw-r--r--app/scripts/controllers/network/network.js12
-rw-r--r--app/scripts/controllers/preferences.js4
-rw-r--r--app/scripts/lib/buy-eth-url.js41
-rw-r--r--app/scripts/lib/nodeify.js15
-rw-r--r--app/scripts/metamask-controller.js15
-rw-r--r--app/scripts/migrations/033.js32
-rw-r--r--app/scripts/migrations/index.js2
-rw-r--r--app/scripts/notice-controller.js100
9 files changed, 86 insertions, 136 deletions
diff --git a/app/scripts/background.js b/app/scripts/background.js
index 7fea3c8c6..cca0d4709 100644
--- a/app/scripts/background.js
+++ b/app/scripts/background.js
@@ -106,7 +106,6 @@ setupMetamaskMeshMetrics()
* @property {string} rpcTarget - DEPRECATED - The URL of the current RPC provider.
* @property {Object} identities - An object matching lower-case hex addresses to Identity objects with "address" and "name" (nickname) keys.
* @property {Object} unapprovedTxs - An object mapping transaction hashes to unapproved transactions.
- * @property {boolean} noActiveNotices - False if there are notices the user should confirm before using the application.
* @property {Array} frequentRpcList - A list of frequently used RPCs, including custom user-provided ones.
* @property {Array} addressBook - A list of previously sent to addresses.
* @property {address} selectedTokenAddress - Used to indicate if a token is globally selected. Should be deprecated in favor of UI-centric token selection.
diff --git a/app/scripts/controllers/network/network.js b/app/scripts/controllers/network/network.js
index 0c6327f6e..47432c1e2 100644
--- a/app/scripts/controllers/network/network.js
+++ b/app/scripts/controllers/network/network.js
@@ -25,10 +25,18 @@ const INFURA_PROVIDER_TYPES = [ROPSTEN, RINKEBY, KOVAN, MAINNET]
const env = process.env.METAMASK_ENV
const METAMASK_DEBUG = process.env.METAMASK_DEBUG
-const testMode = (METAMASK_DEBUG || env === 'test')
+
+let defaultProviderConfigType
+if (process.env.IN_TEST === 'true') {
+ defaultProviderConfigType = LOCALHOST
+} else if (METAMASK_DEBUG || env === 'test') {
+ defaultProviderConfigType = RINKEBY
+} else {
+ defaultProviderConfigType = MAINNET
+}
const defaultProviderConfig = {
- type: testMode ? RINKEBY : MAINNET,
+ type: defaultProviderConfigType,
}
const defaultNetworkConfig = {
diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js
index f92341353..737411890 100644
--- a/app/scripts/controllers/preferences.js
+++ b/app/scripts/controllers/preferences.js
@@ -40,7 +40,9 @@ class PreferencesController {
// Feature flag toggling is available in the global namespace
// for convenient testing of pre-release features, and should never
// perform sensitive operations.
- featureFlags: {},
+ featureFlags: {
+ privacyMode: true,
+ },
knownMethodData: {},
participateInMetaMetrics: null,
firstTimeFlowType: null,
diff --git a/app/scripts/lib/buy-eth-url.js b/app/scripts/lib/buy-eth-url.js
index 040b5695b..fbe6c6c9e 100644
--- a/app/scripts/lib/buy-eth-url.js
+++ b/app/scripts/lib/buy-eth-url.js
@@ -11,24 +11,37 @@ module.exports = getBuyEthUrl
* network does not match any of the specified cases, or if no network is given, returns undefined.
*
*/
-function getBuyEthUrl ({ network, amount, address }) {
- let url
+function getBuyEthUrl ({ network, amount, address, service }) {
+ // default service by network if not specified
+ if (!service) service = getDefaultServiceForNetwork(network)
+
+ switch (service) {
+ case 'wyre':
+ return `https://dash.sendwyre.com/sign-up`
+ case 'coinswitch':
+ return `https://metamask.coinswitch.co/?address=${address}&to=eth`
+ case 'coinbase':
+ return `https://buy.coinbase.com/?code=9ec56d01-7e81-5017-930c-513daa27bb6a&amount=${amount}&address=${address}&crypto_currency=ETH`
+ case 'metamask-faucet':
+ return 'https://faucet.metamask.io/'
+ case 'rinkeby-faucet':
+ return 'https://www.rinkeby.io/'
+ case 'kovan-faucet':
+ return 'https://github.com/kovan-testnet/faucet'
+ }
+ throw new Error(`Unknown cryptocurrency exchange or faucet: "${service}"`)
+}
+
+function getDefaultServiceForNetwork (network) {
switch (network) {
case '1':
- url = `https://dash.sendwyre.com/sign-up`
- break
-
+ return 'wyre'
case '3':
- url = 'https://faucet.metamask.io/'
- break
-
+ return 'metamask-faucet'
case '4':
- url = 'https://www.rinkeby.io/'
- break
-
+ return 'rinkeby-faucet'
case '42':
- url = 'https://github.com/kovan-testnet/faucet'
- break
+ return 'kovan-faucet'
}
- return url
+ throw new Error(`No default cryptocurrency exchange or faucet for networkId: "${network}"`)
}
diff --git a/app/scripts/lib/nodeify.js b/app/scripts/lib/nodeify.js
index 25be6537b..a813ae679 100644
--- a/app/scripts/lib/nodeify.js
+++ b/app/scripts/lib/nodeify.js
@@ -1,5 +1,5 @@
const promiseToCallback = require('promise-to-callback')
-const noop = function () {}
+const callbackNoop = function (err) { if (err) throw err }
/**
* A generator that returns a function which, when passed a promise, can treat that promise as a node style callback.
@@ -11,6 +11,7 @@ const noop = function () {}
*/
module.exports = function nodeify (fn, context) {
return function () {
+ // parse arguments
const args = [].slice.call(arguments)
const lastArg = args[args.length - 1]
const lastArgIsCallback = typeof lastArg === 'function'
@@ -19,8 +20,16 @@ module.exports = function nodeify (fn, context) {
callback = lastArg
args.pop()
} else {
- callback = noop
+ callback = callbackNoop
}
- promiseToCallback(fn.apply(context, args))(callback)
+ // call the provided function and ensure result is a promise
+ let result
+ try {
+ result = Promise.resolve(fn.apply(context, args))
+ } catch (err) {
+ result = Promise.reject(err)
+ }
+ // wire up promise resolution to callback
+ promiseToCallback(result)(callback)
}
}
diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js
index 540aee936..4108ed4c0 100644
--- a/app/scripts/metamask-controller.js
+++ b/app/scripts/metamask-controller.js
@@ -24,7 +24,6 @@ const KeyringController = require('eth-keyring-controller')
const NetworkController = require('./controllers/network')
const PreferencesController = require('./controllers/preferences')
const CurrencyController = require('./controllers/currency')
-const NoticeController = require('./notice-controller')
const ShapeShiftController = require('./controllers/shapeshift')
const InfuraController = require('./controllers/infura')
const BlacklistController = require('./controllers/blacklist')
@@ -211,13 +210,6 @@ module.exports = class MetamaskController extends EventEmitter {
})
this.balancesController.updateAllBalances()
- // notices
- this.noticeController = new NoticeController({
- initState: initState.NoticeController,
- version,
- firstVersion: initState.firstTimeInfo.version,
- })
-
this.shapeshiftController = new ShapeShiftController({
initState: initState.ShapeShiftController,
})
@@ -243,7 +235,6 @@ module.exports = class MetamaskController extends EventEmitter {
PreferencesController: this.preferencesController.store,
AddressBookController: this.addressBookController,
CurrencyController: this.currencyController.store,
- NoticeController: this.noticeController.store,
ShapeShiftController: this.shapeshiftController.store,
NetworkController: this.networkController.store,
InfuraController: this.infuraController.store,
@@ -265,7 +256,6 @@ module.exports = class MetamaskController extends EventEmitter {
RecentBlocksController: this.recentBlocksController.store,
AddressBookController: this.addressBookController,
CurrencyController: this.currencyController.store,
- NoticeController: this.noticeController.memStore,
ShapeshiftController: this.shapeshiftController.store,
InfuraController: this.infuraController.store,
ProviderApprovalController: this.providerApprovalController.store,
@@ -371,7 +361,6 @@ module.exports = class MetamaskController extends EventEmitter {
const keyringController = this.keyringController
const preferencesController = this.preferencesController
const txController = this.txController
- const noticeController = this.noticeController
const networkController = this.networkController
const providerApprovalController = this.providerApprovalController
@@ -470,10 +459,6 @@ module.exports = class MetamaskController extends EventEmitter {
signTypedMessage: nodeify(this.signTypedMessage, this),
cancelTypedMessage: this.cancelTypedMessage.bind(this),
- // notices
- checkNotices: noticeController.updateNoticesList.bind(noticeController),
- markNoticeRead: noticeController.markNoticeRead.bind(noticeController),
-
approveProviderRequest: providerApprovalController.approveProviderRequest.bind(providerApprovalController),
clearApprovedOrigins: providerApprovalController.clearApprovedOrigins.bind(providerApprovalController),
rejectProviderRequest: providerApprovalController.rejectProviderRequest.bind(providerApprovalController),
diff --git a/app/scripts/migrations/033.js b/app/scripts/migrations/033.js
new file mode 100644
index 000000000..3abb2593e
--- /dev/null
+++ b/app/scripts/migrations/033.js
@@ -0,0 +1,32 @@
+// next version number
+const version = 33
+
+/*
+
+Cleans up notices and assocated notice controller code
+
+*/
+
+const clone = require('clone')
+
+module.exports = {
+ version,
+
+ migrate: async function (originalVersionedData) {
+ const versionedData = clone(originalVersionedData)
+ versionedData.meta.version = version
+ const state = versionedData.data
+ const newState = transformState(state)
+ versionedData.data = newState
+ return versionedData
+ },
+}
+
+function transformState (state) {
+ const newState = state
+ // transform state here
+ if (state.NoticeController) {
+ delete newState.NoticeController
+ }
+ return newState
+}
diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js
index eb1b51685..be3328bad 100644
--- a/app/scripts/migrations/index.js
+++ b/app/scripts/migrations/index.js
@@ -42,4 +42,6 @@ module.exports = [
require('./029'),
require('./030'),
require('./031'),
+ require('./032'),
+ require('./033'),
]
diff --git a/app/scripts/notice-controller.js b/app/scripts/notice-controller.js
deleted file mode 100644
index 6fe8b8cf0..000000000
--- a/app/scripts/notice-controller.js
+++ /dev/null
@@ -1,100 +0,0 @@
-const {EventEmitter} = require('events')
-const semver = require('semver')
-const extend = require('xtend')
-const ObservableStore = require('obs-store')
-const hardCodedNotices = require('../../notices/notices.js')
-const uniqBy = require('lodash.uniqby')
-
-module.exports = class NoticeController extends EventEmitter {
-
- constructor (opts = {}) {
- super()
- this.noticePoller = null
- this.firstVersion = opts.firstVersion
- this.version = opts.version
- const initState = extend({
- noticesList: [],
- }, opts.initState)
- this.store = new ObservableStore(initState)
- // setup memStore
- this.memStore = new ObservableStore({})
- this.store.subscribe(() => this._updateMemstore())
- this._updateMemstore()
- // pull in latest notices
- this.updateNoticesList()
- }
-
- getNoticesList () {
- return this.store.getState().noticesList
- }
-
- getUnreadNotices () {
- const notices = this.getNoticesList()
- return notices.filter((notice) => notice.read === false)
- }
-
- getNextUnreadNotice () {
- const unreadNotices = this.getUnreadNotices()
- return unreadNotices[0]
- }
-
- async setNoticesList (noticesList) {
- this.store.updateState({ noticesList })
- return true
- }
-
- markNoticeRead (noticeToMark, cb) {
- cb = cb || function (err) { if (err) throw err }
- try {
- const notices = this.getNoticesList()
- const index = notices.findIndex((currentNotice) => currentNotice.id === noticeToMark.id)
- notices[index].read = true
- notices[index].body = ''
- this.setNoticesList(notices)
- const latestNotice = this.getNextUnreadNotice()
- cb(null, latestNotice)
- } catch (err) {
- cb(err)
- }
- }
-
- async updateNoticesList () {
- const newNotices = await this._retrieveNoticeData()
- const oldNotices = this.getNoticesList()
- const combinedNotices = this._mergeNotices(oldNotices, newNotices)
- const filteredNotices = this._filterNotices(combinedNotices)
- const result = this.setNoticesList(filteredNotices)
- this._updateMemstore()
- return result
- }
-
- _mergeNotices (oldNotices, newNotices) {
- return uniqBy(oldNotices.concat(newNotices), 'id')
- }
-
- _filterNotices (notices) {
- return notices.filter((newNotice) => {
- if ('version' in newNotice) {
- const satisfied = semver.satisfies(this.version, newNotice.version)
- return satisfied
- }
- if ('firstVersion' in newNotice) {
- const satisfied = semver.satisfies(this.firstVersion, newNotice.firstVersion)
- return satisfied
- }
- return true
- })
- }
-
- async _retrieveNoticeData () {
- // Placeholder for remote notice API.
- return hardCodedNotices
- }
-
- _updateMemstore () {
- const nextUnreadNotice = this.getNextUnreadNotice()
- const noActiveNotices = !nextUnreadNotice
- this.memStore.updateState({ nextUnreadNotice, noActiveNotices })
- }
-
-}