From 0940ecd57b6efbf76171579ffe72dfd8a683f5be Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 23 Jul 2018 17:12:20 -0400 Subject: added camera snippet injection to inpage.js --- app/scripts/inpage.js | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'app') diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index 7dd7fda02..1fafe7813 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -5,6 +5,7 @@ const log = require('loglevel') const LocalMessageDuplexStream = require('post-message-stream') const setupDappAutoReload = require('./lib/auto-reload.js') const MetamaskInpageProvider = require('./lib/inpage-provider.js') +const Instascan = require('instascan') restoreContextAfterImports() log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn') @@ -96,3 +97,41 @@ function restoreContextAfterImports () { console.warn('MetaMask - global.define could not be overwritten.') } } + +function initCameraScanner () { + // Append preview div + const preview = document.createElement('div') + preview.id = 'metamask-preview-wrapper' + preview.style = 'position:absolute; top: 20px; left: 20px; z-indez: 99999999999999; width: 300px; height: 300px; overflow: hidden' + const previewVideo = document.createElement('video') + previewVideo.id = 'metamask-preview-video' + previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%' + preview.appendChild(previewVideo) + document.body.appendChild(preview) + console.log('injected') + const scanner = new Instascan.Scanner({ + video: document.getElementById('metamask-preview-video'), + backgroundScan: false, + continuous: true, + }) + scanner.addListener('scan', function (content) { + alert(content) + scanner.stop().then(_ => { + document.getElementById('metamask-preview-wrapper').parentElement.removeChild(document.getElementById('metamask-preview-wrapper')) + }) + }) + Instascan.Camera.getCameras().then(function (cameras) { + if (cameras.length > 0) { + scanner.start(cameras[1]) + } else { + console.error('No cameras found.') + } + }).catch(function (e) { + console.error(e) + }) +} + +setTimeout(_ => { + console.log('injecting...') + initCameraScanner() +}, 3000) -- cgit v1.2.3 From 02091486094dcc818096ce13a22cdc140a2e8347 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 23 Jul 2018 19:45:13 -0400 Subject: fixes --- app/scripts/inpage.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index 1fafe7813..1a7bea7c0 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -102,10 +102,10 @@ function initCameraScanner () { // Append preview div const preview = document.createElement('div') preview.id = 'metamask-preview-wrapper' - preview.style = 'position:absolute; top: 20px; left: 20px; z-indez: 99999999999999; width: 300px; height: 300px; overflow: hidden' + preview.style = 'position:absolute; top: 20px; left: 20px; width: 300px; height: 300px; overflow: hidden; z-index: 999999999;' const previewVideo = document.createElement('video') previewVideo.id = 'metamask-preview-video' - previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%' + previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%;' preview.appendChild(previewVideo) document.body.appendChild(preview) console.log('injected') @@ -122,7 +122,7 @@ function initCameraScanner () { }) Instascan.Camera.getCameras().then(function (cameras) { if (cameras.length > 0) { - scanner.start(cameras[1]) + scanner.start(cameras[0]) } else { console.error('No cameras found.') } -- cgit v1.2.3 From f7ad978474f42eb96f4f6c79376391504cf228c1 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 23 Jul 2018 21:27:51 -0400 Subject: camera working back and forth --- app/scripts/contentscript.js | 47 +++++++++++++++++++++++++++ app/scripts/inpage.js | 38 ---------------------- app/scripts/metamask-controller.js | 24 +++++++++++++- app/scripts/platforms/extension.js | 65 ++++++-------------------------------- 4 files changed, 80 insertions(+), 94 deletions(-) (limited to 'app') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 7c775fb04..87f7c63ef 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -6,6 +6,7 @@ const PongStream = require('ping-pong-stream/pong') const ObjectMultiplex = require('obj-multiplex') const extension = require('extensionizer') const PortStream = require('./lib/port-stream.js') +const Instascan = require('instascan') const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString() const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n' @@ -199,3 +200,49 @@ function redirectToPhishingWarning () { console.log('MetaMask - redirecting to phishing warning') window.location.href = 'https://metamask.io/phishing.html' } + +function initQrCodeScanner () { + // Append preview div + const preview = document.createElement('div') + preview.id = 'metamask-preview-wrapper' + preview.style = 'position:absolute; top: 20px; left: 20px; width: 300px; height: 300px; overflow: hidden; z-index: 999999999;' + const previewVideo = document.createElement('video') + previewVideo.id = 'metamask-preview-video' + previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%;' + preview.appendChild(previewVideo) + document.body.appendChild(preview) + console.log('injected') + const scanner = new Instascan.Scanner({ + video: document.getElementById('metamask-preview-video'), + backgroundScan: false, + continuous: true, + }) + scanner.addListener('scan', function (content) { + console.log('QR-SCANNER: got code (IN-PAGE)', content) + scanner.stop().then(_ => { + console.log('QR-SCANNER: stopped scanner and sending msg (IN-PAGE)', content) + extension.runtime.sendMessage({ + action: 'qr-code-scanner-data', + data: content, + }) + console.log('QR-SCANNER: message sent (IN-PAGE)', content) + document.getElementById('metamask-preview-wrapper').parentElement.removeChild(document.getElementById('metamask-preview-wrapper')) + }) + }) + Instascan.Camera.getCameras().then(function (cameras) { + if (cameras.length > 0) { + scanner.start(cameras[0]) + } else { + console.error('No cameras found.') + } + }).catch(function (e) { + console.error(e) + }) +} + +extension.runtime.onMessage.addListener(({ action }) => { + console.log('QR-SCANNER: message received (IN-PAGE)', action) + initQrCodeScanner() +}) +console.log('QR-SCANNER: now listening (IN-PAGE)') + diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index 1a7bea7c0..20621b73f 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -5,7 +5,6 @@ const log = require('loglevel') const LocalMessageDuplexStream = require('post-message-stream') const setupDappAutoReload = require('./lib/auto-reload.js') const MetamaskInpageProvider = require('./lib/inpage-provider.js') -const Instascan = require('instascan') restoreContextAfterImports() log.setDefaultLevel(process.env.METAMASK_DEBUG ? 'debug' : 'warn') @@ -98,40 +97,3 @@ function restoreContextAfterImports () { } } -function initCameraScanner () { - // Append preview div - const preview = document.createElement('div') - preview.id = 'metamask-preview-wrapper' - preview.style = 'position:absolute; top: 20px; left: 20px; width: 300px; height: 300px; overflow: hidden; z-index: 999999999;' - const previewVideo = document.createElement('video') - previewVideo.id = 'metamask-preview-video' - previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%;' - preview.appendChild(previewVideo) - document.body.appendChild(preview) - console.log('injected') - const scanner = new Instascan.Scanner({ - video: document.getElementById('metamask-preview-video'), - backgroundScan: false, - continuous: true, - }) - scanner.addListener('scan', function (content) { - alert(content) - scanner.stop().then(_ => { - document.getElementById('metamask-preview-wrapper').parentElement.removeChild(document.getElementById('metamask-preview-wrapper')) - }) - }) - Instascan.Camera.getCameras().then(function (cameras) { - if (cameras.length > 0) { - scanner.start(cameras[0]) - } else { - console.error('No cameras found.') - } - }).catch(function (e) { - console.error(e) - }) -} - -setTimeout(_ => { - console.log('injecting...') - initCameraScanner() -}, 3000) diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index bcc7075c2..62d707432 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -380,6 +380,9 @@ module.exports = class MetamaskController extends EventEmitter { // TREZOR unlockTrezorAccount: nodeify(this.unlockTrezorAccount, this), + // QR code scanner + scanQrCode: nodeify(this.scanQrCode, this), + // vault management submitPassword: nodeify(this.submitPassword, this), @@ -653,7 +656,26 @@ module.exports = class MetamaskController extends EventEmitter { const { identities } = this.preferencesController.store.getState() return { ...keyState, identities } - } + } + + scanQrCode () { + return new Promise((resolve, reject) => { + console.log('QR-SCANNER: intializing QR code scanner feature (MM controller)') + // Tell contentscript to inject the QR reader + this.platform.sendMessage('qr-code-scanner-init') + console.log('QR-SCANNER: message to initialize has been sent (MM controller)') + // Wait for the scanner to send something back + this.platform.addMessageListener(({ action, data }) => { + console.log('QR-SCANNER: message received (MM controller)', action, data) + if (action && action === 'qr-code-scanner-data') { + const normalizedAddress = data.replace('ethereum:', '') + console.log('QR-SCANNER: resolving promise!', normalizedAddress) + return Promise.resolve(normalizedAddress) + } + }) + console.log('QR-SCANNER: now listening (MM controller)') + }) + } // diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 901c26cab..182df23b1 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -1,5 +1,4 @@ const extension = require('extensionizer') -const explorerLink = require('etherscan-link').createExplorerLink class ExtensionPlatform { @@ -18,11 +17,8 @@ class ExtensionPlatform { return extension.runtime.getManifest().version } - openExtensionInBrowser (route = null) { - let extensionURL = extension.runtime.getURL('home.html') - if (route) { - extensionURL += `#${route}` - } + openExtensionInBrowser () { + const extensionURL = extension.runtime.getURL('home.html') this.openWindow({ url: extensionURL }) } @@ -36,57 +32,16 @@ class ExtensionPlatform { } } - showTransactionNotification (txMeta) { - - const status = txMeta.status - if (status === 'confirmed') { - this._showConfirmedTransaction(txMeta) - } else if (status === 'failed') { - this._showFailedTransaction(txMeta) - } - } - - _showConfirmedTransaction (txMeta) { - - this._subscribeToNotificationClicked() - - const url = explorerLink(txMeta.hash, parseInt(txMeta.metamaskNetworkId)) - const nonce = parseInt(txMeta.txParams.nonce, 16) - - const title = 'Confirmed transaction' - const message = `Transaction ${nonce} confirmed! View on EtherScan` - this._showNotification(title, message, url) - } - - _showFailedTransaction (txMeta) { - - const nonce = parseInt(txMeta.txParams.nonce, 16) - const title = 'Failed transaction' - const message = `Transaction ${nonce} failed! ${txMeta.err.message}` - this._showNotification(title, message) - } - - _showNotification (title, message, url) { - extension.notifications.create( - url, - { - 'type': 'basic', - 'title': title, - 'iconUrl': extension.extension.getURL('../../images/icon-64.png'), - 'message': message, - }) + addMessageListener (cb) { + extension.runtime.onMessage.addListener(cb) } - _subscribeToNotificationClicked () { - if (!extension.notifications.onClicked.hasListener(this._viewOnEtherScan)) { - extension.notifications.onClicked.addListener(this._viewOnEtherScan) - } - } - - _viewOnEtherScan (txId) { - if (txId.startsWith('http://')) { - global.metamaskController.platform.openWindow({ url: txId }) - } + sendMessage (message, query = {}) { + extension.tabs.query(query, tabs => { + const activeTab = tabs.filter(tab => tab.active)[0] + extension.tabs.sendMessage(activeTab.id, message) + console.log('QR-SCANNER: message sent to tab', message, activeTab) + }) } } -- cgit v1.2.3 From d5929e5c42e230fc0a52337f86b5850e68516563 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 23 Jul 2018 22:10:57 -0400 Subject: added qr code scanner icon in send transaction --- app/scripts/contentscript.js | 7 +------ app/scripts/metamask-controller.js | 9 ++------- app/scripts/platforms/extension.js | 3 +-- 3 files changed, 4 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 87f7c63ef..83ed85a1a 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -205,7 +205,7 @@ function initQrCodeScanner () { // Append preview div const preview = document.createElement('div') preview.id = 'metamask-preview-wrapper' - preview.style = 'position:absolute; top: 20px; left: 20px; width: 300px; height: 300px; overflow: hidden; z-index: 999999999;' + preview.style = 'position:fixed; top: 20px; left: 20px; width: 300px; height: 300px; overflow: hidden; z-index: 999999999;' const previewVideo = document.createElement('video') previewVideo.id = 'metamask-preview-video' previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%;' @@ -218,14 +218,11 @@ function initQrCodeScanner () { continuous: true, }) scanner.addListener('scan', function (content) { - console.log('QR-SCANNER: got code (IN-PAGE)', content) scanner.stop().then(_ => { - console.log('QR-SCANNER: stopped scanner and sending msg (IN-PAGE)', content) extension.runtime.sendMessage({ action: 'qr-code-scanner-data', data: content, }) - console.log('QR-SCANNER: message sent (IN-PAGE)', content) document.getElementById('metamask-preview-wrapper').parentElement.removeChild(document.getElementById('metamask-preview-wrapper')) }) }) @@ -241,8 +238,6 @@ function initQrCodeScanner () { } extension.runtime.onMessage.addListener(({ action }) => { - console.log('QR-SCANNER: message received (IN-PAGE)', action) initQrCodeScanner() }) -console.log('QR-SCANNER: now listening (IN-PAGE)') diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 62d707432..f67d4edf8 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -660,20 +660,15 @@ module.exports = class MetamaskController extends EventEmitter { scanQrCode () { return new Promise((resolve, reject) => { - console.log('QR-SCANNER: intializing QR code scanner feature (MM controller)') // Tell contentscript to inject the QR reader - this.platform.sendMessage('qr-code-scanner-init') - console.log('QR-SCANNER: message to initialize has been sent (MM controller)') + this.platform.sendMessageToActiveTab('qr-code-scanner-init') // Wait for the scanner to send something back this.platform.addMessageListener(({ action, data }) => { - console.log('QR-SCANNER: message received (MM controller)', action, data) if (action && action === 'qr-code-scanner-data') { const normalizedAddress = data.replace('ethereum:', '') - console.log('QR-SCANNER: resolving promise!', normalizedAddress) - return Promise.resolve(normalizedAddress) + resolve(normalizedAddress) } }) - console.log('QR-SCANNER: now listening (MM controller)') }) } diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 182df23b1..1cab0bedd 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -36,11 +36,10 @@ class ExtensionPlatform { extension.runtime.onMessage.addListener(cb) } - sendMessage (message, query = {}) { + sendMessageToActiveTab (message, query = {}) { extension.tabs.query(query, tabs => { const activeTab = tabs.filter(tab => tab.active)[0] extension.tabs.sendMessage(activeTab.id, message) - console.log('QR-SCANNER: message sent to tab', message, activeTab) }) } } -- cgit v1.2.3 From 74fd6d1d1227d7a9e49623b73ee85985d79a1e46 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Tue, 24 Jul 2018 20:32:20 -0400 Subject: working without injection --- app/manifest.json | 3 ++- app/scripts/contentscript.js | 41 -------------------------------------- app/scripts/metamask-controller.js | 18 ----------------- app/scripts/platforms/extension.js | 6 ------ 4 files changed, 2 insertions(+), 66 deletions(-) (limited to 'app') diff --git a/app/manifest.json b/app/manifest.json index 52256c5b7..6933652e6 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -76,5 +76,6 @@ "ids": [ "*" ] - } + }, + "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" } diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 83ed85a1a..72de16f31 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -6,7 +6,6 @@ const PongStream = require('ping-pong-stream/pong') const ObjectMultiplex = require('obj-multiplex') const extension = require('extensionizer') const PortStream = require('./lib/port-stream.js') -const Instascan = require('instascan') const inpageContent = fs.readFileSync(path.join(__dirname, '..', '..', 'dist', 'chrome', 'inpage.js')).toString() const inpageSuffix = '//# sourceURL=' + extension.extension.getURL('inpage.js') + '\n' @@ -201,43 +200,3 @@ function redirectToPhishingWarning () { window.location.href = 'https://metamask.io/phishing.html' } -function initQrCodeScanner () { - // Append preview div - const preview = document.createElement('div') - preview.id = 'metamask-preview-wrapper' - preview.style = 'position:fixed; top: 20px; left: 20px; width: 300px; height: 300px; overflow: hidden; z-index: 999999999;' - const previewVideo = document.createElement('video') - previewVideo.id = 'metamask-preview-video' - previewVideo.style = 'width: 100%; height: 100%; object-fit: none; margin-left: -10%; margin-top: 10%;' - preview.appendChild(previewVideo) - document.body.appendChild(preview) - console.log('injected') - const scanner = new Instascan.Scanner({ - video: document.getElementById('metamask-preview-video'), - backgroundScan: false, - continuous: true, - }) - scanner.addListener('scan', function (content) { - scanner.stop().then(_ => { - extension.runtime.sendMessage({ - action: 'qr-code-scanner-data', - data: content, - }) - document.getElementById('metamask-preview-wrapper').parentElement.removeChild(document.getElementById('metamask-preview-wrapper')) - }) - }) - Instascan.Camera.getCameras().then(function (cameras) { - if (cameras.length > 0) { - scanner.start(cameras[0]) - } else { - console.error('No cameras found.') - } - }).catch(function (e) { - console.error(e) - }) -} - -extension.runtime.onMessage.addListener(({ action }) => { - initQrCodeScanner() -}) - diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index f67d4edf8..c6be4b9d2 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -380,9 +380,6 @@ module.exports = class MetamaskController extends EventEmitter { // TREZOR unlockTrezorAccount: nodeify(this.unlockTrezorAccount, this), - // QR code scanner - scanQrCode: nodeify(this.scanQrCode, this), - // vault management submitPassword: nodeify(this.submitPassword, this), @@ -658,21 +655,6 @@ module.exports = class MetamaskController extends EventEmitter { return { ...keyState, identities } } - scanQrCode () { - return new Promise((resolve, reject) => { - // Tell contentscript to inject the QR reader - this.platform.sendMessageToActiveTab('qr-code-scanner-init') - // Wait for the scanner to send something back - this.platform.addMessageListener(({ action, data }) => { - if (action && action === 'qr-code-scanner-data') { - const normalizedAddress = data.replace('ethereum:', '') - resolve(normalizedAddress) - } - }) - }) - } - - // // Account Management // diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 1cab0bedd..452a51bd8 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -36,12 +36,6 @@ class ExtensionPlatform { extension.runtime.onMessage.addListener(cb) } - sendMessageToActiveTab (message, query = {}) { - extension.tabs.query(query, tabs => { - const activeTab = tabs.filter(tab => tab.active)[0] - extension.tabs.sendMessage(activeTab.id, message) - }) - } } module.exports = ExtensionPlatform -- cgit v1.2.3 From 2770df80e3cdd4d539b88c6d018108cb07211748 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Wed, 25 Jul 2018 16:14:10 -0400 Subject: add & delete tokens per account --- app/scripts/controllers/detect-tokens.js | 2 +- app/scripts/controllers/preferences.js | 33 +++++++++++++++++++++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/detect-tokens.js b/app/scripts/controllers/detect-tokens.js index 195ec918a..62e639795 100644 --- a/app/scripts/controllers/detect-tokens.js +++ b/app/scripts/controllers/detect-tokens.js @@ -85,7 +85,7 @@ class DetectTokensController { set preferences (preferences) { if (!preferences) { return } this._preferences = preferences - preferences.store.subscribe(({ tokens }) => { this.tokenAddresses = tokens.map((obj) => { return obj.address }) }) + preferences.store.subscribe(({ tokens = [] }) => { this.tokenAddresses = tokens.map((obj) => { return obj.address }) }) preferences.store.subscribe(({ selectedAddress }) => { if (this.selectedAddress !== selectedAddress) { this.selectedAddress = selectedAddress diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index f6250dc16..878333481 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -24,6 +24,7 @@ class PreferencesController { const initState = extend({ frequentRpcList: [], currentAccountTab: 'history', + addressTokens: {}, tokens: [], useBlockie: false, featureFlags: {}, @@ -35,6 +36,16 @@ class PreferencesController { this.diagnostics = opts.diagnostics this.store = new ObservableStore(initState) + + Object.defineProperty(this.store._state, 'tokens', { + get: () => { + const selectedAddress = this.store.getState().selectedAddress + const tokens = this.store.getState().addressTokens + // TODO when create vault + if (!(selectedAddress in tokens)) return [] + return tokens[selectedAddress] + }, + }) } // PUBLIC METHODS @@ -117,14 +128,16 @@ class PreferencesController { */ addAddresses (addresses) { const identities = this.store.getState().identities + const addressTokens = this.store.getState().addressTokens addresses.forEach((address) => { // skip if already exists if (identities[address]) return // add missing identity const identityCount = Object.keys(identities).length + if (!(address in addressTokens)) addressTokens[address] = [] identities[address] = { name: `Account ${identityCount + 1}`, address } }) - this.store.updateState({ identities }) + this.store.updateState({ identities, addressTokens }) } /* @@ -181,7 +194,8 @@ class PreferencesController { setSelectedAddress (_address) { return new Promise((resolve, reject) => { const address = normalizeAddress(_address) - this.store.updateState({ selectedAddress: address }) + const tokens = this.store.getState().addressTokens[_address] + this.store.updateState({ selectedAddress: address, tokens: tokens }) resolve() }) } @@ -233,7 +247,10 @@ class PreferencesController { tokens.push(newEntry) } - this.store.updateState({ tokens }) + const selectedAddress = this.store.getState().selectedAddress + const addressTokens = this.store.getState().addressTokens + addressTokens[selectedAddress] = tokens + this.store.updateState({ addressTokens }) return Promise.resolve(tokens) } @@ -246,11 +263,13 @@ class PreferencesController { * */ removeToken (rawAddress) { - const tokens = this.store.getState().tokens - - const updatedTokens = tokens.filter(token => token.address !== rawAddress) + const addressTokens = this.store.getState().addressTokens + const selectedAddress = this.store.getState().selectedAddress + + const updatedTokens = addressTokens[selectedAddress].filter(token => token.address !== rawAddress) + addressTokens[selectedAddress] = updatedTokens + this.store.updateState({ addressTokens, tokens: updatedTokens }) - this.store.updateState({ tokens: updatedTokens }) return Promise.resolve(updatedTokens) } -- cgit v1.2.3 From adee549c43ace4809e9e9779a3bd9c0dc75aaa17 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Wed, 25 Jul 2018 17:46:31 -0400 Subject: preferences test fixes for tokens per account --- app/scripts/controllers/preferences.js | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 878333481..1b1044955 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -40,10 +40,9 @@ class PreferencesController { Object.defineProperty(this.store._state, 'tokens', { get: () => { const selectedAddress = this.store.getState().selectedAddress - const tokens = this.store.getState().addressTokens - // TODO when create vault - if (!(selectedAddress in tokens)) return [] - return tokens[selectedAddress] + const addressTokens = this.store.getState().addressTokens + if (!(selectedAddress in addressTokens)) return [] + return addressTokens[selectedAddress] }, }) } @@ -88,12 +87,16 @@ class PreferencesController { */ setAddresses (addresses) { const oldIdentities = this.store.getState().identities + const addressTokens = this.store.getState().addressTokens const identities = addresses.reduce((ids, address, index) => { const oldId = oldIdentities[address] || {} ids[address] = {name: `Account ${index + 1}`, address, ...oldId} return ids }, {}) - this.store.updateState({ identities }) + for (const address in identities) { + if (!(address in addressTokens)) addressTokens[address] = [] + } + this.store.updateState({ identities, addressTokens }) } /** @@ -104,11 +107,13 @@ class PreferencesController { */ removeAddress (address) { const identities = this.store.getState().identities + const addressTokens = this.store.getState().addressTokens if (!identities[address]) { throw new Error(`${address} can't be deleted cause it was not found`) } delete identities[address] - this.store.updateState({ identities }) + delete addressTokens[address] + this.store.updateState({ identities, addressTokens }) // If the selected account is no longer valid, // select an arbitrary other account: @@ -194,8 +199,10 @@ class PreferencesController { setSelectedAddress (_address) { return new Promise((resolve, reject) => { const address = normalizeAddress(_address) - const tokens = this.store.getState().addressTokens[_address] - this.store.updateState({ selectedAddress: address, tokens: tokens }) + const addressTokens = this.store.getState().addressTokens + if (!(address in addressTokens)) addressTokens[address] = [] + const tokens = addressTokens[address] + this.store.updateState({ selectedAddress: address, tokens }) resolve() }) } @@ -265,7 +272,7 @@ class PreferencesController { removeToken (rawAddress) { const addressTokens = this.store.getState().addressTokens const selectedAddress = this.store.getState().selectedAddress - + const updatedTokens = addressTokens[selectedAddress].filter(token => token.address !== rawAddress) addressTokens[selectedAddress] = updatedTokens this.store.updateState({ addressTokens, tokens: updatedTokens }) -- cgit v1.2.3 From 1d3ad7cfbbdf5831f10eed774244ba1ccedf25d1 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Thu, 26 Jul 2018 18:04:34 -0400 Subject: tokens per network for individual account --- app/scripts/controllers/preferences.js | 66 ++++++++++++++++++++++++++-------- app/scripts/metamask-controller.js | 1 + 2 files changed, 52 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 1b1044955..6ad8a5696 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -34,16 +34,17 @@ class PreferencesController { }, opts.initState) this.diagnostics = opts.diagnostics - + this.network = opts.network this.store = new ObservableStore(initState) - - Object.defineProperty(this.store._state, 'tokens', { - get: () => { + this._defineTokensGetter(this.store._state) + this.network.providerStore.subscribe(({ type }) => { const selectedAddress = this.store.getState().selectedAddress const addressTokens = this.store.getState().addressTokens - if (!(selectedAddress in addressTokens)) return [] - return addressTokens[selectedAddress] - }, + if (!(type in addressTokens)) addressTokens[type] = {} + if (!(selectedAddress in addressTokens[type])) addressTokens[type][selectedAddress] = [] + const tokens = addressTokens[type][selectedAddress] + this.store.updateState({ tokens }) + }) } // PUBLIC METHODS @@ -88,13 +89,15 @@ class PreferencesController { setAddresses (addresses) { const oldIdentities = this.store.getState().identities const addressTokens = this.store.getState().addressTokens + const providerType = this.network.providerStore.getState().type const identities = addresses.reduce((ids, address, index) => { const oldId = oldIdentities[address] || {} ids[address] = {name: `Account ${index + 1}`, address, ...oldId} return ids }, {}) for (const address in identities) { - if (!(address in addressTokens)) addressTokens[address] = [] + if (!(providerType in addressTokens)) addressTokens[providerType] = {} + if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] } this.store.updateState({ identities, addressTokens }) } @@ -134,12 +137,16 @@ class PreferencesController { addAddresses (addresses) { const identities = this.store.getState().identities const addressTokens = this.store.getState().addressTokens + const providerType = this.network.providerStore.getState().type + addresses.forEach((address) => { // skip if already exists if (identities[address]) return // add missing identity const identityCount = Object.keys(identities).length - if (!(address in addressTokens)) addressTokens[address] = [] + + if (!(providerType in addressTokens)) addressTokens[providerType] = {} + if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] identities[address] = { name: `Account ${identityCount + 1}`, address } }) this.store.updateState({ identities, addressTokens }) @@ -200,8 +207,14 @@ class PreferencesController { return new Promise((resolve, reject) => { const address = normalizeAddress(_address) const addressTokens = this.store.getState().addressTokens - if (!(address in addressTokens)) addressTokens[address] = [] - const tokens = addressTokens[address] + const providerType = this.network.providerStore.getState().type + + if (!(providerType in addressTokens)) addressTokens[providerType] = {} + + if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] + + const tokens = addressTokens[providerType][address] + this.store.updateState({ selectedAddress: address, tokens }) resolve() }) @@ -256,7 +269,10 @@ class PreferencesController { const selectedAddress = this.store.getState().selectedAddress const addressTokens = this.store.getState().addressTokens - addressTokens[selectedAddress] = tokens + const providerType = this.network.providerStore.getState().type + + if (!(providerType in addressTokens)) addressTokens[providerType] = {} + addressTokens[providerType][selectedAddress] = tokens this.store.updateState({ addressTokens }) return Promise.resolve(tokens) @@ -272,9 +288,9 @@ class PreferencesController { removeToken (rawAddress) { const addressTokens = this.store.getState().addressTokens const selectedAddress = this.store.getState().selectedAddress - - const updatedTokens = addressTokens[selectedAddress].filter(token => token.address !== rawAddress) - addressTokens[selectedAddress] = updatedTokens + const providerType = this.network.providerStore.getState().type + const updatedTokens = addressTokens[providerType][selectedAddress].filter(token => token.address !== rawAddress) + addressTokens[providerType][selectedAddress] = updatedTokens this.store.updateState({ addressTokens, tokens: updatedTokens }) return Promise.resolve(updatedTokens) @@ -402,6 +418,26 @@ class PreferencesController { // // PRIVATE METHODS // + + /** + * Getter definition for the `tokens` property of store + * + * @param {object} object Store state + * + */ + + _defineTokensGetter (object) { + Object.defineProperty(object, 'tokens', { + get: () => { + const selectedAddress = this.store.getState().selectedAddress + const addressTokens = this.store.getState().addressTokens + const providerType = this.network.providerStore.getState().type + if (!(providerType in addressTokens)) addressTokens[providerType] = {} + if (!(selectedAddress in addressTokens[providerType])) return [] + return addressTokens[providerType][selectedAddress] + }, + }) + } } module.exports = PreferencesController diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index bcc7075c2..df84bcba4 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -87,6 +87,7 @@ module.exports = class MetamaskController extends EventEmitter { this.preferencesController = new PreferencesController({ initState: initState.PreferencesController, initLangCode: opts.initLangCode, + network: this.networkController, }) // currency controller -- cgit v1.2.3 From 2827e13caab87692aa085af380355aeb42a13bdf Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Thu, 26 Jul 2018 19:28:12 -0400 Subject: add & delete tokens per network --- app/scripts/controllers/preferences.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 6ad8a5696..7ad3ce1e3 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -204,20 +204,18 @@ class PreferencesController { * */ setSelectedAddress (_address) { - return new Promise((resolve, reject) => { - const address = normalizeAddress(_address) - const addressTokens = this.store.getState().addressTokens - const providerType = this.network.providerStore.getState().type + const address = normalizeAddress(_address) + const addressTokens = this.store.getState().addressTokens + const providerType = this.network.providerStore.getState().type - if (!(providerType in addressTokens)) addressTokens[providerType] = {} + if (!(providerType in addressTokens)) addressTokens[providerType] = {} - if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] + if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] - const tokens = addressTokens[providerType][address] + const tokens = addressTokens[providerType][address] - this.store.updateState({ selectedAddress: address, tokens }) - resolve() - }) + this.store.updateState({ selectedAddress: address, tokens }) + return Promise.resolve(tokens) } /** -- cgit v1.2.3 From 6cd4bc9f4ecb2c4a066da0aceb36d1a24bbe33e2 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Thu, 26 Jul 2018 20:24:39 -0400 Subject: working without permission issues --- app/manifest.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'app') diff --git a/app/manifest.json b/app/manifest.json index 6933652e6..52256c5b7 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -76,6 +76,5 @@ "ids": [ "*" ] - }, - "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'" + } } -- cgit v1.2.3 From d65d018ad0f78a0319f11942ada9ca0d85214db9 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Thu, 26 Jul 2018 21:11:58 -0400 Subject: restore platform/extension.js --- app/scripts/platforms/extension.js | 62 +++++++++++++++++++++++++++++++++++--- 1 file changed, 57 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 844670537..db0548efc 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -1,4 +1,5 @@ const extension = require('extensionizer') +const explorerLink = require('etherscan-link').createExplorerLink class ExtensionPlatform { @@ -23,8 +24,11 @@ class ExtensionPlatform { return extension.runtime.getManifest().version } - openExtensionInBrowser () { - const extensionURL = extension.runtime.getURL('home.html') + openExtensionInBrowser (route = null) { + let extensionURL = extension.runtime.getURL('home.html') + if (route) { + extensionURL += `#${route}` + } this.openWindow({ url: extensionURL }) } @@ -38,10 +42,58 @@ class ExtensionPlatform { } } - addMessageListener (cb) { - extension.runtime.onMessage.addListener(cb) + showTransactionNotification (txMeta) { + + const status = txMeta.status + if (status === 'confirmed') { + this._showConfirmedTransaction(txMeta) + } else if (status === 'failed') { + this._showFailedTransaction(txMeta) + } + } + + _showConfirmedTransaction (txMeta) { + + this._subscribeToNotificationClicked() + + const url = explorerLink(txMeta.hash, parseInt(txMeta.metamaskNetworkId)) + const nonce = parseInt(txMeta.txParams.nonce, 16) + + const title = 'Confirmed transaction' + const message = `Transaction ${nonce} confirmed! View on EtherScan` + this._showNotification(title, message, url) } + _showFailedTransaction (txMeta) { + + const nonce = parseInt(txMeta.txParams.nonce, 16) + const title = 'Failed transaction' + const message = `Transaction ${nonce} failed! ${txMeta.err.message}` + this._showNotification(title, message) + } + + _showNotification (title, message, url) { + extension.notifications.create( + url, + { + 'type': 'basic', + 'title': title, + 'iconUrl': extension.extension.getURL('../../images/icon-64.png'), + 'message': message, + }) + } + + _subscribeToNotificationClicked () { + if (!extension.notifications.onClicked.hasListener(this._viewOnEtherScan)) { + extension.notifications.onClicked.addListener(this._viewOnEtherScan) + } + } + + _viewOnEtherScan (txId) { + if (txId.startsWith('http://')) { + global.metamaskController.platform.openWindow({ url: txId }) + } + } } -module.exports = ExtensionPlatform +module.exports = ExtensionPlatform \ No newline at end of file -- cgit v1.2.3 From bea1cf3f3c7527109b12b13427ea16f428b2790a Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Thu, 26 Jul 2018 21:15:16 -0400 Subject: clean up --- app/scripts/contentscript.js | 1 - app/scripts/inpage.js | 1 - app/scripts/metamask-controller.js | 1 + app/scripts/platforms/extension.js | 2 +- 4 files changed, 2 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 031cfca43..7b7114c35 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -200,4 +200,3 @@ function redirectToPhishingWarning () { console.log('MetaMask - redirecting to phishing warning') window.location.href = 'https://metamask.io/phishing.html' } - diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index 20621b73f..7dd7fda02 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -96,4 +96,3 @@ function restoreContextAfterImports () { console.warn('MetaMask - global.define could not be overwritten.') } } - diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index c6be4b9d2..ad54a0ab9 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -655,6 +655,7 @@ module.exports = class MetamaskController extends EventEmitter { return { ...keyState, identities } } + // // Account Management // diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index db0548efc..0803164e8 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -96,4 +96,4 @@ class ExtensionPlatform { } } -module.exports = ExtensionPlatform \ No newline at end of file +module.exports = ExtensionPlatform -- cgit v1.2.3 From 6886429f0b74b8f281818fb03484cccd0e0b8ed0 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Thu, 26 Jul 2018 21:22:39 -0400 Subject: fix linting errors --- app/scripts/metamask-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index ad54a0ab9..bcc7075c2 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -653,7 +653,7 @@ module.exports = class MetamaskController extends EventEmitter { const { identities } = this.preferencesController.store.getState() return { ...keyState, identities } - } + } // -- cgit v1.2.3 From f5107fa12efcafe2d7e6531399f53c524192e6d6 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Fri, 27 Jul 2018 14:56:03 -0400 Subject: migration for preferences controller tokens --- app/scripts/migrations/028.js | 37 +++++++++++++++++++++++++++++++++++++ app/scripts/migrations/index.js | 1 + 2 files changed, 38 insertions(+) create mode 100644 app/scripts/migrations/028.js (limited to 'app') diff --git a/app/scripts/migrations/028.js b/app/scripts/migrations/028.js new file mode 100644 index 000000000..ce52cec05 --- /dev/null +++ b/app/scripts/migrations/028.js @@ -0,0 +1,37 @@ +// next version number +const version = 28 + +/* + +normalizes txParams on unconfirmed txs + +*/ +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 + + if (newState.PreferencesController) { + if (newState.PreferencesController.tokens) { + const tokens = newState.TransactionController.tokens + const selectedAddress = newState.PreferencesController.selectedAddress + newState.PreferencesController.tokens = [] + newState.PreferencesController.addressTokens = {'mainnet': {selectedAddress: tokens}} + } + } + + return newState +} diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index 04d90bfff..2499b7fd1 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -37,4 +37,5 @@ module.exports = [ require('./024'), require('./025'), require('./026'), + require('./028'), ] -- cgit v1.2.3 From 5b9725d1f154e8ed0994c3aab844f696937b0e6e Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Fri, 27 Jul 2018 16:05:12 -0400 Subject: refactor to accountTokens --- app/scripts/controllers/preferences.js | 100 ++++++++++++++++----------------- app/scripts/migrations/028.js | 2 +- 2 files changed, 48 insertions(+), 54 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 7ad3ce1e3..88b6fa998 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -13,6 +13,7 @@ class PreferencesController { * @property {array} store.frequentRpcList A list of custom rpcs to provide the user * @property {string} store.currentAccountTab Indicates the selected tab in the ui * @property {array} store.tokens The tokens the user wants display in their token lists + * @property {object} store.accountTokens The tokens stored per account and then per network type * @property {boolean} store.useBlockie The users preference for blockie identicons within the UI * @property {object} store.featureFlags A key-boolean map, where keys refer to features and booleans to whether the * user wishes to see that feature @@ -24,7 +25,7 @@ class PreferencesController { const initState = extend({ frequentRpcList: [], currentAccountTab: 'history', - addressTokens: {}, + accountTokens: {}, tokens: [], useBlockie: false, featureFlags: {}, @@ -36,16 +37,8 @@ class PreferencesController { this.diagnostics = opts.diagnostics this.network = opts.network this.store = new ObservableStore(initState) - this._defineTokensGetter(this.store._state) - this.network.providerStore.subscribe(({ type }) => { - const selectedAddress = this.store.getState().selectedAddress - const addressTokens = this.store.getState().addressTokens - if (!(type in addressTokens)) addressTokens[type] = {} - if (!(selectedAddress in addressTokens[type])) addressTokens[type][selectedAddress] = [] - const tokens = addressTokens[type][selectedAddress] - this.store.updateState({ tokens }) - - }) + this._defineTokens() + this._subscribeProviderType() } // PUBLIC METHODS @@ -88,18 +81,17 @@ class PreferencesController { */ setAddresses (addresses) { const oldIdentities = this.store.getState().identities - const addressTokens = this.store.getState().addressTokens - const providerType = this.network.providerStore.getState().type + const accountTokens = this.store.getState().accountTokens + const identities = addresses.reduce((ids, address, index) => { const oldId = oldIdentities[address] || {} ids[address] = {name: `Account ${index + 1}`, address, ...oldId} return ids }, {}) for (const address in identities) { - if (!(providerType in addressTokens)) addressTokens[providerType] = {} - if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] + if (!(address in accountTokens)) accountTokens[address] = {} } - this.store.updateState({ identities, addressTokens }) + this.store.updateState({ identities, accountTokens }) } /** @@ -110,13 +102,13 @@ class PreferencesController { */ removeAddress (address) { const identities = this.store.getState().identities - const addressTokens = this.store.getState().addressTokens + const accountTokens = this.store.getState().accountTokens if (!identities[address]) { throw new Error(`${address} can't be deleted cause it was not found`) } delete identities[address] - delete addressTokens[address] - this.store.updateState({ identities, addressTokens }) + delete accountTokens[address] + this.store.updateState({ identities, accountTokens }) // If the selected account is no longer valid, // select an arbitrary other account: @@ -136,20 +128,17 @@ class PreferencesController { */ addAddresses (addresses) { const identities = this.store.getState().identities - const addressTokens = this.store.getState().addressTokens - const providerType = this.network.providerStore.getState().type - + const accountTokens = this.store.getState().accountTokens addresses.forEach((address) => { // skip if already exists if (identities[address]) return // add missing identity const identityCount = Object.keys(identities).length - if (!(providerType in addressTokens)) addressTokens[providerType] = {} - if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] + if (!(address in accountTokens)) accountTokens[address] = {} identities[address] = { name: `Account ${identityCount + 1}`, address } }) - this.store.updateState({ identities, addressTokens }) + this.store.updateState({ identities, accountTokens }) } /* @@ -205,16 +194,14 @@ class PreferencesController { */ setSelectedAddress (_address) { const address = normalizeAddress(_address) - const addressTokens = this.store.getState().addressTokens + const accountTokens = this.store.getState().accountTokens const providerType = this.network.providerStore.getState().type - if (!(providerType in addressTokens)) addressTokens[providerType] = {} - - if (!(address in addressTokens[providerType])) addressTokens[providerType][address] = [] - - const tokens = addressTokens[providerType][address] - + if (!(address in accountTokens)) accountTokens[address] = {} + if (!(providerType in accountTokens[address])) accountTokens[address][providerType] = [] + const tokens = accountTokens[address][providerType] this.store.updateState({ selectedAddress: address, tokens }) + return Promise.resolve(tokens) } @@ -266,12 +253,10 @@ class PreferencesController { } const selectedAddress = this.store.getState().selectedAddress - const addressTokens = this.store.getState().addressTokens + const accountTokens = this.store.getState().accountTokens const providerType = this.network.providerStore.getState().type - - if (!(providerType in addressTokens)) addressTokens[providerType] = {} - addressTokens[providerType][selectedAddress] = tokens - this.store.updateState({ addressTokens }) + accountTokens[selectedAddress][providerType] = tokens + this.store.updateState({ accountTokens, tokens }) return Promise.resolve(tokens) } @@ -284,12 +269,12 @@ class PreferencesController { * */ removeToken (rawAddress) { - const addressTokens = this.store.getState().addressTokens + const accountTokens = this.store.getState().accountTokens const selectedAddress = this.store.getState().selectedAddress const providerType = this.network.providerStore.getState().type - const updatedTokens = addressTokens[providerType][selectedAddress].filter(token => token.address !== rawAddress) - addressTokens[providerType][selectedAddress] = updatedTokens - this.store.updateState({ addressTokens, tokens: updatedTokens }) + const updatedTokens = accountTokens[selectedAddress][providerType].filter(token => token.address !== rawAddress) + accountTokens[selectedAddress][providerType] = updatedTokens + this.store.updateState({ accountTokens, tokens: updatedTokens }) return Promise.resolve(updatedTokens) } @@ -418,22 +403,31 @@ class PreferencesController { // /** - * Getter definition for the `tokens` property of store + * Getter definition for the `tokens` property of store when controller is initialized * - * @param {object} object Store state * */ + _defineTokens () { + const selectedAddress = this.store.getState().selectedAddress + const accountTokens = this.store.getState().accountTokens + const providerType = this.network.providerStore.getState().type + if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} + if (!(providerType in accountTokens[selectedAddress])) return [] + this.tokens = accountTokens[selectedAddress][providerType] + } - _defineTokensGetter (object) { - Object.defineProperty(object, 'tokens', { - get: () => { - const selectedAddress = this.store.getState().selectedAddress - const addressTokens = this.store.getState().addressTokens - const providerType = this.network.providerStore.getState().type - if (!(providerType in addressTokens)) addressTokens[providerType] = {} - if (!(selectedAddress in addressTokens[providerType])) return [] - return addressTokens[providerType][selectedAddress] - }, + /** + * Subscription to network provider type + * + * + */ + _subscribeProviderType () { + this.network.providerStore.subscribe(({ type }) => { + const selectedAddress = this.store.getState().selectedAddress + const accountTokens = this.store.getState().accountTokens + if (!(type in accountTokens[selectedAddress])) accountTokens[selectedAddress][type] = [] + const tokens = accountTokens[selectedAddress][type] + this.store.updateState({ tokens }) }) } } diff --git a/app/scripts/migrations/028.js b/app/scripts/migrations/028.js index ce52cec05..e36884a9c 100644 --- a/app/scripts/migrations/028.js +++ b/app/scripts/migrations/028.js @@ -29,7 +29,7 @@ function transformState (state) { const tokens = newState.TransactionController.tokens const selectedAddress = newState.PreferencesController.selectedAddress newState.PreferencesController.tokens = [] - newState.PreferencesController.addressTokens = {'mainnet': {selectedAddress: tokens}} + newState.PreferencesController.accountTokens = {selectedAddress: {'mainnet': tokens}} } } -- cgit v1.2.3 From e687bc5a47e2157193dfa099a0f45a97fa1aaed1 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Fri, 27 Jul 2018 16:17:28 -0400 Subject: fix migration for preferences controller tokens --- app/scripts/migrations/028.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/scripts/migrations/028.js b/app/scripts/migrations/028.js index e36884a9c..cbda48584 100644 --- a/app/scripts/migrations/028.js +++ b/app/scripts/migrations/028.js @@ -29,7 +29,7 @@ function transformState (state) { const tokens = newState.TransactionController.tokens const selectedAddress = newState.PreferencesController.selectedAddress newState.PreferencesController.tokens = [] - newState.PreferencesController.accountTokens = {selectedAddress: {'mainnet': tokens}} + newState.PreferencesController.accountTokens = {[selectedAddress]: {'mainnet': tokens}} } } -- cgit v1.2.3 From 0757f47e84d601792e65c32286465b115ae6770c Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Mon, 30 Jul 2018 11:41:31 -0400 Subject: passing tokens to all accounts in migration --- app/scripts/migrations/028.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'app') diff --git a/app/scripts/migrations/028.js b/app/scripts/migrations/028.js index cbda48584..6553a1052 100644 --- a/app/scripts/migrations/028.js +++ b/app/scripts/migrations/028.js @@ -26,10 +26,13 @@ function transformState (state) { if (newState.PreferencesController) { if (newState.PreferencesController.tokens) { - const tokens = newState.TransactionController.tokens - const selectedAddress = newState.PreferencesController.selectedAddress + const identities = newState.TransactionController.identities + const tokens = newState.PreferencesController.tokens + newState.PreferencesController.accountTokens = {} + for (const identity in identities) { + newState.PreferencesController.accountTokens[identity] = {'mainnet': tokens} + } newState.PreferencesController.tokens = [] - newState.PreferencesController.accountTokens = {[selectedAddress]: {'mainnet': tokens}} } } -- cgit v1.2.3 From 4339f04e80be74dd318e03f75fcf3410e923d30d Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 30 Jul 2018 17:50:05 -0400 Subject: use existing modals --- app/_locales/en/messages.json | 12 ++++++++++++ app/scripts/contentscript.js | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 8d65bc596..8edf37235 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -2,6 +2,9 @@ "accept": { "message": "Accept" }, + "accessingYourCamera": { + "message": "Accesing your camera..." + }, "account": { "message": "Account" }, @@ -937,6 +940,12 @@ "info": { "message": "Info" }, + "scanInstructions": { + "message": "Place the QR code in front of your camera so we can read it..." + }, + "scanQrCode": { + "message": "Scan QR Code" + }, "shapeshiftBuy": { "message": "Buy with Shapeshift" }, @@ -1086,6 +1095,9 @@ "unknownNetworkId": { "message": "Unknown network ID" }, + "unknownQrCode": { + "message": "Error: We couldn't identify that QR code" + }, "unlock": { "message": "Unlock" }, diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index b7496f318..e0a2b0061 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -198,6 +198,6 @@ function blacklistedDomainCheck () { */ function redirectToPhishingWarning () { console.log('MetaMask - routing to Phishing Warning component') - let extensionURL = extension.runtime.getURL('phishing.html') + const extensionURL = extension.runtime.getURL('phishing.html') window.location.href = extensionURL } -- cgit v1.2.3 From 34617a21c30afcca54a5ac884e361d41d39a4699 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 30 Jul 2018 18:36:37 -0400 Subject: copy --- app/_locales/en/messages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 8edf37235..286e32194 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -941,7 +941,7 @@ "message": "Info" }, "scanInstructions": { - "message": "Place the QR code in front of your camera so we can read it..." + "message": "Place the QR code in front of your camera" }, "scanQrCode": { "message": "Scan QR Code" -- cgit v1.2.3 From 31286673c3bd0c35925f2d41f3e24c0a9d561fa8 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Mon, 30 Jul 2018 18:43:34 -0400 Subject: isolation of tokens related methods in preferences --- app/scripts/controllers/preferences.js | 85 +++++++++++++++++----------------- 1 file changed, 42 insertions(+), 43 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 88b6fa998..4daa196a9 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -37,7 +37,6 @@ class PreferencesController { this.diagnostics = opts.diagnostics this.network = opts.network this.store = new ObservableStore(initState) - this._defineTokens() this._subscribeProviderType() } // PUBLIC METHODS @@ -81,16 +80,16 @@ class PreferencesController { */ setAddresses (addresses) { const oldIdentities = this.store.getState().identities - const accountTokens = this.store.getState().accountTokens + const oldAccountTokens = this.store.getState().accountTokens const identities = addresses.reduce((ids, address, index) => { const oldId = oldIdentities[address] || {} ids[address] = {name: `Account ${index + 1}`, address, ...oldId} return ids }, {}) - for (const address in identities) { - if (!(address in accountTokens)) accountTokens[address] = {} - } + const accountTokens = addresses.reduce((address) => { + return oldAccountTokens[address] || {} + }, {}) this.store.updateState({ identities, accountTokens }) } @@ -135,7 +134,7 @@ class PreferencesController { // add missing identity const identityCount = Object.keys(identities).length - if (!(address in accountTokens)) accountTokens[address] = {} + accountTokens[address] = {} identities[address] = { name: `Account ${identityCount + 1}`, address } }) this.store.updateState({ identities, accountTokens }) @@ -194,14 +193,8 @@ class PreferencesController { */ setSelectedAddress (_address) { const address = normalizeAddress(_address) - const accountTokens = this.store.getState().accountTokens - const providerType = this.network.providerStore.getState().type - - if (!(address in accountTokens)) accountTokens[address] = {} - if (!(providerType in accountTokens[address])) accountTokens[address][providerType] = [] - const tokens = accountTokens[address][providerType] - this.store.updateState({ selectedAddress: address, tokens }) - + this.store.updateState({ selectedAddress: address }) + const tokens = this._updateTokens() return Promise.resolve(tokens) } @@ -251,13 +244,7 @@ class PreferencesController { } else { tokens.push(newEntry) } - - const selectedAddress = this.store.getState().selectedAddress - const accountTokens = this.store.getState().accountTokens - const providerType = this.network.providerStore.getState().type - accountTokens[selectedAddress][providerType] = tokens - this.store.updateState({ accountTokens, tokens }) - + this._updateAccountTokens(tokens) return Promise.resolve(tokens) } @@ -269,13 +256,9 @@ class PreferencesController { * */ removeToken (rawAddress) { - const accountTokens = this.store.getState().accountTokens - const selectedAddress = this.store.getState().selectedAddress - const providerType = this.network.providerStore.getState().type - const updatedTokens = accountTokens[selectedAddress][providerType].filter(token => token.address !== rawAddress) - accountTokens[selectedAddress][providerType] = updatedTokens - this.store.updateState({ accountTokens, tokens: updatedTokens }) - + const tokens = this.store.getState().tokens + const updatedTokens = tokens.filter(token => token.address !== rawAddress) + this._updateAccountTokens(updatedTokens) return Promise.resolve(updatedTokens) } @@ -401,34 +384,50 @@ class PreferencesController { // // PRIVATE METHODS // + /** + * Subscription to network provider type. + * + * + */ + _subscribeProviderType () { + this.network.providerStore.subscribe(({ type }) => { + const selectedAddress = this.store.getState().selectedAddress + const accountTokens = this.store.getState().accountTokens + if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} + if (!(type in accountTokens[selectedAddress])) accountTokens[selectedAddress][type] = [] + const tokens = accountTokens[selectedAddress][type] + this.store.updateState({ tokens }) + }) + } /** - * Getter definition for the `tokens` property of store when controller is initialized + * Updates `accountTokens` and `tokens` of current account and network according to it. * + * @param {[array]} tokens Array of tokens to be updated. * */ - _defineTokens () { - const selectedAddress = this.store.getState().selectedAddress + _updateAccountTokens (tokens) { const accountTokens = this.store.getState().accountTokens + const selectedAddress = this.store.getState().selectedAddress const providerType = this.network.providerStore.getState().type - if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} - if (!(providerType in accountTokens[selectedAddress])) return [] - this.tokens = accountTokens[selectedAddress][providerType] + accountTokens[selectedAddress][providerType] = tokens + this.store.updateState({ accountTokens, tokens }) } /** - * Subscription to network provider type + * Updates `tokens` of current account and network. * * */ - _subscribeProviderType () { - this.network.providerStore.subscribe(({ type }) => { - const selectedAddress = this.store.getState().selectedAddress - const accountTokens = this.store.getState().accountTokens - if (!(type in accountTokens[selectedAddress])) accountTokens[selectedAddress][type] = [] - const tokens = accountTokens[selectedAddress][type] - this.store.updateState({ tokens }) - }) + _updateTokens () { + const accountTokens = this.store.getState().accountTokens + const selectedAddress = this.store.getState().selectedAddress + const providerType = this.network.providerStore.getState().type + if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} + if (!(providerType in accountTokens[selectedAddress])) accountTokens[selectedAddress][providerType] = [] + const tokens = accountTokens[selectedAddress][providerType] + this.store.updateState({ tokens }) + return tokens } } -- cgit v1.2.3 From fbcba8f019313c3b02429043578e044046c6cc68 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Mon, 30 Jul 2018 19:09:17 -0400 Subject: create tokens storage when setadresses --- app/scripts/controllers/preferences.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 4daa196a9..5c158288b 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -87,8 +87,10 @@ class PreferencesController { ids[address] = {name: `Account ${index + 1}`, address, ...oldId} return ids }, {}) - const accountTokens = addresses.reduce((address) => { - return oldAccountTokens[address] || {} + const accountTokens = addresses.reduce((tokens, address) => { + const oldTokens = oldAccountTokens[address] || {} + tokens[address] = oldTokens + return tokens }, {}) this.store.updateState({ identities, accountTokens }) } -- cgit v1.2.3 From 822c1734d6e3cb9a60306c1b89617c1013627f57 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Mon, 30 Jul 2018 20:36:31 -0400 Subject: fix double state update when account changed --- app/scripts/controllers/preferences.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 5c158288b..193965c2c 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -195,8 +195,8 @@ class PreferencesController { */ setSelectedAddress (_address) { const address = normalizeAddress(_address) - this.store.updateState({ selectedAddress: address }) - const tokens = this._updateTokens() + const tokens = this._updateTokens(address) + this.store.updateState({ selectedAddress: address, tokens }) return Promise.resolve(tokens) } @@ -421,14 +421,12 @@ class PreferencesController { * * */ - _updateTokens () { + _updateTokens (selectedAddress) { const accountTokens = this.store.getState().accountTokens - const selectedAddress = this.store.getState().selectedAddress const providerType = this.network.providerStore.getState().type if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} if (!(providerType in accountTokens[selectedAddress])) accountTokens[selectedAddress][providerType] = [] const tokens = accountTokens[selectedAddress][providerType] - this.store.updateState({ tokens }) return tokens } } -- cgit v1.2.3 From 22cf5a1391be5babae1a05bfb7b3dcde7110e286 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Mon, 30 Jul 2018 20:44:22 -0400 Subject: improve comments --- app/scripts/metamask-controller.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index df84bcba4..db323e3fe 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -1437,7 +1437,7 @@ module.exports = class MetamaskController extends EventEmitter { } /** - * A method for activating the retrieval of price data and auto detect tokens, + * A method for activating the retrieval of price data, * which should only be fetched when the UI is visible. * @private * @param {boolean} active - True if price data should be getting fetched. -- cgit v1.2.3 From edb154749d468299166e41e56d23beb781817cbc Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Mon, 30 Jul 2018 22:57:05 -0400 Subject: send to fullscreen if no permission from popup --- app/_locales/en/messages.json | 3 +++ app/scripts/platforms/extension.js | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 286e32194..60e873371 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1144,6 +1144,9 @@ "whatsThis": { "message": "What's this?" }, + "youNeedToAllowCameraAccess": { + "message": "You need to allow camera access to use this feature." + }, "yourSigRequested": { "message": "Your signature is being requested" }, diff --git a/app/scripts/platforms/extension.js b/app/scripts/platforms/extension.js index 0803164e8..71b162dd0 100644 --- a/app/scripts/platforms/extension.js +++ b/app/scripts/platforms/extension.js @@ -24,8 +24,13 @@ class ExtensionPlatform { return extension.runtime.getManifest().version } - openExtensionInBrowser (route = null) { + openExtensionInBrowser (route = null, queryString = null) { let extensionURL = extension.runtime.getURL('home.html') + + if (queryString) { + extensionURL += `?${queryString}` + } + if (route) { extensionURL += `#${route}` } -- cgit v1.2.3 From ccae79d392b76d6277bbbb7c887f520e66f81a2f Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Tue, 31 Jul 2018 13:07:28 -0400 Subject: fix undefined for tokens on tests --- app/scripts/controllers/preferences.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 193965c2c..0cc61ba61 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -405,13 +405,15 @@ class PreferencesController { /** * Updates `accountTokens` and `tokens` of current account and network according to it. * - * @param {[array]} tokens Array of tokens to be updated. + * @param {array} tokens Array of tokens to be updated. * */ _updateAccountTokens (tokens) { const accountTokens = this.store.getState().accountTokens const selectedAddress = this.store.getState().selectedAddress const providerType = this.network.providerStore.getState().type + if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} + if (!(providerType in accountTokens[selectedAddress])) accountTokens[selectedAddress][providerType] = [] accountTokens[selectedAddress][providerType] = tokens this.store.updateState({ accountTokens, tokens }) } -- cgit v1.2.3 From 3124e8c61209af960bc36d23677a8fcb5a4f7943 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Tue, 31 Jul 2018 15:59:19 -0400 Subject: tokens related functions refactor --- app/scripts/controllers/preferences.js | 37 ++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 0cc61ba61..fcbf9c186 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -190,13 +190,14 @@ class PreferencesController { * Setter for the `selectedAddress` property * * @param {string} _address A new hex address for an account - * @returns {Promise} Promise resolves with undefined + * @returns {Promise} Promise resolves with tokens * */ setSelectedAddress (_address) { const address = normalizeAddress(_address) - const tokens = this._updateTokens(address) - this.store.updateState({ selectedAddress: address, tokens }) + this._updateTokens(address) + this.store.updateState({ selectedAddress: address }) + const tokens = this.store.getState().tokens return Promise.resolve(tokens) } @@ -392,12 +393,8 @@ class PreferencesController { * */ _subscribeProviderType () { - this.network.providerStore.subscribe(({ type }) => { - const selectedAddress = this.store.getState().selectedAddress - const accountTokens = this.store.getState().accountTokens - if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} - if (!(type in accountTokens[selectedAddress])) accountTokens[selectedAddress][type] = [] - const tokens = accountTokens[selectedAddress][type] + this.network.providerStore.subscribe(() => { + const { tokens } = this._getTokenRelatedStates() this.store.updateState({ tokens }) }) } @@ -409,11 +406,7 @@ class PreferencesController { * */ _updateAccountTokens (tokens) { - const accountTokens = this.store.getState().accountTokens - const selectedAddress = this.store.getState().selectedAddress - const providerType = this.network.providerStore.getState().type - if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} - if (!(providerType in accountTokens[selectedAddress])) accountTokens[selectedAddress][providerType] = [] + const { accountTokens, providerType, selectedAddress } = this._getTokenRelatedStates() accountTokens[selectedAddress][providerType] = tokens this.store.updateState({ accountTokens, tokens }) } @@ -421,15 +414,29 @@ class PreferencesController { /** * Updates `tokens` of current account and network. * + * @param {string} selectedAddress Account address to be updated with. * */ _updateTokens (selectedAddress) { + const { tokens } = this._getTokenRelatedStates(selectedAddress) + this.store.updateState({ tokens }) + } + + /** + * A getter for `tokens` and `accountTokens` related states. + * + * @param {string} selectedAddress A new hex address for an account + * @returns {array, object, string, string} States to interact with tokens in `accountTokens` + * + */ + _getTokenRelatedStates (selectedAddress) { const accountTokens = this.store.getState().accountTokens + if (!selectedAddress) selectedAddress = this.store.getState().selectedAddress const providerType = this.network.providerStore.getState().type if (!(selectedAddress in accountTokens)) accountTokens[selectedAddress] = {} if (!(providerType in accountTokens[selectedAddress])) accountTokens[selectedAddress][providerType] = [] const tokens = accountTokens[selectedAddress][providerType] - return tokens + return { tokens, accountTokens, providerType, selectedAddress } } } -- cgit v1.2.3 From d8817b26466617920e47da1f5b1db642ba701a9e Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Tue, 31 Jul 2018 16:18:06 -0400 Subject: fix doc tag --- app/scripts/controllers/preferences.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index fcbf9c186..707fd7de9 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -426,7 +426,7 @@ class PreferencesController { * A getter for `tokens` and `accountTokens` related states. * * @param {string} selectedAddress A new hex address for an account - * @returns {array, object, string, string} States to interact with tokens in `accountTokens` + * @returns {Object.} States to interact with tokens in `accountTokens` * */ _getTokenRelatedStates (selectedAddress) { -- cgit v1.2.3 From 710b4e294f66fe6e623fa145cc99be5b79c8210e Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Tue, 31 Jul 2018 18:30:40 -0400 Subject: added crossbrowser support and error handling --- app/_locales/en/messages.json | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'app') diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 60e873371..ec96f5b08 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -656,6 +656,9 @@ "notStarted": { "message": "Not Started" }, + "noWebcamFound": { + "message": "We couldn't find any webcam available on your computer. Make sure the device is connected and configured correctly." + }, "oldUI": { "message": "Old UI" }, @@ -1098,6 +1101,9 @@ "unknownQrCode": { "message": "Error: We couldn't identify that QR code" }, + "unknownCameraError": { + "message": "Ooops! Something went wrong while trying to access you camera. Please try again..." + }, "unlock": { "message": "Unlock" }, -- cgit v1.2.3 From 71ef4d85da50c50f767e20623fd30c014ba16ecf Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Fri, 3 Aug 2018 18:57:23 -0400 Subject: design complete --- app/_locales/en/messages.json | 10 ++++++++-- app/images/webcam.svg | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 app/images/webcam.svg (limited to 'app') diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index ec96f5b08..db050e766 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -656,8 +656,11 @@ "notStarted": { "message": "Not Started" }, + "noWebcamFoundTitle": { + "message": "Webcam not found" + }, "noWebcamFound": { - "message": "We couldn't find any webcam available on your computer. Make sure the device is connected and configured correctly." + "message": "Your computer's webcam was not found. Please try again." }, "oldUI": { "message": "Old UI" @@ -1101,8 +1104,11 @@ "unknownQrCode": { "message": "Error: We couldn't identify that QR code" }, + "unknownCameraErrorTitle": { + "message": "Ooops! Something went wrong...." + }, "unknownCameraError": { - "message": "Ooops! Something went wrong while trying to access you camera. Please try again..." + "message": "There was an error while trying to access you camera. Please try again..." }, "unlock": { "message": "Unlock" diff --git a/app/images/webcam.svg b/app/images/webcam.svg new file mode 100644 index 000000000..4b9b58148 --- /dev/null +++ b/app/images/webcam.svg @@ -0,0 +1,18 @@ + + + + webcam + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3 From c6b7e460b536a6fcff4e4328b1007f677720b585 Mon Sep 17 00:00:00 2001 From: brunobar79 Date: Wed, 8 Aug 2018 03:00:39 -0400 Subject: code review changes --- app/_locales/en/messages.json | 3 +++ app/scripts/lib/enums.js | 11 +++++++++++ app/scripts/lib/util.js | 29 +++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+) (limited to 'app') diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 4ffa66fc0..62ec4ce37 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -1074,6 +1074,9 @@ "message": "We had trouble loading your token balances. You can view them ", "description": "Followed by a link (here) to view token balances" }, + "tryAgain": { + "message": "Try again" + }, "twelveWords": { "message": "These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret." }, diff --git a/app/scripts/lib/enums.js b/app/scripts/lib/enums.js index 0a3afca47..c6d57a1bc 100644 --- a/app/scripts/lib/enums.js +++ b/app/scripts/lib/enums.js @@ -2,8 +2,19 @@ const ENVIRONMENT_TYPE_POPUP = 'popup' const ENVIRONMENT_TYPE_NOTIFICATION = 'notification' const ENVIRONMENT_TYPE_FULLSCREEN = 'fullscreen' +const PLATFORM_BRAVE = 'Brave' +const PLATFORM_CHROME = 'Chrome' +const PLATFORM_EDGE = 'Edge' +const PLATFORM_FIREFOX = 'Firefox' +const PLATFORM_OPERA = 'Opera' + module.exports = { ENVIRONMENT_TYPE_POPUP, ENVIRONMENT_TYPE_NOTIFICATION, ENVIRONMENT_TYPE_FULLSCREEN, + PLATFORM_BRAVE, + PLATFORM_CHROME, + PLATFORM_EDGE, + PLATFORM_FIREFOX, + PLATFORM_OPERA, } diff --git a/app/scripts/lib/util.js b/app/scripts/lib/util.js index 51e9036cc..d7423f2ad 100644 --- a/app/scripts/lib/util.js +++ b/app/scripts/lib/util.js @@ -5,6 +5,11 @@ const { ENVIRONMENT_TYPE_POPUP, ENVIRONMENT_TYPE_NOTIFICATION, ENVIRONMENT_TYPE_FULLSCREEN, + PLATFORM_FIREFOX, + PLATFORM_OPERA, + PLATFORM_CHROME, + PLATFORM_EDGE, + PLATFORM_BRAVE, } = require('./enums') /** @@ -37,6 +42,29 @@ const getEnvironmentType = (url = window.location.href) => { } } +/** + * Returns the platform (browser) where the extension is running. + * + * @returns {string} the platform ENUM + * + */ +const getPlatform = _ => { + const ua = navigator.userAgent + if (ua.search('Firefox') !== -1) { + return PLATFORM_FIREFOX + } else { + if (window && window.chrome && window.chrome.ipcRenderer) { + return PLATFORM_BRAVE + } else if (ua.search('Edge') !== -1) { + return PLATFORM_EDGE + } else if (ua.search('OPR') !== -1) { + return PLATFORM_OPERA + } else { + return PLATFORM_CHROME + } + } +} + /** * Checks whether a given balance of ETH, represented as a hex string, is sufficient to pay a value plus a gas fee * @@ -100,6 +128,7 @@ function BnMultiplyByFraction (targetBN, numerator, denominator) { } module.exports = { + getPlatform, getStack, getEnvironmentType, sufficientBalance, -- cgit v1.2.3 From 543207b5af63424c1510438af356906696f5eb66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Thu, 9 Aug 2018 12:14:09 +0200 Subject: Fixed ENS to IPFS functionality in Firefox `tabs.getSelected` is deprecated and it doesn't work in firefox replaced by `tabs.query({active: true}` --- app/scripts/lib/ipfsContent.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js index 5222151ea..9e401ebcd 100644 --- a/app/scripts/lib/ipfsContent.js +++ b/app/scripts/lib/ipfsContent.js @@ -5,7 +5,7 @@ module.exports = function (provider) { function ipfsContent (details) { const name = details.url.substring(7, details.url.length - 1) let clearTime = null - extension.tabs.getSelected(null, tab => { + extension.tabs.query({active: true}, tab => { extension.tabs.update(tab.id, { url: 'loading.html' }) clearTime = setTimeout(() => { -- cgit v1.2.3 From a2082bae5c535f6f92d7b4124785e562815d840f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20Antu=C3=B1a=20D=C3=ADez?= Date: Thu, 9 Aug 2018 12:20:51 +0200 Subject: Avoid overwriting a domain that can be resolved by DNS According to the current implementation any domain ending in .eth or .test will try to resolve through ENS even if the DNS is able to resolve it. changing `onBeforeRequest` to `onErrorOccurred` will only resolve those .eth or .test domains that the DNS is not able to resolve. --- app/scripts/lib/ipfsContent.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/scripts/lib/ipfsContent.js b/app/scripts/lib/ipfsContent.js index 9e401ebcd..5db63f47d 100644 --- a/app/scripts/lib/ipfsContent.js +++ b/app/scripts/lib/ipfsContent.js @@ -34,11 +34,11 @@ module.exports = function (provider) { return { cancel: true } } - extension.webRequest.onBeforeRequest.addListener(ipfsContent, {urls: ['*://*.eth/', '*://*.test/']}) + extension.webRequest.onErrorOccurred.addListener(ipfsContent, {urls: ['*://*.eth/', '*://*.test/']}) return { remove () { - extension.webRequest.onBeforeRequest.removeListener(ipfsContent) + extension.webRequest.onErrorOccurred.removeListener(ipfsContent) }, } } -- cgit v1.2.3 From 500ef5cb3ae3cf9eddc97f74d5e911b972cbf06d Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 9 Aug 2018 10:09:53 -0700 Subject: Merge branch 'master' into develop --- 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 ed328f19f..fd6a40e0e 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_appName__", "short_name": "__MSG_appName__", - "version": "4.8.0", + "version": "4.9.0", "manifest_version": 2, "author": "https://metamask.io", "description": "__MSG_appDescription__", -- cgit v1.2.3 From 1605c8544ac4efd46d02d1d6002f4198e0bf6a63 Mon Sep 17 00:00:00 2001 From: Thomas Date: Thu, 9 Aug 2018 10:23:16 -0700 Subject: v4.9.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 fd6a40e0e..84cedd687 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,7 +1,7 @@ { "name": "__MSG_appName__", "short_name": "__MSG_appName__", - "version": "4.9.0", + "version": "4.9.1", "manifest_version": 2, "author": "https://metamask.io", "description": "__MSG_appDescription__", -- cgit v1.2.3 From 8df3f2696c4c5aad4e0e929e0a8a38e8c7135f72 Mon Sep 17 00:00:00 2001 From: Esteban MIno Date: Thu, 9 Aug 2018 16:15:56 -0400 Subject: fix migration 28 --- app/scripts/migrations/028.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app') diff --git a/app/scripts/migrations/028.js b/app/scripts/migrations/028.js index 6553a1052..9e995ee1a 100644 --- a/app/scripts/migrations/028.js +++ b/app/scripts/migrations/028.js @@ -25,8 +25,8 @@ function transformState (state) { const newState = state if (newState.PreferencesController) { - if (newState.PreferencesController.tokens) { - const identities = newState.TransactionController.identities + if (newState.PreferencesController.tokens && newState.PreferencesController.identities) { + const identities = newState.PreferencesController.identities const tokens = newState.PreferencesController.tokens newState.PreferencesController.accountTokens = {} for (const identity in identities) { -- cgit v1.2.3 From 00a2ab21aecefa9cc4f688782867fc25fedd6ad4 Mon Sep 17 00:00:00 2001 From: Jenny Pollack Date: Thu, 9 Aug 2018 13:49:40 -0700 Subject: sentry - change releaseVersion to release --- app/scripts/background.js | 4 ++-- app/scripts/lib/setupRaven.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/scripts/background.js b/app/scripts/background.js index 7eb7b1255..3d3afdd4e 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -44,8 +44,8 @@ const notificationManager = new NotificationManager() global.METAMASK_NOTIFIER = notificationManager // setup sentry error reporting -const releaseVersion = platform.getVersion() -const raven = setupRaven({ releaseVersion }) +const release = platform.getVersion() +const raven = setupRaven({ release }) // browser check if it is Edge - https://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser // Internet Explorer 6-11 diff --git a/app/scripts/lib/setupRaven.js b/app/scripts/lib/setupRaven.js index e657e278f..3651524f1 100644 --- a/app/scripts/lib/setupRaven.js +++ b/app/scripts/lib/setupRaven.js @@ -8,7 +8,7 @@ module.exports = setupRaven // Setup raven / sentry remote error reporting function setupRaven (opts) { - const { releaseVersion } = opts + const { release } = opts let ravenTarget // detect brave const isBrave = Boolean(window.chrome.ipcRenderer) @@ -22,7 +22,7 @@ function setupRaven (opts) { } const client = Raven.config(ravenTarget, { - releaseVersion, + release, transport: function (opts) { opts.data.extra.isBrave = isBrave const report = opts.data -- cgit v1.2.3 From 6c11ae44bfb6e9f81aa8c8345a8558267a2ed6fb Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Wed, 8 Aug 2018 19:19:00 -0230 Subject: Fix casing of MetaMask in all localized messages Using the following: sed -i.bak s/Metamask/MetaMask/ app/_locales/**/*.json && \ find app/_locales/ -name '*.bak' -delete --- app/_locales/de/messages.json | 2 +- app/_locales/en/messages.json | 6 +++--- app/_locales/es/messages.json | 4 ++-- app/_locales/fr/messages.json | 2 +- app/_locales/it/messages.json | 4 ++-- app/_locales/nl/messages.json | 2 +- app/_locales/th/messages.json | 2 +- app/_locales/tr/messages.json | 4 ++-- app/_locales/vi/messages.json | 2 +- app/_locales/zh_CN/messages.json | 2 +- app/_locales/zh_TW/messages.json | 2 +- 11 files changed, 16 insertions(+), 16 deletions(-) (limited to 'app') diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 1d2619672..88b0f397f 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -828,7 +828,7 @@ "message": "Willkommen zur neuen Oberfläche (Beta)" }, "uiWelcomeMessage": { - "message": "Du verwendest nun die neue Metamask Oberfläche. Schau dich um, teste die neuen Features wie z.B. das Senden von Token und lass es uns wissen falls du irgendwelche Probleme hast." + "message": "Du verwendest nun die neue MetaMask Oberfläche. Schau dich um, teste die neuen Features wie z.B. das Senden von Token und lass es uns wissen falls du irgendwelche Probleme hast." }, "unapproved": { "message": "Nicht genehmigt" diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 62ec4ce37..1c42e865f 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -120,7 +120,7 @@ "message": "Close" }, "chromeRequiredForTrezor":{ - "message": "You need to use Metamask on Google Chrome in order to connect to your TREZOR device." + "message": "You need to use MetaMask on Google Chrome in order to connect to your TREZOR device." }, "confirm": { "message": "Confirm" @@ -150,7 +150,7 @@ "message": "Connect to Trezor" }, "connectToTrezorHelp": { - "message": "Metamask is able to access your TREZOR ethereum accounts. First make sure your device is connected and unlocked." + "message": "MetaMask is able to access your TREZOR ethereum accounts. First make sure your device is connected and unlocked." }, "connectToTrezorTrouble": { "message": "If you are having trouble, please make sure you are using the latest version of the TREZOR firmware." @@ -1087,7 +1087,7 @@ "message": "Welcome to the New UI (Beta)" }, "uiWelcomeMessage": { - "message": "You are now using the new Metamask UI." + "message": "You are now using the new MetaMask UI." }, "unapproved": { "message": "Unapproved" diff --git a/app/_locales/es/messages.json b/app/_locales/es/messages.json index f287674f1..ed7f8f681 100644 --- a/app/_locales/es/messages.json +++ b/app/_locales/es/messages.json @@ -75,7 +75,7 @@ "message": "Pedir prestado con Dharma (Beta)" }, "builtInCalifornia": { - "message": "Metamask fue diseñado y construido en California" + "message": "MetaMask fue diseñado y construido en California" }, "buy": { "message": "Comprar" @@ -874,7 +874,7 @@ "message": "Advertencia" }, "welcomeBeta": { - "message": "Bienvenido a Metamask Beta" + "message": "Bienvenido a MetaMask Beta" }, "whatsThis": { "message": "¿Qué es esto?" diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index da2cfe4f8..0a9cb516a 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -570,7 +570,7 @@ "message": "Bienvenue dans la nouvelle interface utilisateur (Beta)" }, "uiWelcomeMessage": { - "message": "Vous utilisez maintenant la nouvelle interface utilisateur Metamask. Jetez un coup d'oeil, essayez de nouvelles fonctionnalités comme l'envoi de jetons, et faites-nous savoir si vous avez des problèmes." + "message": "Vous utilisez maintenant la nouvelle interface utilisateur MetaMask. Jetez un coup d'oeil, essayez de nouvelles fonctionnalités comme l'envoi de jetons, et faites-nous savoir si vous avez des problèmes." }, "unavailable": { "message": "Indisponible" diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index ef3ed4025..1fd6a9d38 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -178,7 +178,7 @@ "message": "La rete predefinita per transazioni in Ether è la Rete Ethereum Principale." }, "denExplainer": { - "message": "Il DEN è il tuo archivio crittato con password dentro Metamask." + "message": "Il DEN è il tuo archivio crittato con password dentro MetaMask." }, "deposit": { "message": "Deposita" @@ -816,4 +816,4 @@ "youSign": { "message": "Ti stai connettendo" } -} \ No newline at end of file +} diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index 38289f602..c1f3ef094 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -762,7 +762,7 @@ "message": "Welkom bij de nieuwe gebruikersinterface (bèta)" }, "uiWelcomeMessage": { - "message": "U gebruikt nu de nieuwe gebruikersinterface van Metamask. Kijk rond, probeer nieuwe functies uit zoals het verzenden van tokens en laat ons weten of u problemen ondervindt." + "message": "U gebruikt nu de nieuwe gebruikersinterface van MetaMask. Kijk rond, probeer nieuwe functies uit zoals het verzenden van tokens en laat ons weten of u problemen ondervindt." }, "unavailable": { "message": "Niet beschikbaar" diff --git a/app/_locales/th/messages.json b/app/_locales/th/messages.json index 3d7dec226..c9aaa0394 100644 --- a/app/_locales/th/messages.json +++ b/app/_locales/th/messages.json @@ -762,7 +762,7 @@ "message": "ยินดีต้อนรับสู่หน้าตาใหม่ (เบต้า)" }, "uiWelcomeMessage": { - "message": "ขณะนี้คุณใช้งาน Metamask หน้าตาใหม่แล้ว ลองใช้ความสามรถใหม่ ๆ เช่นการส่งโทเค็นและหากพบปัญหากรุณาแจ้งให้เราทราบ" + "message": "ขณะนี้คุณใช้งาน MetaMask หน้าตาใหม่แล้ว ลองใช้ความสามรถใหม่ ๆ เช่นการส่งโทเค็นและหากพบปัญหากรุณาแจ้งให้เราทราบ" }, "unavailable": { "message": "ใช้งานไม่ได้" diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index c2c09bc91..da35e4f96 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -852,7 +852,7 @@ "message": "Yeni UI (Beta)'ya hoşgeldiniz" }, "uiWelcomeMessage": { - "message": "Şu anda yeni Metamask UI kullanmaktasınız. Gözatın, jeton gönderme gibi yeni özellikleri deneyin ve herhangi bir sorunlar karşılaşırsanız bize haber verin" + "message": "Şu anda yeni MetaMask UI kullanmaktasınız. Gözatın, jeton gönderme gibi yeni özellikleri deneyin ve herhangi bir sorunlar karşılaşırsanız bize haber verin" }, "unapproved": { "message": "Onaylanmadı" @@ -909,4 +909,4 @@ "youSign": { "message": "İmzalıyorsunuz" } -} \ No newline at end of file +} diff --git a/app/_locales/vi/messages.json b/app/_locales/vi/messages.json index cd30de4de..782dfd119 100644 --- a/app/_locales/vi/messages.json +++ b/app/_locales/vi/messages.json @@ -570,7 +570,7 @@ "message": "Chào mừng bạn đến với giao diện mới (Beta)" }, "uiWelcomeMessage": { - "message": "Bạn đang sử dụng giao diện mới của Metamask. Chúng tôi khuyến khích bạn thử nghiệm và khám phá các tính năng mới như gửi token, và nếu bạn có gặp phải vấn đề gì khó khăn, xin hãy liên hệ ngay để chúng tôi có thể giúp đỡ bạn." + "message": "Bạn đang sử dụng giao diện mới của MetaMask. Chúng tôi khuyến khích bạn thử nghiệm và khám phá các tính năng mới như gửi token, và nếu bạn có gặp phải vấn đề gì khó khăn, xin hãy liên hệ ngay để chúng tôi có thể giúp đỡ bạn." }, "unavailable": { "message": "Không có sẵn" diff --git a/app/_locales/zh_CN/messages.json b/app/_locales/zh_CN/messages.json index 241ea948d..a39bba9da 100644 --- a/app/_locales/zh_CN/messages.json +++ b/app/_locales/zh_CN/messages.json @@ -879,7 +879,7 @@ "message": "欢迎使用新版界面 (Beta)" }, "uiWelcomeMessage": { - "message": "你现在正在使用新的 Metamask 界面。 尝试发送代币等新功能,有任何问题请告知我们。" + "message": "你现在正在使用新的 MetaMask 界面。 尝试发送代币等新功能,有任何问题请告知我们。" }, "unapproved": { "message": "未批准" diff --git a/app/_locales/zh_TW/messages.json b/app/_locales/zh_TW/messages.json index 9aaee0e16..200c75c3c 100644 --- a/app/_locales/zh_TW/messages.json +++ b/app/_locales/zh_TW/messages.json @@ -362,7 +362,7 @@ "message": "你想怎麼存入 Ether?" }, "holdEther": { - "message": "Metamask 讓您能保存 ether 和代幣, 並成為您接觸分散式應用程式的途徑." + "message": "MetaMask 讓您能保存 ether 和代幣, 並成為您接觸分散式應用程式的途徑." }, "import": { "message": "導入", -- cgit v1.2.3 From 6e6a4825acc2ea19253d2a662ec5625333464dec Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Wed, 8 Aug 2018 19:23:27 -0230 Subject: Fix casing of Bitcoin, Ethereum, and Litecoin across localized messages Using the following commands: sed -i.bak s/bitcoin/Bitcoin/ app/_locales/**/*.json && \ find app/_locales/ -name '*.bak' -delete sed -i.bak s/ethereum/Ethereum/ app/_locales/**/*.json && \ find app/_locales/ -name '*.bak' -delete sed -i.bak s/litecoin/Litecoin/ app/_locales/**/*.json && \ find app/_locales/ -name '*.bak' -delete --- app/_locales/de/messages.json | 2 +- app/_locales/en/messages.json | 4 ++-- app/_locales/fr/messages.json | 2 +- app/_locales/it/messages.json | 2 +- app/_locales/nl/messages.json | 4 ++-- app/_locales/ph/messages.json | 2 +- app/_locales/pt/messages.json | 2 +- app/_locales/ru/messages.json | 2 +- app/_locales/tr/messages.json | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/_locales/de/messages.json b/app/_locales/de/messages.json index 88b0f397f..c06a99250 100644 --- a/app/_locales/de/messages.json +++ b/app/_locales/de/messages.json @@ -84,7 +84,7 @@ "message": "Auf Coinbase kaufen" }, "buyCoinbaseExplainer": { - "message": "Coinbase ist die weltweit bekannteste Art und Weise um bitcoin, ethereum und litecoin zu kaufen und verkaufen." + "message": "Coinbase ist die weltweit bekannteste Art und Weise um Bitcoin, Ethereum und Litecoin zu kaufen und verkaufen." }, "ok": { "message": "Ok" diff --git a/app/_locales/en/messages.json b/app/_locales/en/messages.json index 1c42e865f..ddfcf6f12 100644 --- a/app/_locales/en/messages.json +++ b/app/_locales/en/messages.json @@ -99,7 +99,7 @@ "message": "Buy on Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase is the world’s most popular way to buy and sell bitcoin, ethereum, and litecoin." + "message": "Coinbase is the world’s most popular way to buy and sell Bitcoin, Ethereum, and Litecoin." }, "bytes": { "message": "Bytes" @@ -150,7 +150,7 @@ "message": "Connect to Trezor" }, "connectToTrezorHelp": { - "message": "MetaMask is able to access your TREZOR ethereum accounts. First make sure your device is connected and unlocked." + "message": "MetaMask is able to access your TREZOR Ethereum accounts. First make sure your device is connected and unlocked." }, "connectToTrezorTrouble": { "message": "If you are having trouble, please make sure you are using the latest version of the TREZOR firmware." diff --git a/app/_locales/fr/messages.json b/app/_locales/fr/messages.json index 0a9cb516a..1463e2b5f 100644 --- a/app/_locales/fr/messages.json +++ b/app/_locales/fr/messages.json @@ -63,7 +63,7 @@ "message": "Acheter sur Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase est le moyen le plus populaire au monde d'acheter et de vendre du bitcoin, de l'ethereum et du litecoin." + "message": "Coinbase est le moyen le plus populaire au monde d'acheter et de vendre du Bitcoin, de l'Ethereum et du Litecoin." }, "cancel": { "message": "Annuler" diff --git a/app/_locales/it/messages.json b/app/_locales/it/messages.json index 1fd6a9d38..2ae5fae72 100644 --- a/app/_locales/it/messages.json +++ b/app/_locales/it/messages.json @@ -81,7 +81,7 @@ "message": "Compra su Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase è il servizio più popolare al mondo per comprare e vendere bitcoin, ethereum e litecoin." + "message": "Coinbase è il servizio più popolare al mondo per comprare e vendere Bitcoin, Ethereum e Litecoin." }, "cancel": { "message": "Cancella" diff --git a/app/_locales/nl/messages.json b/app/_locales/nl/messages.json index c1f3ef094..46847f1bf 100644 --- a/app/_locales/nl/messages.json +++ b/app/_locales/nl/messages.json @@ -81,7 +81,7 @@ "message": "Koop op Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase is 's werelds populairste manier om bitcoin, ethereum en litecoin te kopen en verkopen." + "message": "Coinbase is 's werelds populairste manier om Bitcoin, Ethereum en Litecoin te kopen en verkopen." }, "cancel": { "message": "Annuleer" @@ -435,7 +435,7 @@ "message": "back-up woorden hebben alleen kleine letters" }, "mainnet": { - "message": "belangrijkste ethereum-netwerk" + "message": "belangrijkste Ethereum-netwerk" }, "message": { "message": "Bericht" diff --git a/app/_locales/ph/messages.json b/app/_locales/ph/messages.json index 29d63be02..9a243447a 100644 --- a/app/_locales/ph/messages.json +++ b/app/_locales/ph/messages.json @@ -63,7 +63,7 @@ "message": "Bumili sa Coinbase" }, "buyCoinbaseExplainer": { - "message": "Ang Coinbase ang pinakasikat na paraan upang bumili at magbenta ng bitcoin, ethereum, at litecoin sa buong mundo." + "message": "Ang Coinbase ang pinakasikat na paraan upang bumili at magbenta ng Bitcoin, Ethereum, at Litecoin sa buong mundo." }, "cancel": { "message": "Kanselahin" diff --git a/app/_locales/pt/messages.json b/app/_locales/pt/messages.json index e770392d0..6f0bb1584 100644 --- a/app/_locales/pt/messages.json +++ b/app/_locales/pt/messages.json @@ -81,7 +81,7 @@ "message": "Comprar no Coinbase" }, "buyCoinbaseExplainer": { - "message": "Coinbase é a forma mais conhecida para comprar e vender bitcoin, ethereum, e litecoin." + "message": "Coinbase é a forma mais conhecida para comprar e vender Bitcoin, Ethereum, e Litecoin." }, "cancel": { "message": "Cancelar" diff --git a/app/_locales/ru/messages.json b/app/_locales/ru/messages.json index b43251064..bb722735d 100644 --- a/app/_locales/ru/messages.json +++ b/app/_locales/ru/messages.json @@ -84,7 +84,7 @@ "message": "Купить на Coinbase" }, "buyCoinbaseExplainer": { - "message": "Биржа Coinbase – это наиболее популярный способ купить или продать bitcoin, ethereum и litecoin." + "message": "Биржа Coinbase – это наиболее популярный способ купить или продать Bitcoin, Ethereum и Litecoin." }, "ok": { "message": "ОК" diff --git a/app/_locales/tr/messages.json b/app/_locales/tr/messages.json index da35e4f96..08ba6cde8 100644 --- a/app/_locales/tr/messages.json +++ b/app/_locales/tr/messages.json @@ -84,7 +84,7 @@ "message": "Coinbase'de satın al" }, "buyCoinbaseExplainer": { - "message": "Coinbase bitcoin, ethereum, and litecoin alıp satmanın dünyadaki en popüler yolu" + "message": "Coinbase Bitcoin, Ethereum, and Litecoin alıp satmanın dünyadaki en popüler yolu" }, "ok": { "message": "Tamam" -- cgit v1.2.3